.: robotitaly.NET :. - la community italiana sulla robotica  

Vai indietro   .: robotitaly.NET :. - la community italiana sulla robotica > Prodotti DROIDS > 990.005 MuIn - Multi Inteface Board

Rispondi
 
Strumenti della discussione Modalità di visualizzazione
  #1  
Vecchio 07-20-2011, 10:40 AM
GiordiX GiordiX non è collegato
Nuovo Roboter
 
Registrato dal: Jul 2011
Messaggi: 6
predefinito MUIN acquisire segnale 1 KHz piezoeletrico

Salve a tutti e sopratutto al caro astrobeed che mi ha aiutato tante volte indirettamente aiutando gl'altri.
Ecco il mio problema:
uso l'ADC della MUIN per acquisire il segnale di un sensore piezoelettrico che misura gli impatti di particelle; ogni particella, all'impatto, genera una forma d'onda che oscilla per qualche attimo.

Devo interfacciare il tutto con LabVIEW; a tal proposito usando la scheda di acquisizione NI-DAQ proprietaria, riesco ad acquisire e visualizzare correttamente il segnale su labview, ma non riesco a fare lo stesso con la MUIN.

La muin mi pare segue senza problemi un segnale a 1 KHz ed ho fatto varie prove cambiando anche i valori di FOSC e TAD (il clock è a 40 MHz)....
Come posso acquisire correttamente questo segnale come se usassi la scheda DAQ ??

I miei tentativi sono stati quelli di acquisire econvertire il segnale tramite ADC come un qualsiasi segnale analogico... ottenuti i valori, li spedisco via seriale e li ricevo su labVIEW.... provando con segnali semplicio di prova, l'acquisizione va a buon fine mentre per il segnale del piezo no, nemmeno in quiete (senza impatti).

Vi posto il codice, la parte interessante almeno, del firmware utilizzato:

// infinite letture
while(1)
{

// Impostazioni ADC...
// Apertura del modulo ADC
OpenADC( ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_2_TAD,
ADC_CH1 & ADC_REF_VDD_VSS & ADC_INT_OFF,
ADC_2ANA);

// Selezione AN1 per la conversione
SetChanADC (ADC_CH1);

// Avvia la conversione del canale analogico selezionato
ConvertADC();
// Aspetta la fine della conversione
while (BusyADC());
// leggo il risultato della conversione
ADC = ReadADC();
itoa(ADC,valore_conversione);
// Chiude il modulo ADC
//CloseADC();


// Configura l'USART
// 8 bit
// 19200 bit/s
// 1 bit stop
// 0 bit parità
OpenUSART( USART_TX_INT_OFF &
USART_RX_INT_OFF & //ON o OFF ? è interruzione RX (ma non stiamo usando interrupt quindi OFF)
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,129 ); //31 per INDINGO??? negli altri esercizi 9600-->64 opp 19200-->129 ?????

//printf per indingo
//printf("\nlettura%d.......\n\r",i);
//invio al terminale
//Per mezzo di questa funzione è possibile scrivere un dato in uscita alla porta seriale.
//Il dato deve essere di tipo char quindi di lunghezza non superiore a 8 bit.
while(BusyUSART());
WriteUSART('I');
while(BusyUSART());
WriteUSART(valore_conversione[0]);
while(BusyUSART());
WriteUSART(valore_conversione[1]);
while(BusyUSART());
WriteUSART(valore_conversione[2]);
while(BusyUSART());
WriteUSART(valore_conversione[3]);
while(BusyUSART());
WriteUSART(valore_conversione[4]);
while(BusyUSART());
WriteUSART('F');
while(BusyUSART());

// Chiudo l'USART
//CloseUSART();

// 200 ms delay required by the HMC6343 startup
Delay10KTCYx(100);


Grazie!
Rispondi quotando
  #2  
Vecchio 07-21-2011, 08:46 AM
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Moderator
 
Registrato dal: Mar 2006
residenza: Roma
Messaggi: 2,133
Blog Entries: 1
predefinito

Quote:
Originariamente inviata da GiordiX Visualizza il messaggio
Salve a tutti e sopratutto al caro astrobeed che mi provando con segnali semplicio di prova, l'acquisizione va a buon fine mentre per il segnale del piezo no, nemmeno in quiete (senza impatti).
Cosa vuol dire che non va buon fine ?
Il codice mi sembra corretto, però metti all'esterno del loop l'inizializzazione dell'UART, basta farla solo una volta.
Per segnale a 1 kHz intendi una sinusoide con questa frequenza come massimo ?
Rispondi quotando
  #3  
Vecchio 07-21-2011, 02:53 PM
GiordiX GiordiX non è collegato
Nuovo Roboter
 
Registrato dal: Jul 2011
Messaggi: 6
predefinito

Quote:
Originariamente inviata da astrobeed Visualizza il messaggio
Cosa vuol dire che non va buon fine ?
Il codice mi sembra corretto, però metti all'esterno del loop l'inizializzazione dell'UART, basta farla solo una volta.
Per segnale a 1 kHz intendi una sinusoide con questa frequenza come massimo ?
Ah si l'UART poi l'ho messa fuori!
Praticamente il sensore da un segnale di circa 1khz.. cmq anche con un generatore di funzioni, se applico in ingresso una sinusoide a 1 KHz poi quando visualizzo il segnale campionato la forma d'onda è completamente diversa.

Oggi ho fatto altre prove e praticamente già dai 20-22 Hz in su la forma d'onda catturata non è la forma d'onda in ingresso (sia essa una sinusoide, una onda quadra o altro...)

Devo campionare più veloce?
la domanda è:
tale MUIN ce la fa? e come va fatto il firmware?

ps. sotto i 20 Hz il segnale catturato dalla muin (ovvero convertito da Analogico a Digitale e poi visuliazzato sul LabVIEW è perfetto)
Rispondi quotando
  #4  
Vecchio 07-23-2011, 01:53 AM
GiordiX GiordiX non è collegato
Nuovo Roboter
 
Registrato dal: Jul 2011
Messaggi: 6
predefinito

Ho letto che il PIC18F2520, quello a bordo della MUIN, ha un ADC con una frequenza di campionamento in gradi di ottenere 100Ksps (samples per second). Come devo settare il FOSC e il TAD per ottenere tale campionamento? Perchè poi il compilatore del C18 non mi fa creare array di cui la somma della dimensioni con può superare il 136??

tipo
char array[150]; mi dice "too large"

Chiedo sulla questione dell'array perchè ho provato a modificare il firmware salvando i campioni dell'ADC in un array e poi spedirli...
Non capisco proprio perchè nn va!!
Rispondi quotando
  #5  
Vecchio 07-24-2011, 08:36 AM
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Moderator
 
Registrato dal: Mar 2006
residenza: Roma
Messaggi: 2,133
Blog Entries: 1
predefinito

Quote:
Originariamente inviata da GiordiX Visualizza il messaggio
Ho letto che il PIC18F2520, quello a bordo della MUIN, ha un ADC con una frequenza di campionamento in gradi di ottenere 100Ksps (samples per second).
Il sample rate massimo è poco più di 50 kHz, comunque più che sufficiente per ricostruire perfettamente anche un segnale complesso ad 1 kHz, però non basta per un'onda quadra che risulterebbe con in fronti di salita e discesa decisamente lenti.
Però c'è la questione velocità di trasmissione, è inutile campionare a 50 kHz se poi trasmetti a 19200 bps, 5 byte sono 50 bit e a quella velocità al massimo trasmetti 384 campioni al secondo, troppo poco anche applicando Shannon, mentre bastano per frequenze di poche decine di Hertz.
Soluzione possibile, acquisire i dati in buffer di memoria per poi trasmetterli con comodo tutti, però il 18F2520 ha solo 1.5k di ram e se campioni a 2 kHz ti bastano per circa 0.5 secondi.
Soluzione ottimale trasmettere i dati a 1 Mbps, in questo modo puoi inviare 100.000 byte al secondo che diventano 20.000 sample acquisiti, setti il sample rate a 10 ksps e dovresti essere a posto anche considerando un certo margine di tempo per gestire altre cose con il micro.
Il problema potrebbe essere ricevere i dati sul pc a 1 Mbps, non tutte le porte seriali reggono tale velocità, però utilizzando un adattatore USB-TTL il problema si risolve perché quasi tutti permettono velocità di gran lunga maggiori del classico 115.2 kbps.

Ultima modifica di astrobeed; 07-24-2011 a 10:05 AM
Rispondi quotando
  #6  
Vecchio 07-24-2011, 11:15 AM
GiordiX GiordiX non è collegato
Nuovo Roboter
 
Registrato dal: Jul 2011
Messaggi: 6
predefinito

Quote:
Originariamente inviata da astrobeed Visualizza il messaggio
Soluzione ottimale trasmettere i dati a 1 Mbps, in questo modo puoi inviare 100.000 byte al secondo che diventano 20.000 sample acquisiti, setti il sample rate a 10 ksps e dovresti essere a posto anche considerando un certo margine di tempo per gestire altre cose con il micro.
Il problema potrebbe essere ricevere i dati sul pc a 1 Mbps, non tutte le porte seriali reggono tale velocità, però utilizzando un adattatore USB-TTL il problema si risolve perché quasi tutti permettono velocità di gran lunga maggiori del classico 115.2 kbps.
Grazie della risposta ma non ho chiare alcune cose.
Come setto il sample rate a 10 Ksps ?? Non basta lasciare invariato il settaggio della FOSC e del TAD come da codice?

Quindi per settare la velocità a 1 Mbps secondo la tabella seguente, devo settare l'SPBRG a 21??


che significa una % errore negativa ???

io per comunicare uso la porta seriale del mio pc: faccio tutto tramite USB 2.0; la muin ha un modulo Xbee nella fattispecie è questo qui:
http://www.robot-italy.com/product_i...0618bc8b2cc179
Leggo che " velocita' fino a 921.6 kbps" quindi non arriva a 1 Mbps ma quasi... pensi che basti?

Ultima modifica di GiordiX; 07-24-2011 a 11:58 AM
Rispondi quotando
  #7  
Vecchio 07-26-2011, 11:25 AM
GiordiX GiordiX non è collegato
Nuovo Roboter
 
Registrato dal: Jul 2011
Messaggi: 6
predefinito

Ho capito, facendo i calcoli a mano, che mi conviene usare FOSC 8 e 6TAD...

Il segnale che acquisisco "funziona bene" nel senso che mi registra bene gli impatti MA rispetto al segnale che visualizzo sull'oscilloscopio siamo lontani....

Più in generale se metto un onda sinusoidale in ingresso da 1 fino a 4 KHz, il segnale acquisito non ha per niente la forma di una sinusoide....è un limite della MUIN o sbaglio qualcosa io ??

Spostando il problema più in generale, come acquisisco un onda sinusoidale (convertendola da analogica a digitale) a 4 KHz sulla MUIN ??

Ma possibile che nessuno in tutto il web sa come acquisire (campionando) un segnale analogico di almeno 4 KHz ?? Cerco in lungo e in largo ma non trovo nulla....

Astrobeed mi resti solo tu :S
Rispondi quotando
  #8  
Vecchio 07-26-2011, 02:13 PM
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Moderator
 
Registrato dal: Mar 2006
residenza: Roma
Messaggi: 2,133
Blog Entries: 1
predefinito

Quote:
Originariamente inviata da GiordiX Visualizza il messaggio
Ho capito, facendo i calcoli a mano, che mi conviene usare FOSC 8 e 6TAD...
Non puoi settare in modo arbitrario FOSC e TAD, il primo deve rispettare dei limiti minimi e massimi, sul data sheet c'è un'apposita tabella che ti dice il valore da usare in funzione del clock, TAD deve essere come minimo 11 altrimenti acquisisci meno bit del dovuto.
Usa le impostazioni ADC che trovi nei sorgenti della MuIn, sono già ottimali, la frequenza del sample rate sei tu a stabilirla in funzione di ogni quanto vai a leggere l'ADC.
L'ADC per acquisire il valore analogico ci mette circa 2.5 us, poi c'è il tempo necessario per trasformarlo in valore digitale che dipende da TAD.
Per quanto riguarda come vedi la forma d'onda acquisita dipende da come fai la ricostruzione della stessa.
Rispondi quotando
  #9  
Vecchio 07-26-2011, 09:21 PM
GiordiX GiordiX non è collegato
Nuovo Roboter
 
Registrato dal: Jul 2011
Messaggi: 6
predefinito

Quote:
Originariamente inviata da astrobeed Visualizza il messaggio
Non puoi settare in modo arbitrario FOSC e TAD, il primo deve rispettare dei limiti minimi e massimi, sul data sheet c'è un'apposita tabella che ti dice il valore da usare in funzione del clock, TAD deve essere come minimo 11 altrimenti acquisisci meno bit del dovuto.
Usa le impostazioni ADC che trovi nei sorgenti della MuIn, sono già ottimali, la frequenza del sample rate sei tu a stabilirla in funzione di ogni quanto vai a leggere l'ADC.
L'ADC per acquisire il valore analogico ci mette circa 2.5 us, poi c'è il tempo necessario per trasformarlo in valore digitale che dipende da TAD.
Per quanto riguarda come vedi la forma d'onda acquisita dipende da come fai la ricostruzione della stessa.

mmm, non credo di aver capito... io ho seguito la guida "C18 Step by step" di Mauro Larenti dove leggo

"Considerando per esempio una frequenza operativa del PIC pari a 20MHz, selezionando FOSC/2 si ha che TAD è pari a 0.1 μs. Il massimo ritardo di acquisizione che è possibile avere è pari a 20 TAD , ovvero pari ad un ritardo di 2 μs. Tale valore essendo inferiore al Tacq calcolato, vuol dire che FOSC/2 è troppo rapido. In particolare tra un'acquisizione e l'altra è necessario attendere 3 TAD che è bene includere nel tempo di acquisizione. Per entrare nelle specifiche si può dunque scegliere FOSC/4 ovvero TAD = 0.2μs e 16 TAD per il tempo di acquisizione. "

ho fatto anche io i mie calcoli, e considerando un Tacq di 1,06 usec, le migliori impostazioni erano FOSC 8 e TAD 6; per migliori intendo con un TAD calcolato il più vicino possibile a Tacq; cmq per non sbagliare ho fatto tutte le prove, con tutti i FOSC e TAD possibili ed il migliore resta quello FOSC 8 / TAD 6. (a prove fatte...)

Cmq ignorando la precisione del segnale catturato, alla fine il segnale era sufficiente ai miei scopi ma adesso mi è sorto un altro problema ben più grave... collegando questo sensore ingresso alla muin programmata SOLO per gestire la conversione e l'invio seriale del segnale va tutto ok, mentre inserendo questa routine di acquisizione e invio in un firmware che deve gestire anche i dei fototransistor e un servo motore succede una cosa strana...
alla minima vibrazione, ovvero al minimo segnale "sentito" da questo sensore, la MUIN si resetta come se avessi premuto il tasto reset D:
Come cavolo è possibile? Mi dareste un occhiata al codice se lo posto?
Rispondi quotando
Rispondi

Segnalibri

Strumenti della discussione
Modalità di visualizzazione

Regole d'invio
Non puoi inserire discussioni
Non puoi inserire repliche
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è attivo
Le smilie sono attive
Il codice IMG è attivo
il codice HTML è disattivato

Salto del forum


Tutti gli orari sono GMT. Attualmente sono le 02:41 AM.


Powered by vBulletin versione 3.8.7
Copyright ©: 2000 - 2018, Jelsoft Enterprises Ltd.