STM32F4: Configurar el PWM con Timers

Un timer no es más que un contador. Es como un reloj que se usa para medir eventos temporales. Se configura a través de unos registros especiales y se puede elegir, entre otras cosas, su modo de funcionamiento.

En el ejemplo de hoy vamos a trabajar con la placa de desarrollo 32F411-DISCOVERY y nuestro objetivo va a ser aprender a configurar el TIM4 en modo PWM para controlar la intensidad de luz del led Naranja que viene integrado en la placa.

Esta placa está basada en el microcontrolador STM32F411 el cual dispone de hasta 11 Timers, de los cuales 6 pueden ser de 16 bits, y 2 de 32 bits, cada uno con hasta 4 canales de IC/OC/PWM o contador de pulsos. Además de 2 timers watchdog y un Systick Timer.

A través del software CubeMX activaremos el PWM Generation CH2 del TIM4 en la pestaña Pinout. Además de que asociaremos el pin PD13 la función alternativa de TIM4_CH2 (Channe2 PWM Generation CH2).

timers1

Con esto habremos conseguido dos cosas: por un lado configurar el canal 2 del Timer4 en modo PWM, y por otro lado asociar la salida del PWM al pin PD13, que es donde se encuentra el led naranja.

Tras esto pasamos a la pestaña Configuration y ahí configuramos el control del TIM4. Dentro de la pestaña de Parameter Settings hay 3 parámetros numéricos que debemos entender para configurarlos correctamente.

Prescaler (PSC – 16 bits value).

Con este valor podemos fijar la frecuencia del reloj asociado al Timer dividiendo la frecuencia del reloj de sistema.

Counter Period (AutoReload Register – 16 bits value).

Será el valor en el cual nuestro Timer saltará y nos avisará de alguna forma, ya sea reiniciándose o lanzando una interrupcion, etc.

Pulse (16 bits value).

Con este valor podemos fijar el ciclo de trabajo de nuestro PWM.

  • FreqTimer = FreqClock / (Prescaler + 1)
  • Prescaler = (FreqClock / FreqTimer) – 1
  • FreqPWM = FreqTimer / (CounterPeriod + 1)
  • Period = (FreqTimer / FreqPWM) – 1
  • Pulse = ((Period + 1) * DutyCicle) / 100 – 1
Queremos llevar a cabo dos ejemplos, por un lado queremos ver parpadear el led a varios ciclos de trabajo diferentes, y por otro lado queremos configurar un dimmer del led.

A grandes rasgos, lo que hacemos con esta técnica es fijar el periodo de la señal utilizando la frecuencia del PWM, y utilizar la frecuencia del timer para poder modular el ancho del pulso. Siendo esta frecuencia del timer una división de la frecuencia de reloj de nuestro microcontrolador.

Ejemplo 1. Parpadeo del led.

Para el parpadeo del led queremos un periodo de trabajo lento para que nos de tiempo a ver esa conmutación entre encendido y apagado del led. Es por ello que hemos fijado la Frecuencia del PWM a 1Hz. Luego, para hacer el resto de operaciones más fáciles hemos fijado la FreqTimer a 10 Khz. Con estos datos y usando las ecuaciones anteriores obtenemos:

  • APB2 timer clocks = 96 Mhz
  • Objetivo de PWM Freq = 1 Hz
  • Prescaler = 9599
  • Period = 9999

Para poder ver el cambio de parpadeo del led usaremos estos tres valores de Pulse (% Duty cicle).

  • Pulse: 99 (1%), 4999 (50%), 9899 (99%)

Ejemplo 2. Dimmer del led.

En este caso queremos que el periodo de trabajo sera muy pequeño para que las transiciones sean fluidas para el ojo humano. Es por ello que en este ejemplo hemos fijado la Frecuencia del PWM a 10 Khz. Luego, para hacer el resto de operaciones más fáciles hemos fijado la FreqTimer a 2 Mhz. Con estos datos y usando las ecuaciones anteriores obtenemos:

timers2

  • APB2 timer clocks = 96 Mhz
  • Objetivo de PWM Freq = 10 Khz
  • Prescaler = 47
  • Period = 199

Para poder ver un dimmer en el led recorreremos todos los valores posibles de Pulse (% Duty cicle).

  • Pulse: 0 (0%)-199 (100%)

Ejecución de los ejemplos

Una vez hemos generado la plantilla de código con CubeMX es momento de continuar en Eclipse.

Ahora debemos tener en cuenta que para que el PWM se ponga en funcionamiento tenemos que llamar a la función

Y para poder hacer cambios en el valor de Pulse desde Eclipse debemos llamar a la macro

TFG: DESARROLLO DE UN SISTEMA ELECTRÓNICO E IMPLEMENTACIÓN DE SERVICIOS INTERACTIVOS PARA UN TABLÓN EXPOSITOR SOBRE UNA RED DE SENSORES INALÁMBRICA

En el pasillo del laboratorio del Grupo de Investigación B105 Electronic Systems Lab se encuentra un tablón expositor que cuenta con un sistema de iluminación LED (Light-Emitting Diode). El objetivo de este Trabajo de Fin de Grado es diseñar e implementar un sistema electrónico que ofrezca funcionalidades interactivas para dicho tablón, de forma que los usuarios puedan interactuar con el mismo a través de un conjunto de pulsadores.

Los LEDs del tablón son controlados por los drivers TLC5940 de Texas Instruments. Además, para enviar los datos a estos drivers se emplea un sistema empotrado, el cual se ha decidido que sea una Raspberry Pi 3. Para poder implementar las distintas funcionalidades se ha diseñado una red de sensores inalámbrica (WSN, Wireless Sensor Network) que se comunique con dicho sistema de control.

La WSN está formada por cuatro nodos. Dos de ellos disponen de tres pulsadores de distintos colores, que serán el medio de interacción entre los usuarios y los LEDs. Otro de los nodos dispone de un sensor de presencia para avisar al sistema de que hay alguien cerca del tablón y el nodo restante es el encargado de recibir los mensajes que envían el resto de nodos y comunicarse con la Raspberry Pi 3.

Las tareas realizadas para la consecución del objetivo de este proyecto se detallan a continuación:

  • Se ha diseñado e implementado la WSN, para lo cual se ha realizado tanto el diseño hardware como software de los nodos. En la imagen de la cabecera se muestra uno de estos nodos.
  • Se ha establecido la comunicación entre la red de sensores y el sistema de control mediante UART (Universal Asynchronous Receiver-Transmitter), de forma que cuando al nodo que recibe los datos le llega un mensaje, lo envía a la Raspberry, la cual procesa la información para configurar de forma adecuada los LEDs.
  • Se han programado las distintas funcionalidades interactivas. Concretamente se han desarrollado cuatro: una funcionalidad asociada a la detección de presencia frente al tablón para captar la atención del posible usuario y tres minijuegos, dos de ellos de dos jugadores y uno de un solo jugador.
  • Para facilitar la interacción del usuario con el tablón, se han diseñado unas cajas para almacenar los nodos que disponen de los pulsadores. El resultado final de las mismas se muestra en las siguientes imágenes:
cajaimpresa1
Botonera para el control del tablón LED
cajaimpresa3
Botonera para el control del tablón LED

 

 

 

 

 

 

 

Una vez realizadas todas estas tareas, el sistema se ha puesto en funcionamiento y se encuentra operativo para poder hacer uso de él.