Está en la página 1de 21

UNIVERSIDAD EL BOSQUE

CENTRO DE DESARROLLO TECNOLÓGICO


FACULTAD DE INGENIERÍA
PROGRAMA DE INGENIERÍA ELECTRÓNICA

Asignatura: Sistemas Embebidos. Fecha: 02/04/23

Nombre de la práctica: Laboratorio ADC/DAC.

Nombre estudiantes: Juan Camilo Sabogal Ramírez, Jorge Alberto Guzmán


Arciniegas y Sebastián Andrés Puerta Velasquez.

Objetivo general:
Aplicar el conocimiento adquirido en clase sobre ADC, IT, DMA,y TIMERS.

Objetivos específicos:
1. Implementar un programa para leer un voltaje analógico con el ADC usando el método de
Polling. Configure una salida de PWM con un ciclo útil proporcional al valor del voltaje
analógico leído.

2. Implementar un programa para leer un voltaje analógico con el ADC usando el método de
Interrupciones. Configure una salida de PWM con un ciclo útil proporcional al valor del voltaje
analógico leído.

3. Implementar un programa para leer un voltaje analógico con el ADC usando el DMA.
Configure una salida de PWM con un ciclo útil proporcional al valor del voltaje analógico
leído.

4. Comparar los resultados de ejecución utilizando los tres métodos de lectura del ADC.

5. Implementar un filtro analógico pasabajas que le permita obtener una tensión de salida DC
usando el PWM.

Marco Teórico:
ADC: Es un circuito integrado electrónico o dispositivo modular de uso común que convierte
una señal analógica, generalmente un voltaje, en una serie de representaciones digitales
discretas muestreadas, o en números. Los ADC realizan tres operaciones distintas:
muestreo, cuantificación y codificación. Forman el corazón de muchos instrumentos digitales
comunes, como voltímetros, osciloscopios y analizadores de espectro. También se
incorporan en el front end de los circuitos digitales que procesan señales analógicas
provenientes de dispositivos como micrófonos, acelerómetros, y otros transductores que
necesitan convertir su salida al dominio digital para que un microprocesador pueda trabajar
con los datos.

DAC: Es un dispositivo para convertir un código digital (generalmente binario, compuesto de


ceros y unos) a una señal analógica (corriente, voltaje o carga eléctrica). Hay distintos
componentes que pueden intervenir en este proceso, como interruptores simples, red de
resistores, fuentes actuales o condensadores. Un convertidor de analógico a digital (ADC)
realiza la operación inversa.

PWM: Son las siglas de Pulse Width Modulation (Modulación por ancho de pulso). Para
transmitir una señal, ya sea analógica o digital, se debe modular para que sea transmitida sin
perder potencia o sufrir distorsión por interferencias. Se usa para transmitir señales
analógicas cuya señal portadora será digital. En esta técnica se modifica el ciclo de trabajo
de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir
información a través de un canal de comunicaciones o para controlar la cantidad de energía
que se envía a una carga.

DMA: El DMA (acceso directo a la memoria) permite que el dispositivo de red mueva los
datos del paquete directamente a la memoria del sistema, reduciendo la utilización de la
CPU. Sin embargo, la frecuencia y los intervalos aleatorios en los cuales los paquetes llegan
no permiten que el sistema ingrese un estado de energía más bajo.

Interrupciones: Las interrupciones son eventos que hacen que el microcontrolador deje de
realizar la tarea actual y pase a efectuar otra actividad. Al finalizar la segunda actividad
retorna a la primera y continúa a partir del punto donde se produjo la interrupción. Las
interrupciones permiten que un solo microcontrolador ejecute varias tareas dependiendo del
evento que desencadene la interrupción.

Ciclo útil: Es la relación de tiempo en el que una carga o circuito está encendido en
comparación con el tiempo en que la carga o el circuito está apagado. A veces
denominado “factor de trabajo”, se expresa como un porcentaje del tiempo de
activación.

Filtro analógico: Se llama así porque las señales no se discretizan, ni se hace uso de
algoritmos, sino que el filtro está compuesto directamente por elementos como
resistencias, bobinas, condensadores, y amplificadores operacionales, que
finalmente son los que realizan el filtrado. En cambio en un filtro digital, se realiza un
procesamiento de la señal, con un microprocesador, normalmente DSP, o FPGA, se
convierten a digitales, y se realiza un algoritmo, que en sí, es el filtro.

Metodología y equipos:
Lo primero que se realizó fueron los cálculos de los registros del TIMER para generar una
señal PWM con una frecuencia que pudiera ser observada por el ojo humano. Teniendo en
cuenta eso se decidió asignar los valores a los registros de tal forma que la frecuencia fuera
40 Hz.

Se utilizó el siguiente programa para calcular los valores de los registros:


GitHub - v0idv0id/STM32-Scaler: A simple timer PSC, ARR and CCRx calculator for STM32
MCUs
Fig 1. Posibles valores registros TIMER

Basado en los valores obtenidos se decidió seleccionar la primera opción:


● PSC = 34
● ARR = 59999

Los valores obtenidos se pueden validar mediante la siguiente fórmula:

𝑓𝑐𝑙𝑘
𝑓𝑃𝑊𝑀 = (𝐴𝑅𝑅+1)·(𝑃𝑆𝐶+1)

84 𝑀𝐻𝑧
𝑓𝑃𝑊𝑀 = (59999+1)·(34+1)
= 40𝐻𝑧

Configuración Pinout
Configuración GPIO: Se usó el pin PA6 como la salida del Timer 3, es decir es la salida del
PWM, su configuración se dejó en las opciones default, el pin PA0 se usó como la entrada al
ADC, de igual manera su configuración se dejó en las opciones default.

Fig 2. Configuración GPIO en el STM32CubeMX

Fig 3. Configuración TIMER3 en el STM32CubeMX

Esquemático Conexión para Polling, IT, y DMA


Fig 4. Esquemático sin Filtro
Fig 5. Esquemático con Filtro

Montaje en Protoboard
Fig 6. Montaje en Protoboard

Método de Polling
● Configuración STM32Cube MX

Configuración del ADC: Se activó el ADC de la tarjeta habilitando el canal 0, se


configuraron los parámetros de resolución a 12 bits, Clock Prescaler en 4 y lo demás
se dejó como viene de default.

Fig 7. Configuración ADC método polling en el STM32CubeMX

Configuración TIM3: Para configurar el TIM3 se configuró el PSC, el ARR, y se activó


el auto reload preload. Esto con el objetivo de conseguir una frecuencia determinada.
Fig 8. Configuración TIMER3 método polling en el STM32CubeMX

● Explicación del Código: En este código lo primero que realiza es la inicialización de los
periféricos en la función int main, se debe agregar el HAL_TIM_PWM_Start para
iniciar la generación de la de la señal PWM por medio del TIMER3 usando el canal 1.
Luego en el ciclo while se inicia la conversión por medio de la función
HAL_ADC_Start, se indica que se va a tomar la medición por medio del método de
polling usando la función HAL_ADC_PollForConversion, acá se especifica el ADC que
se utiliza. Se almacena el valor en una variable llamada adcValue que es de tipo
uint16_t mediante la función HAL_ADC_GetValue. Luego el valor almacenado en la
variable adcValue se guarda en el registro CCR1 del TIM3 para modificar el ciclo útil
del PWM.
Método de IT
● Configuración STM32Cube MX
Configuración del ADC: Se activó el ADC de la tarjeta habilitando el canal 0, se
configuraron los parámetros de resolución a 12 bits, Clock Prescaler en 4 y por último
se habilitó el modo de conversión continua.

Fig 9. Configuración ADC método Interrupciones en el STM32CubeMX


Configuración TIM3: Para configurar el TIM3 se configuró el PSC, el ARR, y se activó
el auto reload preload. Esto con el objetivo de conseguir una frecuencia determinada.

Fig 10. Configuración TIMER3 método Interrupciones en el STM32CubeMX

● Explicación del Código: En este segundo código lo primero que realiza es la


inicialización de los periféricos en la función int main, se debe agregar el
HAL_TIM_PWM_Start para iniciar la generación de la de la señal PWM por medio del
TIMER3 usando el canal 1. Luego en el ciclo while se inicia la conversión por medio
de la función HAL_ADC_Start, se indica que se va a tomar la medición por medio del
método de interrupciones usando la función HAL_ADC_Start_IT, acá se especifica el
ADC que se utiliza. Se almacena el valor en una variable llamada “ValorADC” que es
de tipo uint16_t mediante la función HAL_ADC_GetValue. Luego el valor almacenado
en la variable “ValorADC” se guarda en el registro CCR1 del TIM3 con un corrimiento
de 4 dígitos (para que su resolución respectiva de ADC quede estable en 12 bits) para
modificar el ciclo útil del PWM.
Método de DMA

● Configuración STM32Cube MX

Configuración del ADC: Se activó el ADC de la tarjeta habilitando el canal 0, se


configuraron los parámetros de resolución a 12 bits, Clock Prescaler en 4, se activó el
DMA 2 en el Stream 0 que va desde el periférico a la memoria, el DMA se configuró
en el modo circular y con un ancho de datos de una palabra y por último se activó el
modo de conversión continuo del ADC, mientras que el resto se dejó como viene de
default.
Fig 11. Configuración del DMA usado por el ADC en el STM32CubeMX

Fig 12. Configuración ADC método DMA en el STM32CubeMX


Configuración TIM3: Para configurar el TIM3 se configuró el PSC, el ARR, y se activó el auto
reload preload. Esto con el objetivo de conseguir una frecuencia determinada.

Fig 13. Configuración TIMER3 método DMA en el STM32CubeMX

Fig 14. Configuración TIMER3 método DMA en el STM32CubeMX

● Explicación del Código: En este código lo primero que realiza es la inicialización de los
periféricos en la función int main, se debe agregar la función HAL_TIM_PWM_Start
antes del ciclo whilea para iniciar la generación de la de la señal PWM por medio del
TIMER3 usando el canal 1. Luego se indica que se va a tomar la medición por medio
del método de DMA usando la función HAL_ADC_Start_DMA. Se almacena el valor
en una variable llamada buffer que es de tipo uint32_t mediante la misma función. Por
último el valor almacenado en la variable buffer se guarda en el registro CCR1 del
TIM3 para modificar el ciclo útil del PWM.
Diseño del Filtro
Para el diseño del filtro se cambió la frecuencia del PWM ya que con 40Hz no hay margen
para que se consiga la atenuación adecuada. Se utilizó el programa mencionado
anteriormente y se calcularon los valores para el TIMER para conseguir una frecuencia de
10kHZ.
Fig 15. Posibles valores registros TIMER

Basado en los valores obtenidos se decidió seleccionar la primera opción:


● PSC = 0
● ARR = 8399

Los valores obtenidos se pueden validar mediante la siguiente fórmula:

𝑓𝑐𝑙𝑘
𝑓𝑃𝑊𝑀 = (𝐴𝑅𝑅+1)·(𝑃𝑆𝐶+1)

84 𝑀𝐻𝑧
𝑓𝑃𝑊𝑀 = (8399+1)·(0+1)
= 10𝐾𝐻𝑧

Teniendo en cuenta que la frecuencia del PWM es de 10KHz debemos hacer un filtro que
asegure la atenuación de la frecuencia y energía del PWM, por lo que se decidió tener una
década de diferencia entre la frecuencia de corte y la frecuencia del PWM, es decir de un
1KHz, y poder asegurar la atenuación deseada:
Teniendo en cuenta lo antes explicado se fijó un valor de capacitancia de 100nF y se despejo
la resistencia para hallar su valor:

1
𝑓𝑐 = 2π·𝑅·𝐶

1
1𝐾𝐻𝑧 = 2π·𝑅·100𝑛𝐹

1
1𝐾𝐻𝑧 · (2π · 100𝑛𝐹) = 𝑅

−4 1
6. 24 · 10 = 𝑅

1
𝑅= −4
6.24·10

𝑅 = 1591. 54 Ω ≈ 1. 6𝑘 Ω

Resultados:
1. Implemente un programa para leer un voltaje analógico con el ADC usando el método de
Polling.

https://drive.google.com/file/d/1VHwxt3aE_fExlApe-VDQhMthJXv01cfh/view?usp=sharing

2. Implemente un programa para leer un voltaje analógico con el ADC usando el método de
Interrupciones.

https://drive.google.com/file/d/1V7LPAmafbEAHPq67ClA1QJUFs4g0MrYx/view?usp=sharing

3. Implemente un programa para leer un voltaje analógico con el ADC usando el DMA.

https://drive.google.com/file/d/1V3cvwelXwq2OObylRx2C4RVh5ses4YHz/view?usp=sharing

4. Compare los resultados de ejecución utilizando los tres métodos de lectura del ADC.
En términos de funcionalidad los 3 códigos realizaban lo mismo, sin embargo, en términos de
metodología de funcionamiento se diferencian bastante. En el caso de polling

5. Implemente un filtro analógico pasabajas que le permita obtener una tensión de salida DC
usando el PWM

Análisis y discusión de resultados:


Ejercicio #1
En este primer ejercicio se requiere hacer una lectura de un voltaje analógico, por lo que se
hizo la implementación por medio de un montaje con el uso de un LED. Para dar comienzo,
se realizaron las asignaciones de los pines y las configuraciones generales del programa,
como lo fueron los ajustes de: timers, generación de canal de PWM, conversión continua de
ADC, etc; para que posteriormente se llevarán a cabo los cálculos con respecto a los timers
necesarios cuyos valores fueran óptimos para una frecuencia de 40hz. En un principio se
podía visualizar que la implementación estaba correcta, pero se presenciaba un ligero
percance, y es que se le habían asignado los parámetros para la variable de frecuencia
(recalcando que la lectura debía ser en el voltaje análogo) en ese caso se notaba como el
parpadeo del LED variaba según la resistencia que presentaba el potenciómetro de 1MΩ; por
lo que se le realizaron los ajustes pertinentes en el que quedará reflejado la intensidad
lumínica del LED con respecto a la resistividad del potenciómetro, de esta forma quedaría
satisfactoriamente desarrollado el ejercicio de polling para la observación de la variable
esperada.

Ejercicio #2
En este segundo ejercicio se realizó un par de ligeras modificaciones con respecto a la
primera implementación realizada, de tal forma que la ejecución del sistema se realizara por
medio de interrupciones y no de forma secuencial por el método de polling. Para llevar a cabo
lo anterior, se agregó una variable de tipo entera de 16 bits para el valor del ADC que
empiece con el valor de 0; también se agregó una instrucción para la capa de abstracción del
hardware donde se inicializan las interrupciones, teniendo en cuenta que el valor del ADC
brindado por medio de la instrucción ubicada en la función cuya finalidad es la obtención de
dicho valor, en la que se procede a realizar un corrimiento de 4 dígitos, debido a que las
resoluciones de los ADC constan de 12 bits. Bajo el mismo principio del montaje, se
realizaron las conexiones pertinentes, y de esta forma se llevó a cabo la óptima realización
de este ejercicio.

Ejercicio #3

De igual manera que con el segundo ejercicio solo se realizaron un par de ligeras
modificaciones con respecto al primer ejercicio, de tal forma que la ejecución del sistema se
realizara por medio del DMA sin una participación significativa del CPU. Para llevar a cabo lo
anterior, se agregó una variable de tipo entera de 32 bits para el valor del ADC que empiece
con el valor de 0; también se agregó la función HAL_ADC_Start_DMA en la cual se va a
inicializar el ADC y el DMA, esta función también establece tres parámetros los cuales
establece el puntero a la estructura ADC_HandleTypeDef que contiene los parámetros de
configuración del ADC especificado, la dirección de destino y la longitud de los datos que se
desplazarán del periférico ADC a la memoria, en ese orden respectivamente. Luego se
agrega la función HAL_ADC_ConvCpltCallback en la cual se de retorna el valor de la
conversión luego de que la misma se haya completado, en esta misma función se toma el
valor de la conversión para asignarlo al ciclo de trabajo PWM que determina el brillo del LED.

