0% encontró este documento útil (0 votos)
3 vistas16 páginas

Implementación de ADC y PWM en STM32

El documento detalla la práctica de implementación de un ADC, PWM y LCD utilizando el microcontrolador STM32G031K8T8 en un laboratorio de microcontroladores. Se describe la configuración de hardware y software, incluyendo la lectura de un sensor de corriente ACS712 y el control de un motor DC mediante un puente H. Además, se explican las funciones de programación necesarias para la visualización de datos en una pantalla LCD y la generación de señales PWM.

Cargado por

oruiz12
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)
3 vistas16 páginas

Implementación de ADC y PWM en STM32

El documento detalla la práctica de implementación de un ADC, PWM y LCD utilizando el microcontrolador STM32G031K8T8 en un laboratorio de microcontroladores. Se describe la configuración de hardware y software, incluyendo la lectura de un sensor de corriente ACS712 y el control de un motor DC mediante un puente H. Además, se explican las funciones de programación necesarias para la visualización de datos en una pantalla LCD y la generación de señales PWM.

Cargado por

oruiz12
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

Laboratorio de microcontroladores

Universidad Autónoma de Querétaro


Facultad de Ingeniería
Campus San Juan del Rio

Práctica 2: Implementación de ADC, PWM y LCD.

Alumno:
Oscar Ruiz Rivera

Exp: 283294

Carrera:
Ingeniería Electromecánica

Docente:
Leonardo Esteban Moreno Suárez

Fecha:
10/10/2024
Laboratorio de microcontroladores

I. Objetivo
Mediante el uso de un microcontrolador STM32G031K8T8 realizar la implementación de un ADC
para la lectura de un sensor de corriente, el cual estará monitoreando la corriente consumida por un
motor que será regulado mediante un PWM y los datos obtenidos se mostrarán en una pantalla LCD.
II. Introducción
STM32G031K8T6
El STM32G031K8T6 es un microcontrolador de la familia STM32 de 32 bits, basado en el núcleo
ARM Cortex-M0+ de bajo consumo y alto rendimiento. Este microcontrolador se destaca por su
eficiencia energética, flexibilidad y un conjunto robusto de características que lo hacen ideal para
aplicaciones embebidas. Funciona a una frecuencia de hasta 64 MHz, lo que le permite manejar
operaciones de manera rápida y eficiente en diversas tareas.
Entre sus características principales se incluyen 64 KB de memoria flash, 8 KB de SRAM, y una
amplia variedad de periféricos integrados como puertos GPIO, convertidores ADC de 12 bits, y
temporizadores avanzados, esenciales para tareas de control y generación de señales PWM. Además,
soporta diversas interfaces de comunicación como USART, SPI, I2C, lo que lo hace adecuado para
interactuar con otros dispositivos o módulos de manera eficiente.

Fig.1. Microcontrolador STM32G031K8T6.


Sensor de corriente ASC712-5A
El ACS712 utiliza el principio del efecto Hall para detectar la corriente que fluye a través de un
conductor. Este efecto consiste en generar un voltaje proporcional a un campo magnético
perpendicular cuando una corriente circula por un material conductor. Dentro del sensor, una cinta
de cobre lleva la corriente a medir, lo que genera un campo magnético que es detectado por un sensor
de efecto Hall integrado en el chip.

Fig.2. Sensor ACS712-5A.


Analog-to-Digital Conversion (ADC)
El ADC convierte una señal analógica continua en una señal digital discreta. Primero, el ADC realiza
un muestreo de la señal en intervalos regulares. Luego, cada muestra es cuantificada, asignándole un
Laboratorio de microcontroladores

valor numérico digital dentro de un rango definido por la resolución del ADC (por ejemplo, un ADC
de 10 bits tiene 1024 niveles). La señal cuantificada se codifica en formato binario y es enviada al
microcontrolador. El rango de medición del ADC está limitado por un voltaje de referencia (Vref), y
su función es esencial para procesar señales físicas (como voltaje o corriente) en sistemas digitales.
Liquid-Crystal Display (LCD)
Una pantalla LCD 16x2 es un dispositivo de visualización de cristal líquido que puede mostrar hasta
32 caracteres organizados en 2 filas de 16 caracteres cada una. El control de la pantalla se realiza
mediante un controlador integrado (generalmente el HD44780 o compatible), que se comunica con
el microcontrolador. Este controlador permite la manipulación de los caracteres que se muestran en
pantalla, así como el posicionamiento de dichos caracteres en cualquiera de las 32 posiciones
disponibles.

Fig.3. Pantalla LCD 16x2.


Puente H-L298N
El puente H L298N es un controlador de motores ampliamente utilizado para controlar la dirección y
velocidad de motores de corriente continua (DC) y motores paso a paso. Este módulo utiliza un diseño
de puente H, lo que permite controlar el flujo de corriente a través del motor para invertir la dirección
de giro y regular la velocidad mediante modulación por ancho de pulso (PWM).

Fig.4. Puente H-L298N.

III. Instrumentos y materiales


Laptop: Elemento esencial para la práctica en esta trabajaremos el código para el
microcontrolador.
Multímetro: Instrumento que nos ayuda a medir los voltajes en los pines de los elementos
del circuito.
Osciloscopio: Instrumento utilizado para observar el cambio de voltaje en la señal del sensor
de corriente.
Fuente de Voltaje: Utilizada para la alimentación a 12V del puente H.
Protoboard: Utilizada para realizar la prueba del circuito físico sin soldar.
Laboratorio de microcontroladores

STM32G031K8T6: Microcontrolador el cual nos permite llevar a cabo las instrucciones del
código programado.
Register-DataSheet: Manual de registros del microcontrolador, documento indispensable el
cual nos permite conocer la información de los registros del microcontrolador para su
programación.
Register-DataSheet LCD: Manual de códigos de programación para la pantalla LCD.
Sensor de corriente: Modelo ACS712 de 5A el cual nos permitirá medir la corriente
consumida del motor.
Puente H: Elemento utilizado para controlar el sentido de giro y la corriente consumida del
motor mediante PWM.
Motor DC: Elemento alimentado a 12V que nos permitirá tener una carga la cual podremos
medir con el sensor de corriente.
Potenciómetro: Resistencia variable utilizada para variar el ancho de pulso del PWM.
Cables dupont: Cables utilizados para hacer las conexiones del circuito.

IV. Metodología
Para comenzar con esta práctica se necesita crear un nuevo proyecto en el software de simulación
STM32CubeIDE, en este proyecto tendremos un archivo .c en el cual podremos programar las
diferentes opciones de los pines para poder observarlas en el microcontrolador. En este archivo .c se
incluye la librería principal main.h, una función main con la cual damos inicio a nuestro código de
programación y un ciclo infinito while (1).
Además, es necesario el conocimiento de la programación mediante registros, para esto es de suma
importancia contar con el manual de registros del microcontrolador este documento se puede
encontrar en la página oficial de STM electronics en específico para esta práctica la familia
G031K8T6.
Como primera instancia se realizará una librería para poder mandar e imprimir cadenas de caracteres
a la pantalla LCD, para esto creamos un archivo .h dentro de nuestro proyecto, además es necesario
revisar el register-datasheet del microcontrolador y el manual de la pantalla LCD, en este caso es una
HITACHI-HD44780U las cual en su manual nos especifica los códigos para su configuración,
definimos los 11 pines del microcontrolador para poder mandar información a la pantalla LCD.

Fig.5. Tabla de declaración de pines para LCD.


Laboratorio de microcontroladores

Fig.6. Configuración de pines A del microcontrolador.

Fig.7. Configuración de pines B del microcontrolador.


En las imágenes anteriores podemos observar el comando GPIOx_ODR en el cual podemos asignar
la dirección de la salida del pin para mandar información al microcontrolador de la pantalla para que
las traduzca en acciones que posteriormente se verán.
Después configuramos las siguientes funciones para controlar lo que hacemos con la pantalla:
Config_PINOUT(); En esta función debemos activar los reloj de los grupos A y B de los pines que
usaremos del microcontrolador vistos en la tabla anterior y configurarlos como salida generales.

Fig.8. Activación del reloj del grupo A y B.


En la imagen anterior podemos observar el comando RCC_IOPENR en la página 151 del manual de
registros del microcontrolador, con el cual podemos activar el reloj de los grupos A y B para los pines
del microcontrolador que usaremos. Colocamos un 1 en la casilla donde se encuentran los grupos que
queremos activas y tomando grupos de 4 casillas determinamos el numero en sistema hexadecimal
por lo que el comando sería el siguiente: RCC_IOPENR->|0x2, al no tener un valor de reset no es
necesario eliminar el valor anterior de los pines.
Laboratorio de microcontroladores

Fig.9. Configuración pines del grupo A como salidas generales.


En la imagen anterior podemos observar el comando GPIOx_MODER en la página 182 del manual
de registros del microcontrolador con el cual podremos activar los pines específicos que utilizaremos,
para este comando en lugar de x mostrada colocamos el grupo del pin que utilizaremos seguido de su
dirección en sistema hexadeciamal, en este caso al tener un valor de reset es necesario colocarlo para
evitar que los pines tomen un valor diferente al asignado, en la imagen solo se muestran los pines del
grupo A que se utilizarán como una salida de propósito general.
GPIOA_MODER->&=~(0xFF00); //Reset value
GPIOA_MODER->|5500; //Configuración de pines

Fig.10. Configuración pines del grupo B como salidas generales.


En esta imagen al igual que en la anterior se asigno como salida de propósito general pero ahora para
los pines de grupo B, ahora la x para a ser B y cambia la dirección de los pines.
GPIOB_MODER->&=~(0xFFFF); //Reset value
GPIOA_MODER->|5515; //Configuración de pines
De acuerdo con el manual de la pantalla LCH de HITACHI tenemos las siguientes instrucciones que
deberemos mandar conforme a los pines seleccionador del microcontrolador para realizar acciones
Laboratorio de microcontroladores

en la pantalla LCD, que podemos observar en la pagina 24. De acuerdo a estas instrucciones se
realizaron funciones específicas en le código que a continuación se describen:
Clear_LCD(); En esta función configuramos una limpieza de la pantalla, es decir, que estén los
espacios vacíos para poder escribir en la pantalla y ningún dato se reescriba.

Fig.11. Instrucción Clear display.


Fset_LCD(); En esta función configuramos la interfaz de la pantalla, las dos líneas de la pantalla para
visualización de caracteres y el tamaño 5x8 de los caracteres que se mostrarán en la pantalla.

Fig.12. Instrucción Function set.


LCD_ON(); En esta función encendemos la pantalla y el cursor.

Fig.13. Instrucción Display on/off control.


Cursor_move_direction(); En esta función configuramos el movimiento hacia la derecha del cursor
con un salto de carácter cada que se escribe uno nuevo.

Fig.14. Instrucción Entry mode set.


Jump_Line(); En esta función damos un salto de línea o renglón en la pantalla LCD.

Fig.15. Instrucción Set DDRAM address.


Después realizamos 2 funciones más que son las encargadas de mandar y escribir los datos en la
pantalla LCD:
LCD_Write(); Esta función esta encargada de envíar un carácter al display LCD configurando los
pines de datos según cada bit del carácter. Primero, establece el modo de escritura activando las
señales RS y RW para indicar que se trata de datos. Luego, recorre los 8 bits del carácter y, en cada
uno, verifica si el bit es 1 o 0. Dependiendo del valor del bit, activa o desactiva el pin correspondiente
en el LCD (de D0 a D7), lo que permite que el carácter se represente correctamente en paralelo en el
display.
Laboratorio de microcontroladores

LCD_Write_String(); Esta función recorre una cadena de caracteres y envía cada carácter
individualmente a la pantalla usando LCD_Write().
Una vez logrando mandar datos a la pantalla LCD, procedemos a realizar la configuración del
ADC. Para esto se realiza la siguiente función:
configurar_adc(); En esta función se activa el reloj del ADC en el registro RCC_APBENR2 y el
reloj del grupo A (RCC_IOPENR_GPIOAEN) así como los pines A0 y A1 como entradas analógicas,
esencial para que el ADC pueda leer señales analógicas en estos pines. Después se activa el regulador
del ADC y la calibración del mismo para obtener una mejor precisión en las lecturas, se desactiva la
conversión continua para que el ADC realice una conversión a la vez y se activa la interrupción
cuando la conversión termina, permitiendo que el microcontrolador responda una vez que el ADC
completa una lectura. Finalmente, enciende el ADC y espera hasta que esté listo para comenzar a
convertir.

Posteriormente se configuro una función para obtener los datos del ADC:
leer_valor_adc(); Esta función se encarga de capturar y devolver un valor digital desde el convertidor
analógico a digital (ADC) del microcontrolador. Al llamarla, se inicia el proceso de conversión
activando el ADC en el canal configurado, y luego se espera hasta que finalice la conversión, indicada
por la bandera de fin de conversión (EOC). Cuando la conversión está completa, la función recupera
el valor resultante del registro de datos del ADC y lo retorna.
Después se creó una función para la configuración del PWM:
configurar_pwm(); Esta función configura el microcontrolador para generar una señal PWM en el
pin PB3 utilizando el temporizador TIM1. Primero, se habilita el reloj para el puerto GPIOB y el
temporizador TIM1. Luego se configura el pin PB3 en modo de salida alternativa, asignándole la
función específica de TIM1_CH2, que corresponde al canal 2 del temporizador. A continuación, se
establece el valor de auto-reload (ARR) en 1999 y el preescaler (PSC) en 63 para definir la frecuencia
del PWM en 60 Hz. Se configura el canal 2 de TIM1 en "PWM modo 1" y se habilita la salida de este
canal mediante el registro CCER. Finalmente, se activa la salida principal del temporizador con MOE
y se habilita el temporizador TIM1 (CEN) para iniciar la generación de la señal PWM en el pin PB3.

Fig.16. Habilitación TIM1.


En la imagen anterior podemos observar la habilitación del reloj para el temporizador 1 el cual nos
permitirá generar una señal periódica.
Laboratorio de microcontroladores

Fig.17. Habilitación grupo B.


En la imagen anterior podemos observar la habilitación del grupo B, debido a que se utilizará un pin
de este grupo como salida de PWM.

Fig.18. Habilitación pin B3.


En la imagen anterior se declara el pin B3 como una salida alternativa, al no tener un valor de reset
no es necesario añadirlo.

Fig.19. Habilitación PWM.


En la imagen anterior podemos observar el comando TIM1_CCMR1 en la página 409 del manual de
registros del microcontrolador, con la instrucción OC2M se configura el PWM en el canal 2 del
temporizador 1.

Fig.20. Habilitación canal 2.


Laboratorio de microcontroladores

En la imagen anterior podemos observar el comando TIM1_CCER en la página 414 del manual de
registros del microcontrolador, con la instrucción CC2E con la cual configuramos el canal 2 del
temporizador 1 como salida comparadora.

Fig.21. Canal 2 como salida.


En la imagen anterior podemos encontrar el comando TIM1_BDTR en la página 420 del manual de
registros del microcontrolador, con la instrucción MOE con la cual habilitamos el modo de salida
para el canal 2 del temporizador 1.

Fig.22. Habilitación salida de PWM.


En la imagen anterior podemos observar el comando TIM1_CR1 en la página 396 del manual de
registros del microcontrolador, con la instrucción CEN con la cual habilitamos el conteo del
temporizador 1 por ende la señal PWM en el pin B3 del microcontrolador.
Posteriormente se tuvo que configurar una función para crear un temporizador para la interrupción:
configurar_temporizador(); Esta función se utiliza para configurar el temporizador TIM3 del
microcontrolador para generar interrupciones periódicas cada 2 milisegundos. Al habilitar el reloj del
TIM3, establecer el prescaler para reducir la frecuencia de conteo a 1 MHz, y configurar un valor de
auto-reload de 1999, se asegura que el temporizador alcance su límite cada 2 ms. Cuando esto sucede,
se genera una interrupción que es manejada por el controlador de interrupciones (NVIC), que permite
al sistema tomar tiempo para lectura del ADC y la actualización de la pantalla LCD.
Pensando en que el microcontrolador solo tiene un ADC se creó una función que haga la selección
de canal para poder leer la variación del potenciómetro que regulará el PWM y la variación del sensor
al medir la corriente consumida por el motor.
Laboratorio de microcontroladores

Fig.23. Reloj del ACD.


En la imagen anterior podemos observar el comando RCC_APBENR2 en la página 156 del manual
de registros del microcontrolador con el cual activamos el reloj del ADC, indispensable para poder
realizar las conversiones de datos.

Fig.24. Pines analógicos.


En la imagen anterior podemos observar el comando RCC_MODER en la página 182 del manual de
registros del microcontrolador, en el cual asignamos los pines A0 y A1 como entradas analógicas
para el ADC.

Fig.25. Calibración ADC.


En la pagina 316 del manual de registros del microcontrolador podemos encontrar el comando
ADC_CR con el cual podemos activar ADVR que activa la interrupción para la calibración del ADC
y ADCAL para la calibración del ADC.
Laboratorio de microcontroladores

Fig.26. Conversión continua.


En la página 318 podemos encontrar el comando ADC_CFGR1 en el cual con la instrucción CONT
podemos desactivar la conversión continua para que el ADC solo convierta de dato en dato
dependiendo la selección de canal que se le asigne.

Fig.27. Conversión ADC.


Con el comando ADC_IER específicamente con las instrucciones EOCIE para la interrupción de la
conversión y ADRDY como bandera para cuando termine la conversión del dato.

Fig.28. Habilitación del ADC.


Finalmente se habilita el ADC para que este pueda empezar a obtener los datos del pin del
microcontrolador.
configurar_canal_adc(); Esta función permite seleccionar un canal específico del ADC para realizar
una conversión. Primero, borra cualquier selección de canal previa para evitar interferencias, y luego
configura el canal que se desea activar utilizando el número de canal proporcionado. A continuación,
la función espera a que la configuración se complete comprobando una bandera (CCRDY) que
confirma que el canal está listo para su uso. Una vez que la configuración está lista, se limpia la
bandera para que pueda usarse nuevamente en el futuro. Finalmente, si el ADC está habilitado, se
inicia la conversión en el canal seleccionado, lo que permite que el ADC comience a convertir la
señal analógica en un valor digital.
Laboratorio de microcontroladores

Posteriormente se creó la función que realiza la interrupción y lee los canales del ADC uno a la vez:
TIM3_IRQHandler(); La función alterna entre dos canales del ADC (PA0 y PA1) para leer valores
de corriente de un sensor y ajustar el ancho de pulso del PWM mediante un potenciometro. Cuando
canal_actual es 0, se promedian las lecturas del canal 0 (PA0) y se utiliza este promedio para ajustar
el valor del PWM basado en la lectura del canal 1 (PA1). Cuando canal_actual es 1, se promedian
cinco lecturas del canal 1 y se actualiza dato1POT con el resultado. Al finalizar, se cambia
canal_actual para alternar entre los dos canales en la próxima interrupción.
Finalmente se creó una función para caracterizar el sensor y obtener el valor obtenido del ADC en un
valor interpretado de corriente:
calcularCorriente(); Esta función convierte un valor digital obtenido del ADC (adc_value) en una
medida de corriente en miliamperios (mA). Primero, se calcula el voltaje en milivoltios del valor
leído por el ADC utilizando una referencia de voltaje (V_REF) y el valor máximo del ADC
(ADC_MAX). Luego, usando la sensibilidad del sensor (SENSIBILIDAD), convierte este voltaje en
una corriente en mA. La función supone que el valor de 0A corresponde a 2500 mV debido a la
naturaleza del sensor. El valor de corriente resultante se devuelve como un entero de 16 bits (int16_t).
Dentro del apartado main() colocamos las funciones que solo se ejecutarán una sola vez como los son
la configuración de la pantalla LCD, la configuración del PWM y la configuración del ADC, en
cambio en el apartado del ciclo infinito while() pondremos las acciones y operaciones que se repetirán
constantemente, como la conversión del dato obtenido de entero a carácter y la escritura de las
cadenas de caracteres en la pantalla LCD.
Después de analizar el código para su correcto funcionamiento se procede al armado de la maqueta
en la cual implementamos el siguiente circuito haciendo las conexiones de los pines propuestos del
microcontrolador:

Fig.29. Esquema del circuito.


Laboratorio de microcontroladores

V. Resultados
Debido a que la corriente de un solo motor era de 220 mA y el rango del sensor es grande se tuvieron
dificultades para monitorear dicha corriente, por lo que se opto por conectar un arreglo de 3 motores
en paralelo para poder consumir una corriente mayor, además se agregó un capacitor de 10uF en la
salida del sensor debido a que la señal enviada del sensor al ADC contenía ruido y las mediciones
obtenidas variaban mucho, obteniendo los siguientes resultados:

Fig.30. Circuito físico armado.

Fig.31. Lectura del sensor al 0%. Fig.32. Lectura del sensor al 100%.
Laboratorio de microcontroladores

Fig.33. Lectura del sensor carga 1. Fig.34. Lectura del sensor carga 2.
Al poder aumentar la corriente consumida y disminuir el ruido de la señal enviada del sensor de
corriente se logró obtener una mejor medición tanto así que las variaciones fueron mininas con
respecto a lo que decía la fuente de alimentación que se estaba consumiendo.
VI. Conclusiones
En resumen, podemos concluir que se llevó a cabo con éxito la práctica al poder implementar desde
el mismo microcontrolador la obtención de dos medicines con un solo ADC mediante el cambio de
canal, como lo fue el potenciómetro que variaba el ancho de pulso del PWM y la señal del sensor de
corriente, después de analizar el funcionamiento de la comunicación de la pantalla LCD se logró la
implementación de esta a la práctica mostrando los datos obtenidos, al presentarse el problema en las
variaciones del sensor se implementó un condensador a la salida de la señal del sensor de corriente
para suavizar los picos de esta y estabilizar al medias mostradas en pantalla. Esta práctica nos muestra
la importancia de los convertidores analógicos-digitales para los sistemas de control y procesamiento
de señales al poder traducir las señales de sensores a señales digitales que los microcontroladores
pueden manipular y procesar.
VII. Referencias
[1] Tutorial sensor de corriente ACS712. (s. f.). Naylamp Mechatronics - Perú.
[Link]
[2] HD44780U (LCD-II). (1998). Sparkfun. Recuperado 1 de octubre de 2024, de
[Link]
[3] STM32G031K8 - STMicroElectronics. (s. f.). STMicroelectronics.
[Link]
Laboratorio de microcontroladores

[4] Tutorial de uso del módulo L298N. (s. f.). Naylamp Mechatronics - Perú.
[Link]

También podría gustarte