Genere un número fijo de pulsos en el STM32F4 PWM

Estoy tratando de controlar un servomotor ( enlace ). Es un motor de CC sin escobillas con una interfaz similar a un motor paso a paso.

El motor gira una distancia definida en función del número de pulsos que recibe del PWM. La velocidad está determinada por la frecuencia de pulso del PWM, como un motor paso a paso.

Para controlar este motor estoy usando un microcontrolador STM32F407ZET6. Puedo cambiar fácilmente la frecuencia y el ciclo de trabajo de PWM, pero mi pregunta es la siguiente:

¿Cómo genero un número fijo de pulsos en el PWM? Por ejemplo, quiero que el PWM envíe 1000 pulsos en un momento determinado con una frecuencia de 20kHz y un Duty Cycle del 50%. 20kHz y 50% Duty Cycle son fáciles de definir, pero no puedo determinar cómo generar los 1000 pulsos fijos.

Una de las soluciones que probé fue volver a conectar el PWM a un temporizador en modo contador y detener el PWM cuando se haya generado la cantidad requerida de pulsos. Pero el número de pulsos no siempre es fijo, a veces oscila entre 998 y 1005 (por ejemplo).

¿Es posible hacer esto sin necesidad de retroalimentación?

Si desea una cantidad específica de pulsos, es posible que deba hacer bit-bang en su PWM utilizando un temporizador y no el generador PWM incorporado.
¿Poner un contador en la rutina de interrupción más corta posible?
Si se conoce el conteo de pulsos, sabe cuánto tiempo lleva enviarlos y puede usar otro temporizador para deshabilitar el PWM.
@RonBeyer peor solución posible

Respuestas (1)

Habilite la interrupción de comparación de captura con la configuración del bit CCxIE en el registro TIMx_DIER (llene x con su temporizador y canal cc). esto habilita una interrupción procesada cada vez que se completa un pulso. En su isr puede verificar el registro TIMx_CNT para verificar dos veces.

Habilite pwm, comience a contar sus pulsos en isr, cuando alcance el número deseado de pulso, deshabilite pwm.