Segnale analogico

Ciao a tutti, non riesco a trovare risposta a una domanda: con il segnale analogico (ANALOG IN) quanti valori si possono acquisire in un secondo da un sensore, con Arduino Mega?

Puoi considerare un massimo di circa 9000 campioni

cyberhs: Puoi considerare un massimo di circa 9000 campioni

Corretto se campioni sempre dallo stesso ingresso ADC, se sono due la velocità si dimezza, se sono tre diventa un terzo e così via. Questo perché l'ADC è uno solo e i vari ingressi vengono di volta in volta collegati per effettuare la misura, di conseguenza si riduce la velocità di acquisizione su i vari canali mentre il numero complessivo delle letture rimane costante a oltre 9000 al secondo.

Grazie mille @cyberhs e @astrobeed credo di aver capito dunque che il numero 9000 derivi dalla frequenza dichiarata di 9kHz e se ho capito bene, utilizzando 6 sensori la velocità dovrebbe ridursi a circa 1500 al secondo. Di nuovo grazie mille, buona giornata! ;)

Per la verità, c'è la possibilità di aumentare il sample rate senza compromettere [u]troppo[/u] la precisione della misura.

L'ADC di Arduino ha una frequenza di campionamento di 125kHz data dal clock a 16MHz diviso per 128 dal suo prescaler.

Poiché ATMEL raccomanda una frequenza di campionamento tra 50kHz e 200kHz, usando il divisore 64 per il prescaler, si ottiene una frequenza di 250kHz che corrisponde a circa 19000 campioni al secondo.

Si potrebbero usare divisori inferiori, sino al massimo di 16 (1MHz), ma la precisione della misura scende di fatto a quella di un ADC ad 8bit.

Non è proprio così, il data sheet del 328p, ma vale per tutti gli AVR, nel capitolo dedicato al ADC dice testualmente:

Up to 76.9kSPS (Up to 15kSPS at Maximum Resolution)

Ovvero la massima velocità di campionamento possibile è 76.9 ksps, con solo sette bit di risoluzione, mentre la massima velocità di campionamento a 10 bit è 15 ksps, andando oltre si riducono i bit di risoluzione. Il limite di 76.9 ksps è imposto dal hardware del ADC che più di questo non può fare dato che tocca sempre fare i conti con l'elettronica del sample & hold, è il vero collo di bottiglia degli ADC.

Astro, la cosa l'ho letta su AVR121 (Enhancing ADC resolution by oversampling) pag.2:

The sampling frequency is a result of prescaling the CPU clock; a lower prescaling factor gives a higher ADC clock frequency. At a certain point, a higher ADC clock will decrease the accuracy of the conversion as the Effective Number Of Bits, ENOB, will decrease. All ADCs has bandwidth limitations, AVRs ADC is no exception. According to the datasheet, to get a 10 bits resolution on the conversion result, the ADC clock frequency should be 50kHz – 200kHz. When the ADC clock is 200kHz, the sampling frequency is ~15kSPS, which confines the upper frequency in the sampled signal to ~7.5kHz. According to the datasheet, the ADC clock can be driven on frequencies up to 1Mhz, though this will lower the ENOB.

A conferma della cosa, a pag. 253 del ATmega328:

If a lower resolution than 10 bits is needed, the input clock frequency to the ADC can be higher than 200 kHz to get a higher sample rate.

cyberhs: Astro, la cosa l'ho letta su AVR121 (Enhancing ADC resolution by oversampling) pag.2:

Stai facendo confusione tra la frequenza in ingresso al clock del ADC con la massima frequenza di campionamento possibile, questo valore è 76.9 ksps, la risoluzione scende a solo sette bit, è il limite fisico del hardware non puoi superarlo. Da notare che a 200 kHz di clock campioni a 15 ksps 10 bit, con 1 MHz di clock campioni a 75 ksps 7 bit, puoi salire fino a 1.025 MHz per arrivare al limite massimo di 76.9 ksps, se vai oltre l'ADC fornisce valori errati. Il data sheet dice chiaramente che il tempo minimo di conversione del ADC è 13 us, ovvero 79.6 kHz :) Da notare che Arduino usa l'ADC in modo single run, il che richiede il doppio del tempo per acquisire la lettura rispetto al modo free run. Altri dettagli, miti sfatati, sul ADC di Arduino li trovi qui in questo mio post.

Dato che si parla comunque di segnali analogici e campionamento, mi accodo con una domanda al volo, senza aprire un topic solo per quello ... volendo maggiore precisione, conviene l'oversampling e la decimazione, o e' meglio puntare direttamente su un'ADC esterno ?

Voglio dire, mi pare di ricordare che ogni volta che si "aggiunge" un bit virtuale alla precisione, con quel sistema si deve dividere per 4 il massimo numero di campionature, giusto ? ... quindi, in teoria, 2250 per 11 bit, 562 per 12 bit, 140 per 13 bit, 35 per 14 bit ... fa presto a diventare lenta, la cosa ...

passa ad una teensy che ti cambia la vita :)

Etemenanki: Dato che si parla comunque di segnali analogici e campionamento, mi accodo con una domanda al volo, senza aprire un topic solo per quello ... volendo maggiore precisione, conviene l'oversampling e la decimazione, o e' meglio puntare direttamente su un'ADC esterno ?

Come ben sai oversampling e decimazione hanno un prezzo da pagare in banda e serve un segnale analogico "sporco", altrimenti non funziona. E' un sistema "grezzo" che può andare bene in certi casi per ottenere uno, massimo due, bit in più però a mio avviso è sempre meglio puntare su un ADC con la necessaria risoluzione, meglio ancora con un bit in più di quanto richiesto in modo da poter eliminare anche il classico errore +/- 1 count tipico degli ADC.