Está en la página 1de 5

LED PWM

Introducción
El controlador LED_PWM está diseñado principalmente para controlar la
intensidad de los LED, aunque puede usarse también para generar señales
PWM para otros fines. Cuenta con 16 canales que pueden generar formas de
onda independientes que se pueden usar para controlar dispositivos LED
RGB. Para una mayor flexibilidad, tanto los canales de alta velocidad como
los canales de baja velocidad se pueden manejar desde uno de los cuatro
temporizadores de alta velocidad / baja velocidad. El controlador PWM
también tiene la capacidad de aumentar o disminuir automáticamente el
ciclo de trabajo gradualmente, permitiendo desvanecimientos sin ninguna
interferencia del procesador. Para aumentar la resolución, el controlador
LED_PWM también puede oscilar entre dos valores, cuando un se configura el
valor fraccional de PWM.
Arquitectura del controlador
El controlador LED_PWM tiene ocho generadores PWM de alta velocidad y ocho
de baja velocidad. En este documento,se denominará hschn y lschn,
respectivamente. Estos canales pueden manejarse desde cuatro
temporizadores que serán indicados por h_timerx y l_timerx.
La figura siguiente muestra la arquitectura del controlador LED_PWM. Como
se puede ver en la misma, el controlador LED_PWM contiene ocho canales de
alta velocidad y ocho de baja velocidad. Hay cuatro módulos de reloj de
alta velocidad para los canales de alta velocidad, de los cuales se puede
seleccionar un h_timerx. También hay cuatro relojes de baja velocidad
para los canales de baja velocidad, de los cuales se puede seleccionar un
l_timerx:

La figura siguiente ilustra un canal PWM con su temporizador seleccionado;


en este caso un canal de alta velocidad está asociado a un temporizador de
alta velocidad.

1
Temporizadores (Timers)
Un temporizador de alta velocidad tiene un multiplexor para seleccionar
una de las dos fuentes de reloj: REF_TICK o APB_CLK.
El reloj de entrada es dividido por un primer divisor, el cual reduce su
frecuencia. El factor de división se especifica mediante el registro
LEDC_CLK_DIV_NUM_HSTIMERx el cual esta constituido por un número de punto
fijo: los 10 bits más altos representan la parte entera denominada “A”,
mientras que los ocho bits de menor peso contienen la porción fraccionaria
denominada “B”. El factor de división final es el siguiente:

La figura siguiente muestra la entrada y salida de reloj cuando la porción


fraccional B no es 0.

El reloj de salida del divisor es el reloj base para el contador que


contará hasta el valor especificado en LEDC_HSTIMERx_DUTY_RES. Se generará
una interrupción por desborde una vez que el valor de conteo alcance el
valor cargado en el registro LEDC_HSTIMERx_DUTY _RES, momento en el cual
el contador reinicia el conteo desde 0. También es posible resetear, parar
y leer los valores del contador por software.
El período de ciclo de esta señal define la frecuencia de las señales de
cualquier canal PWM conectado a este temporizador. Esta frecuencia depende
tanto del factor de división del divisor, así como el rango del contador:

2
Los temporizadores de baja velocidad l_timerx del canal de baja velocidad
difieren de los temporizadores de alta velocidad h_timerx en dos aspectos:
1. Cuando la fuente del reloj del temporizador de alta velocidad puede
sincronizarse desde REF_TICK o APB_CLK, la velocidad baja los
temporizadores provienen de REF_TICK o SLOW_CLOCK. La fuente
SLOW_CLOCK puede ser APB_CLK (80 MHz) u 8 MHz, y se puede seleccionar
usando LEDC_APB_CLK_SEL.

2. El contador de alta velocidad y el divisor fallan, lo que significa


que si el software modifica el valor máximo del contador o divisor,
la actualización entrará en vigencia después de la próxima
interrupción por desborde. En contraste, el contador y el divisor de
baja velocidad actualizarán estos valores solo cuando
LEDC_LSTIMERx_PARA_UP esté configurado.

CANALES
Un canal toma el valor de 20 bits del contador del temporizador de alta
velocidad seleccionado y lo compara con un conjunto de dos valores para
configurar la salida del canal.
El primer valor con el que se compara es el contenido del registro
LEDC_HPOINT_HSCHn, si estos dos coinciden, la salida se enclavará
poniéndose en 1.
El segundo valor es la suma de LEDC_HPOINT_HSCHn y LEDC_DUTY_HSCHn. Cuando
se alcanza este valor, la salida se pone en 0.
Al usar estos dos valores, se puede establecer la fase relativa y el ciclo
de trabajo de la salida PWM. En la siguiente figura se ilustra el
funcionamiento:

