Ir a contenido
Mejora tu programación con Arduino: Manejo de PWM - 330ohms

Mejora tu programación con Arduino: Manejo de PWM - 330ohms

Si has usado servomotores con las librerias de Arduino o has controlado la velocidad de un motor ya tendrás idea de lo que es PWM. Para los servos se emplea un ciclo de trabajo muy específico y en otras aplicaciones puede que necesites modificar la frecuencia de forma precisa. Sin embargo, para poder emplear esta funcionalidad en varias salidas, las librerías construyen de un modo muy particular las señal. Las variaciones de unos microsegundos pueden influir en el funcionamiento, provocando “parpadeos” en la posición de los servos.

Para ello te mostraremos como manejar los registros que controlan el módulo de PWM, de modo que puedas definir con gran precisión las señales que manejes.

Obtener salidas PWM puede conseguirse simplemente trabajando con la funcion analogWrite(), pues esta maneja una señal que varia su ancho de pulso. Sin embargo, la frecuencia de esta señal es fija y no tenemos todo el control para manipularla. Una forma de tener más control sobre una señal de ancho de pulso es generando directamente la señal encendiendo y apagando las salidas con las funciones millis() y micros(). La desventaja de esto es que no puedes realizar otras instrucciones y dejar en segundo plano el PWM. Para manejar varias tareas a la vez es que manejamos los registros directamente.

Tomado de la hoja de especficaciones del servo SG90, se puede observar la señal de control y las posiciones que puede tomar para determinado ancho de pulso

Los registros de configuración

La señal PWM se puede realizar mediante 3 registros, llamados Timer0, Timer1 y Timer2. Estos registros controlan las salidas de PWM. Para establecer las frecuencias y ancho de pulso se usan los registros TCCRnA y TCCRnB. La configuración de estos registros se puede complicar aún más por las distintas modalidades y casos específicos que se pueden dar al configurarlos. También es útil mencionar que estos registros se agrupan en un conjunto de bits, y estas son sus funciones:

  • Los bits de que manjan la forma de generar la señal (Waveform Generation Mode bits WGM ): estos controlan la forma en que manejamos el temporizador.
    (Estos bits se distribuyen en los dos registros)
  • Bits de selección de reloj (CS): estos controlan el preescalador del temporizador
  • Bits (COMnA): habilitan/deshabilitan/invierten la salida A
  • Bits (COMnB): habilitan/deshabilitan/invierten la salida B

Los registros OCRnA y OCRnB fijan los nivleles en los que las salidas A y B serán afectadas. Cuando el temporizador iguale esos valores, la salida correspondiente cambiará de acuerdo a el modo especificado por los registros anteriores.

En este tutorial vamos a manejar los registros de 2 modos: Fast PWM y Phase-correct PWM. La diferencia entre estos dos es cómo opera internamente el microcontrolador para generar las señales. Veamos como configurarlos:

Fast PWM

Esta porción de código configura el modo Fast PWM en los pines 3 y 11, usando el Timer 2. Para resumir los cambios en los registros, diremos que los bits de configuración de la forma de onda en WGM, selecciona el modo fast PWM. Al mandar el dato 10 a COM2A y COM2B provee una señal no invertida a las salidas A y B. Configurando los bits CS a 100 indica que usamos el preescalador de 64. Los registros de comparación se configuran arbitrariamente a 180 y 50 para controlar el ancho de pulso de las salidas A y B.

Phase-correct PWM

El segundo modo de PWM se llama phase-correct PWM. En este modo, el temporizador cuenta de 0 a 255 y luego de regreso a 0, La salida se apaga cuando el temporizador llega al valor de comparación y luego va de regreso. Esto resulta en una señal mas simétrica. La frecuencia de salida será aproximadamente la mitad del valor para el modo fast PWM, dado a que el temporizador debe contar de ida y regreso.

Los dos metodos producen señales PWM, la diferencia es que el modo fast PWM puede alcanzar frecuencias más altas, que pueden servir en fuentes de conmutacion y controladores de motores. El modo phase-correct permite tener una señal más exacta, pero no alcanza frecuencias tan altas.

Referencias:

Secrets of Arduino PWM

Datasheet ATMEGA328P

Artículo anterior Tutorial #8 de Raspberry Pi Pico: sensor ultrasónico - 330ohms