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
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.
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.
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:
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);
}
}
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ência | Resolução (máxima) | Duty Cycle |
1 Hz até 1 kHz | 20 bits | 0 a 100% |
1 kHz a 100 kHz | 13 bits | 0 a 100% |
100 kHz a 1 MHz | 7 bits | 0 a 100% |
1 MHz a 20 MHz | 3 bits | 25%, 50%, 75% ou 100% |
20 MHz a 40MHz | 1 bit | 50% |
*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