Calcolo di PWM e timer
Scegli una scheda, una frequenza e un duty cycle. Ottieni i valori dei registri del suo timer, la frequenza che fa davvero, quanti passi di duty hai e il codice per la sua toolchain.
I risultati sono calcoli su formule pubblicate, non misure. Verificali sul tuo hardware. Gratis, senza registrazione
Cos’è il PWM
La modulazione a larghezza di impulso (PWM) accende e spegne del tutto un pin, velocemente e di continuo. La frequenza è quanti cicli acceso-spento avvengono in un secondo; il duty cycle è la parte di ogni ciclo in cui il pin è acceso. Un LED al 25 % sembra meno luminoso e un motore al 25 % gira più piano, perché entrambi rispondono alla media.
Come un timer genera il PWM
Un timer hardware conta i colpi di clock, di solito dopo un prescaler che divide il clock. Quando il conteggio arriva al valore del periodo (TOP sugli AVR, ARR sugli STM32, il valore di wrap sull’RP2040) ricomincia: questo fissa la frequenza. Un valore di confronto decide in che punto del conteggio il pin cambia: questo fissa il duty cycle.
Frequenza contro risoluzione
Il numero di passi di duty è il clock del timer diviso per la frequenza PWM. Frequenza più alta vuol dire meno passi: con il suo clock da 80 MHz, il LEDC dell’ESP32 ha 13 bit a 5 kHz, ma solo 8 bit a 312 kHz. Scegli la frequenza più bassa adatta al carico.
LED: qualche centinaio di hertz o più, così l’occhio non vede sfarfallio; da 1 a 5 kHz è comune. Motori in corrente continua con un driver: spesso 20 kHz o più, sopra quello che si sente. Servo da modellismo: 50 Hz, con un impulso di circa 1–2 ms che fissa l’angolo.
La formula
f = fclk / (prescaler × (TOP + 1)) duty = confronto / (TOP + 1) passi = TOP + 1, risoluzione = log2(passi) bit ESP32 LEDC: f = fclk / (divisore × 2^bit) nRF52840: f = 16 MHz / (2^PRESCALER × COUNTERTOP)
Fonte: Datasheet ATmega328P / ATmega2560, Timer/Counter1 Fast PWM (modo 14, TOP = ICR1); RM0368 / RM0383, timer general-purpose; ESP32 e ESP32-S3/C3 Technical Reference Manual, LED PWM Controller; RP2040 Datasheet 4.5.2.6 “Configuring PWM Period”; nRF52840 Product Specification, PWM.
Esempio svolto
Un segnale per servo su un Arduino Uno: 50 Hz al 7,5 % di duty (un impulso di 1,5 ms, la posizione centrale). Il Timer1 con prescaler 8 conta a 2 MHz; TOP = 2 000 000 / 50 − 1 = 39999, quindi la frequenza è esattamente 50 Hz, e OCR1A = 0,075 × 40000 = 3000.
Un ESP32 a 5 kHz: 80 MHz / 5 kHz = 16000 colpi per periodo, quindi il LEDC ha 13 bit (8192 passi) con un divisore di 1,953125, esattamente 5 kHz; il 50 % di duty è 4096.
Domande e risposte
Che frequenza PWM devo usare?
LED: da 1 a 5 kHz evita lo sfarfallio visibile. Motori in corrente continua: 20 kHz o più per restare sopra l’udito, se il driver riesce a commutare così veloce. Servo: 50 Hz, con impulsi da 1 a 2 ms. Buzzer: la nota che vuoi sentire.
Perché ho meno passi di duty a frequenza più alta?
Ogni periodo PWM si conta in colpi del timer. A frequenza più alta il periodo è più corto, quindi contiene meno colpi, e ogni colpo è un passo di duty. Dimezzando la frequenza i passi raddoppiano, fino alla larghezza del timer.
Cambiare un timer può rompere altre cose?
Sì. Su un Arduino Uno, il Timer0 fa funzionare millis() e delay(), il Timer1 è usato dalla libreria Servo e il Timer2 da tone(). Riconfigurarne uno cambia quelle funzioni e i pin analogWrite() di quel timer. Scegli un timer che il tuo sketch non usa già.
Che frequenza usa analogWrite()?
Dipende dalla scheda e dal suo core. Su un Arduino Uno è circa 490 Hz sui pin 3, 9, 10 e 11 e circa 980 Hz sui pin 5 e 6, con duty a 8 bit (da 0 a 255). Per scegliere tu la frequenza, imposta i registri del timer come mostra questo calcolatore.
La frequenza mostrata qui è misurata?
No. È calcolata con le formule dei registri nei datasheet, per il clock indicato. Se la tua scheda usa un clock diverso, cambia il campo del clock. Per controllare il segnale reale usa un oscilloscopio o un analizzatore logico.
Impara le basi
Lezioni gratuite del corso di BoardPilot che spiegano le idee dietro questo calcolatore:
Timer e interruptPWM, macchine a stati e altro
Altri calcolatori
Calcolo della resistenza per LEDCalcolo del partitore di tensioneCalcolo delle resistenze di pull-up I2CCalcolo del baud rate UARTCalcolo della frequenza di campionamento ADC
Guardalo su una scheda vera
BoardPilot usa questi stessi calcoli dentro l’app, accanto a una vista 3D dal vivo della tua scheda, dei pin e dei fili, con un debug guidato quando qualcosa non funziona. Provalo nel browser o scaricalo per macOS e Windows.