Por que frequência e resolução andam juntas
Um periférico PWM conta pulsos de clock: o contador define o período, e o valor de comparação, quanto tempo a saída fica ligada. Com n bits de resolução o contador precisa de 2^n pulsos de clock por período, então a frequência máxima é o clock dividido por 2^n. A 80 MHz, com 8 bits dá para chegar a 312,5 kHz, com 13 bits a 9,77 kHz e com 1 bit a 40 MHz, mas com o ciclo de trabalho preso em 50%.
f(máx) = f(clock) / 2^bits f = f(clock) / (divisor × 2^bits)
O divisor também tem um teto, por isso frequências baixas pedem mais bits, não menos: em um ESP32-S3 com o clock de 80 MHz, 50 Hz exigem pelo menos 11 bits.
ESP32: o periférico LEDC
Todos os ESP32 geram o PWM com o periférico LEDC: um divisor com 8 bits fracionários, de 1 a cerca de 1024, e um contador de até 20 bits no ESP32, C5, C6, H2 e P4, e de 14 bits no S2, S3 e C3. O clock pode ser o APB de 80 MHz (uma saída do PLL nos chips mais novos, 96 MHz no H2), o cristal (40 MHz; 32 MHz no H2, 40 ou 48 MHz no C5), um oscilador RC interno ou, no ESP32 e no S2, o REF_TICK de 1 MHz.
O Arduino-ESP32 3.x tira o clock do PWM do cristal em todos os chips, menos no ESP32 original. Isso reduz a frequência máxima em cada resolução, pela metade onde um cristal de 40 MHz substitui um clock de 80 MHz: em um ESP32-S3, 5 kHz dão 12 bits em vez de 13. Chamar ledcSetClockSource(LEDC_AUTO_CLK) antes do ledcAttach() deixa o driver escolher o clock mais rápido; a função existe a partir do Arduino-ESP32 3.0.5. O ESPHome usa o clock APB quando ele existe e escolhe a resolução sozinho.
Raspberry Pi Pico: RP2040 e RP2350
Cada slice PWM tem um contador de 16 bits que volta a zero depois de TOP e um divisor de 1 a 255 + 15/16 em passos de 1/16. A frequência é o clock do sistema dividido por (TOP + 1) e pelo divisor, e mais uma vez por 2 no modo phase-correct. Como TOP pode ter qualquer valor, o Pico acerta em cheio quase qualquer frequência: a 125 MHz, 25 kHz são TOP 4999 com divisor 1, uns 12,3 bits.
Arduino Uno e Nano: os timers do ATmega328P
O Timer0 e o Timer2 são de 8 bits, e o Timer1, de 16 bits, cada um com uma série fixa de prescalers N. A frequência vem de N e de TOP: clock / (N × (TOP + 1)) em fast PWM, clock / (2 × N × TOP) em phase-correct. O analogWrite() deixa todos com prescaler 64: 976,6 Hz nos pinos 5 e 6, 490,2 Hz nos pinos 3, 9, 10 e 11. Para outras frequências, o Timer1 com TOP no ICR1 mantém os dois pinos e até 16 bits: um sinal de 25 kHz para uma ventoinha no pino 9 sai com ICR1 = 639, sem prescaler.
ESP8266
O ESP8266 não tem PWM por hardware: o core Arduino e o ESPHome geram o PWM por software, de 100 Hz a 40 kHz no core Arduino, com faixa padrão de 255. Segundo a documentação do core, frequências altas deixam a CPU ocupada.
Que frequência usar em cada caso
| Uso | Frequência | Por quê |
|---|---|---|
| Dimerização de LED | 1,25 kHz ou mais | A IEEE 1789 considera de baixo risco de cintilação um PWM de liga e desliga total a partir de 1.250 Hz |
| Servo de modelismo | 50 Hz, pulsos de 1 a 2 ms | Um pulso a cada 20 ms; a duração do pulso define o ângulo |
| Ventoinha de PC de 4 fios | 25 kHz (21–28 kHz) | Especificação da Intel para ventoinhas PWM de 4 fios |
| Motor DC | uns 20 kHz ou mais | Acima do limite da audição; confira o limite do driver |
| Buzzer passivo | A frequência da nota, 50% | A frequência é a altura do som |
Valores padrão de cada plataforma
| Plataforma | analogWrite() padrão | Resolução máxima | Clock do PWM |
|---|---|---|---|
| ESP32 (Arduino-ESP32 3.x) | 1 kHz, 8 bits | 20 bits | APB 80 MHz ou REF_TICK 1 MHz (AUTO) |
| ESP32-S2, S3, C3 (Arduino-ESP32 3.x) | 1 kHz, 8 bits | 14 bits | XTAL 40 MHz por padrão |
| ESP32-C5, C6, P4 (Arduino-ESP32 3.x) | 1 kHz, 8 bits | 20 bits | XTAL 40 MHz por padrão (C5: 40 ou 48 MHz) |
| ESP32-H2 (Arduino-ESP32 3.x) | 1 kHz, 8 bits | 20 bits | XTAL 32 MHz por padrão |
| RP2040, RP2350 (Arduino-Pico) | 1 kHz, faixa 255 | 16 bits | Clock do sistema: 200 MHz (Pico), 150 MHz (Pico 2) |
| ATmega328P (Uno, Nano) | 490 Hz (pinos 3, 9, 10, 11), 976,6 Hz (pinos 5, 6), 8 bits | 16 bits (Timer1) | 16 MHz com prescaler 64 |
| ESP8266 (core Arduino 3.x) | 1 kHz, faixa 255 | Faixa de até 65535 | PWM por software |
Fontes: driver LEDC e arquivos de recursos dos SoCs do ESP-IDF (release 5.5), esp32-hal-ledc.c e documentação da API LEDC do Arduino-ESP32 3.x, componentes ledc, rp2040_pwm e esp8266_pwm do ESPHome, datasheet do RP2040 e hardware_pwm do pico-sdk, wiring_analog.cpp do Arduino-Pico, datasheet da Microchip do ATmega328P e core AVR do Arduino, referência do core Arduino para ESP8266, especificação da Intel de ventoinhas PWM de 4 fios, IEEE 1789-2015 segundo o resumo do Departamento de Energia dos EUA, biblioteca Servo do Arduino.
Perguntas frequentes
Qual é a frequência PWM máxima do ESP32?
40 MHz, com 1 bit de resolução e o ciclo de trabalho fixo em 50%: o clock de 80 MHz dividido por 2. Para uma dimerização útil, com 8 bits dá para chegar a 312,5 kHz e com 10 bits a 78,1 kHz. Com o Arduino-ESP32 3.x em chips diferentes do ESP32 original, o clock padrão do cristal reduz esses valores (pela metade nos chips com cristal de 40 MHz e clock APB ou PLL de 80 MHz), a menos que você chame ledcSetClockSource(LEDC_AUTO_CLK), disponível a partir da versão 3.0.5.
Por que o ledcAttach() falha com “requested frequency and duty resolution can not be achieved”?
Porque o divisor precisa ficar entre 1 e cerca de 1024. Se a frequência for alta demais para os bits pedidos, diminua a resolução. Se for baixa demais, aumente a resolução: com menos bits é preciso um divisor maior. A calculadora mostra a faixa válida das duas.
Qual frequência PWM usar em uma ventoinha de PC de 4 pinos?
25 kHz: a especificação da Intel aceita de 21 a 28 kHz. Um ESP32 a 25 kHz chega a 11 bits com o clock de 80 MHz; um Arduino Uno tira 25 kHz do pino 9 com o Timer1 e ICR1 = 639. Comande a linha PWM da ventoinha com uma saída open-drain ou um transistor, porque é a própria ventoinha que leva a linha para o nível alto.
Como controlar um servo com PWM no ESP32?
A 50 Hz com 14 bits um passo vale cerca de 1,2 µs, fino o bastante para um servo: 1,5 ms correspondem a 1229, 1 ms a 819 e 2 ms a 1638. No ESPHome, ligue uma saída ledc a 50 Hz ao componente servo; no Arduino você também pode usar uma biblioteca como a ESP32Servo.
Por que a frequência PWM dos pinos 5 e 6 do Arduino Uno é diferente?
Os pinos 5 e 6 usam o Timer0 em fast PWM (976,6 Hz), e os outros, o Timer1 e o Timer2 em phase-correct (490,2 Hz). O Timer0 também conta o millis(), então só mude o prescaler dele se puder conviver com millis() e delay() errados.
Que resolução PWM usar em LEDs?
Com 8 bits (256 passos), a dimerização mostra degraus visíveis com pouco brilho, quando o olho mais percebe pequenas mudanças; com 12 bits ou mais e uma curva gama as transições ficam suaves. Mantenha a frequência em 1,25 kHz ou mais para ter pouca cintilação.
As duas saídas de um slice PWM do Pico podem ter frequências diferentes?
Não: A e B compartilham o contador, então têm a mesma frequência e o mesmo TOP, e só o ciclo de trabalho pode mudar. Se você precisar de frequências diferentes, use pinos de slices diferentes.