STM32F4 Precisión del temporizador

2

Estoy trabajando con un tablero de descubrimiento STM32F4 y me he encontrado con un poco de comportamiento inusual del que espero que alguien pueda explicarme la causa. Mi objetivo es configurar un temporizador para activar una interrupción a 100 Hz (es decir, un período de 10 ms). Es importante para mi proyecto que este valor sea lo más cercano a 10 ms posible. El reloj de mi sistema está configurado a 168 MHz, y el temporizador que estoy usando está sincronizado en el bus APB2, que está cronometrado en 84 MHz, pero como los temporizadores funcionan al doble de la velocidad del reloj de su bus, el reloj de mi temporizador también funciona a 168 MHz .

Para obtener mi período de 10 ms, tendría que configurar mis valores de preescalador y período en la estructura TIM_TimeBaseInitTypeDef a valores enteros de 16 bits. Los valores iniciales que elegí fueron 60000 para el prescaler y 28 para el período. 168 MHz / 60K = 2800 Hz. Luego, establecer mi período en 28 debería proporcionarme un evento de actualización a 100 Hz.

Estoy bastante seguro de que mi matemática se comprueba, sin embargo, cuando medí el momento en que se disparó mi interrupción, mi período fue algo más cercano a 10.33 ms, en lugar de los 10 ms esperados. Después de jugar con otras configuraciones, decidí intentar cambiar los valores de preescalador y período para ver si las configuraciones de tiempo cambiaron. Para mi sorpresa, lo hicieron. Para los valores de período que probé, los dibujé en la siguiente gráfica:

Dosobservacionesprincipalesqueveo:

1)Cambiarelperíodoporelprescaleryviceversadacomoresultadoelmismoperíodomedido

2)Cuantomáscercaesténelperíodoylosvaloresdelprescaler,máscercaestaráeltiempomedidodelperíododeseado.

¿Alguiensabeporquéestoes?Meparecequenohaydiferenciaentreelpar(60000,28)y(1344,1250)entérminosdecálculodelperíodo(esdecir,ambossemultiplicana1680000)

Editar:heañadidounenlaceamicódigo aquí .

Edit2: Siento que los comentarios se desvían de mi pregunta intencional. Mi problema no es que no pueda obtener un período de 10 ms. Mi pregunta es ¿POR QUÉ establecer el preescalador y el período en valores más separados entre sí en un período menos preciso?

    
pregunta HD_Mouse

2 respuestas

3

Como Tut fue el primero en sugerir, el error observado surge del hecho de que el número total de ciclos en estos divisores es uno más que el valor cargado en el registro correspondiente.

Tuviste esto en cuenta en el registro de prescaler, pero no en el registro de período.

Cuando distribuye la división neta equitativamente entre las dos etapas, cada una tiene un valor moderadamente grande y, por lo tanto, el efecto de "off-by-one" es pequeño.

Pero cuando distribuye la división de manera desigual de modo que un valor sea solo 28, la diferencia entre 29 conteos (28 + 1) frente a los 28 (27 + 1) correctos es responsable del error de 1 parte en 28 que ver.

    
respondido por el Chris Stratton
0

En realidad divide la frecuencia como:

$$ f = \ frac {168 ~ MHz} {(60000 + 1) \ cdot (28 + 1)} = 96.55 ~ Hz \\ T = 10.36 ~ ms $$

Si desea 10Hz, intente configurar prescaler = 59999, periodo = 27; entonces el temporizador funcionará como

$$ f = \ frac {168 ~ MHz} {(59999 + 1) \ cdot (27 + 1)} = 100 ~ Hz $$

Es una regla de la especificación STM.

    
respondido por el Milo

Lea otras preguntas en las etiquetas