Medir el tiempo entre dos eventos GPIO en STM32 [duplicado]

1

Quiero medir las RPM de un motor que estoy controlando usando un STM32 y un chip de controlador. Entiendo que tengo que medir el tiempo entre la señal de 2 hall y calcular la velocidad (RPM).

La pregunta es, ¿cómo puedo iniciar un temporizador y reiniciarlo en cada interrupción de señal de hall? Intenté estudiar los temporizadores, pero la cantidad de cosas que aprender es enorme ...

Me refiero a mi caso, ¿qué modo debo ejecutar un temporizador? Creo que hay captura de entrada directa, capturas de salida, etc ...

Aquí está mi código de interrupción:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    if(GPIO_Pin == GPIO_PIN_4 || GPIO_Pin == GPIO_PIN_5 || GPIO_Pin == GPIO_PIN_6) {
        commutate();
    }
}
    
pregunta DEKKER

1 respuesta

3

La respuesta corta es: ¡necesitas usar el temporizador en el modo de captura de entrada!

Luego, Timer_Pin puede configurarse para un disparador de interrupción externo, es decir, cuando se produce una interrupción externa, se produce una captura de tiempo de entrada (~ marca de tiempo). De manera similar, otra captura ocurre en la siguiente interrupción, solo necesita encontrar la diferencia entre las dos capturas para calcular el tiempo transcurrido entre dos eventos. ¡Pero hay que tener cuidado al configurar el temporizador para que pueda capturar al menos dos interrupciones consecutivas!

Para explicar las cosas con más detalle, asumo que estás usando STM32CubeMx para generar el código, ¡incluso si no estás siguiendo los pasos similares!

  1. Debe configurar un temporizador en "Modo directo de captura de entrada", que le asigna un pin GPIO. ¡Ahora, puede usar esto para la interrupción de su sensor!

  2. Configure el temporizador para que pueda capturar un mínimo de dos capturas de TIM consecutivas.

El cálculo es simple y sigue como sigue:

La frecuencia mínima que mides es

MinPulseFrequency = (2*TIMxPeripheralFrequency)/((Period+1)(Prescaler+1)) 
  1. Repase los ejemplos de STM32Cube y busque el ejemplo TIM / Timer_Input_Capture. Se ha explicado bastante bien.

  2. Incluso si no quiere ver todos los detalles sobre cómo funcionan todos los modos del temporizador, ¡asegúrese de entender lo que está sucediendo en el modo de captura de entrada! y vea cómo puede configurarse correctamente usando este Libro de cocina de uso general con temporizador.

Para un problema similar en un contexto diferente, pero que funciona como un código de ejemplo para usted será esta publicación.

    
respondido por el charansai

Lea otras preguntas en las etiquetas