Cómo obtener datos del sensor en intervalos de tiempo fijos

0

Estoy usando un microcontrolador STM (stm32l432kb). En mi aplicación, necesito obtener los datos del sensor en un intervalo fijo (según el modo seleccionado). Como tengo que seleccionar los modos: -
Modo 1: que genera los datos en un intervalo fijo de 5 segundos.
Modo 2: que genera los datos en un intervalo fijo de 10 segundos.
Modo 3: el cual da salida a los datos en un intervalo fijo de 15 segundos.

Aquí estoy un poco confundido de cómo obtener estos datos en función de los modos.

    
pregunta SACHIN RAJPUT

2 respuestas

2

Una idea es hacer uso de las interrupciones del temporizador. El "Modo" restablecerá el temporizador y decidirá el valor inicial cargado al temporizador. El valor cargado depende del intervalo de tiempo que desee. En cada interrupción del temporizador, el control cambiará a su ISR, donde leerá el valor del sensor.

El pseudocódigo tendrá un aspecto similar al siguiente:

Timer_ISR()    
{
x = readSensor();
}
    
respondido por el MITU RAJ
0

Si usa cubemx y HAL_Driver layer, por ejemplo, su frecuencia de actualización del temporizador es 40MHZ (verá en el reloj esquemático en cubeMx), y sus condiciones iniciales para el temporizador fueron, por ejemplo:

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 40000;                       //40e6/40e3 = 1000 ms
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 5000;                   //If you want five seconds for initial interruption
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)

Con este código sabrías que tu temporizador se interrumpe cada 5 segundos. Luego, el código basado en el modo seleccionado, supuse que podría ser algo como esto:

void prepare_timer(char mode){
    htim2.Init.Period = mode * 5000;
    TIM_Base_SetConfig(TIM2, &htim2.Init);
}

Y luego, solo debes configurar el temporizador a través del código de dos líneas. Obviamente, antes de todo esto, necesita activar NVIC en CubeMX. Y ponga esta función prepare_timer () dentro del controlador:

void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */
--------------maybe here----------------------
  /* USER CODE END TIM2_IRQn 1 */
}

Tal vez deba hacer __HAL_TIM_ENABLE(&htim2); o algo para habilitar el conteo, etc.

    
respondido por el JotaCorp

Lea otras preguntas en las etiquetas