Calcolo della frequenza di campionamento ADC
Ogni lettura ADC richiede un numero fisso di cicli del clock dell’ADC. Scegli la tua scheda e l’impostazione dell’ADC per vedere quanto dura una conversione e quante letture al secondo può fare l’hardware.
I risultati sono calcoli su formule pubblicate, non misure. Verificali sul tuo hardware. Gratis, senza registrazione
Perché una conversione ADC richiede tempo
Prima l’ADC campiona: collega al pin un piccolo condensatore interno e lo lascia caricare alla tensione di ingresso. Poi converte: confronta quella tensione memorizzata un bit alla volta. Entrambe le fasi usano il clock dell’ADC, che il chip ricava dal clock principale con un prescaler, quindi il tempo di conversione è un numero fisso di cicli di clock dell’ADC.
La frequenza di campionamento non è la velocità di analogRead()
Questo calcolatore dà il limite dell’hardware. Una chiamata come analogRead() aggiunge il suo lavoro (scegliere il canale, avviare, aspettare, restituire) e il tuo loop ne aggiunge altro. Leggere alla velocità piena di solito richiede la modalità continua dell’ADC, il DMA o una FIFO.
Quanto veloce ti serve?
Per catturare un segnale, campiona a più del doppio della sua frequenza più alta (la frequenza di Nyquist); da cinque a dieci volte è più comodo. Una temperatura cambia in secondi e bastano poche letture al secondo; l’audio ne richiede decine di migliaia.
E l’ESP32?
Espressif non pubblica un tempo di conversione fisso per analogRead() su ESP32, ESP32-S3 o ESP32-C3, quindi questo calcolatore non ne inventa uno. Misuralo nel tuo sketch: cronometra qualche centinaio di chiamate a analogRead() con micros() e dividi.
La formula
frequenza = fADC / cicli per conversione AVR (ATmega328P, ATmega2560): fADC = fCPU / prescaler, 13 cicli (25 per la prima conversione) STM32F4: Tconv = tempo di campionamento + 12 cicli, fADC al massimo 36 MHz RP2040, RP2350: 96 cicli a 48 MHz, al massimo 500000 campioni al secondo nRF52840 SAADC: un campione = TACQ + tCONV (meno di 2 µs)
Fonte: Datasheet ATmega328P, ADC “Prescaling and Conversion Timing”; RM0368 11.5 “Channel-wise programmable sampling time” e datasheet STM32F401 (fADC); RP2040 Datasheet 4.9 ADC; nRF52840 Product Specification, SAADC.
Esempio svolto
Arduino Uno con il prescaler predefinito di Arduino, 128: il clock dell’ADC è 16 MHz / 128 = 125 kHz, una conversione dura 13 cicli = 104 µs, quindi l’hardware può fare circa 9615 letture al secondo.
Con prescaler 16 il clock dell’ADC sarebbe 1 MHz, circa 76900 letture al secondo, ma il datasheet chiede da 50 a 200 kHz per la piena precisione a 10 bit. Un Raspberry Pi Pico converte in 96 cicli a 48 MHz: 2 µs, 500000 letture al secondo.
Domande e risposte
Quanto è veloce analogRead() su un Arduino Uno?
Una conversione dura 104 µs con il prescaler predefinito di 128 (13 cicli di clock dell’ADC a 125 kHz), quindi l’hardware fa al massimo circa 9600 letture al secondo. Con il lavoro in più di analogRead() stessa, di solito una chiamata dura poco più di 100 µs, cioè circa 9000 letture al secondo in un loop stretto.
Posso rendere più veloce l’ADC di Arduino?
Sì, con un prescaler più piccolo (i bit ADPS nel registro ADCSRA). Il prescaler 64 dà un clock dell’ADC di 250 kHz e circa 19200 letture al secondo; prescaler più piccoli sono ancora più veloci. Sopra i 200 kHz il datasheet non garantisce più la piena precisione a 10 bit, quindi gli ultimi bit diventano più rumorosi.
Perché non c’è un numero per l’ESP32?
Espressif non pubblica un tempo di conversione fisso per analogRead() sulla famiglia ESP32, e il tempo dipende dalla versione del core e dalle impostazioni. Invece di tirare a indovinare, misuralo: chiama analogRead() qualche centinaio di volte, cronometra il loop con micros() e dividi.
Che frequenza di campionamento mi serve?
Più del doppio della frequenza più alta nel segnale (la frequenza di Nyquist), e meglio da cinque a dieci volte. Cose lente come una temperatura o un potenziometro richiedono solo poche letture al secondo; l’audio decine di migliaia.
Perché le letture ADC sono sbagliate o rumorose ad alta velocità?
A frequenze di campionamento alte il condensatore interno ha meno tempo per caricarsi. Se la sorgente ha una resistenza alta, per esempio un partitore fatto con resistenze da 100 kΩ, non si carica del tutto e le letture escono basse o rumorose. Usa una resistenza di sorgente più bassa (il datasheet dell’ATmega328P è pensato per circa 10 kΩ o meno), un tempo di campionamento più lungo dove il chip lo permette (STM32, nRF52), oppure un piccolo condensatore sul pin per segnali lenti.
Impara le basi
Lezioni gratuite del corso di BoardPilot che spiegano le idee dietro questo calcolatore:
ADC: leggere il mondo analogicoTimer e interrupt
Altri calcolatori
Calcolo della resistenza per LEDCalcolo del partitore di tensioneCalcolo delle resistenze di pull-up I2CCalcolo del baud rate UARTCalcolo di PWM e timer
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.