Go Down

Topic: Campionamento segnale analogico Arduino (Read 824 times) previous topic - next topic

Standardoil

Due cose:
Micros richiede unsigned long, non unsigned int
Poi occorre considerare il caso che la lettura sia proprio 0xFF
A chi Trasmetti?
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

docdoc

Ok docdoc, sto capendo meglio, ma per leggere b1 e b2 devo sempre effettuare il serial.print?
Per leggere i due byte dall'altra parte intendi? Sicuramente non una "print", visto che questa scrive mentre tu dovresti leggere.
Ma dipende da "cosa" c'è dall'altra parte della seriale: chi è che deve acquisire questi dati che mandi via seriale? Un programma su PC oppure un altro Arduino (ma penso di no...)??
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Mauro93

#17
May 20, 2019, 04:29 pm Last Edit: May 20, 2019, 04:32 pm by Mauro93
Una volta effettuato il campionamento devo portare questi dati su Exel. Con il mio primo sketch (in maniera bruta) copiavo e incollavo direttamente. Una volta su Exel, questi dati li devo rielaborare per fare una serie di operazioni.

Standardoil, con unsigned int (dal primo sketch) ottengo molti meno valori.

Standardoil

Enno, allora no
Non puoi facilmente importarli in Excel (ricordati la x...) se usi dati binari con un separatore qualsiasi
O esiste qualche macro di Excel già pronta?
Mi interesserebbe....
Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

fabpolli

Questa riga
Code: [Select]

while (micros() - microseconds >= sampling_period_us);

secondo me deve diventare
Code: [Select]

while (micros() - microseconds < sampling_period_us);

perché altrimenti non aspetta che la differenza tra l'attuale micros() e il precedente sia trascorsa anzi l'esatto opposto, la prima si uca solitamente negli if per determinare se è il momento di fare una certa cosa, tu invece vuoi aspettare finché non è trascorso il tempo

docdoc

Una volta effettuato il campionamento devo portare questi dati su Exel. Con il mio primo sketch (in maniera bruta) copiavo e incollavo direttamente. Una volta su Exel, questi dati li devo rielaborare per fare una serie di operazioni.
Ok, non lo avevi detto, allora non puoi mandare i dati binari.
Torna quindi la soluzione di impostare la velocità della seriale a 115200 e cercare di limitare i caratteri (lascia perdere lo spazio ed usa solo "println()" per andare a capo).

Code: [Select]
...
void setup() {
  Serial.begin(115200);
  sampling_period_us = (1000000*(1.0/SAMPLING_FREQUENCY));
}
int current = 0;

void loop() {
  unsigned long microseconds = micros();
  for (int i = 0; i < n_ripetizioni*SAMPLING_FREQUENCY; i++) {
   T = i;
   while (micros() - microseconds < sampling_period_us);
   current = analogRead(A1);
   microseconds += sampling_period_us;
   Serial.println(current);
}

...

Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Maurotec

Con la MCU che viaggia a 16MHz può anche impostare il baud rate a 250 000 e 500 000.
Ricordo anche che la seriale harware è bufferizzata con ring buffer, per cui la print e le altre si limitano ad inserire un carattere nel buffer, operazione che dovrebbe essere molto veloce, scritto il buffer la funzione termina e restituisce il controllo al chiamante.

Il problema viene quando il buffer si riempe, per evitare ciò non si può fare altro che aumentare il baud rate.

Ragionando ragionando.
Ho un nuovo campione ogni 1666 us.
500 000 bit per secondo diviso 8 + 1 stop bit mi da il numero di caratteri per secondo,
cps = 500 000 / 9 = 55555.
Io ho solo una finestra temporale di 1.66ms per spedire il dato.
cpms = cps / 1000 = 55.

Posso spedire 55 caratteri in 1ms e mi restano 660us per fare altro.

Non sono molto lucido, non so se ho sbagliato i calcoli.

 

Mauro93

Ok fabpolli e docdoc ho fatto così e ora torna. Rilevo 600 letture al secondo o 3000 in 5 sec cambiando il numero di ripetizioni. Grazie mille

zoomx

@docdoc,
proprio recentemente su questo forum ho scoperto che esiste anche questa
Serial.write(buf, len)
per cui non è più necessario usare 2 serial.write

@Standardoil
non credo ci siano macro già pronte, del resto Excel è nato per ufficio. Per applicazioni più scientifiche ci sarebbe Origin che, difatti, importa anche dati binari.

daysleeper

O esiste qualche macro di Excel già pronta?
Mi interesserebbe....
Qualche tempo fa ho usato la plxDaq, trovata a zonzo su internet ma ripresa anche in questo forum. Non è male, è pure "bidirezionale" volendo. Non era molto veloce, ed Excel non gradiva velocità di trasmissione molto spinte (crashava). Quando dovevo loggare eventi brevi l'avevo risolta facendo prima tutte le letture, tenendole in memoria, e poi trasmettendole con calma.
Se è stupido ma funziona allora non è stupido.

Standardoil

Prima legge di Nelson (che sono io): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

docdoc

@docdoc,
proprio recentemente su questo forum ho scoperto che esiste anche questa
Serial.write(buf, len)
per cui non è più necessario usare 2 serial.write
Si lo sapevo, l'avevo già vista la trovi ovviamente anche nel reference, ma l'ho usata finora poche volte, solo per gli array visto che anche nel reference parla solo di array.
Ma forse funziona anche con l'int passando il relativo puntatore:

Code: [Select]
Serial.write(&current, 2);

il mio dubbio è poi come gestire la ricezione, visto che la read() legge comunque un byte alla volta, per cui sarebbe utile solo per accorciare il codice in fase di write. O no?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gpb01

#27
May 21, 2019, 12:07 pm Last Edit: May 21, 2019, 12:07 pm by gpb01
il mio dubbio è poi come gestire la ricezione, visto che la read() legge comunque un byte alla volta, per cui sarebbe utile solo per accorciare il codice in fase di write. O no?
Purtroppo NON hanno fatto una read() multibyte (anche se la cosa era possibile dato che i dati ricevuti finiscono in un circular buffer) e quindi, SI, devi leggere poi byte a byte e ricomporre quello che hai trasmesso.

Guglielmo
Search is Your friend ... or I am Your enemy !

zoomx

Dovrebbe essere
Code: [Select]
 Serial.write ((char *) &current, 2);
https://forum.arduino.cc/index.php?topic=323119.0

Io per la ricezione pensavo ad un PC.

zoomx

#29
May 21, 2019, 12:30 pm Last Edit: May 21, 2019, 12:32 pm by zoomx
Purtroppo NON hanno fatto una read() multibyte (anche se la cosa era possibile dato che i dati ricevuti finiscono in un circular buffer) e quindi, SI, devi leggere poi byte a byte e ricomporre quello che hai trasmesso.
Durante la ricerca del post che ricordavo sul serial.write, che poi non ho trovato, mi sono imbattuto in un altro post mi pare di Nick Gammon dove addirittura c'era un qualcosa come
Code: [Select]
Serial.read(buffer, 0, 4);

che, ovviamente, ora non trovo più.

Edit: ci sarebbe parseInt() che però restituisce un long.

Go Up