Campionamento segnali da sensore analogico

Buon pomeriggio,

ho trovato http://forum.arduino.cc/index.php?topic=63563.msg3004375#msg3004375 altamente stimolante ed utile e mi son chiesto: 'Perchè non arricchirlo e continuare a discuterne a riguardo?'

Pertanto ho fatto qualche ricerca sul campionamento imbattendomi casualmente in questo articolo http://www.df.unipi.it/~fuso/dida/rlc_2015.pdf.

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... :open_mouth: 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.

Scusa Claudio_F, ma non ho ben capito cosa hai fatto, cioè mi sembra di comprendere che vai a legggere quante volte ti si accende il led, giusto?

La mia domanda era in merito al lavoro dell'articolo, in quanto si parla di un campionamento abbastanza alto.

In particolare la mia domanda era anche sulle righe di codice come:

bitClear(ADCSRA,ADPS0); // Istruzioni necessarie per velocizzare
bitClear(ADCSRA,ADPS2); // il rate di acquisizione analogica

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 :wink: