Un senyal digital de l'ESP32 només pot tenir un valor de 0V o de 3.3V. Permet activar/desactivar un actuador.
Un senyal analògic de sortida pot tenir qualsevol valor entre 0V i 3.3V. Permet controlar la intensitat d'iluminació d'una làmpada, la velocitat de gir d'un motor, el volum d'un so ...
Però totes les sortides dels microcontroladors són digitals (1 o 0).
Tot i això poden generar sortides pseudoanalògiques, mitjançant una tècnica anomenada PWM (Pulse Width Modulation, modulació d'ample de pols).
Valor d'un senyal PWM: entre 0 i 255
La conversió ADC utilitza 8 bits. 28 = 256 possibles valors (0 a 255)
Conceptes PWM 👇
Els senyals PWM són trens de polsos (senyals alt-baix que es repeteixen en el temps).
La tensió generada pel pin depèn de l'ample del pols (percentatge del temps que els pols està actiu en un període):
Ample pols = 0% → Vs = 0V (led apagat)
Ample pols = 100% → Vs = 3.3V (led encés al màxim)
La freqüència del PWM és el nombre de polsos que es repeteixen en 1 s.
L’ESP32 permet definir la freqüència dels senyals PWM. Per controlar nivells d’il·luminació de leds utilitzem F = 5000 Hz (5000 polsos / segon).
L'ample del pols és la seva durada: T = 1 / 5000 Hz = 0,2 milisegons
Sortides analògiques de l'ESP32
Tots els pins que podem fer servir com a sortides digitals poden treure senyals PWM.
En un disseny PWM cal:
Importar les classes Pin i PWM de la llibreria machine:
from machine import Pin, PWM
Crear l'objecte PWM especificant el núm de pin:
objectePWM = PWM(Pin(23))
Especificar la freqüència del senyal PWM (polsos per segon), entre 0 i 7825 Hz. Amb LEDs utilitzem 5000 Hz, la qual cosa provoca un parpelleig que l'ull humà no pot detectar:
objectePWM.freq(5000)
Assignar l'ample del pols, entre 0 (0% del cicle de treball, apagat) i 1023 (100% del cicle de treball, lluminositat màxima en el cas d'un LED)
objectePWM.duty(500)
EXEMPLES BÀSICS. Nivell d'il·luminació d'un LED
Aquest programa assigna un valor fix al senyal PWM.
Proveu amb diferents amples de pols (duty) per comprovar l'efecte en la lluminositat del LED
from machine import Pin, PWM
led = PWM(Pin(23)) # configuració de l'objecte PWM
led.freq (5000) # assigna la freqüència: 5000 Hz
led.duty (100) # ample del pols per definir la lluminositat del led
Podem definir tots els paràmetres de l'objecte PWM en una única línia de codi.
El següent exemple, a més, manté encés el led durant 2 segons i l'apaga
from machine import Pin, PWM
from time import sleep
led = PWM(Pin(23), freq=5000, duty=100)
sleep(2)
led.deinit()
# deinit reinicia el pin: deixa d'enviar senyals PWM i el LED s'apaga
Encesa gradual d'un LED
Es tracta de anar augmentant contínuament l'ample del pols (duty) des de 0 (apagat) fins a 255 (lluminositat màxima)
Proposta 1. Fem que un cop encés al màxim, el LED s'apagui gradualment
Proposta 2. Fem-ho continu
.
SEGUIM
Amb senyals PWM també podem ...