Ejercicio #4
En este cuarto ejercicio se llevó a cabo la comparación acerca de los tres métodos, polling,
interrupciones y DMA, que se usaron para la implementación del ejercicio de lectura de una
señal circuital análoga, en dichos casos, el voltaje. Como se pudo apreciar durante todo el
proceso, cada una de estas desarrollan la funcionalidad del montaje de forma muy similar
(aunque la configuración y programación de cada uno de los métodos puede divergir de gran
forma), pero siempre y cuando se mantenga la idea del porqué, y esto se debe a la
complejidad del montaje; usualmente para proyectos de una complejidad mucho mayor, el
método de polling se podria quedar un poco colgado en términos de optimización, ya que la
CPU en este, se tiene que detener para esperar el procesamiento de cada una de las
variables y sus respectivas conversiones, mientras que en los métodos de interrupción y
DMA, no tienen que terminar directamente un proceso para dar comienzo a otro. En pocas
palabras, es de carácter fundamental la apropiación que cada uno tiene para realizar la
selección del método que se quiera implementar, siempre y cuando se mantengan al tanto los
parámetros de la complejidad del proyecto.

Ejercicio #5

En este quinto ejercicio se realizó un filtro pasivo pasa-bajas con una frecuencia de corte de
1KHz, este se diseñó fijando un valor de capacitancia y de frecuencia para despejar el valor
de la resistencia. Se escogió el valor de 1KHz para la frecuencia de corte teniendo en cuenta
que la frecuencia a atenuar deseada es de 10KHz, teniendo una diferencia de una decada
entre ambas frecuencias podemos asegurar la atenuación de la potencia con frecuencia de
10KHz, como pudimos ver en la simulación este circuito funcionó de la manera esperada.

Conclusiones:
Se consiguió programar de forma satisfactoria la tarjeta STM32F411RE para la ejecución de
los tres métodos de lectura del ADC. De forma general, los códigos de los ejercicios #1, #2 y
#3 se asimilaban en grandes apartados, pero aun así, se tenían que tener presentes las
óptimas configuraciones de cada uno para que quedase implementado de la forma correcta;
asimismo generando un criterio a futuro de cual método seleccionar con respecto a los
parámetros de un proyecto. Por otra parte, el ejercicio #5, solo se llevó a cabo de forma
simulada, debido a la dificultad del préstamo de los equipos necesarios; todo esto durante las
horas asignadas de clase.

Referencias:
A. (2023b, febrero 20). ADC Single Channel in STM32 using Poll Interrupt and DMA.
ControllersTech. https://controllerstech.com/stm32-adc-single-channel/

Blocked. (s. f.). https://www.digikey.com/es/articles/match-the-right-adc-to-the-application

Cec, R. (s. f.). Convertidor Digital Analógico (DAC). Revista CEC.


https://www.revistacec.com/didactica/3101-convertidor-digital-analogico-dac-3101.html

¿Qué es PWM y cómo usarlo? (s. f.).


https://solectroshop.com/es/blog/que-es-pwm-y-como-usarlo--n38

Acceso directo a memoria (DMA) Coalescing. (s. f.). Intel.


https://www.intel.la/content/www/xl/es/support/articles/000007456/ethernet-products.html

Interrupciones de los microcontroladores PIC. (s. f.).


https://tecmikro.com/content/68-interrupciones-microcontroladores-pic

F. (2021, 29 octubre). ¿Qué es un ciclo de trabajo? Fluke.


https://www.fluke.com/es-co/informacion/blog/electrica/que-es-un-ciclo-de-trabajo

Electronica, W. (2020, 16 julio). Filtros analogicos.


https://wilaebaelectronica.blogspot.com/2017/01/filtros-analogicos.html

También podría gustarte