Citation preview

Contador 0-99 con Timer Virtual Angélica Bustos Sáenz, Sebastián Moreno Mora [email protected], [email protected] Universidad Central • 4 canales independientes que se pueden utilizar para: o Captura de señal (de entrada) o Comparación de cuenta (para salida) o Generación automática de señales PWM o Salida en modo “un pulso” • Generación automática de señales de interrupción en diferentes eventos.

Resumen: En la práctica de laboratorio, se realizó la programación para un contador de 0 a 99, configurando el Timer 2 del microcontrolador STM32F407VX, quien es el que genera el pulso cada segundo. Índice de Términos: Timer, preescalar, Periodo, STM32F407VX, Display 7 Segmentos. Abstract: In the laboratory practice, programming was performed for a counter from 0 to 99, for this the timer 2 of the STM32F407VX microcontroller was configured, which is the one that pulses every second pulse.

I.

-

-

Base de Tiempos El circuito de base de tiempos está formado por tres bloques, cada uno de ellos con un registro asociado: 1. El contador 2. El prescaler 3. Registro de Autorecarga (ARR)

INTRODUCCION

Una característica fundamental de los microcontroladores STM32F407VX es que tienen la capacidad de trabajar con tiempos con una gran precisión. El periférico que realiza estas funciones son los timmer. Especificamente en este laboratorio se introduce en el funcionamiento y configuración del tim2. II.

Podemos dividir el timer en dos grandes bloques, la circuitería de base de tiempos y los canales de captura/comparación.

En la siguiente figura se pueden ver los tres bloques de la base de tiempos.

Figura 1. Diagrama de bloques del circuito de base de tiempos

MARCO TEORICO

Timer de Propósito General La familia de microcontroladores STM32F4 tiene una serie de timers de propósito general (TIM2 a TIM5) que tienen las siguientes características: • Contador de autorecarga de 16 o 32 bits, con cuenta creciente o decreciente. • Prescaler programable de 16 bits para dividir la frecuencia de reloj por un valor entre 1 y 65535.

III.  

MATERIALES

Tarjeta STM32F4 DISCOVERY Display 7 Segmentos

PROBLEMÁTICA: “Diseñar un contador de 0 a 99 con el tim2 de la tarjeta de desarrollo, y que se visualice en el display 7 segmentos”.

IV.

DESARROLLO DE CONTENIDOS

𝐹 = (𝑇𝑖𝑚

𝑇𝑖𝑚𝑒𝑟_𝐶𝑙𝑜𝑐𝑘

(1)

𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 +1)∗𝐴𝑅𝑅

1. Crear el proyecto en STM32CubeMX, y asignar los puertos de salida para los displays.

De los cuales tenemos los siguientes datos 1𝐻𝑧 =

84𝑀𝐻𝑧 (𝑇𝑖𝑚𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 + 1) ∗ 𝐴𝑅𝑅

Sin embargo sabemos que como el prescaler se usa para reducir la velocidad del reloj del temporizador, se utiliza la siguiente formula 𝑇𝑖𝑚𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 =

𝑇𝑖𝑚𝑒𝑟_𝐶𝑙𝑜𝑐𝑘

1𝐻𝑧 =

Figura 2. Configuración de Pines I/O

DISPLAY1 Puerto Pin PE9 A PE10 B PE11 C PE12 D PE13 E PE14 F PE15 G

DISPLAY2 Puerto Pin PD0 A PD1 B PD2 C PD3 D PD6 E PD7 F PB4 G

8400

=

84𝑀ℎ𝑧 8400

= 10𝐾𝐻𝑧 (2)

84𝑀𝐻𝑧 (10𝐾𝐻𝑧 + 1) ∗ 𝐴𝑅𝑅

Ya con estos datos procedemos a hallar el ARR. 𝐴𝑅𝑅 =

84𝑀𝐻𝑧 (10𝐾𝐻𝑧 + 1) ∗ 1𝐻𝑧

𝐴𝑅𝑅 = 9999 + 1 = 10000 Estos datos se diligencian en:

Tabla1. Asignación de Puertos con Pines Display

2. Realizar la configuración del TIM2 La frecuencia del Microcontrolador es de 168MHz, la cual se divide en 4 para que trabaje a una frecuencia de 84MHz.

Figura 4. Configuración Prescalar y Counter Period / STM32Cube

O en el código de tim.c

Figura 3.Configuración Clock

Como el objetivo de la práctica de laboratorio es que se genere el cambio cada segundo que es lo mismo decir 1Hz, se configura la frecuencia con la siguiente formula:

