Вы находитесь на странице: 1из 4

Contador 0-99 con Timer Virtual

Angélica Bustos Sáenz, Sebastián Moreno Mora


abustoss1@ucentral.edu.co, smorenom5@ucentral.edu.co
Universidad Central

Resumen: En la práctica de laboratorio, se • 4 canales independientes que se pueden


realizó la programación para un contador de 0 utilizar para: o Captura de señal (de entrada) o
a 99, configurando el Timer 2 del Comparación de cuenta (para salida) o
microcontrolador STM32F407VX, quien es el Generación automática de señales PWM o
que genera el pulso cada segundo. Salida en modo “un pulso”
• Generación automática de señales de
Índice de Términos: Timer, preescalar, interrupción en diferentes eventos.
Periodo, STM32F407VX, Display 7
Segmentos. Podemos dividir el timer en dos grandes
bloques, la circuitería de base de tiempos y los
Abstract: In the laboratory practice, canales de captura/comparación.
programming was performed for a counter
from 0 to 99, for this the timer 2 of the - Base de Tiempos
STM32F407VX microcontroller was
configured, which is the one that pulses every El circuito de base de tiempos está formado por tres
second pulse. bloques, cada uno de ellos con un registro asociado:
1. El contador
2. El prescaler
3. Registro de Autorecarga (ARR)
I. INTRODUCCION
En la siguiente figura se pueden ver los tres
Una característica fundamental de los
bloques de la base de tiempos.
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 Figura 1. Diagrama de bloques del circuito de base de
configuración del tim2. tiempos

II. MARCO TEORICO


III. MATERIALES
- Timer de Propósito General
 Tarjeta STM32F4 DISCOVERY
La familia de microcontroladores STM32F4  Display 7 Segmentos
tiene una serie de timers de propósito general
(TIM2 a TIM5) que tienen las siguientes PROBLEMÁTICA: “Diseñar un contador
características: de 0 a 99 con el tim2 de la tarjeta de desarrollo,
• Contador de autorecarga de 16 o 32 bits, con y que se visualice en el display 7 segmentos”.
cuenta creciente o decreciente.
• Prescaler programable de 16 bits para dividir
la frecuencia de reloj por un valor entre 1 y
65535.
IV. DESARROLLO DE
CONTENIDOS 𝑇𝑖𝑚𝑒𝑟_𝐶𝑙𝑜𝑐𝑘
𝐹 = (𝑇𝑖𝑚 (1)
𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 +1)∗𝐴𝑅𝑅
1. Crear el proyecto en STM32CubeMX, y De los cuales tenemos los siguientes datos
asignar los puertos de salida para los
displays. 84𝑀𝐻𝑧
1𝐻𝑧 =
(𝑇𝑖𝑚𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 + 1) ∗ 𝐴𝑅𝑅

Sin embargo sabemos que como el prescaler se


usa para reducir la velocidad del reloj del
temporizador, se utiliza la siguiente formula
𝑇𝑖𝑚𝑒𝑟_𝐶𝑙𝑜𝑐𝑘 84𝑀ℎ𝑧
𝑇𝑖𝑚𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟 = = = 10𝐾𝐻𝑧 (2)
8400 8400

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

Figura 2. Configuración de Pines I/O Ya con estos datos procedemos a hallar el


ARR.
DISPLAY1 DISPLAY2
Puerto Pin Puerto Pin 84𝑀𝐻𝑧
PE9 A PD0 A 𝐴𝑅𝑅 =
(10𝐾𝐻𝑧 + 1) ∗ 1𝐻𝑧
PE10 B PD1 B
PE11 C PD2 C
PE12 D PD3 D 𝐴𝑅𝑅 = 9999 + 1 = 10000
PE13 E PD6 E
PE14 F PD7 F Estos datos se diligencian en:
PE15 G PB4 G
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 Figura 5 Configuración Prescalar y Counter Period /
frecuencia con la siguiente formula: 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.

int
Figura 6 Configuración Timer Virtual display_1_On[10]={Cero,Uno,Dos,Tres,Cuat
ro,Cinco,Seis,Siete,Ocho,Nueve};
La figura 6 indica que si el timer virtual esta int
active, incremente su valor, y si el valor del display_2_On[10]={Cero_1,Uno_1,Dos_1,Tre
s_1,Cuatro_1,Cinco_1,Seis_1,Siete_1,Ocho
incremento es igual al valor del periodo, inicialice _1,Nueve_1};
el timer virtual en 0. Figura 10. Creación de vectores de los displays

Estos valores se inicializan en el main.c como se - Se establecen los valores iniciales de las
muestra en la figura 7 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

- Se realiza un ciclo infinito para que cuenten


las variables y se visualicen en el display.
Figura 8 Definicion de Funciones para asignacion de pines

3.3 En el programa principal main.c


relacionadas entre si, es decir que estaban
while (1) llamadas en los dos archivos,
{
if (Timer_1.expired_timer==YES) //Si el pero solo el programa principal (main.c) la
timer esta expirado ==1 { leia, y en esta no estaba guardada todas las
Timer_1.expired_timer=NOT; //Borrar el
estado del timmer y asignarle 0
configuraciones del timer virtual que se
j++; // Incrementar las Unidades hicieron en el tim.c, que se pueden evidenciar
if (j>9) //Unidades es mayor a 9? en la figura 6.
{
i++;//Incremente las decenas
j=0; //Devuelva las unidades a 0 En el timer virtual cuando se daban los valores
}
if (i>9) //Las decenas es mayor que 9
iniciales en el main.c la funcion
i=0; //Asigne a las decenas el valor de 0 Timer_1.period_timer estaba
inicializada en 0, por lo cual cuando ingresaba
HAL_GPIO_WritePin(GPIOE,Reset_1,GPIO_PIN_R
ESET); //Borre los registros de Decenas al bucle donde preguntan if
(Timer_1.value_timer==Timer_1.per
HAL_GPIO_WritePin(GPIOE,display_1_On[i],GP
IO_PIN_SET);
iod_timer) de la configuración del timer
//Escriba el registro en decenas y virtual que se encuentra en la figura 6, el valor
mantengalo del timmer aumentaba y comparaba el valor
HAL_GPIO_WritePin(GPIOD, con el del periodo, pero no era consistente, por
Reset_2,GPIO_PIN_RESET);HAL_GPIO_WritePin( lo cual se demoraba mucho tiempo en generar
GPIOB,Reset_2,GPIO_PIN_RESET);
//Borre los registros de Decenas
un cambio, y no se podía visualizar en el
display.
HAL_GPIO_WritePin(GPIOD,
display_2_On[j],GPIO_PIN_SET);HAL_GPIO_Wri
tePin(GPIOB,
display_2_On[j],GPIO_PIN_SET);
}
VI. CONCLUSIONES
Figura 12 Programa principal

Para el desarrollo de esta práctica se tuvieron


4. Se realiza el montaje y las conexiones en cuenta varios aspectos, tanto en
correspondientes en protoboard. programación, como por ejemplo la
configuración y habilitación de los timer e
interrupciones del microcontrolador.

VII. 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
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