STM32F4: Configuración del ADC con un timer

Este tutorial debe seguirse después de haber realizado el tutorial sobre la configuración y el uso básico del ADC, el cual se encuentra en la lista de tutoriales de la placa de desarrollo STM32F4.

 

CONFIGURACIÓN INICIAL

Timer externo:

En este caso, en CubeMX, también seleccionamos el pin PA1 como pin de entrada al ADC, pero además, en las opciones de la izquierda que se muestran al desplegar el ADC1, debemos seleccionar External-Trigger-for-Regular-Conversion. Esto se debe a que vamos a utilizar un timer para controlar cuando realizamos las lecturas del ADC. Por lo tanto, tenemos que habilitar este timer también. Podría ser cualquiera de los que muestra cubeMX, nosotros hemos elegido el timer 1, canal 1. Entre las opciones posibles para su configuración, hemos elegido PWM generation CH1, para así utilizar la información de uno de los anteriores tutoriales, aunque ésta no sería la única opción.

Todo esto puede verse reflejado en la imagen siguiente, donde encontramos los pines ADC1_TIM1, TIM1_CH1 y ADC1_EXTI11, la casilla de External-Trigger-for-Regular-Conversion marcada y el timer configurado como PWM.

Pinout ADC – PWM Timer

Al activar estas opciones, la configuración del ADC y del timer es la que encontramos en las imágenes siguientes. En cuanto al timer, hemos impuesto una frecuencia de 1 KHz y un ciclo del 50%. Sabiendo que la frecuencia del sistema es de 96 MHz, nos queda la siguiente igualdad:

(Preescaler + 1)x(Periodo + 1) = fclk/fPWM

Donde suponemos el preescalado y el periodo y obtenemos el pulso.

Configuración del ADC y del PWM Timer

Se deja al lector la implementación del timer externo sin configuración PWM.

Timer interno:

Para este otro caso, seleccionamos un timer que no tenga muchas funcionalidades, como el timer 2 (TIM2). En la opción clock source, seleccionamos Internal Clock, y después en la pestaña de configuración, ponemos la misma configuración que teníamos con el PWM en los campos que sean iguales.
Es importante seleccionar en “Trigger Event Selection TRGO” la opción de Update Event.

 

LECTURA Y REPRESENTACIÓN DE LA SEÑAL

Timer externo:

Ahora conectaremos el pin asociado al TIM1_CH1 con el pin asociado al ADC1_EXTI11 con un cable externo, y el generador de funciones en la entrada del ADC (PA1). Estas señales se pueden visualizar en el osciloscopio para comprobar que efectivamente es como esperamos.
Pasamos la configuración de CubeMX a Eclipse. Ahora no solo tenemos que iniciar el ADC sino también el timer. Después, la toma de datos sería de la misma forma que en el anterior tutorial. Se deja al lector la tarea de implementar el código, sería necesario el código del tutorial anterior del ADC y del tutorial relacionado con el timer.

Sin embargo, aquí tenemos que tener en cuenta el teorema de Nyquist, puesto que ahora tenemos una frecuencia de muestreo conocida. La señal de entrada será de 50 Hz, ya que así dispondremos de 20 muestras por período. El array en el que se guardan será de 100 muestras, por lo que tendremos 5 períodos de una representación muy aproximada de la señal, como bien puede observarse en la imagen.

Señal de 1 KHz procesada por el ADC
Timer interno:

En este caso no sería necesario conectar ningún cable adicional.
Tras pasar la configuración a Eclipse, iniciamos el timer de una forma diferente a la anterior, utilizando la función HAL_TIM_Base_Start(&htim2). Y ya podríamos correr nuestro código.

 

Nota: la imagen de la portada se ha obtenido de Jóvenes Científicos