campionamento e trasmissione con seriale

Salve a tutti,
per un progetto dell’università devo acquisire un segnale elettromiografico tramite degli elettrodi e visualizzarlo attraverso un grafico per poi confrontarlo con segnali acquisiti in diverso modo.
La frequenza di campionamento richiesta è di 1 kHz.
Per fare in modo di rispettare la frequenza data faccio nella funzione “loop” acquisisco solo se è passato un millisecondo dalla precedente iterazione. Per far ciò utilizzo il seguente codice:

 time_prev=time_actual;
  time_actual=millis();
 if (time_actual > time_prev)
    { value = analogRead(A0)* (5.0 / 1023.0);
       Serial.print(value);}

ovviamente inizializzo la seriale e le variabili ottenute.
Utilizzando questo codice però, attraverso una variabile di controllo che misura i ms tra un ciclo e l’altro, ho notato che ogni tanto perde dei valori… in particolare in un secondo acquisisce circa 980 campioni invece di 1000…
Come posso fare per evitare ciò? C’è un modo per sincronizzare il ADC con il clock del processore?
Grazie mille in anticipo.

Ciao e benvenuto, come da regolamento, il primo post dovrebbe essere di presentazione e non subito una richiesta d'aiuto. :stuck_out_tongue:
Inoltre il codice si include usando gli appositi tag :wink:

Detto questo... tornando alla tua domanda, la campionatura di un segnale analogico sul micro Atmega328 dell'Arduino è lunga qualche decina di us, per cui dovresti campionare senza problemi a 1kHz. Casomai invece di fare 1 lettura ogni ms io ridurrei il tempo perché devi prevedere anche il tempo impiegato dal micro ad eseguire il tuo codice.

paggio46:
C'è un modo per sincronizzare il ADC con il clock del processore?

Certo, fai un po' di ricerche su come si usano i Timers, ne imposti uno in modo che ti generi un interrupt ogni 1 mSec e nella ISR fai la tua acquisizione.

Così sei sicuro che effettui esattamente 1000 campionamenti per secondo ...

Guglielmo

Beh, se vogliamo andare nell'hard, l'ADC può essere messo in modalità "Free Running", dove la campionatura viene eseguita costantemente, una dietro l'altra (oltretutto con un tempo di campionatura inferiore alla modalità singola). Usando sempre un timer, si può leggere il dato della lettura ad intervalli regolari :wink: