PWM – ESP32

PWM – ESP32

Um recurso muito útil e muito utilizado na eletrônica é o
PWM (Pulse-Width Modulation) ou MPL (modulação por largura de pulso mais conhecida pela sigla em inglês. Este recurso é utilizado para diminuir a quantidade de energia enviada para uma carga qualquer como um LED ou motor apenas diminuindo a duração do pulso enviado em diversos valores de frequência. Para um LED esta frequência deve ser superior a 50 Hz para que não haja uma percepção óptica que o LED está piscando

Funcionamento do PWM fonte: http://www.pyroelectro.com/

Como é exibido acima, o brilho do LED é alterado conforme o Duty Cycle (ciclo de trabalho), funcionando como um chaveamento em uma velocidade tão rápida que não se dá para perceber a olhos nus, porem pode ser visto visivelmente por filmagens.

A variação do Duty Cycle é feita alterando somente a largura do pulso através do chaveamento, muitos microcontroladores já possuem circuitos específicos já integrado em seu chip onde é só selecionar a frequência e a porcentagem do Duty Cycle na programação que o PWM funciona automaticamente como é o caso do ESP32, em outro que não possuem esse tipo de circuito o PWM é feito manualmente pelo próprio controlador através de bibliotecas que utilizam a frequência do processador para fazer o chaveamento ligando e desligando através de mudanças de estado no código.

Ilustração de um pulso PWM as 50% fonte: www.citisystems.com.br

A o pico de tensão continua o mesmo porem o que é alterado é a tensão média do sinal, no exemplo acima, para uma tensão de 12V com um duty cycle de 50% a frequência não é importante neste caso, a tensão media em um ciclo (1 Hz) é de 6V se você medir com um voltímetro dará 6V porem o pico da tensão (Vpp) se mantêm a 12V somente a corrente é reduzida pela metade

O pico de tensão (Vpp) dependendo do componente é muito perigoso devido a tensão de isolamento, como no caso dos capacitores que possui o isolante dielétrico que possui o limite exposto em seu corpo

ATENÇÃO

Programação

Arduino

Para o Arduíno a configuração do PWM é feita pela função analogWrite(x), onde x é o valor do duty cycle em 7bits (0 à 255) onde 255 é 100%, a frequência nesta função não é ajustável ela é fixa de 500Hz. Esta função funciona somente na plataforma Arduino (UNO, Mega, Nano, …), no ESP32 esta função é invalida pois o PWM é feito por uma maneira diferente.

Variações do Duty Cycle do PWM do analogWrite Fonte: www.arduino.cc

ESP32

O PWM do ESP32 é separado por canais, o numero máximo de canais são 8 (0 a 7), abaixo está um diagrama de como é feita a modulação do PWM do ESP32:

Diagrama do Controlador PWM do ESP32 Fonte: docs.espressif.com

No ESP32 o conjunto de função responsável pelo PWM é o ledc que necessita ser configurado em 3 etapas: ledcSetup, ledcAttachPin e ledcWrite.

O código de exemplo é o seguinte:

const int ledPino = 16;  // 16 corresponde ao GPIO16

//configuração dos parâmetros do PWM
const int freq = 10000;
const int ledCanal = 0;
const int resolucao = 8;
 
void setup(){'
  // configura o PWM através dos parâmetros
  ledcSetup(ledCanal, freq, resolucao);
  
  // Anexar o canal ao GPIO
  ledcAttachPin(ledPino, ledCanal);

 // diminuir o brilho do LED
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // mudando o brilho do LED com o PWM
    ledcWrite(ledCanal, dutyCycle);   
    delay(15);
  }
}
ledC

Documentação Online

Acesse a Documentação Online do LEDC no site da Espressif clicando do botão abaixo:

No exemplo da configuração acima a frequência utilizada é de 10 kHz, a frequência pode ser configurada até 40 MHz, porem com uma resolução muito pequena de até 2bits

FrequênciaResolução (máxima)Duty Cycle
1 Hz até 1 kHz20 bits0 a 100%
1 kHz a 100 kHz13 bits0 a 100%
100 kHz a 1 MHz7 bits0 a 100%
1 MHz a 20 MHz3 bits25%, 50%,
75% ou 100%
20 MHz a 40MHz1 bit50%

*Os valores da tabela são valores encontrados em prática, pode variar conforme a frequência

Se você estiver usando o monitor serial caso a resolução ou o duty cycle esteja errado ele irá retornar o seguinte erro:

E (196) ledc: requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=128

Outra função que se pode utilizar para o PWM que tem o mesmo propósito é a função sigmaDeltaWrite() como o exemplo abaixo:

void setup()
{
    //Configura o canal 0 com frequência de 312500 Hz
    sigmaDeltaSetup(0, 312500);
    //Anexa o pino 18 (GPIO18) ao canal 0
    sigmaDeltaAttachPin(18,0);
    //inicializa o canal 0 para desativado
    sigmaDeltaWrite(0, 0);
}

void loop()
{
    //aumenta lentamente o valor
    //irá estourar a 256
    static uint8_t i = 0;
    sigmaDeltaWrite(0, i++);
    delay(100);
}

A única diferença é que no sigmaDelta não é possível configurar a resolução ela é de 7 bits, porem é configurável o prescale de 0 a 255 com base no clock do processador

sigmadelta_set prescale(canal, prescale);

Exemplo:

// Configurar o canal 1 com o prescale de 1/100 para 80MHz fica 800 kHz
sigmadelta_set_prescale( 1 , 100);

Fontes:
https://randomnerdtutorials.com/esp32-pwm-arduino-ide/
https://portal.vidadesilicio.com.br/controle-de-potencia-via-pwm-esp32/
http://www.pyroelectro.com/tutorials/fading_led_pwm/index.html
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/ledc.html
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/sigmadelta.html

Licença CC 4.0

Creative Commons

O trabalho “PWM – ESP32” de JailsonBR está licenciado com uma Licença Creative Commons Atribuição 4.0 Internacional.

Jailson Oliveira

Sou Engenheiro Eletricista com Enfase em Eletrônica e Técnico em Eletrônica, gosto de estar praticando montagens de circuitos e também programar sistemas embarcados. Acredito que compartilhar informações gratuita gera mais informações novas por parte de outras pessoas.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *