Aziz Bench

Calculadora PWM: frequência e resolução

Escolha o chip e a frequência de que você precisa: veja quantos bits de resolução do ciclo de trabalho você consegue, a frequência exata, os valores do divisor ou do timer e o código para Arduino, ESPHome e os SDKs.

Resolução do ciclo de trabalho
13bits
8.192 passos a 5 kHz
Frequência obtida
5 kHzexata
Menor passo
24,4 ns0,0122% do período
Divisor
1,953clock APB, 80 MHz
Sinal
ligado 100 µsperíodo 200 µs
Chip e software
Software

O Arduino-ESP32 3.x tira o clock do PWM do cristal em todos os chips, menos no ESP32 original, e isso limita a resolução. O ESPHome escolhe a resolução sozinho.

Sinal
Hz

Em hertz: 5000 são 5 kHz.

%

Configuração e código

Clock e divisorClock APB a 80 MHz, divisor 1,953 (div_param 500), 13 bits: o timer roda a 5 kHz.
Valor a escrever50% = 4.096 de 8.192. Escreva 8.192 para ficar sempre ligado e 0 para ficar sempre desligado.
Faixa possívelA 5 kHz: de 1 a 13 bits. Com 13 bits: de 0,119 Hz a 9,7656 kHz.
Configurações compartilhadasO ESP32 tem 16 canais PWM e 8 timers: os canais do mesmo timer compartilham frequência e resolução.

Código

Troque o pino pelo seu: os valores correspondem ao resultado acima.

Arduino-ESP32 3.x
const int PWM_PIN = 4;          // GPIO
const uint32_t PWM_FREQ = 5000;     // Hz
const uint8_t PWM_RES = 13;        // bit: 0–8192

void setup() {
  ledcAttach(PWM_PIN, PWM_FREQ, PWM_RES);
  ledcWrite(PWM_PIN, 4096);        // 50 %
}

void loop() {}
ESPHome
output:
  - platform: ledc
    pin: GPIO4
    id: pwm_out
    frequency: 5kHz

light:
  - platform: monochromatic
    output: pwm_out
    name: "LED"
ESP-IDF
#include "driver/ledc.h"
#include "esp_err.h"

void app_main(void)
{
    ledc_timer_config_t timer = {
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .duty_resolution = LEDC_TIMER_13_BIT,
        .timer_num = LEDC_TIMER_0,
        .freq_hz = 5000,
        .clk_cfg = LEDC_AUTO_CLK,
    };
    ESP_ERROR_CHECK(ledc_timer_config(&timer));

    ledc_channel_config_t channel = {
        .gpio_num = 4,
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .channel = LEDC_CHANNEL_0,
        .timer_sel = LEDC_TIMER_0,
        .duty = 4096,              // 50 %
        .hpoint = 0,
    };
    ESP_ERROR_CHECK(ledc_channel_config(&channel));
}

Resolução máxima nas frequências mais comuns

FrequênciaResolução
50 Hz20 bits
490 Hz17 bits
1 kHz16 bits
5 kHz13 bits
20 kHz11 bits
25 kHz11 bits
40 kHz10 bits
100 kHz9 bits
1 MHz6 bits

Dicas

Arduino-ESP32 3.x: ledcAttach(pin, freq, resolution) substitui o ledcSetup() e o ledcAttachPin() da versão 2.x, e o ledcWrite() recebe o pino, não o canal.

O ESP32 tem dois grupos de 8 canais: high-speed, que aplica o novo ciclo de trabalho na hora, e low-speed. O Arduino-ESP32 usa primeiro o grupo high-speed.

Cada canal tira a frequência de um dos 8 timers: duas saídas com frequências diferentes precisam de dois timers.

Para LEDs use pelo menos 1,25 kHz: a IEEE 1789 considera de baixo risco um PWM de liga e desliga total a partir de 1.250 Hz, e para pessoas sensíveis a partir de uns 3 kHz.

Texto pronto para colar em um fórum ou em uma issue.

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

UsoFrequênciaPor quê
Dimerização de LED1,25 kHz ou maisA IEEE 1789 considera de baixo risco de cintilação um PWM de liga e desliga total a partir de 1.250 Hz
Servo de modelismo50 Hz, pulsos de 1 a 2 msUm pulso a cada 20 ms; a duração do pulso define o ângulo
Ventoinha de PC de 4 fios25 kHz (21–28 kHz)Especificação da Intel para ventoinhas PWM de 4 fios
Motor DCuns 20 kHz ou maisAcima do limite da audição; confira o limite do driver
Buzzer passivoA frequência da nota, 50%A frequência é a altura do som

Valores padrão de cada plataforma

PlataformaanalogWrite() padrãoResolução máximaClock do PWM
ESP32 (Arduino-ESP32 3.x)1 kHz, 8 bits20 bitsAPB 80 MHz ou REF_TICK 1 MHz (AUTO)
ESP32-S2, S3, C3 (Arduino-ESP32 3.x)1 kHz, 8 bits14 bitsXTAL 40 MHz por padrão
ESP32-C5, C6, P4 (Arduino-ESP32 3.x)1 kHz, 8 bits20 bitsXTAL 40 MHz por padrão (C5: 40 ou 48 MHz)
ESP32-H2 (Arduino-ESP32 3.x)1 kHz, 8 bits20 bitsXTAL 32 MHz por padrão
RP2040, RP2350 (Arduino-Pico)1 kHz, faixa 25516 bitsClock 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 bits16 bits (Timer1)16 MHz com prescaler 64
ESP8266 (core Arduino 3.x)1 kHz, faixa 255Faixa de até 65535PWM 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.