Practica2 MM
Practica2 MM
Practica2 MM
ingenierÍa mecatrÓnica
docente:
ibarra manzano oscar gerardo
microprocesadores y microcontroladores
reporte practica 2
nua: 147747
1
ANTECEDENTES
2
DESARROLLO DE LA PRACTICA
Microprocesadores y microcontroladores: Práctica No. 2
Aplicación del puerto general de entrada y salida (GPIO):
Uso del WDT (Watchdog Timer) en un medidor de distancia.
28 de agosto de 2024
3
Desarrollo:
En esta Práctica, utilizaremos el sensor HC-SR04, dispositivo con cuatro terminales utilizadas para su operación(dos
terminales de alimentación eléctrica (VCC y GND) y dos terminales de control y respuesta (Trigger y Echo)). El
sensor es mostrado en la Figura 1. Su operación inicia aplicando una señal externa de disparo de 10µs de ancho de
pulso a través de la terminal Trig, para que el sensor emita una ráfaga de ocho pulsos de una señal de ultrasonido de
40kHz, ráfaga que se espera sea reflejada por la superficie ubicada a la distancia que se desea medir. Si lo anterior
ocurre, el sensor generará un pulso de salida a través de la terminal Echo cuyo ancho es igual al tiempo que toma la
ráfaga de ultrasonido en ir y regresar a la superficie que la está reflejando.
Considerando lo anterior, la distancia la podemos expresar en función del ancho del pulso medido en segundos en la
terminal Echo mediante la siguiente ecuación:
1
d = νtancho
2
donde ν es la velocidad del sonido en el ambiente expresada en cm ·s−1 (343,2m ·s−1 = 3,432 × 104cm s·−1) y
tancho es la medición en tiempo del ancho del pulso entregado por el sensor expresada en segundos.
4
1. Configuración de operación del microcontrolador.
Para esta Práctica, configuraremos nuestro sistema con los elementos por defecto que nos proporciona la se-
lección de la tarjeta de evaluación del microcontrolador NUCLEO-L476RG , que son el LED verde (LD2), el
botón azul (B1) y el puerto de comunicación ası́ncrona (UART2). Adicionalmente, será necesario configurar
dos terminales más, una para generar el pulso de disparo de 10µs y otra para realizar la medición en tiem-
po (con resolución de µs) del ancho del pulso entregado a través de la terminal Echo (medición de tiempo
transcurrido entre las transiciones positiva (↑) y negativa (↓) de la señal Echo).
5
Figura 2: Configuración de los puertos GPIOA0 y GPIOA1.
6
interrupt] □. En la columna [Preemption Priority] fija el nivel de prioridad a 0. Este proceso se puede
visualizar en la Figura 4.
Generación de código. El último paso para obtener la estructura de archivos del proyecto
El programa deberá generar una señal de disparo (Trigger) en el sensor HC-SR04 de 10µs de duración
de ancho de pulso.
Generada la señal de disparo, deberá esperar en la señal Echo una transición positiva (↑) y contar los
pulso de reloj que ocurren hasta que una transición de bajada (↓) se presente, con el número de pulsos
4
contados y conociendo el periodo de reloj de estos, se puede determinar el ancho del pulso de la señal
Echo, que es proporcional a la distancia de viaje de la señal de ultrasonido.
Cada vez que es realizada una medición, la distancia calculada será enviada y mostrada en la compu-
tadora anfitrión a través del puerto serial.
Las mediciones de distancia se realizaran de forma continua con una frecuencia de una medición por
segundo.
Establecidas las caracterı́sticas anteriores, podemos iniciar la programación de nuestra aplicación. Para este
caso, vamos a programar los archivos wdt.h y wdt.c donde integremos las funciones para iniciar la ope-
ración del WDT y de la medición de tiempo. Para integrar estos archivos se deberá seleccionar en el explo-
rador de proyectos (Project Explorer) el nombre del proyecto y con el botón secundario del ratón selecciona:
[PracticaNo2]→[New]→[Header File]. Este paso se muestra en la Figura 6.
Con el procedimiento anterior se habra´ creado e incorporado el archivo wdt.h al proyecto. Ahora, Repite
el procedimiento para la creación e incorporación del archivo wdt.c, pero en este caso la navegación en los
menús serı́a: [PracticaNo2]→[New]→[Source File]. Este paso se muestra en la Figura 7.
5
Programación de los archivos wdt.h y wdt.c:
wdt.h
1 #ifndef INC_WDT_H_
2 #define INC_WDT_H_
3
4 void wdt_init(void);
5 void wdt_us(uint32_t delay);
6 void wdt_ms(uint32_t delay);
7 #endif /* INC_WDT_H_ */
En este primer programa, se definen las tres funciones que se utilizarán: wdt init() que activa la
operación del WDT y wdt us(uint32 t delay) y wdt ms(uint32 t delay) que correspon-
den a la realización de un retardo en micro-segundos y mili-segundos. el programa y sus funciones son
mostrados a continuación:
wdt.c
1 #include "stm32l4xx_hal.h"
2 #include "wdt.h"
3
4 void wdt_init(void){
5 CoreDebug->DEMCR |= 0x01000000;
6 DWT->CTRL |= 1;
7 }
8
9 void wdt_us(uint32_t delay){
10 uint32_t cnt_inicial = DWT->CYCCNT;
11 uint32_t No_tick = HAL_RCC_GetHCLKFreq()/1000000;
12 uint32_t cnt_final = cnt_inicial + No_tick*delay;
13
14 if (cnt_final > cnt_inicial){
15 while (DWT->CYCCNT < cnt_final);
16 }else{
17 while((DWT->CYCCNT > cnt_inicial) || (DWT->CYCCNT < cnt_final));
18 }
19 }
20
Con este paso, hemos concluido la creación e incorporación de los archivos wdt.h y wdt.c en nuestro
proyecto, por lo que podemos utilizar las funciones definidas una vez que sea incluida en el archivo main.c.
6
en este paso, incluiremos las librer´ıas stdio.h y string.h. La primera, corresponde a un archivo de
cabecera de la biblioteca estándar de C que se utiliza funciones de entrada y salida comunes. La segunda,
contiene un conjunto de funciones para el manejo de cadenas. La incorporación de las 3 cabeceras se muestra
en el siguiente segmento del programa dentro de main.c:
Ahora, regresemos un poco a nuestra ecuación donde expresamos la distancia que mediremos:
1
d = νsonidotancho
2
1(
= 3,432 × 104cm · s−1 · No. pulsos · TCLOCK
(2 l
3,432 × 104
= · No. Pulsos
2FCLK
( Vsonido l
= No. Pulsos
2F ·
CLK
donde FCLK es la frecuencia de operación del reloj de referencia, en este caso la frecuencia de operación del
WDT, el cual se puede leer por software y Vsonido = 3,432 104 ×
es constante y la cual definiremos en la sección
correspondiente del programa:
Ahora, podemos proceder a definir los tipos y variables que utilizaremos en nuestro programa. En este punto,
el WDT es un contador de 32-bits el cual debemos leer cada vez que ocurra una transición en la señal Echo,
por lo que definiremos tres variables del tipo entero sin signo de 32-bits: WDT inicial, que sera´ actualizada
cada vez que ocurra una transición positiva (↑) en la señal Echo; WDT final, que será actualizada cada
vez que ocurra una transición negativa (↓); y WDT delta que será actualizada con el cálculo del número
de pulsos transcurridos entre ambas transiciones. Como lo muestra la Figura 8. Además, declararemos las
variables distancia como flotante donde se almacenara´ la distancia calculada y DataTX[50] como un
buffer de 50 caracteres que utilizaremos para realizar la transmisión a la computadora huésped.
7
La declaración de las variables aparece en el siguiente segmento de programa:
Declaradas las variables, declaremos la función void HAL GPIO EXTI Callback(uint16 t GPIO Pin)
encargada de atender las interrupciones generadas por las transiciones de la señal Echo. Esta declaración es
mostrada a continuación:
Por último, solo será necesario incluir la lı́nea que habilitará el funcionamiento del WDT:
y dentro del super ciclo, una secuencia que genere el pulso de inicio de medición (Trigger), como se muestra
a continuación:
8
1 while (1)
2 {
3 HAL_GPIO_WritePin(Trigger_GPIO_Port, Trigger_Pin, GPIO_PIN_SET);
4 wdt_us(10);
5 HAL_GPIO_WritePin(Trigger_GPIO_Port, Trigger_Pin, GPIO_PIN_RESET);
6 wdt_ms(1000);
7 /* USER CODE END WHILE */
8
Desarrollo:
Figura 1. Conexiones
Después de realizar las conexiones, se configuró el microcontrolador en STM32CubeMX, ajustando los puertos
Trigger y Echo para generar y recibir pulsos. Luego, en STM32CubeIDE, se programó la medición de distancias
con el sensor ultrasónico, generando pulsos de 10 µs y calculando el tiempo de respuesta del Echo. Finalmente,
los resultados se enviaron en tiempo real a la computadora a través del puerto serial.
9
Figura 2. Distancia mostrada
2. En cada una de las funciones realizadas: void HAL GPIO EXTI Callback(uint16 t GPIO Pin),
void wdt init(), void wdt us(uint32 t delay) y void wdt ms(uint32 t delay) des-
cribe su funcionamiento.
Esta función se activa automáticamente cuando ocurre una interrupción externa en un pin GPIO
configurado. El parámetro GPIO_Pin identifica el pin que generó la interrupción.
• void wdt_init()
Genera un retardo en microsegundos usando el WDT. Calcula los ciclos necesarios para el retardo y entra
en un bucle hasta alcanzar el tiempo deseado.
Genera un retardo en milisegundos utilizando el WDT. Calcula el valor objetivo multiplicando el tiempo
en milisegundos por la frecuencia del reloj, y espera hasta que el temporizador alcance ese valor.
10
3. Modifica la aplicación para que las medición la reporte en pulgadas (Inch).
En la función HAL_GPIO_EXTI_Callback, se modificó el cálculo para que la distancia del sensor ultrasónico
se reporte en pulgadas en lugar de centímetros.
Para ello, se añadió / 2.54 al cálculo, convirtiendo la distancia de centímetros a pulgadas. Además, se ajustó el
formato de la cadena de salida para mostrar la unidad en pulgadas. Ahora, las mediciones se visualizan en el
monitor serial en pulgadas.
11
4. Elabora un diagrama en el STM32Cube Monitor y exhibe la medición realizada en un nodo de exhibición.
En este diagrama, se configuró un nodo de exhibición para mostrar la distancia en pulgadas, tras modificar el
código para que las mediciones se expresaran en esa unidad. Durante las pruebas, se determinó que el sensor
tenía un rango máximo de 962 pulgadas, por lo que se ajustó el diagrama con este valor como límite superior.
El resultado de la visualización en STM32CubeMonitor fue el siguiente:
El diagrama ofrece una representación gráfica en tiempo real de las mediciones de distancia, permitiendo
observar los datos directamente desde el monitor. Esta visualización simplifica el análisis y la interpretación
de los datos proporcionados por el sensor.
12
Conclusiones:
Durante el transcurso de la realización de la práctica, efectúa las mediciones necesarias para verificar el diseño
instrumentado y comprueba los resultados obtenidos, no olvidar comentar y discutir lo observado.
CONCLUSIONES
En conclusión, la implementación del sensor ultrasónico con el microcontrolador NUCLEO-L476RG ha
demostrado ser una solución efectiva y precisa para la medición de distancias. La visualización en tiempo real
mediante STM32CubeMonitor ha facilitado una comprensión clara y rápida de los datos, al permitirnos
observar las mediciones en pulgadas de manera directa. La configuración detallada de los puertos GPIO y la
incorporación del Watchdog Timer han garantizado la estabilidad y la fiabilidad del sistema, minimizando los
riesgos de errores. La conversión de las mediciones a pulgadas y la correcta representación gráfica han
mejorado la utilidad del sistema, haciéndolo más adaptable a diferentes aplicaciones. En general, esta
experiencia ha subrayado la importancia de una integración cuidadosa y de una visualización efectiva para
lograr resultados precisos y útiles en proyectos de medición y control.
REFERENCIAS
2. R. Stonick, "Implementation of GPIO and Watchdog Timer for Reliable Distance Measurement
Systems," IEEE Trans. Embedded Syst., vol. 62, no. 5, pp. 321–329, 2019.
4. M. Burns y A. W. Roberts, "Distance Measurement Systems with Watchdog Timer for Error
Detection in Real-Time Systems," IEEE Trans. Industrial Electronics, vol. 58, no. 7, pp. 901-910,
2015.
13