Arduino lê o valor do ciclo de trabalho PWM com entrada (analógica / digital)

Estou trabalhando na comparação de pilotos automáticos como Ardupilot , CC3D , KK2.1.5 . A comparação é sobre as reações / comportamentos do sistema que ele dá durante o vôo. Para isso, preciso ler os valores do ciclo de trabalho do PWM (como os osilascópios – a frequência do PWM pode variar de 50 a 430 Hz) na placa do piloto automático. Existem 4 PWMs de entrada de comando e 4 PWMs de controle ESC para um quadrotor típico. Tenho que ler 8 valores de ciclo de trabalho com pinos de entrada digital / analógica. Como faço para medir o ciclo de trabalho de 8 sinais PWM? Além disso, a medição digital ou analógica é precisa e mais rápida?

Observação sobre o comando attachInterrupt : De acordo com arduino.cc a série AtMega328 tem 2 interrupções , A série Arduino ATmega 2560 tem 7 interrupções.

Resposta

O código mostrado em minha resposta à pergunta 18183 , “Ler canais receptores RC usando interrupção em vez de PulseIn ”. Essa resposta possui código para ler quatro canais do RC PWM. Pode ser facilmente adaptado para funcionar com oito canais. Ele tem um ISR que é executado quando os pinos selecionados mudam. Ele classifica quais canais mudaram e armazena o valor de micros() em cada mudança.

Veja também minha resposta à pergunta 19106 , “As interrupções externas podem ser OR” d juntas no “328 (Uno)?” Essa resposta inclui um esboço para gerar o código ISR apropriado. Minha resposta à pergunta 32572 , “Como detectar a direção de um codificador rotativo?”, mostra outra instância.

Entrada digital, como usado no código mencionado acima, leva em um microssegundo dez microssegundos no ISR. Conforme observado no comentário de dannyf “, desfazer o loop for e (quando possível) usar constantes em vez de variáveis pode reduzir o tempo de in-ISR para 3,4 μs. Observação, entrada e saída de ISR ainda adiciona vários microssegundos.

A entrada analógica de 10 bits, por outro lado, levará cerca de 104 microssegundos por leitura, um tempo comparável a algumas das larguras de pulso que você medirá. Portanto, não é rápido o suficiente. Se a precisão degradada do ADC for aceitável, diminuir o fator de escala do relógio ADC conforme explicado em uma página da web em microsmart.co.za pode reduza o tempo de conversão do AD para 20 μs. Isso é cerca de três vezes o tempo que a entrada digital leva, portanto, é bastante lento.

Comentários

  • > leva menos de um microssegundo no ISR, acho isso improvável. Obviamente, ' não tenho certeza de quais partes do código você estava falando – como eles são três. mas um olhar causal sobre eles sugeriria que seriam necessários mais de 16 tiques para executar o corpo do ISR – sem contar a sobrecarga. Na verdade, um passarinho meu disse que iria leve cerca de 8us para executá-los em um Uno 🙂
  • @dannyf, eu estava olhando para um dos ISRs mais simples (contagem de codificador único) quando escrevi isso, então precisarei editar a resposta com tempo. Desculpe!
  • não é um problema. duas sugestões: 1) desenrole o loop while; 2) use constantes em vez de variáveis. e também tornaria rcOld um estático dentro do ISR para que o código seja mais modular. com isso, reduzi o tempo de execução para 3,4us.
  • Você pode compartilhar seu código em vez de links. Além disso, a série AtMega328 tem 2 interrupções, a série Arduino ATmega 2560 tem 7 interrupções. Então, como posso medir 8 sinais PWM simultâneos? arduino.cc/en/Reference/attachInterrupt
  • @acs, ATmega328 ' s têm 26 vetores de interrupção diferentes. Os vetores usados no código referenciado são para interrupções de mudança de pino, ou PCINTs, que usam 3 desses vetores. PCINTs estão disponíveis em 22 pinos Nano baseados em ATmega328 e um número semelhante em Uno ' s. Consulte o código mostrado nas perguntas anteriores – no momento, tenho prazos de trabalho a cumprir.

Resposta

se feito em analógico, execute o pwm através de um lpf e execute um adc na saída;

se feito em digital, use uma função de captura de temporizador ou use interrupção externa / interrupção de mudança de pino para capturar o tempo de uma base de tempo.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *