Velocidad de medición con el modo de captura de entrada [STM32 y CubeMx]

0

Tengo el L432KC Nucleo. Estoy tratando de medir velocidades bajas con un sensor de 1 PPR (pulso por revolución). Para PPR bajos, se sugiere el uso del Método de Medición del Período. Si obtengo el período de la señal, puedo aplicar la fórmula:

RPM = 60 / (Período de pulso)

Esto es lo que tengo:

En CubeMx he configurado el modo de captura de entrada del temporizador 2, canal 3. Mi frecuencia APB2 es de 1 MHz. El preescalador TIM2 es 1000 y el período de contador es 10000. Cada vez que se administra un pulso, se produce un flanco descendente.

Ahora, en el código que tengo:

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_IC_CaptureCallback could be implemented in the user file
   */
  if(htim->Instance == TIM2){
      inputCaptureVal = __HAL_TIM_GetCounter(htim);
      __HAL_TIM_SetCounter(htim,0);
  }
}

En el bucle while tengo otra variable:

counterVal = __HAL_TIM_GetCounter(htim2);

¿Es esta la manera correcta de obtener el período? Agradecería cualquier orientación, ya que es la primera vez que utilizo la captura de entrada.

    

1 respuesta

1

Hay algunas cosas que están mal hasta ahora, por lo que será difícil obtener la respuesta correcta de una sola vez. Trabaje en los siguientes consejos y vea si puede llegar a algún lugar con preguntas más específicas para responder.

Para empezar, debe prestar atención a los comentarios en el código de la placa de la HAL: 1) implemente su propio HAL_TIM_IC_CaptureCallback para que CubeMX no sobrescriba su código. 2) no uses UNUSED si usas el argumento.

En cuanto a la lógica, la devolución de llamada se ve bien: se toma el valor del temporizador cuando se produce el disparo PPR. Pero luego necesitas usar ese valor en algún lugar para hacer tu cálculo de RPM.

No estoy seguro de lo que quieres decir con "el bucle while", pero el fragmento de código no parece útil. Ya has llamado a _GetCounter , así que no tienes que volver a hacerlo. Simplemente use el inputCaptureVal de su devolución de llamada. También tenga cuidado con la concurrencia: si intenta utilizar inputCaptureVal mientras se está actualizando en el contexto de interrupción, su cálculo puede estar dañado.

Finalmente, revisa tus unidades. Parece que su contador está en milisegundos (1 MHz dividido por 1000 preescalador), por lo que para obtener RPM necesitará: RPM = 60000 / contador.

    
respondido por el Heath Raftery

Lea otras preguntas en las etiquetas