Entrada PWM de múltiples canales en STM32

Estoy usando una placa basada en STM32F405 (OpenPilot revo) para recibir señales PWM desde un receptor de joystick.

Tengo que capturar cinco señales PWM usando solo dos temporizadores, el temporizador 8 y el temporizador 12. Ya logré capturar una señal PWM y calcular el ciclo de trabajo en solo un canal para cada temporizador usando el ejemplo provisto con la biblioteca estándar (PWM INPUT ).

Pero no pude usar varios canales para cada temporizador. ¿Cómo configuro los canales? Sería genial si alguien tiene un ejemplo con más de un canal utilizado para la entrada de PWM.

Como posible simplificación, existe una posibilidad decente de que sus canales se activen secuencialmente, no en paralelo. (En los viejos tiempos, eso era un hecho, ya que estaban multiplexados en el tiempo a través de un canal analógico, pero hoy el PWM será sintetizado localmente por la MCU del receptor, por lo que, en teoría, podría superponerse). Hoy en día, es posible que desee volver a implementar directamente el receptor hablando con el módulo de chip apropiado (¿2,4 GHz?) En lugar de capturar una salida destinada a los servos. Es probable que el código para hacer esto para cualquier marca de radio que use ya esté disponible en línea.
Algunos receptores RC también emiten una forma de onda PPM que es increíblemente fácil de decodificar con un solo temporizador. Simplemente active una captura de temporizador en cada flanco ascendente, reste el tiempo de captura anterior y tendrá las longitudes de pulso para cada canal. Se recomienda el uso de interrupciones para esto. Este formato es el mismo al que @ChrisStratton se refirió con "fueron multiplexados en el tiempo a través de un canal analógico"

Respuestas (1)

En lugar de usar dos unidades de captura para capturar los flancos ascendentes y descendentes por separado, use una unidad de captura para reaccionar a ambos flancos de la(s) señal(es) y determinar el estado dentro del controlador de interrupciones. O use una interrupción externa (cambio de pin) para reaccionar a cualquier cambio de señal y use un temporizador de funcionamiento libre para capturar el valor del contador en el software. Si no hay interrupciones, puede utilizar OR (diodos) para enviar las señales a una entrada de interrupción y verificar la fuente con entradas normales (una para cada señal).

Preste atención a cómo se manejan las interrupciones (prioridad) en el caso de que varias señales cambien de estado exactamente al mismo tiempo.
uno µs más o menos de latencia probablemente no sea un problema con los servo PWM.