Guia CNC Brasil - Tudo sobre CNC, Router, Laser, Torno e 3D Print
TUTORIAIS => Tutoriais => Softwares => Tópico iniciado por: Cássio Alvarenga em 16 de Abril de 2013, 10:10
-
Amigos,
Preciso de um modo eficaz de calcular em c++ a area de um grafico de aceleração de um motor de passo, desse tipo:
(http://www.piclist.com/images/member/RB-ezy-Q33/MACH3MotorTuning.jpg)
Porem a aceleração e desaceleração não são uma função linear, portanto não forma uma reta como na figura, mas sim uma função exponencial que forma uma "parábola com o topo achatado" e não um trapézio.
-
Existem várias maneiras de calcular uma integral de maneira numérica (por programa) em tempo real, a mais prática é através de uma soma de pequenos retângulos, que aproximam a área da curva. Deve se ter alguns cuidados para evitar a saturação do algoritmo, pois uma integral vai aumentando indefinidamente.
-
Existem várias maneiras de calcular uma integral de maneira numérica (por programa) em tempo real, a mais prática é através de uma soma de pequenos retângulos, que aproximam a área da curva. Deve se ter alguns cuidados para evitar a saturação do algoritmo, pois uma integral vai aumentando indefinidamente.
Esse que é o problema, Da um "lag" grande se colocar a base do retangulo (que fica em contato com o eixo das abscissas) pequeno, as vezes da ate erro porque "estoura" o Double, se coloco a base ou pouco maior os resultados dão um desvio não aceitavel :'(.
Vou ver se trocando a curva por uma reta onde passe pelo centro da curva... vai sobrar uma area não contabilizada e uma área á mais, mas creio que se aproximar o valor dessas áreas ela chegam á quase se igualar e da uma aproximação aceitável. Ai é só tirar pela área do trapézio.
-
Esse que é o problema, Da um "lag" grande se colocar a base do retangulo (que fica em contato com o eixo das abscissas) pequeno, as vezes da ate erro porque "estoura" o Double, se coloco a base ou pouco maior os resultados dão um desvio não aceitavel :'(.
Não entendi o "lag".
A coisa é simples..., quando se calcula a área, a cada iteração se soma a altura da curva x largura (base), como a largura da base é constante, o que conta de fato é a altura da curva. Além disso, as iterações são feitas a intervalos de tempo regulares. Acho que deve estar havendo algum erro....
Vou ver se trocando a curva por uma reta onde passe pelo centro da curva... vai sobrar uma area não contabilizada e uma área á mais, mas creio que se aproximar o valor dessas áreas ela chegam á quase se igualar e da uma aproximação aceitável. Ai é só tirar pela área do trapézio.
Ao invés de um retângulo, pode usar um trapézio.
-
Não entendi o "lag".
Para se ter uma aproximação de área aceitável, a base do retângulo tem que ser bem pequena, quanto mais pequena melhor, porem mais lento é o calculo e o programa da uma "paradinha" para resolver o calculo e esse "lag" vai influenciar na usinagem, acho que o jeito vai ser mudar do ATMega328 para um circuito com maior poder de processamento, estou pensando no Cortex M3 (esqueci de mencionar que tudo o programa vai rodar em um microcontrolador não no PC).
Ao invés de um retângulo, pode usar um trapézio.
Não entendi, trocar os milhares de mini-retângulos por trapézios?
O que é eu pensei é o seguinte:
Na imagem anexa tem o gráfico velocidade x tempo (linha verde) nesta linha tem a aceleração do motor (curva exponencial) depois uma reta (velocidade constante) e depois a curva de desaceleração (oposta a curva de aceleração), meu objetivo é saber a área dentro da linha verde (para posteriormente calcular quantos joules foi embora nessa ai, mas essa parte não vem ao caso)
Estou cogitando a possibilidade de transformar a curva exponencial em uma reta que cruze seu centro... Assim basta calcular a area de 2 triângulos e um retângulo que não vai fazer nem cocegas no chip.
Porem parte da área vai ficar fora da soma (parte azul) e uma área vai ser somada á mais (parte amarela).
Logicamente se a área amarela tiver um valor próximo da área azul, a aproximação do calculo vai ser aceitável. (talvez ate melhor que o método dos retângulos)
Capiche?
-
Em 99% das aplicações industriais, em controle PID por exemplo, onde há a ação integral, usa-se a integração em fatias, conforme a figura. Sendo que o algoritmo roda a intervalos precisamente regulares no tempo (a cada 10 ms, por exemplo), mas o intervalo dependerá do processo em tela.
Não entendi o seu gráfico, não seria aceleração x tempo? Se a sua intenção é integrar a aceleração, pelo menos, seria assim como desenhei, não é?
Lembrando que a integral da aceleração fornece a velocidade...
-
Em 99% das aplicações industriais, em controle PID por exemplo, onde há a ação integral, usa-se a integração em fatias, conforme a figura. Sendo que o algoritmo roda a intervalos precisamente regulares no tempo (a cada 10 ms, por exemplo), mas o intervalo dependerá do processo em tela.
Infelizmente desse jeito da deixando o processo lento demais.
Não entendi o seu gráfico, não seria aceleração x tempo? Se a sua intenção é integrar a aceleração, pelo menos, seria assim como desenhei, não é?
O grafico é de Velocidade x tempo, A aceleração só estará presente quando a reta tangente á qualquer ponto do grafico for diferente de zero, no caso das bordas, já no meio a VELOCIDADE é constante.
Lembrando que a integral da aceleração fornece a velocidade...
Minha intenção é calcular o trabalho exercido. Integrando a velocidade x tempo.
-
Em 99% das aplicações industriais, em controle PID por exemplo, onde há a ação integral, usa-se a integração em fatias, conforme a figura. Sendo que o algoritmo roda a intervalos precisamente regulares no tempo (a cada 10 ms, por exemplo), mas o intervalo dependerá do processo em tela.
Infelizmente desse jeito da deixando o processo lento demais.
Lento?? Se o cálculo de cada fatia for feito a cada 1 ms, a cada 1 ms terás um resultado da integral, está bom? Pode ser mais rápido também. Ou seja, depende da fatia de tempo da integral. O que é lento para você?
O grafico é de Velocidade x tempo, A aceleração só estará presente quando a reta tangente á qualquer ponto do grafico for diferente de zero, no caso das bordas, já no meio a VELOCIDADE é constante.
Acho que há algumas nuvens no ar....
Se o gráfico é de velocidade x tempo, a integral fornece a distância percorrida, certo?
A derivada desse gráfico (a derivada da velocidade) fornece a aceleração, você quer a derivada ou a integral?
Minha intenção é calcular o trabalho exercido. Integrando a velocidade x tempo.
O trabalho exercido (Joules) pode ser calculado pela integração da potência no motor (integral do produto Torque x Velocidade).
A integral da velocidade x tempo fornece a distância percorrida.
Você também pode calcular aproximadamente o trabalho exercido através da integração da potência elétrica consumida pelo motor, como num "relógio de luz", descontando o rendimento do motor, que você pode medir através de testes.
-
Lento?? Se o cálculo de cada fatia for feito a cada 1 ms, a cada 1 ms terás um resultado da integral, está bom? Pode ser mais rápido também. Ou seja, depende da fatia de tempo da integral. O que é lento para você?
Quando calcula a integral por definição numérica, o programa da uma parada de quase 1 segundo. (estou usando a base do retangulo 1e-7).
Se o gráfico é de velocidade x tempo, a integral fornece a distância percorrida, certo?
Exato, eu já sei qual é o momento binário, para saber o trabalho basta saber a distância, não é?
Você também pode calcular aproximadamente o trabalho exercido através da integração da potência elétrica consumida pelo motor, como num "relógio de luz", descontando o rendimento do motor, que você pode medir através de testes.
O X da questão é o rendimento do motor :). O dispositivo que estou trabalhando é justamente para calcular o rendimento, ou melhor dizendo eficiência em diferentes regimes de trabalho.
-
Cassio, seria interessante dar mais detalhes sobre a parte prática também e não só teoria.
Tá rodando isso em alguma placa ou só simulando? Qual MCU? Qual frequencia? C ou C++? Tu que ta programando? Como voce detecta o "lag" (debug?)?
Recomendo fazer como o minilathe falou, fatiar a curva em várias retas para simplificar, reduzindo bastante a fatia vai dar boa precisão e vai ser bem mais rápido o cálculo.
Dá mais detalhes da aplicação.
-
Tá rodando isso em alguma placa ou só simulando? Qual MCU? Qual frequencia? C ou C++? Tu que ta programando? Como voce detecta o "lag" (debug?)?
Recomendo fazer como o minilathe falou, fatiar a curva em várias retas para simplificar, reduzindo bastante a fatia vai dar boa precisão e vai ser bem mais rápido o cálculo.
Dá mais detalhes da aplicação.
é em C++ utilizando um chip ATMega328p
O programa faz a leitura de um movimento colendo dados do mesmo e depois processando para fornecer as informações logo depois deste movimento, percebi o "lag" quando implementei o codigo para calcular a integral, porem ele faz certinho no primeiro movimento, no segundo movimento em diante o sistema não recebe o começo do movimento, é como se ele tivesse parado cerca de 1 segundo calculando a integral para depois receber os dados dos sensores.
Entendeu? (não sei se fui claro)
Já pensei na solução: Primeiro vou colher todos os dados de TODOS movimentos e DEPOIS vou processa-los para só então exibir.
do jeito que estou fazendo, diga-se "em tempo real": Ler sensores -> processa os dados -> print dos resultados... logo depois do movimento esta atrasando o "ler sensores" do próximo movimento.
Vai ser assim agora: "ler sensores e salva" isso pra cada movimento, DEPOIS vou processar do jeito comum (como o gil falou) e então só depois exibir.
-
Os sistemas de tempo real mais simples executam repetidamente um laço do tipo:
(1) ler entradas, em seu caso, ler a aceleração ou a velocidade
(2) integrar a medição
(3) mostrar o resultado
(4) incrementar variáveis (de tempo, contadores, ...)
Há também os sistemas concorrentes e multitarefa, mais complexos, que fazem várias coisas ao mesmo tempo, ler entradas, calcular, atualizar saídas, ....
Mas, se você quer apenas analisar depois do ocorrido, ou como se diz, "comentar o vídeo tape do jogo", é bem mais fácil armazenar tudo a processar depois. Apesar de gastar mais memória de dados, a vantagem dessa abordagem é que pode aplicar vários algoritmos e comparar os resultados obtidos. Mas, com as baratas memórias SD, Mini-SD, ... de vários GB, isso é "molezinha" para um ATMega.
-
Lento?? Se o cálculo de cada fatia for feito a cada 1 ms, a cada 1 ms terás um resultado da integral, está bom? Pode ser mais rápido também. Ou seja, depende da fatia de tempo da integral. O que é lento para você?
Quando calcula a integral por definição numérica, o programa da uma parada de quase 1 segundo. (estou usando a base do retangulo 1e-7).
Realmente, ainda não entendi a tal lentidão...
Se o gráfico é de velocidade x tempo, a integral fornece a distância percorrida, certo?
Exato, eu já sei qual é o momento binário, para saber o trabalho basta saber a distância, não é?
E se é um motor de passo que não perde passos, a distância é proporcional a quantidade de passos aplicada ao driver, que você pode totalizar facilmente com um contador. Complica um pouquinho se levar em conta os sinais de passo e direção num dados eixo. Além disso, em movimentos compostos (z,y,z), tem que calcular a distância efetivamente percorrida (vetor deslocamento tridimensional) e força na direção do deslocamento (vetor força tridimensional).
Por isso, acho que integrar o produto torque instantâneo do motor x velocidade instantânea seja mais preciso. Explicando, o torque (unidimensional) é mais facilmente mensurável e a velocidade (unidimensional) pode ser determinada através da frequência instantânea de pulsos ao driver. Além disso, como a velocidade do motor muda menos frequentemente do que a distância percorrida, o resultado deve ser mais preciso usando velocidades. Se somar as potências em cada eixo motriz obtêm-se a potência total do movimento tridimensional.
Ainda é uma aproximação, pois há as perdas nos fusos, patins e acoplamentos.
O X da questão é o rendimento do motor :). O dispositivo que estou trabalhando é justamente para calcular o rendimento, ou melhor dizendo eficiência em diferentes regimes de trabalho.
Acho que se você determinar numa bancada de testes o rendimento do motor para cada regime de operação (torque x velocidade), poderia aplicar esse rendimento modelado a partir do torque e da velocidade medidas. Assumindo que o rendimento do motor não varie muito, a menos um motor mais antigo, mas aí é só medir o rendimento de novo.