LEDC_DUTY_HSCHn es un registro de punto fijo con cuatro bits


fraccionarios. Como se mencionó antes, cuando LEDC_DUTY_HSCHn [24..4] se
usa directamente en el cálculo de PWM, LEDC_DUTY_HSCHn [3..0] puede usarse
para difuminar la salida. Si este valor no es cero, con una probabilidad
estadística de LEDC_DUTY_HSCHn [3..0] / 16, el valor real del pulso PWM
será un ciclo más largo. Esto efectivamente aumenta la resolución del
generador PWM a 25 bits, pero a costa de un ligero temblor en el ciclo de
trabajo.
Los canales también tienen la capacidad de desvanecerse automáticamente de
un valor de ciclo de trabajo a otro. Esta característica es habilitada
configurando LEDC_DUTY_START_HSCHn. Cuando se pone en uno este bit, el
controlador PWM automáticamente incrementar o disminuir el valor en
LEDC_DUTY_HSCHn, dependiendo de si el bit LEDC_DUTY_INC_HSCHn esta puesto
en 1 o en 0, respectivamente. La velocidad a la cambia el ciclo de
trabajo se define como tal:
3
cada vez que LEDC_DUTY_CYCLE_HSCHn realiza un ciclo, el contenido de
LEDC_DUTY_SCALE_HSCHn se agrega a /o restado de LEDC_DUTY_HSCHn [24..4].
La duración del desvanecimiento puede limitarse configurando
LEDC_DUTY_NUM_HSCHn: el desvanecimiento solo durará ese número de ciclos
antes de terminar. El final de un desvanecimiento también genera una
interrupción.

Notas
• Cuando LEDC está en modo de desvanecimiento, configure el segundo
desvanecimiento solo después de LEDC_DUTY_CHNG_END_HSCHn o
LEDC_DUTY_CHNG_END_LSCHn, lo que genera una interrupción.

• Cuando LEDC está en modo de desvanecimiento decreciente y


LEDC_DUTY_HSCHn es 2LEDC_HSTIMERx_DUTY _RES, LEDC_DUTY_SCALE_HSCHn no
puede ponerse en 1. Cuando LEDC está en modo de desvanecimiento
decreciente y LEDC_DUTY_LSCHn es 2LEDC_LSTIMERx_DUTY _RES,
LEDC_DUTY_SCALE_LSCHn no se puede ponerse en 1.

Interrupciones
• LEDC_DUTY_CHNG_END_LSCHn_INT: se activa cuando finaliza el
desvanecimiento en un canal de baja velocidad.
• LEDC_DUTY_CHNG_END_HSCHn_INT: se activa cuando finaliza el
desvanecimiento en un canal de alta velocidad.
• LEDC_HS_TIMERx_OVF_INT: se activa cuando un temporizador de alta
velocidad alcanza su valor de cuenta máxima.
• LEDC_LS_TIMERx_OVF_INT: se activa cuando un temporizador de baja
velocidad alcanza su valor de cuenta máxima.

SOPORTE ARDUINO
Para controlar y configurar el PWM LED, el ESP32 cuenta con las siguientes
funciones:

• ledcSetup(channel, freq, resolution_bits): Esta función permite la


configuración de cada canal del módulo PWM. Los parámetros que se le
pasan son: el Nro del canal, de los 16 posibles; la frecuencia, y los
bits de resolución.

• ledcWrite(channel,duty): Esta función permite fijar el duty cicle de


un canal determinado. Los parámetros que se le pasan son el valor del
canal y el del dutycicle.

• ledcWriteTone(channel, freq): Esta función utiliza el módulo PWM para


generar una frecuencia de salida como si fuera un generador de tono
cuyo ciclo de trabajo es al 50%. Los parámetros a pasar son el canal
y el vallor de la frecuencia de salida.

• ledcWriteNote(channel, note, octave):Esta función es similar a la


anterior pero con la característica de que convierte el PWM en un
sintetizador de onda cuadrada, y se le debe especificar el canal, la
nota y la octava.

4
• ledcRead(channel):Esta es una función que nos permite leer el valor
del dutyclicle cargado en un canal especificado.

• ledcReadFreq(channel):Esta función es similar a la anterior pero nos


permite saber que frecuencia se le asignó a un canal determinado.

• ledcAttachPin(pin,channel):Esta función nos permite asignar un pin


como PWM.

• ledcDetachPin(pin):Esta función nos permite desasignar un pin como


PWM.

06 Febrero 2020, Buenos Aires, Argentina. Andrés Raúl Bruno Saravia

También podría gustarte