Estoy tratando de medir el tiempo transcurrido entre dos interrupciones externas generadas por los flancos ascendentes de una señal PWM (generada utilizando un temporizador IC 555). El objetivo es determinar la frecuencia de la señal. Estoy utilizando el GPT (temporizador de propósito general) en modo de captura de entrada. La rutina de devolución de llamada se menciona en el código a continuación.
void HAL_TIM_IC_CaptureCallback (TIM_HandleTypeDef * htim)
{
if (htim->Instance == TIM2)
{
input_capture = __HAL_TIM_GET_COMPARE(&htim2, TIM_CHANNEL_1); // leer el valor de captura del canal 1 de TIM2
frecuencia = input_capture - input_capture_prev;
input_capture_prev = input_capture;
FLAG ++;
}
}
Cada vez que sucede una interrupción externa, tomo el tiempo del temporizador y lo resto con el tiempo en que sucedió una interrupción anterior. Ahora quiero hacer un búfer y tomar 20 muestras que dividiré por la longitud de un búfer para obtener una lectura precisa. Básicamente quiero hacer una función que inicie el temporizador en modo de interrupción, tome 20 muestras, las divida por 20 y devuelva el valor preciso y después de eso desactive el temporizador. Aquí está el código de la función.
uint32_t sampleCapacitance(void)
{
uint32_t sum = 0;
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
FLAG = 0;
while (FLAG <20)
{
buffer[FLAG] = frecuencia;
sum + = buffer[FLAG];
}
HAL_TIM_IC_Stop_IT(&htim2, TIM_CHANNEL_1);
regrésar suma/20;
}
Todas las variables utilizadas que no están definidas localmente son variables volátiles globales. Estoy llamando a esta función cada 1000 ms, el período de la señal PWM tiene una longitud variable (algunos ms a aprox. 100 ms). La frecuencia del reloj del sistema es de 48 MHz, y el valor del preescalador del temporizador es de 47999+1 que da una base de tiempo de 1000 Hz. Por alguna razón, esto no funciona correctamente (los valores del búfer son principalmente 0, excepto en el índice 20 y 0). Me gustaría saber si hay una manera más inteligente de hacer esto y hacer que funcione. Realmente soy nuevo en la programación de MCU, especialmente con la arquitectura ARM Cortex, así que cualquier ayuda sería apreciada. Gracias de antemano.