Cómo configurar la frecuencia PWM con alta granularidad

Quiero crear un PWM a 100kHz que pueda tener 1000 pasos. por ejemplo, cuando configuro CCR1 en 0 %, el PWM está desactivado y cuando configuro CCR1 en 499, debería estar al 50 % y, obviamente, en CCR1 = 999, debería tener un ciclo de trabajo completo del 100 %.

El CPU_CLK es de 80 MHz... pero no puedo lograrlo. Aquí está mi código hasta ahora:

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED2;
  htim1.Init.Period = 1000-1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

Esto me da un PWM con una frecuencia de 40kHz... muy por debajo de los 100kHz... el Prescalare ya está al mínimo... ¿es esto imposible de lograr?

El chip es STM32L476.

100 kHz por 1000 es igual a 100 MHz. Su reloj máximo es de 80 MHz. ¿Ves un problema?
+1 buena pregunta porque muchas personas no entienden las limitaciones relacionadas con la resolución, la frecuencia del reloj y la frecuencia PWM.
Normalmente en los reguladores de amplio rango dinámico utilizan PFM + PWM para conseguir un rango dinámico de 60 dB
Entonces, ¿qué es más importante para usted, "alta granularidad" en el título o "100 kHz" en la pregunta? Porque los temporizadores de 16 bits pueden brindarle una resolución de 65k, muy por encima de los 1000 pasos.
@Maple Necesito exactamente 1000 pasos a 100 kHz... Creo que no es posible hacerlo tan fácilmente :( Necesito un chip más rápido
@DEKKER "Necesito un chip más rápido". O bien, puede usar un generador PWM externo, como el M66242P de 12 bits de Mitsubishi, para 4096 pasos hasta 25MHz

Respuestas (1)

La respuesta corta es que no es trivial con un reloj de 80 MHz a menos que utilice algunas técnicas de interpolación (ver más abajo).

F C yo k = PAG W METRO F r mi q tu q norte C y × 2 s t mi pag s

En su caso, los pasos requeridos son 10 bits... por lo tanto, necesita al menos un reloj principal de 100 MHz.

El documento que vinculé en mi comentario muestra algunas formas complejas de lograr esto con frecuencias de reloj más bajas al difuminar y combinar más temporizadores (es bastante complejo). Aquí está el documento del propio STM.

Obviamente, otra solución sería usar otro MCU de la misma familia con velocidades de reloj más altas si su aplicación/presupuesto lo permite.