Chiedo, a chi sicuramente è più preparato di me, delle delucidazioni in quanto qui si sostiene, sempre se ho ben capito, che è possibile effettuare un campionamento con arduino anche con frequenze di campionamento superiori al KHz (se ne parla nel capitolo dedicato al campionamento).
Io non sono molto preparato sugli aspetti "interni" di Arduino, ma misurare non costa nulla:
#define OBD_LED_PIN 13
int led = 0;
void setup(){ pinMode(OBD_LED_PIN, OUTPUT); }
void loop(){
int val = analogRead(0);
digitalWrite(OBD_LED_PIN, led);
led ^= 1;
}
Risultato: 4167 Hz sul pin 13, corrispondenti a 8334 campionamenti al secondo. Togliendo il tempo della digitalWrite e del mainloop (6.54 µs) otteniamo 113.5 µs per il campionamento.
A questo punto aggiungiamo le due istruzioni presenti nel documento indicato:
bitClear(ADCSRA, ADPS0); // Istruzioni necessarie per velocizzare
bitClear(ADCSRA, ADPS2); // il rate di acquisizione analogica
E arriviamo a... 40kHz, pari a 80mila campionamenti al secondo della durata di poco meno di 6 µs ciascuno.
Non so però quanto questa velocità permetta all'ADC di funzionare correttamente.
Si conto la frequenza del LED, ad ogni campionamento cambia di stato.
Le due righe indicate agiscono sui bit dei registri interni del processore. Intuisco dai nomi che regolano il fattore di divisione di un prescaler, che evidentemente all'accensione è impostato abbastanza elevato (quindi per un tempo di campionamento più grande).
Per ulteriore approfondimento non (ci) resta che leggere il funzionamento dell'ADC nel datasheet dell'ATMEGA