Medición directa de frecuencia con dos temporizadores hw

3

¿En qué modos puedo configurar dos temporizadores para medir directamente la frecuencia en un microcontrolador STM32F303? En este momento, configuro un temporizador en el modo ETR y lo conecto con interrupciones del software de systick, pero me gustaría tener un segundo temporizador directamente para aumentar la precisión.

    
pregunta Tomas Svitil

2 respuestas

3

EDITAR: debido a la baja precisión del HSI - 0.1%, el reloj debe cambiarse a HSE.

Estoy haciendo todo esto en cubeMX, por lo que no escribiré los bits, puede encontrarlos en el manual de referencia - enlace

Después de un poco de experimentación me di cuenta. Para simplificar, escribiré todo el proceso de configuración de 2 contadores para medir la frecuencia directamente.

Primero el contador principal, tomemos TIM1:

  • Ajuste el reloj a ETR2
  • Establezca el disparador en ITRx, puede encontrar el correcto consultando la conexión interna del disparador TIMx, por ejemplo. Si desea que TIM1 sea el contador principal, puede activarlo con TIM15 seleccionando ITR0.
  • Habilite un canal de captura de entrada activado por TRC, esto registrará el conteo de pulsos después de cada puerta
  • Ahora las cosas clásicas del temporizador: establezca el Periodo del contador (carga automática) en 0xffff máx. para TIM1

Y esa es la configuración del contador principal. Ahora para el temporizador de activación, tomemos TIM15:

  • Establezca la fuente del reloj en interna
  • Establezca una salida para comparar la salida en el canal 1 (cualquier canal funcionará) Ajustes de parámetros:
  • En la salida de activación, seleccione Comparar pulso (OC1) como evento de activación
  • Y establezca el preescalador apropiado, el período de contador y (pulso? no estoy seguro si es necesario). P.ej. para 1s, con reloj de 72MHz, elegí 7199 para el prescaler y 9999 para el período del contador
  • El modo de comparación de salida debe estar en modo congelado

Eso es toda la configuración hecha. Después de generar el proyecto, no olvides iniciar todos los temporizadores, por ejemplo,

HAL_TIM_Base_Start(&htim1);
HAL_TIM_IC_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_Base_Start(&htim15);
HAL_TIM_OC_Start(&htim15, TIM_CHANNEL_1);

Y la frecuencia se puede leer en la unidad de comparación de captura,

frequency= __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_1);

Esto es, por supuesto, asumiendo que el tiempo de puerta es 1s.

    
respondido por el Tomas Svitil
0

Si lo entiendo bien, ¿quiere medir una frecuencia externa conectada a un pin de E / S de su MCU?

¿Y el segundo temporizador que necesitas como puerta de referencia? Solo para asegurarte de que te entiendo bien.

Hay notas de aplicación de ST acerca de la calibración del RC Osc interno. Describen cómo se utilizan los relojes y contadores ("temporizador") para obtener la mejor precisión. Tengo una mirada si encuentro esto otra vez.

Así que al final depende de qué frecuencia. el rango que desea medir y los relojes que tiene disponibles (frecuencia y precisión). Me puede decir mas acerca de eso.

mi enfoque sería conf. Una unidad de temporizador en modo de captura (captura desde io pin)

    
respondido por el user3336433

Lea otras preguntas en las etiquetas