configurando la frecuencia de un PWM en un STM32

3

Estoy intentando escribir una función que toma una frecuencia deseada de PWM y configura el temporizador según este valor:

void initTimer(unsigned int freq ){

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM_TimeBaseInitTypeDef timerInitStructure;
    timerInitStructure.TIM_Prescaler = 1000;
    timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    timerInitStructure.TIM_Period = 1000;
    timerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    timerInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &timerInitStructure);
    TIM_Cmd(TIM3, ENABLE);

    TIM_OCInitTypeDef outputChannelInit;
    outputChannelInit.TIM_OCMode = TIM_OCMode_PWM1;
    outputChannelInit.TIM_Pulse = 500;
    outputChannelInit.TIM_OutputState = TIM_OutputState_Enable;
    outputChannelInit.TIM_OCPolarity = TIM_OCPolarity_High;
    // the first channel
    TIM_OC1Init(TIM3, &outputChannelInit);
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);

}

El código funciona bien y genera el PWM esperado. Mi problema es que no sé cómo calcular el valor del preescalador en función de la frecuencia dada. En el ejemplo anterior, los valores son fijos.

¿Alguna idea de cómo puedo hacer esto? ¡Gracias por adelantado!

    
pregunta Engine

2 respuestas

3

En resumen, desea satisfacer la ecuación:

Prescaler * Overflow = Period-in-Cycles = Reloj-ciclos por segundo / frecuencia

Una buena manera de calcular los valores de preescalador y desbordamiento para PWM es elegir el preescalador más pequeño posible, luego recortar el desbordamiento a la frecuencia total deseada. Esto mantiene el valor de desbordamiento lo más grande posible, lo que proporciona la mayor precisión si más adelante desea modular el ciclo de trabajo de la forma de onda.

Por ejemplo, si la frecuencia de reloj es de 72 MHz y desea una onda cuadrada de salida de 250 Hz (50% de servicio), entonces el período de forma de onda de salida total en ciclos de reloj ( period_cycles ) sería de 72 MHz / 250 Hz = 288000 ciclos. El valor overflow del temporizador suele ser de 16 bits como máximo ( 0xFFFF o 65535), el preescalador debe ser tal que prescaler * overflow >= period_cycles y 288000.0 / 0xFFFF => 4.39459... , por lo que el prescaler debe ser 5 . Finalmente, 288000 / 5 => 57600 , que es un buen número redondo para el overflow (querría redondearlo al entero más cercano si no lo fuera).

Aquí hay un código que implementa el algoritmo anterior, incluido el redondeo apropiado utilizando aritmética de enteros C:

#define CLOCK_CYCLES_PER_SECOND  72000000
#define MAX_RELOAD               0xFFFF

uint32_t period_cycles = CLOCK_CYCLES_PER_SECOND / freq;
uint16_t prescaler = (uint16)(period_cycles / MAX_RELOAD + 1);
uint16_t overflow = (uint16)((period_cycles + (prescaler / 2)) / prescaler);
uint16_t duty = (uint16)(overflow / 2);

Por supuesto, en su código real querrá verificar los casos perimetrales como freq == 0 o freq > CLOCK_CYCLES_PER_SECOND/2 .

    
respondido por el bnewbold
1

Para ampliar el comentario de Eugene ... en la hoja de datos, las secciones relevantes son sobre relojes (hay un bonito diagrama de cómo se derivan) y PWM. Y posiblemente también haya un documento que describa la biblioteca que utiliza (FWLib o qué es).

Su código de inicio muestra que el reloj temporizador / PWM se deriva de PCLK1 (APB1), que normalmente es un reloj de CPU dividido por algo. Hay funciones para obtener los relojes (RCC_xxx), por lo que puede obtener el número. Después de eso, básicamente tiene dos divisores, Prescaler y Period, por lo que obtiene PCLK1 / 1000000.

    
respondido por el domen

Lea otras preguntas en las etiquetas

Comentarios Recientes

F010 Cómo codificar información de color simbólica en un UARTBHow para implementar la detección de interrupción de bloqueo de audio de pin de color (cifrado de software / bloqueo del programador) Cómo implementar la detección de máscara de audio de matriz de pin de color (cifrado de software / bloqueo de programador) Los tres errores de software opcionales incluidos para Formatos de archivo de dispositivo automotriz / IDE de fondo Muchos de los controladores generados están diseñados con formularios de controlador... Lees verder