Arduino leyó el valor del ciclo de trabajo PWM con entrada (analógica / digital)

Estoy trabajando en comparar pilotos automáticos como Ardupilot , CC3D , KK2.1.5 . La comparación se refiere a las reacciones / comportamientos del sistema que da durante el vuelo. Para este propósito, necesito leer los valores del ciclo de trabajo de PWM (como los osilascopios; la frecuencia de PWM puede variar de 50 a 430 Hz) de la tarjeta de piloto automático. Hay 4 PWM de entrada de comando y 4 PWM de control esc para un quadrotor típico. Tengo que leer 8 valores de ciclo de trabajo con pines de entrada digital / analógica. ¿Cómo mido el ciclo de trabajo de 8 señales PWM? Además, ¿la medición digital o analógica es precisa y más rápida?

Nota sobre el comando attachInterrupt : Según arduino.cc , la serie AtMega328 tiene 2 interrupciones , La serie Arduino ATmega 2560 tiene 7 interrupciones.

Respuesta

El código que se muestra en mi respuesta a la pregunta 18183 , «Leer canales de receptor RC usando Interrupt en lugar de PulseIn ”. Esa respuesta tiene código para leer cuatro canales de RC PWM. Se puede adaptar fácilmente para trabajar con ocho canales. Tiene un ISR que se ejecuta cuando cambian los pines seleccionados. Clasifica qué canales cambiaron y almacena el valor de micros() en cada cambio.

Consulte también mi respuesta a la pregunta 19106 , «¿Pueden las interrupciones externas ser OR» d juntas en el «328 (Uno)?» Esa respuesta incluye un esquema para generar el código ISR apropiado. Mi respuesta a la pregunta 32572 , «¿Cómo detectar la dirección de un codificador rotatorio?», muestra otra instancia.

Entrada digital, como utilizado en el código mencionado anteriormente, toma menos de un microsegundo diez microsegundos en el ISR. Como se indica en el comentario de dannyf, desenrollar el ciclo for y (cuando sea posible) usar constantes en lugar de variables puede reducir el tiempo en ISR a 3,4 μs. Nota: entrada y salida de ISR aún agregue varios microsegundos.

La entrada analógica de 10 bits, por otro lado, tomará alrededor de 104 microsegundos por lectura, un tiempo comparable a algunos de los anchos de pulso que medirá. Por lo tanto, no es lo suficientemente rápido. Si la precisión de ADC degradada es aceptable, se puede disminuir el factor de escala de reloj de ADC como se explica en una página web en microsmart.co.za reduzca el tiempo de conversión de AD a 20 μs. Esto es aproximadamente tres veces el tiempo que tarda la entrada digital, por lo que es bastante lento.

Comentarios

  • > toma menos de un microsegundo en el ISR, lo encuentro poco probable. Obviamente, ' no estoy seguro de qué piezas de código estaba hablando, ya que son tres. Pero una mirada causal en ellos sugeriría que se necesitarán más de 16 tics para ejecutar el cuerpo del ISR, sin contar la sobrecarga. De hecho, un pajarito mío dijo que tome cerca de 8us para ejecutarlos en un Uno, 🙂
  • @dannyf, estaba mirando uno de los ISR más simples (conteo de codificador único) cuando escribí eso, así que tendré que editar la respuesta con la correcta tiempo. ¡Lo siento!
  • No hay problema. Dos sugerencias: 1) desenrolle el ciclo while; 2) usa constantes en lugar de variables. y también haría que rcOld sea estático dentro del ISR para que el código sea más modular. con eso, reduje el tiempo de ejecución a 3.4us.
  • ¿Puedes compartir tu código en lugar de enlaces? Además, la serie AtMega328 tiene 2 interrupciones, la serie Arduino ATmega 2560 tiene 7 interrupciones. Entonces, ¿cómo puedo medir 8 señales PWM simultáneas? arduino.cc/en/Reference/attachInterrupt
  • @acs, ATmega328 ' s tienen 26 vectores de interrupción diferentes. Los vectores usados en el código referenciado son para interrupciones de cambio de pin, o PCINT, que usan 3 de esos vectores. Los PCINT están disponibles en 22 de los pines Nano basados en ATmega328, y un número similar en Uno ' s. Consulte el código que se muestra en las preguntas anteriores; en este momento tengo fechas límite de trabajo que cumplir.

Responder

si se hace en analógico, ejecute el pwm a través de un lpf y realice un adc en la salida;

si se hace en digital, use la función de captura de un temporizador o use la interrupción externa / interrupción de cambio de pin para capturar el tiempo de una base de tiempo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *