0% encontró este documento útil (0 votos)
91 vistas19 páginas

Control de Microcontroladores con Dimmer y Timers

Este documento describe el uso de timers y captura/comparación en microcontroladores. Explica conceptos básicos de timers y su aplicación en un módulo dimmer de luz AC. También presenta la metodología para implementar timers en un microcontrolador STM32 para controlar la intensidad de una lámpara.

Cargado por

Adair Téllez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
91 vistas19 páginas

Control de Microcontroladores con Dimmer y Timers

Este documento describe el uso de timers y captura/comparación en microcontroladores. Explica conceptos básicos de timers y su aplicación en un módulo dimmer de luz AC. También presenta la metodología para implementar timers en un microcontrolador STM32 para controlar la intensidad de una lámpara.

Cargado por

Adair Téllez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Universidad Autónoma de Querétaro

Facultad de Ingeniería

Campus San Juan del Río

Estudiantes:
Adair Téllez Aviles
Axel Aarón Reséndiz Linares

Carrera: Ingeniería Electromecánica

Expedientes:
298497
292726

Maestro: M.C. Leonardo Esteban Moreno Suárez

Materia: Microcontroladores

Timers (Captura/Comparación).

Fecha: 19-09-2023
Microcontroladores

Introducción
Respecto a la implementación, se debe deben de tener en cuenta ciertos conceptos, los cuales son Módulo
Dimmer De Luz Ac Control Potencia 1 Canal el cual te permite agregar control de voltaje AC y un timer, el
cual se ejecuta cada cierto periodo de tiempo, el cual realiza una serie de procesos cuando se le indica.

El timer es un objeto que tiene como funcionalidad ejecutar una función o bloque de código cada cierto
tiempo. Esto tiene muchas aplicaciones ya que no depende de la acción por parte de usuario para ejecutar
cierto código.vi

EL módulo Dimmer de Luz AC y de Potencia AC de 1 canales, te permite agregar control de voltaje AC para
aplicaciones de control de iluminación de lámparas incandescentes o control de potencia en resistencias
calefactoras para control de temperatura, también se puede utilizar para controlar motores de AC
universales, que contienen algunos bombas, ventiladores y taladros.

El módulo puede trabajar con un nivel de alimentación de 5 o 3.3V por los que es compatible con
microcontroladores de 3.3V y 5V (como arduino uno, mega, nodemcu, etc) .vii

La práctica consistió en utilizar el módulo Dimmer para capturar el cruce por cero de la señal eléctrica,
posteriormente al ya tener capturado el cruce por cero, se muestra el porcentaje de luminosidad o de
velocidad según sea el caso, esto al presionar un push button.

Objetivo
Realizar un código, en el software STM32CubeIDE, capaz de mostrar en una pantalla la intensidad de
iluminación de un foco o la velocidad de un motor AC, esto se deberá de realizar con ayuda del cruce por
cero de la señal, para que así se comience el conteo, lo anterior mencionado deberá de activarse con un
push button, finalmente realizar la simulación correspondiente en Proteus para la tarjeta STM32F103C8T6
y finalmente implementarlo en la tarjeta STM32G031K8.

Metodología

La metodología aplicada en la realización de esta práctica fue la siguiente.


i. Definición de objetivos: Se estableció los objetivos de la práctica, los cuáles fueron mostrar el
porcentaje de velocidad del motor o de luminosidad del foco incandescente (según sea el caso), en
la pantalla LCD 2x16 utilizando los pines de propósito general.
ii. Diagrama de flujo del código: Se presenta el siguiente diagrama de flujo, el cuál muestra a detalle la
metodología utilizada en el desarrollo del código para lograr el objetivo mencionado anteriormente.
Microcontroladores

• Creación de archivo de cabecera.


Creación de • Creación de archivo fuente.
archivos

• Función wcom: esta función es utilizada para realización de comandos.


• Función wdat: esta función es utilizada para imprimir caracteres en la pantalla.
Creación de • Función init_lcd: esta función configura e inicializa la pantalla para poder ser utilizada.
funciones

• Se crean los caracteres especiales en la matriz de 5x8, en esta práctica se crearon caracteres
especiales relacionados a tildes.
Caracteres
especiales
• Guardar los caracteres especiales en memoria para después ser utilizados.

•Creación de un ciclo infinito.


•Lectura de puerto
Escribir en
pantalla •Mostrar porcentaje de velocidad o de intensidad luminosa.

Figura 1. Diagrama de flujo para código.

iii. Configuración de pines: Debido a que el microcontrolador utilizado el STM32G031K8, no tiene los
pines de propósito general utilizados en simulación en el puerto A, se realizó el ajuste para que los
pines que sirvan como salida sean los del puerto B, de igual forma se hace uso de dos pines del
puerto A que servirán como entradas, para la configuración de los pines se hace uso del manual del
microcontrolador iii(Capítulo 9), dicha configuración puede ser modificada de acuerdo al uso que se
dará a las entradas o salidas de propósito general.
iv. Simulación: La simulación se realizará en el software Proteus, debido a que es posible cargar el
archivo hexadecimal generado por el entorno de desarrollo y poder simular las instrucciones, el
microcontrolador utilizado en la implementación física no se encuentra en Proteus, por lo que se
simula utilizando el microcontrolador STM32F103C8T6, es importante mencionar que se deberá de
realizar los ajustes necesarios en el código, principalmente el encendido del microcontrolador y el
ajuste de los pines de propósito general, esta información puede ser consultada en el manual de
referencia.iv
v. Resultados: Se deberá de comparar los resultados obtenidos en simulación con los obtenidos de
manera experimental con la finalidad de discutir estos resultados y establecer si el desarrollo de la
práctica fue el correcto.

Respecto al proceso que se realiza dentro de la implementación, se muestra el siguiente diagrama de flujo,
cabe señalar que se debió de hacer dos implementaciones, uno con el microcontrolador STM32F103C8T6
y otro con el STM32G031K8, esto debido a que no se encuentran los componentes necesarios en proteus
para realizar la simulación correspondiente.
Microcontroladores

Realizar • Realizar conexiones para poder observar el funcionamiento de manera experimental.


conexion de
la tarjeta.

• No debera de contener errores para que pueda ser cargado a la tarjeta STM32F103C8T6.
Compilacion del
codigo

Carga del
codigo a la •De esta manera podremos corroborar que funciona de la manera adecuada.
tarjeta

•Debera de mostrar el porcentaje de velocidad o de luminosidad según sea el caso.


Observar los
resultados
•Se visualizara en los osciloscopios el comportamiento de las señales

Implementar en
•Deberemos de repetir los pasos anteriores para la tarjeta STM32G031K8.
microcontrolador
STM32G031K8

Figura 2. Diagrama de flujo para implementación física.

Desarrollo, resultados y discusión de los resultados


Los resultados obtenidos pueden ser divididos en dos partes fundamentales, primero la implementación
física utilizando el microcontrolador STM32F103C8T6 ya que no se puede simular esta práctica, y después
la implementación física del circuito utilizando el microcontrolador de gama baja STM32 G031K8.

Para el desarrollo de la simulación se generó un archivo fuente en el entorno de desarrollo STM32CubeIDE


al que se nombre luz.c, (es importante mencionar que se utilizó un archivo de cabecera, estos archivos
pueden observarse en los anexos), posteriormente se configuro los pines de acuerdo al manual de
referencia del microcontrolador (Capítulo 9), los pines por defecto tienen una configuración como entrada
de en modo analógico, y se configuro para que los pines fueran salidas de propósito general push-pull a
una velocidad de 50MHz, la metodología para realizar esta configuración fue la siguiente. Se utilizó el
registro bajo de configuración de puerto, para la configuración de estos pines se consideran las siguientes
posibilidades de configuración para CNFy.

Modo de entrada
00: Modo analógico
01: Entrada flotante
10: Entrada con pull-up / pull-down
11: Reservado
Tabla 1 Configuración de pines.
Microcontroladores

Modo de salida
00: Salida de propósito general Push-pull
01: Salida de propósito general Open-
drain
10: Salida con función alterna Push-pull
11: Salida con función alteran Open-
drain
Tabla 2 Configuración de pines.

Y las posibilidades para la configuración de MODEy.

Modo
00: Modo entrada
01: Modo salida, velocidad máxima
10MHz
10: Modo salida, velocidad máxima 2MHz
11: Modo salida, velocidad máxima
50MHz
Tabla 3 Configuración de pines.

La forma para identificar si se trata de una entrada o salida de propósito general y su configuración, es
revisar el valor de defecto, para este microcontrolador el valor por defecto es un 4 en cada pin de todos los
puertos, por lo que se construye la Tabla 4.

CNF MODE
0 1 0 0
Tabla 4 Valor de reset en entradas/salidas de propósito general.

Es posible observar de la Tabla 4, que el valor hexadecimal corresponde a un 4, primero se observa las
columnas de mode y se observa que esta en modo entrada, después se revisa la Tabla 2 (correspondiente
a entrada) que se encuentra en configuración entrada flotante, se busca que los pines funcionen como
salidas push-pull a una velocidad de 50MHz, que en valor hexadecimal corresponde a un 3, por lo que se
configuran estos pines. Este mismo procedimiento es usado para la configuración de los pines que
funcionaran como entradas de propósito general, la siguiente tabla muestra a detalle los pines utilizados del
microcontrolador.

Puerto Pin Función


A 0 Salida, conectado al pin de
selección de registro de control
de datos
A 1 Salida, conectado al pin de
habilitación de la pantalla
A 4 Salida, conectado a D4,
perteneciente al bus de datos de
la pantalla
Microcontroladores

A 5 Salida, conectado a D5,


perteneciente al bus de datos de
la pantalla
A 6 Salida, conectado a D6,
perteneciente al bus de datos de
la pantalla
A 7 Salida, conectado a D7,
perteneciente al bus de datos de
la pantalla
B 0 Entrada, conectado al push
button que acciona el sistema,
configurada como pull-up / pull-
down.
B 1 Entrada, conectada a Pzc Pd del
módulo Dimmmer configurada
como pull-up / pull-down.
B 2 Entrada, configurada como
analógica.
B 3 Salida, conectada a Pd del
módulo Dimmmer configurada
con una velocidad de 2 MHz
configurada como propósito
general push-pull
Tabla 5 Configuración de pines.

Una vez realizado el código se genera un archivo en el software de simulación Proteus y se realizan las
conexiones (Figura 3), cabe señalar que esta simulación solo es para mostrar como se hacen las
conexiones, esto cuando no se cuenta con el módulo Dimmer.
Microcontroladores

Figura 1 Conexión en simulación.

Al no tener la certeza de que funcionaba el código, se procedió a llevarlo de manera experimental con la
tarjeta STM32F103C8T6, para ello utilizamos la Tabla 5, para realizar las conexiones.

Figura 4 Conexión física tarjeta STM32F103C8T6.

Con el circuito anterior se experimento para corroborar que funcionaba de la manera esperada, pues como
se mencionó anteriormente proteus no cuenta con los elementos necesarios para llevarla a cabo.
Microcontroladores

Tras el haber obtenido el resultado esperado, se realizaron las modificaciones correspondientes al código
para adaptarse al microcontrolador de gama baja STM32G031K8.
La primera modificación que se realizó fue que se utilizó los pines del puerto B como salidas a la pantalla
LCD (esto debido a que el puerto B no cuenta con los mismos pines que el microcontrolador usado en
simulación), tres pines del puerto A se usaron como entradas y un pin se utilizó como salida la selección de
pines del microcontrolador se detalla en la siguiente tabla.

Puerto Pin Función


B 0 Salida, conectado al pin de
selección de registro de control
de datos
B 1 Salida, conectado al pin de
habilitación de la pantalla
B 4 Salida, conectado a D4,
perteneciente al bus de datos de
la pantalla
B 5 Salida, conectado a D5,
perteneciente al bus de datos de
la pantalla
B 6 Salida, conectado a D6,
perteneciente al bus de datos de
la pantalla
B 7 Salida, conectado a D7,
perteneciente al bus de datos de
la pantalla
A 0 Entrada, conectado al push
button que acciona el sistema,
configurada como pull-up / pull-
down.
A 1 Entrada, conectada a Pzc Pd del
módulo Dimmmer configurada
como pull-up / pull-down.
A 4 Entrada, configurada como
analógica.
A 5 Salida, conectada a Pd del
módulo Dimmmer configurada
con una velocidad de 2 MHz
configurada como propósito
general push-pull
Tabla 6 Configuración de pines para modelo experimental.

Se utiliza el manual de referencia de este microcontrolador para realizar las modificaciones necesarias (el
código con las modificaciones se puede observar en los Anexos) para posteriormente cargar el código al
microcontrolador.
Microcontroladores

Posteriormente se carga el código al microcontrolador y se hacen pruebas para verificar el funcionamiento


del código (Figura 5).

Figura 5 Conexión física tarjeta STM32G031K8 y experimentación.

Como se observa en la Figura 5, se realizó una prueba de luminosidad en un foco, donde se observa que
esta encendido el foco, esto se hace al presionar el push button.
Si se observa mas detalladamente la Figura 5, se nota que hay dos osciloscopios conectados, en la Figura
6 y 7 se muestran mas de cerca las imágenes, donde el osciloscopio izquierdo no está mostrando el cruce
por cero de nuestra señal y el osciloscopio derecho nos muestra la señal de salida de nuestro
microcontrolador, donde se nota que porcentaje de luminosidad cuenta, si se contara con el 100% de
luminosidad la señal mostrada debería de ser una sinusoidal pura.
Microcontroladores

Figura 6. Cruce por cero y señal de salida respectivamente.

Finalmente se agregan fotografías de una intensidad de 40% y de 75%.

Figura 7 y 8. Experimentación con 40% de luminosidad.

Figura 9. Señal de osciloscopio de la salida del microntrolador con 40% de luminosidad.


Microcontroladores

Figura 7 y 8. Experimentación con 40% de luminosidad.

Figura 9. Señal de osciloscopio de la salida del microntrolador con 40% de luminosidad.

Finalmente se cumplió con el objetivo, el cual era el control de luminosidad de un foco o velocidad de un
motor, cabe señalar que se realizaron las pruebas en un motor AC y se corroboro que se puede hacer el
mismo funcionamiento, solo que se reportan datos del foco ya que es más fácil de visualizar el cambio con
luminosidad que con velocidad del motor.
Microcontroladores

Conclusiones individuales

Axel Aarón Reséndiz Linares

Adair Téllez Aviles


El detectar el cruce por cero de la señal eléctrica es de gran relevancia, puesto que de esta manera se sabe
cuándo se activa el timer, además de que es la parte fundamental del objetivo que se planteo al inicio, el
principal reto que se encontró fue el entendimiento de como funcionaba el módulo Dimmer ya que este fue
el componente que causa mas problema en cuestión de como opera, finalmente podemos denotar que la
programación para el microcontrolador STM32G031K8 y el STM32F103C8T6 son bastante similares,
puesto que solo basta con cambiar algunos registros, mientras que la principal problemática del
microcontrolador STM32G031K8 es que no cuenta con los puertos A suficientes y se tienen que hacer
ciertas modificaciones en la parte de programación para poder implementarlo de la manera adecuada.

Anexos

Anexo 1. Código para tarjeta STM32F103C8T6.


#include "lcd.h"
/*
* port A bit LCD
* 7 dato 7
* 6 dato 6
* 5 dato 5
* 4 dato 4
* 1 E
* 0 RS
*/
void delay(void){
int i;
for(i=0;i<880;i++);//50us
}

void wcom(char dato){


GPIOB->ODR &=~0x3;//manda a cero rs y e
GPIOB->ODR=(dato&0xF0)|(GPIOB->ODR&0x0F);//concatenacion de datos y
cuidado de datos
GPIOB->ODR |=0x2;
delay();
GPIOB->ODR &=~0x2;
GPIOB->ODR=(dato<<4&0xF0)|(GPIOB->ODR&0x0F);
GPIOB->ODR |=0x2;
Microcontroladores

delay();
GPIOB->ODR &=~0x2;
}
void wdat(char dato){
GPIOB->ODR &=~0x2;
GPIOB->ODR |=0x1;
GPIOB->ODR=(dato&0xF0)|(GPIOB->ODR&0x0F);
GPIOB->ODR |=0x2;
delay();
GPIOB->ODR &=~0x2;
GPIOB->ODR=(dato<<4&0xF0)|(GPIOB->ODR&0x0F);
GPIOB->ODR |=0x2;
delay();
GPIOB->ODR &=~0x2;
}
void init_lcd(void){
uint32_t i;
RCC->APBENR1 |=0x10000000; //habilitacion de puertos
while(!(RCC->APBENR1 &0x10000000));
RCC->IOPENR |= 0x3;
while(!(RCC->IOPENR &0x3));
GPIOB->MODER &=~0xAAAA;

GPIOB->ODR = 0;//mandar a cero


wcom(0x03);//
for(i=0;i<80000;i++);//5ms
wcom(0x03);
for(i=0;i<1920;i++);//120us
wcom(0x03);
for(i=0;i<1920;i++);//120us
wcom(0x02);
for(i=0;i<40000;i++);//5ms
wcom(0x28);//modo 4 bits
for(i=0;i<80000;i++);//10ms
wcom(0x28);//seguro de configuración
for(i=0;i<1920;i++);//120us
wcom(0x0C);//on
for(i=0;i<1920;i++);//120us
wcom(0x01);//clear
for(i=0;i<32000;i++);//2ms
wcom(0x06);//entry mode
}

uint32_t i;
Microcontroladores

int main(void){
init_lcd();

RCC->APBENR1 |= 0x10000001;
while(!(RCC->APBENR1&0x10000001));
RCC->APBENR2 |= 0x800;
RCC->IOPENR |= 0x1;
while(!(RCC->IOPENR&0x1));

GPIOA->MODER &=~0xF0F;
GPIOA->MODER |=0x100;
GPIOA->PUPDR |=0xA;

TIM2->CCMR1 |=0x68;
TIM2->CCER |=0x1;
TIM2->PSC=15;
TIM2->ARR=9999;
TIM2->CR1 |= 0x1;

wcom(0x80);
wdat('L');
wdat('u');
wdat('m');
wdat('i');
wdat('n');
wdat('o');
wdat('s');
wdat('i');
wdat('d');
wdat('a');
wdat('d');
wdat(0x91);
wdat('3');
wdat('5');
wdat('%');

while(1)//ciclo infinito
{
if(GPIOA->IDR &0x1)
{
Microcontroladores

while(GPIOA->IDR&0X2);
while(!(GPIOA->IDR&0X2))
{
TIM2->CNT=0;
}
while(TIM2->CNT<6500);
GPIOA->ODR|=0X10;
for(i=0; i<100; i++);
GPIOA->ODR&=~0X10;
}

}
}

Anexo 2. Código para tarjeta STM32G031K.

#include "lcd.h"
/*
* port A bit LCD
* 7 dato 7
* 6 dato 6
* 5 dato 5
* 4 dato 4
* 1 E
* 0 RS
*/
void delay(void){
int i;
for(i=0;i<20;i++);//50us
}

