Tutorial 5. PWM (Modulación por Ancho de Pulso) en Microcontrolador de la serie STM32F4.

Bienvenido al tutorial 5 de Ophyra, donde utilizaremos uno de los PWM (Modulación por Ancho de Pulso). El STM32F407 de Ophyra cuenta con 14 Timers los cuales 12 tienen una resolución de 12 bits y 2 de 32 bits, además algunos de estos cuentan 4 canales para diferentes usos. El objetivo de este tutorial es utilizar el canal 4 del Timer 1 para controlar la intensidad de un LED.

 

Configurar Hardware usando STM32CubeMX.

Creamos un nuevo proyecto dentro de STM32CubeMX dando un click sobre el menú “New Project” para seleccionar el Microcontrolador de Ophyra (STM32F407VG) como se observa en la imagen 1.

Imagen 1. Selección del Microcontrolador.

Una vez creado el proyecto seleccionamos el Timer 1 (al igual que en el tutorial #2) con la diferencia de habilitar en canal 4 como PWM como en la imagen 2

Imagen 2. Activación del canal 4 del Timer 1.

Esto hace que el uso del PWM sea por medio de Hardware, es decir, tendremos una función que nos permite colocar el valor del ciclo de trabajo sin la necesidad de calcular el tiempo en alto y bajo para dicho valor, por consiguiente al tener un PWM de este tipo el Microcontrolador asigna el GPIO a usar.

Imagen 3. Asignación del GPIO del PWM.

Dentro de la pestaña de configuración “Configuration” se muestra en el grupo de control el Timer seleccionado, en este caso el Timer 1. Accionando sobre este botón se muestra una ventana para configurar la frecuencia y el ciclo de trabajo a la operará nuestro Timer como se muestra en la imagen 4 y 5.

Imagen 4. Configuración de los recursos.

Imagen 5. Configuración del Timer1.

Dentro del tutorial #2 tenemos las fórmulas que dominan a los Timers, quienes nos proporcionan los valores para el Prescaler y el periodo de cuenta (Period Counter) que son las siguientes:

  1. Ft = (Fc)/(P+1)               2. T=(1/Ft)(Cp+1)

Dónde:

Ft = Frecuencia de operación del Timer

P = Prescaler

T = Tiempo

Cp = Periodo de Cuenta (Preiod Counter)

Proponiendo un Prescaler de 15  y una frecuencia de trabajo de 10KHz tenemos una frecuencia máxima de 1MHz y un Counter Period de 99, es decir, la cantidad de pasos que le tomará al PWM llegar al 100% de su ciclo de trabajo:

  1. Ft = 1MHz           2. Cp = 99

Una vez calculado estos valores solo resta el colocarlos en la ventana de la imagen 6.

Imagen 6. Configuración del Timer.

Las demás opciones que nos entrega este modo no las vamos a modificar por el momento. Estas opciones nos permiten habilitar un tiempo muerto, la polaridad del PWM, su resolución, la velocidad de comunicación hacia el GPIO designado por el Microcontrolador y más.

Estamos listos para generar el proyecto al IDE de Atollic, para ello basta con accionar sobre el icono en forma de engrane que se encuentra debajo de la barra de menú e indicaremos el nombre del proyecto, su ubicación y el IDE que utilizaremos para generar nuestro código como se muestra en las imágenes 7 y 8.

Imagen 7. Generación de código.

Imagen 8. Configuración para generar proyecto.

Realizar programa en Atollic TrueSTUDIO.

Una vez que se ha compilado el proyecto y hemos abierto AtollicTrueSTUDIO nos dirigimos a la carpeta Src y al archivo main.c

Imagen 9. Archivos del proyecto actual.

Accionando dos veces sobre el archivo main.c se muestra el archivo que contiene la función main del Microcontrolador. Aproximadamente en la línea 97 tenemos las indicaciones para colocar el código que deseamos realizar como se muestra en la imagen 10, es decir, antes de que se inicie nuestro ciclo infinito.

Imagen 10. Inicio de nuestro código.

Antes de poder controlar nuestro PWM debemos de inicializarlo o comenzarlo, esto se hace con la función o método Hal_TIM_PWM_Start(); la cual requiere dos parámetros. El primer parámetro es el Timer a usar y el segundo es el canal del Timer que controlará el GPIO como se muestra en la imagen 11 y 12.

Imagen 11. Descripción de la función Hal_TIM_PWM_Start().

Imagen 12. Parámetros para la función Hal_TIM_PWM_Start().

La función que se encarga de controlar el GPIO mapeado por el Microcontrolador es __Hal_TIM_SetCompare(); Esta función recibe tres parámetros los cuales son: el Timer a usar, el canal y el número de pasos. Este último valor es el Counter Period del Timer1, por consiguiente únicamente podemos colocar valores entre 0 y 99, es decir, el 100% de nuestro ciclo de trabajo es 99. Si deseamos que el ciclo de trabajo se encuentre a la mitad (50%) debemos de colocar 50.50505051 como tercer parámetro, redondeándolo da 51.

Imagen 13. Función para controlar el PWM.

Para poder ver el efecto del PWM en el GPIO colocamos dos ciclos de repetición FOR. El primer ciclo incrementará el valor del ciclo de trabajo mientras que el segundo se encarga de realizar el decremento.

Imagen 14. Control del PWM.

Una vez terminado de crear nuestro código podemos compilar nuestro proyecto para generar el archivo con extensión .HEX que será cargada a la tarjeta Ophyra. Para ello nos dirigimos al icono con el martillo o dentro del menú PROJECT -> BUILD PROJECT.

Imagen 15. Compilación del proyecto.

Cargar programa a nuestra tarjeta de Desarrollo Ophyra

El último paso es programar tu tarjeta Ophyra. Si nunca lo has hecho, sigue esta GUÍA.

Conclusiones

Hemos configurado y programado en Ophyra, el control del ancho de pulso sobre un GPIO.

Te sugerimos hacer ejercicios como control de intensidad de LED, intensidad de un foco, el control de un servomotor o más.

Además, puedes revisar nuestra sección de prácticas, donde podrás encontrar algunos ejercicios y sus códigos.

Si tienes alguna consulta o duda sobre este tutorial o referente a cualquier otro tema de Ophyra, contactanos a nuestro Foro.

Menú