Trabalhando com Sinais PWM na ESP32 com MicroPython

Resumo

Use machine.PWM para controlar o brilho de LEDs ou a velocidade de motores em um ESP32. Defina o pino, a frequência e o ciclo de trabalho (0-1023, onde 0 é desligado e 1023 é totalmente ligado). Exemplo: pwm = PWM(Pin(2, Pin.OUT)); pwm.freq(1000); pwm.duty(512) para ciclo de trabalho de 50% no pino 2.

Usar PWM (Modulação por Largura de Pulso) no ESP32 com MicroPython permite controlar a tensão média entregue a um componente como um LED ou um motor, ligando e desligando rapidamente a saída. A proporção do tempo ligado para o tempo desligado (o ciclo de trabalho) determina a tensão média.

Aqui está um detalhamento de como usar PWM com MicroPython no ESP32:

from machine import Pin, PWM
import time
 
# Define o pino conectado ao componente que você deseja controlar
led_pin = Pin(2, Pin.OUT)  # Substitua 2 pelo pino desejado
 
# Cria um objeto PWM associado ao pino
pwm = PWM(led_pin)
 
# Define a frequência (em Hz). Valores comuns estão entre 50Hz e 1kHz para LEDs, e mais altos para motores.
pwm.freq(1000)  # 1kHz
 
# Define o ciclo de trabalho (0-1023). 0 é desligado, 1023 é totalmente ligado.
pwm.duty(512)  # Ciclo de trabalho de 50% (metade do brilho para um LED)
 
# Exemplo: Fazer um LED acender e apagar gradualmente
while True:
    for duty in range(0, 1024, 16):  # Aumenta o ciclo de trabalho
        pwm.duty(duty)
        time.sleep_ms(10)
 
    for duty in range(1023, -1, -16):  # Diminui o ciclo de trabalho
        pwm.duty(duty)
        time.sleep_ms(10)
 
# Para parar o sinal PWM:
# pwm.deinit()

Explicação:

  1. from machine import Pin, PWM: Importa as classes necessárias. Pin é para controlar os pinos GPIO, e PWM é para criar objetos PWM.
  2. led_pin = Pin(2, Pin.OUT): Cria um objeto Pin representando o pino GPIO conectado ao seu componente. Substitua 2 pelo número do pino real que você está usando. Pin.OUT configura o pino como uma saída.
  3. pwm = PWM(led_pin): Cria um objeto PWM associado ao pino especificado.
  4. pwm.freq(1000): Define a frequência PWM para 1kHz. Ajuste este valor conforme necessário. Frequências mais altas são geralmente melhores para um controle mais suave e menos cintilação de LEDs, mas podem não ser adequadas para todas as aplicações.
  5. pwm.duty(512): Define o ciclo de trabalho para 512, que é 50% (512/1023). Isso significa que a saída estará ligada por metade do ciclo e desligada pela outra metade. Para LEDs, isso corresponde a aproximadamente metade do brilho.
  6. Exemplo de Fade: O loop while True demonstra como alterar o ciclo de trabalho dinamicamente para criar um efeito de fade. Os loops for incrementam e decrementam o ciclo de trabalho, criando um fade suave de entrada e saída.
  7. pwm.deinit(): Para o sinal PWM no pino. Isso é importante se você quiser usar o pino para um propósito diferente mais tarde.

Considerações Chave:

  • Escolha do Pino: Nem todos os pinos do ESP32 suportam PWM. Consulte o diagrama de pinagem do ESP32 para sua placa específica para identificar pinos capazes de PWM.
  • Frequência: A frequência apropriada depende da sua aplicação. Para LEDs, uma frequência acima de 100Hz geralmente é suficiente para evitar cintilação visível. Para motores, frequências mais altas podem ser necessárias para um controle mais suave.
  • Resolução do Ciclo de Trabalho: O PWM do ESP32 tipicamente tem uma resolução de 10 bits (0-1023). Isso significa que você pode definir o ciclo de trabalho com 1024 valores diferentes.
  • Limitações de Canal: O ESP32 possui um número limitado de canais PWM. Se você precisar controlar muitos dispositivos simultaneamente, pode ser necessário usar técnicas como multiplexação.