void wcom(char dato){


GPIOA->ODR &=~0x3;//manda a cero rs y e
GPIOA->ODR=(dato&0xF0)|(GPIOA->ODR&0x0F);//concatenacion
de datos y cuidado de datos
GPIOA->ODR |=0x2;
delay();
GPIOA->ODR &=~0x2;
GPIOA->ODR=(dato<<4&0xF0)|(GPIOA->ODR&0x0F);
Microcontroladores

GPIOA->ODR |=0x2;
delay();
GPIOA->ODR &=~0x2;
}
void wdat(char dato){
GPIOA->ODR &=~0x2;
GPIOA->ODR |=0x1;
GPIOA->ODR=(dato&0xF0)|(GPIOA->ODR&0x0F);
GPIOA->ODR |=0x2;
delay();
GPIOA->ODR &=~0x2;
GPIOA->ODR=(dato<<4&0xF0)|(GPIOA->ODR&0x0F);
GPIOA->ODR |=0x2;
delay();
GPIOA->ODR &=~0x2;
}
void init_lcd(void){
uint32_t i;
RCC->APB2ENR |=0x1C; //habilitacion de puertos
while(!(RCC->APB2ENR &=0x1C));
GPIOA->CRL = 0x33334433;

GPIOA->ODR = 0;//mandar a cero


wcom(0x03);//
for(i=0;i<2000;i++);//5ms
wcom(0x03);
for(i=0;i<48;i++);//120us
wcom(0x03);
for(i=0;i<48;i++);//120us
wcom(0x02);
for(i=0;i<2000;i++);//5ms
wcom(0x28);//modo 4 bits
for(i=0;i<4000;i++);//10ms
wcom(0x28);//seguro de configuración
for(i=0;i<48;i++);//120us
wcom(0x0C);//on
for(i=0;i<48;i++);//120us
Microcontroladores

wcom(0x01);//clear
for(i=0;i<800;i++);//2ms
wcom(0x06);//entry mode
}

int main(void){
init_lcd();

RCC->APB2ENR |=0x5;
while(!(RCC->APB2ENR&0x5));
RCC->APB1ENR |=0x10000003;
while(!(RCC->APB1ENR&0x10000003));
//---------------------------------------
GPIOB->CRL &=~0x444;
GPIOB->CRL |=0x2488;
//---------------------------------------
TIM3->CR2 |=0x80;
TIM3->CCMR1 |=0x70;
TIM3->CCER |=0x1;
TIM3->PSC =7;
TIM3->ARR = 8333;
TIM3->CR1 = 0x1;
//
wcom(0x80);
wdat('v');
wdat('e');
wdat('l');
wdat('o');
wdat('c');
wdat('i');
wdat('d');
wdat('a');
wdat('d');
wdat('7');
wdat('5');
Microcontroladores

uint16_t i;

while(1){
if(GPIOB->IDR&0X1)
{
while(GPIOB->IDR&0X2);
while(!(GPIOB->IDR&0X2))
{
TIM3->CNT=0;
}
GPIOB->ODR|=0X8;
while(TIM3->CNT<3125);
GPIOB->ODR&=~0X8;
}
else
for(i=0; i<0x36; i++)
GPIOB->ODR &=~0x4;
}

}
Anexo 3. Video timer 1.
https://youtu.be/lIfy9-Tckj4
Anexo 4. Video timer 2.
https://youtu.be/zkU64VnGcco

Bibliografía
i
Puertos de entrada/salida de propósito general (GPIO). (2019, junio 13). Github.io. https://logys.github.io/eleckia/docs/perifericos/gpio/gpio/

ii
Noviello, C. (2016). Mastering STM32: A Step-by-step Guide to the Most Complete ARM Cortex-M Platform, using a Free and Powerful Development
Environment Based on Eclipse and GCC.

iii
Mecafenix, I. (2017, mayo 22). Que es una pantalla LCD y para qué sirve. Ingeniería Mecafenix.
https://www.ingmecafenix.com/electronica/componentes/lcd/

iv
(S/f). Reference manual STM32G031K8. Recuperado el 4 de septiembre de 2023, de https://www.st.com/en/microcontrollers-
microprocessors/stm32g031k8.html

v
(S/f-b). Reference manual STM32F103C8T6. Recuperado el 4 de septiembre de 2023, de https://www.st.com/en/microcontrollers-
microprocessors/stm32f103/documentation.html
Microcontroladores

vi
Módulo Dimmer De Luz Ac Control Potencia 1 Canal. (s/f). Com.mx. Recuperado el 18 de septiembre de 2023, de
https://jelelectronica.mercadoshops.com.mx/MLM-713591569-modulo-dimmer-de-luz-ac-control-potencia-1-canal-_JM

vii
Timers. (2010, abril 24). Programación Orientada a Objetos 2. https://objetos2.wordpress.com/2010/04/24/timers-2/

También podría gustarte