arduino due e audaticy software

gcam:
quindi supponendo di generare un segnale impulsivo a bassa frequenza (fra 1 e 50 hz) di una determinata ampiezza. Acquisendo il segnale con arduino due, posso verificare la frequenza e l'ampiezza.

Nel caso del DAC di arduino due, io posso generare un'onda

http://arduino.cc/en/Tutorial/DueSimpleWaveformGenerator

e acquisire utilizzando l'adc di arduino, ed eventualmente amplificare per valutare il gain.

Quello che descrivi è un circuito closed loop, ad anello chiuso.

Generi un'onda e poi fai delle verifiche sulla stessa, magari con un qualche sistema di feedback per rimanere entro dei parametri stabiliti.

ma per arduino due è necessario utilizzare le istruzioni per velocizzare l'adc come per l'arduino uno
tipo

#define FASTADC 1
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

oppure è veloce già di suo senza la necessità di ulteriori impostazioni.

il mio dubbio nel campionare il segnale di audaticy è la tensione in uscita dal pc e di entrata nell'arduino.
o posso rischiare di rompere arduino due.

Se ho capito bene, vuoi usare l'uscita cuffie...

In genere la tensione disponibile all'uscita è di qualche volt, ma per evitare di superare i 3.3V massimi degli ingressi della DUE, è meglio se metti un partitore resistivo, o ancora meglio un trimmer di "volume"

Avete definito ARDUINO UNO un "Morto-di-sonno"
però da un test eseguito è uscito fuori:
ARDUINO UNO acquisizione di 24000 campioni su 3 canali senza inviare i dati 430 ms circa.
ARDUINO DUE acquisizione di 24000 campioni su 3 canali senza inviare i dati 943 ms circa.

La differenza è notevole.

Per arduino uno ho utilizzato le seguenti istruzioni per accelerare l'ADC

#define FASTADC 1
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

e

#if FASTADC
// set prescale to 16
sbi(ADCSRA,ADPS2) ;
cbi(ADCSRA,ADPS1) ;
cbi(ADCSRA,ADPS0) ;
#endif

Non utilizzando le istruzioni di cui sopra anche l'adc dell'arduino uno è lento.

Come faccio a velocizzare l'adc dell'arduino due ?

Mi pare che il clock dell'ADC del SAM3X sia fisso a 1 MHz, non vedo la possibilità di modificarlo come si può fare sull'Atmega328.

Non capisco.
1 Msps su 16 canali.
L'acquisizione per singolo canale dovrebbe aggirarsi intorno a 62 ksps, cioè 1Msps /16 = 0.0625 Msps = 62,5 ksps

gcam

Però può capitare questo!!!

ARDUINO 1.5.5 BETA
(....)
sam: Fixed wrong initialization for ADC timings (analogRead speed Arduino DUE improved by a factor x10)

L'ho letto giusto ora.

E' stata implementata nell'IDE 1.5.5 di prossima uscita una modifica che permette di migliorere i tempi di acquisizione dell'ADC su Arduino DUE.

[core]

Edit: Preceduto da Leo. :grin:

L'IDE aggiornato è disponibile come versione nightly-build. :wink: (http://arduino.cc/en/Main/Software)

dobbiamo aspettare quindi la versione 1.5.5 per vedere risolto questo problema.

gcam:
dobbiamo aspettare quindi la versione 1.5.5 per vedere risolto questo problema.

Puoi compilarla anche ora, basta che ti scarichi i sorgenti.

PaoloP:
L'IDE aggiornato è disponibile come versione nightly-build. :wink: (http://arduino.cc/en/Main/Software)

perfetto. Provata la nuova versione.
Acquisizione di 24000 campioni su tre canali in 109 ms.

Però...
Nell'inviare i dati al pc sulla seriale, solo 1500 valori a gruppi di tre, l'acquisizione si allunga a 3 secondi circa. serial baud è settato a 115200

Come fare ad inviare i dati al pc in modo veloce ?

gcam

La DUE è dotata anche di una seriale USB che si chiama SerialUSB che dovrebbe essere molto più veloce della seriale normale.
Ma non avendo la scheda non ho mai testato la cosa.
La inizializzi con

SerialUSB.begin(0);

il valore del baud viene ignorato, puoi metterci un valore a caso.

La usi come una normale seriale.

SerialUSB.print("Hello World!");

attenzione, di default arduino usa un prescaler molto grande sia per la uno che per la due.

per la uno so che si può agire sui registri, per la due si può aggiungere la define
ADC_STARTUP_FAST
(che era buggato il valore impostato)

per scendere da 39us x lettura (24kHz) a .76uS (circa 1MHz)

edit: con prescaler al minimo, ovvero 16 (precisione ADC ridotta a 8 bit), la uno arriva a 77 KHz http://forum.arduino.cc/index.php/topic,6549.0.html

ciao, ho fatto un test con la nuova versione 1.5.5 di arduino due senza utilizzare particolari impostazioni.

senza perdere di risoluzione cioè rimanere sui 12 bit, qual'è la velocità di campionamento massima impostabile ?

e come ?

di default la risoluzione e la velocità di campionamento che valore hanno ?

senza perdere di risoluzione cioè rimanere sui 12 bit, qual'è la velocità di campionamento massima impostabile ?

non lo so, guarda sul datasheet.

e come ?

http://forum.arduino.cc/index.php?topic=137635.msg1137618#msg1137618

di default la risoluzione e la velocità di campionamento che valore hanno ?

10 bit a circa 24kHz

10 bit a 24 khz
anche se nel setup inserisco l'istruzione :

analogReadResolution(12);

oppure non c'è nessun legame, tra le due cose.

conq uello passi da 10 bit a 12 bit :slight_smile:

la frequenza di ck dell'adc di atmega328 è al massimo 1Mhz (ck/16) e ci mette circa 27 cicli per fare una conversione , cioè 27 microsecondi circa, quindi si arriva teoricamente a circa 37ksps

la freq di ck di Atmel SAM3X8E è al massimo di 20Mhz (ck/4) e ci mette circa 20 cicli per fare una conversione , cioè 1 microsecondo quindi si arriva teoricamente a 1Msps