Envío Gratis en compras mínimas de $1200 mxn Enviamos a toda la Republica Mexicana
Buscar

5. PWM (Modulación por Ancho de Pulso)

Bienvenidos al quinto tutorial de Ophyra, donde utilizaremos uno de los PWM (Modulación por Ancho de Pulso). Así como se mencionó brevemente en el tutorial 2. Timers (Temporizadores), los Timers tienen cuatro canales que pueden usarse para varias herramientas, y el PWM está incluido en esas opciones.

Proyecto a realizar: Se controlará la intensidad de un LED mediante el PWM.

 

Configurando el hardware

Una vez ya creado nuestro proyecto (véase el tutorial preliminar de Crear un Proyecto para Ophyra), el siguiente paso es activar los recursos a utilizar.

Paso 1. En la categoría de Timers, activaremos el Timer 1. Ahora, en lugar de indicarle una fuente de reloj, se activará el Canal 4 como PWM, así como se muestra en la siguiente imagen.

Imagen 1. Activando el PWM en el 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 pin a utilizar.

Imagen 2. Asignación del pin al PWM.

 

Paso 2. Ahora debemos calcular los parámetros del Prescaler y el Counter Period. Así como en el tutorial 2. Timers (Temporizadores), tenemos las siguientes fórmulas:

Nosotros propondremos que queremos que el PWM trabaje a una frecuencia de 10KHz, que al sacarle su inversa para tener el tiempo de trabajo (T) se vuelve 100μs. También propondremos en este caso el Counter Period (Cp) con un valor de 99 para que sea más fácil de controlar (se explicará mas adelante).

Así entonces, de la segunda fórmula podremos calcular la Frecuencia del Timer (FT) y una vez calculado, podremos calcular el Prescaler (P) de la primera fórmula. Los resultados son los siguientes:

FT = 1MHz

= 83

 

Paso 3. Colocaremos los valores del Prescaler y Counter Period en la configuración del Timer.

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

Imagen 3. Configurando el Timer del PWM.

 

Paso 4. Ahora es momento de generar nuestro código.


ADVERTENCIA

Si durante la creación de tu proyecto no llegaste a configurar el reloj de la tarjeta o a configurar los detalles del proyecto respecto a la generación del código, aún estás a tiempo.

Para sabér cómo hacer esas configuraciones, dirígase al tutorial preliminar de Crear un Proyecto para Ophyra y siga los pasos en Anexo 1: Configurar el reloj de la Ophyra y Anexo 2: Configurar los detalles el proyecto.


 

Para generar el código, basta con hacer clic en el botón de Guardar que se encuentra en la barra de herramientas en la parte superior. La interfaz cambiará y comenzará a cargar el código, así como se muestra en la siguiente imagen.

Imagen 4. Generando código.

 

Realizando el código

Paso 5. Antes de poder controlar nuestro PWM, debemos de inicializarlo. Esto se hace con la función:

HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)

Esta función requiere de dos parámetros. El primero es el Timer a utilizar y el segundo es el canal del Timer que controlará el pin GPIO. En los pasos previos, llegamos a activar el Timer 1 y utilizamos el canal 4, por lo que queda el código de la siguiente manera:

/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

 

Paso 6. La función que se encargará de controlar el pin GPIO asignado por el microcontrolador es:

__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)

Esta función requiere de tres parámetros. El primero es el Timer a utilizar, el segundo es el canal del timer y el último es un número de paso. Este último parámetro puede ir desde 0 hasta un máximo igual al Counter Period que configuramos en el Timer (que en nuestro caso es 99). Escribir el 99 en la función, nos daría un 100% de nuestro ciclo de trabajo. Entonces, si deseamos que el ciclo de trabajo se encuentre a la mitad (50%) debemos colocar 50.50505051 como tercer parámetro, que se redondea a 51 (sólo números enteros).

Queremos que nuestro microcontrolador empiece con un 0% de ciclo de trabajo, por lo que agregaremos la siguiente línea:

/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 0);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

 

Paso 7. 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.

/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 0);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    for (int duty = 0; duty <= 99; duty++) {
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, duty);
        HAL_Delay(10);
    }
    HAL_Delay(100);
    
    for (int duty = 99; duty >= 0; duty--) {
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, duty);
        HAL_Delay(10);
    }
    HAL_Delay(100);
}
/* USER CODE END 3 */

 

Paso final – Cargar el programa a la Ophyra

Ahora, falta programar nuestro código a la tarjeta Ophyra. Las instrucciones se encuentran en el tutorial del Paso final – Cargar el programa a la Ophyra.

 

Preparando nuestra tarjeta Ophyra

Ya que el pin asignado para nuestro PWM no coincide con ninguno de los tres pines del LED-RGB, debemos conectarle su propio LED a ese pin. El material a necesitar es:

  • Cables conectores macho-macho o cable para protoboard.
  • Un LED con capacidad de 3.3 volts (uno de 5V servirá, mas no se iluminará mucho).
  • Una resistencia de 330 ohms.
  • Una tarjeta Ophyra.
Imagen 5. Conectando un LED al pin del PWM.

 

Resultados

Podemos ver que el LED va aumentando su brillo hasta llegar a su máximo y luego comienza a bajar hasta estar completamente apagado.

 

Conclusiones

Hemos configurado y programado en Ophyra el control del ancho de pulso sobre un GPIO. Ahora puedes continuar con ejercicios como el control de un servomotor.

Para seguir aprendiendo más sobre los recursos básicos de la Ophyra, te recomendamos seguir con el siguiente tutorial: 6. Interrupciones Externas.