Figura 5 Configuración Prescalar y Counter Period / Codigo

3. Se genera proyecto en Atollic.

- Se llaman las librerias.h

3.1 Para generar el cambio de numero, se guarda en un timer virtual, donde se generan unas condiciones, las cuales se direccionan donde esta guardado el registro del timer 2. Esta configuación se encuentra en tim.c Figura 9. Liberias incluidas en el programa

- Se crean 2 vectores I (Decenas) y J(Unidades) los cuales contiene las funciones de los numeros. Figura 6 Configuración Timer Virtual

La figura 6 indica que si el timer virtual esta active, incremente su valor, y si el valor del incremento es igual al valor del periodo, inicialice el timer virtual en 0. Estos valores se inicializan en el main.c como se muestra en la figura 7

int display_1_On[10]={Cero,Uno,Dos,Tres,Cuat ro,Cinco,Seis,Siete,Ocho,Nueve}; int display_2_On[10]={Cero_1,Uno_1,Dos_1,Tre s_1,Cuatro_1,Cinco_1,Seis_1,Siete_1,Ocho _1,Nueve_1}; Figura 10. Creación de vectores de los displays -

Se establecen los valores iniciales de las variables, el timer 2 y el timer virtual.

Figura 7 Inicialización de Valores de Timmer

3.2 Se definen las funciones de los numeros para asignar los pines de los puertos E y D a cada uno, y asi se puedan visualizar en el display. Esto se encuentra en la libreria GPIO.H

Figura 11. Inicialización de Valores

Figura 8 Definicion de Funciones para asignacion de pines

3.3 En el programa principal main.c

Se realiza un ciclo infinito para que cuenten las variables y se visualicen en el display.

while (1) { if (Timer_1.expired_timer==YES) //Si el timer esta expirado ==1 { Timer_1.expired_timer=NOT; //Borrar el estado del timmer y asignarle 0 j++; // Incrementar las Unidades if (j>9) //Unidades es mayor a 9? { i++;//Incremente las decenas j=0; //Devuelva las unidades a 0 } if (i>9) //Las decenas es mayor que 9 i=0; //Asigne a las decenas el valor de 0 HAL_GPIO_WritePin(GPIOE,Reset_1,GPIO_PIN_R ESET); //Borre los registros de Decenas HAL_GPIO_WritePin(GPIOE,display_1_On[i],GP IO_PIN_SET); //Escriba el registro en decenas y mantengalo HAL_GPIO_WritePin(GPIOD, Reset_2,GPIO_PIN_RESET);HAL_GPIO_WritePin( GPIOB,Reset_2,GPIO_PIN_RESET); //Borre los registros de Decenas HAL_GPIO_WritePin(GPIOD, display_2_On[j],GPIO_PIN_SET);HAL_GPIO_Wri tePin(GPIOB, display_2_On[j],GPIO_PIN_SET); }

Figura 12 Programa principal

4.

Se realiza el montaje y las conexiones correspondientes en protoboard.

relacionadas entre si, es decir que estaban llamadas en los dos archivos, pero solo el programa principal (main.c) la leia, y en esta no estaba guardada todas las configuraciones del timer virtual que se hicieron en el tim.c, que se pueden evidenciar en la figura 6. En el timer virtual cuando se daban los valores iniciales en el main.c la funcion Timer_1.period_timer estaba inicializada en 0, por lo cual cuando ingresaba al bucle donde preguntan if (Timer_1.value_timer==Timer_1.per iod_timer) de la configuración del timer

virtual que se encuentra en la figura 6, el valor del timmer aumentaba y comparaba el valor con el del periodo, pero no era consistente, por lo cual se demoraba mucho tiempo en generar un cambio, y no se podía visualizar en el display.

VI.

Para el desarrollo de esta práctica se tuvieron en cuenta varios aspectos, tanto en programación, como por ejemplo la configuración y habilitación de los timer e interrupciones del microcontrolador.

VII.

Figura 13. Montaje en Protoboard.

V.

ANALISIS DE RESULTADOS

Uno de los inconvenientes que se presento, fue que la estructura TIM_HandleTypeDef htim2, la cual es la encargada de crear las funciones de los timer estaba definida en el main.c y tim.c, sin embargo no estaban

CONCLUSIONES

REFERENCIAS

[1] https://riunet.upv.es/bitstream/handle/10251/3953 8/ArticuloTimers.pdf?sequence=1 [2] http://embeddedsystemengineering.blogspot.com/ 2015/08/stm32f4-discovery-tutorial-9-timer.html