Deprecated: Function eregi() is deprecated in /membri2/demisoft/modules/Forums/viewtopic.php on line 22

Deprecated: Function eregi() is deprecated in /membri2/demisoft/modules/Forums/nukebb.php on line 44
ADXL202 - Un saluto a tutto il forum :D , ho letto con interesse l'articolo sull'adxl202 Siccome sto facendo un progettino universitario basato proprio su questo
.: News :: Downloads :: Trucchi :: Forum :: Elettronica :. 
 Home
 News
 Archivio Notizie
 Cerca
 Downloads
 Forums
 Gestione Account
 Glossario Info
 Passaparola
 Sondaggi
 Trucchi Giochi
 Trucchi Windows


Benvenuto, Anonimo
Tuo IP: 3.92.28.84
Nickname
Password
CodiceCodice di Sicurezza
Digita il codice di sicurezza:

 · Registrazione
 · Password persa?
Data/Ora Server
23-Jul-2019 07:47:04
(GMT +0200)

RSS Feeds












DemiSoft: Forums


DemiSoft :: Leggi il Topic - ADXL202

 FAQFAQ   CercaCerca   Gruppi utentiGruppi utenti   ProfiloProfilo   Messaggi PrivatiMessaggi Privati   LoginLogin 

ADXL202
Vai a pagina Precedente  1, 2
 
Nuovo Topic   Rispondi    Indice del forum -> Schemi e progetti
Precedente :: Successivo  
Autore Messaggio
Demetrius
Site Admin
Site Admin


Registrato: Jul 29, 2002
Messaggi: 1686

MessaggioInviato: Lun 16 Apr 2007, 10:27    Oggetto: Rispondi citando

Kova ha scritto:
Ummm, non è il contrario Confused
Cioè sapendo l'accelerazione, per calcolare la velocità faccio la derivata, derivando ancora una volta ho la posizione Rolling Eyes

ops Embarassed
si, hai ragione è il contrario.... scusami... la stanchezza Wink

Citazione:
In pratica hai messo un ciclo (forse while?) in cui accumuli i valori di "accX" e "vel" (rispettivamente in accTOTx e velTOT) e man mano che ti arrivano i "dati" calcoli la velocità e la posizione, right? Very Happy

in pratica quelle operazioni sono in una funzione che viene chiamata ogni volta che si riceve un nuovo dato dall'USB, quindi non è un vero e proprio ciclo, cmq il concetto è quello che hai detto.

Citazione:
Come mai hai messo nell'if accX<0 e anche vel<0, può accadere che questi siano negativi?

potendo il sensore rilevare accelerazioni negative, si potrebbero gestire anche questi valori, ma non mi interessava, quindi sarebbe stata una complicazione inutile.
Torna in cima
Profilo Messaggio privato Invia email HomePage
Kova
Newbie
Newbie


Registrato: Apr 10, 2007
Messaggi: 15
Località: Pianeta terra

MessaggioInviato: Dom 13 Mag 2007, 11:07    Oggetto: Rispondi citando

Demetrius ha scritto:
CUT


Ciao Demetrius,
dopo quasi 1 mese passati sui libri a studiare per gli esami, ho ripreso in mano il progettino dell'adxl Razz
Mi sono assemblato tutto il circuito (in realtà ne ho fatti due: uno del pic ed uno dell'adxl e li ho connessi tramite un cavo da 4 poli, il cavetto audio usato nei pc per collegare la scheda audio al lettore CD Razz ).

A dirti la verità non ho ancora capito bene se funge o meno Shocked (ma io penso di si Wink ).
Ti elenco sinteticamente quello che ho fatto:

1) Ho utilizzato esclusivamente le procedure ad 8 bit
2) Nella funzione main c'è questa parte di codice:

Codice:
do {
      usb_task();
      calibrazione8();

      while(true) {
         Accende(LED_VERDE);
         if(usb_enumerated()) {
            out_data[0]=accelerometer_read8x();
            out_data[1]=accelerometer_read8y();
            out_data[2]=zerogXr;
            out_data[3]=zerogYr;
            printf(usb_cdc_putc, "%X ", out_data[0] );
            printf(usb_cdc_putc, "%X ", out_data[1] );
            printf(usb_cdc_putc, "%X ", out_data[2] );
            printf(usb_cdc_putc, "%X ", out_data[3] );
....
.........


In pratica per ottenere l'A(g) in base al datasheet faccio:
A(g)=(out_data[0]-out_data[2])/0.125
Giusto?

Per ottenerlo in milliG dovrei dividere per 1000?

La formula che mi scrivesti nello scorso post:
"accX=(dx-zeroX)*1000 / ppgX;",
non l'ho capita Embarassed

Perchè moltiplichi per 1000 e dividi per 12.5?
12.5 è un termine percentuale quindi non si dovrebbe scrivere 0.125?
Per avere in milliG non si dovrebbe dividere per 1000?

Comunque muovendo l'adxl ottengo dei valori che cambiano in base a come lo muovo (sintomo che forse funge Razz).

Un'ultima cosa: Come interpreto i byte che ricevo?
Nel senso: li devo trattare come valori hex con segno o senza segno?

Ti ringrazio tantissimo per l'aiuto Smile
Ciaooo Wink
Torna in cima
Profilo Messaggio privato
Demetrius
Site Admin
Site Admin


Registrato: Jul 29, 2002
Messaggi: 1686

MessaggioInviato: Lun 14 Mag 2007, 21:51    Oggetto: Rispondi citando

per la formula che ti ho dato, in realtà devi tenere conto che nel codice che t ho dato c'è un fattore ADXL_SCALING_FACTORl = 0.01

quindi sarebbe:
accX=(T1/(T2*0.01)-T1calib/(T2calib*0.01))*1000 / ppgX=(T1/T2-zeroG)*1000/(0.01*12.5)=(T1/T2-zeroG)*1000/0,125

il 1000 serve per avere il valore in mG: la formula ti dà il valore in G, se per esempio ottieni 1.2G, moltiplicando per 1000 si ha 1200milliG. Wink


per verificare che il sensore funzioni, basta che lo metti in verticale e dovresti leggere un valore prossimo ad 1G.


per quanto riguarda l'usb... i valori in ricezione sono interi senza segno, smanettando nelle librerie usb del ccs mi pare si possa cambiare l'impostazione.... ma non mi ricordo molto bene questo aspetto Sad
Torna in cima
Profilo Messaggio privato Invia email HomePage
Kova
Newbie
Newbie


Registrato: Apr 10, 2007
Messaggi: 15
Località: Pianeta terra

MessaggioInviato: Mar 15 Mag 2007, 8:10    Oggetto: Rispondi citando

Demetrius ha scritto:
CUT


Come al solito grazie per l'aiuto Demetrius Shocked
Premetto che sto impazzendo Razz
Allora ti spiego:
Ho nel vettore out_data, questi valori:
Codice:

out_data[0]=accelerometer_read8x();
out_data[1]=accelerometer_read8y();
out_data[2]=zerogXr;
out_data[3]=zerogYr;


Inizialmente ho definito una variabile int8 valore=0;
In questa variabile faccio:
Codice:
valore = (out_data[0]-out_data[2]);

che sarebbe:
(T1/T2-zeroG) (in pratica manca ancora il 1000/0.125=8000)
Quindi invio tramite usb la variabile valore:
Codice:
printf(usb_cdc_putc, "\r%u ", valore );

Il "%u" fa visualizzare il formato Unsigned int.

Collego il tutto alla usb (il sensore è posto inizialmente parallelo al "pavimento").
Ottengo come risultato 0!

Porto il sensore perpendicolare al pavimento e leggo dei valori che oscillano tra 75 e 78 Sad

Non ho capito perchè Confused
Uffff Razz

Grazie ancora per la pazienza Razz
_________________
Non condivido la tua idea, ma darei la vita perché tu la possa esprimere (Voltaire)
Torna in cima
Profilo Messaggio privato
Demetrius
Site Admin
Site Admin


Registrato: Jul 29, 2002
Messaggi: 1686

MessaggioInviato: Mar 15 Mag 2007, 11:38    Oggetto: Rispondi citando

dovresti dichiararlo intero con segno.

valore sarebbe (T1/T2-zeroG) comprensivo del ADXL_SCALING_FACTORl (se hai usato le stesse routine del mio codice), quindi per ottenere il valore finale devi moltiplicare solo per 1000/12.5=80.

prova a farti mandare i valori out_data e vedi cosa contengono, per vedere se è un problema di calcoli del PIC, oppure un problema di lettura dal sensore.

printf(usb_cdc_putc, "\r%u ", valore );
usb_cdc_putc non c'è nella mia versione del compilatore, cosa fa esattamente?
Torna in cima
Profilo Messaggio privato Invia email HomePage
Kova
Newbie
Newbie


Registrato: Apr 10, 2007
Messaggi: 15
Località: Pianeta terra

MessaggioInviato: Mar 15 Mag 2007, 15:47    Oggetto: Rispondi citando

Demetrius ha scritto:
CUT


Allora...io ho implementato l'USB CDC praticamente crea un'emulazione USB sulla seriale (il pc me lo vede come COM4).
Mi serve fare in questo modo perchè dovrei interfacciare il sensore ad un programma scritto in LabView in cui ho già in precedenza lavorato con la seriale Very Happy

Comunque ho reso il codice molto simile al tuo, eccoti l'ennesimo pezzo Very Happy:
Codice:
   
out_data[0]=accelerometer_read8x();
out_data[1]=accelerometer_read8y();
out_data[2]=zerogXr;
out_data[3]=zerogYr;
out_data[4]=0;
out_data[5]=0;
out_data[6]=0;
out_data[7]=0;
usb_put_packet(USB_CDC_DATA_IN_ENDPOINT, out_data, USB_EP1_TX_SIZE, USB_DTS_TOGGLE);


Fatto questo apro l'RS232 monitor (quello di CCS) e vedo, in HEX, i dati che ricevo:
Codice:

//Sensore Parallelo pavimento
59  3B  58  3A  00  00  00  00 
57  39  58  3A  00  00  00  00 
5A  3A  58  3A  00  00  00  00 
59  36  58  3A  00  00  00  00 

//Sensore perpendicolare pavimento
A3  2F  58  3A  00  00  00  00 
92  35  58  3A  00  00  00  00 
A1  39  58  3A  00  00  00  00 
A1  38  58  3A  00  00  00  00 
A1  39  58  3A  00  00  00  00 
A0  38  58  3A  00  00  00  00 
A1  39  58  3A  00  00  00  00 
A1  3A  58  3A  00  00  00  00 
A1  39  58  3A  00  00  00  00 
A0  39  58  3A  00  00  00  00 
A1  3A  58  3A  00  00  00  00
A0  39  58  3A  00  00  00  00

//Movimento a casaccio :)
92  32  58  3A  00  00  00  00 
5D  3A  58  3A  00  00  00  00 
5C  3B  58  3A  00  00  00  00 
5B  3A  58  3A  00  00  00  00 
5A  3B  58  3A  00  00  00  00 
48  4A  58  3A  00  00  00  00 
48  45  58  3A  00  00  00  00 
3E  3F  58  3A  00  00  00  00 
3E  30  58  3A  00  00  00  00 
3F  30  58  3A  00  00  00  00


Ricevo esattamente 8 byte.
Il primo è out_data[0]
Il secondo è out_data[1] ecc.
Gli ultimi 4 sono sempre 0!

A questo punto dovrei applicare la formuletta:
out_data[0]-out_data[2]*1000/12.5

Ma cosi ottengo dei valori apparentemente senza senso Rolling Eyes

Ti ringrazio per l'aiuto Smile
Ciao Wink
Torna in cima
Profilo Messaggio privato
Demetrius
Site Admin
Site Admin


Registrato: Jul 29, 2002
Messaggi: 1686

MessaggioInviato: Mar 15 Mag 2007, 21:10    Oggetto: Rispondi citando

in effetti sembrano valori sballati, anche se non casuali visto che quando lo tieni fermo ottieni valori simili.

vedi se tutte le impostazioni relative al CCP, Interrupt Timer, ecc. sono corrette.... tieni conto di eventuali differenze di Clock tra il mio codice e quello che hai messo tu.

se è tutto a posto, prova la versione a 16bit e vedi che valori ti dà quella.
Torna in cima
Profilo Messaggio privato Invia email HomePage
Kova
Newbie
Newbie


Registrato: Apr 10, 2007
Messaggi: 15
Località: Pianeta terra

MessaggioInviato: Mer 16 Mag 2007, 8:49    Oggetto: Rispondi citando

Demetrius ha scritto:
CUT

Umm effettivamente mi era sfuggito il fatto che nel tuo progetto è stato usato un quarzo da 10MHz e io sto usando uno da 20MHz Shocked
Penso quindi che qualcosa non vada qui:
Codice:
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);


Per questo ho pensato di mettere il divisore a 2 Embarassed :
Codice:
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_2);
setup_timer_2(T2_DISABLED,0,1);


A questo punto faccio visualizzare sull'RS232 il valore:

Codice:
valore = (out_data[0]-out_data[2]);
printf(usb_cdc_putc, "\r%d ", valore );


usb_cdc_putc è definito cosi (nelle librerie del CCS):
Codice:
//// usb_cdc_putc(char c) - Puts a character into the transmit       ////
////      buffer.  If the transmit buffer is full it will wait until ////
////      the transmit buffer is not full before putting the char    ////
////      into the transmit buffer.  The transmit buffer is read by  ////
////      the PC very quickly, and therefore the buffer should only  ////
////      be full for a few milli-seconds.  If you are concerned     ////
////      and don't want to be stuck in a long or infinite loop,     ////
////      use usb_cdc_putready() to see if there is space in the     ////
////      transmit buffer before putting data into the transmit      ////
////      buffer.


In pratica invio "valore" alla rs232 e la faccio visualizzare in formato intero con segno (%d).
Collego l'interfaccia al pc ed ottengo (con il sensore parallelo al piano) valori prossimi allo zero e in perpendicolare leggo 11/12 (che moltiplicato per 80 sarebbero 880-960milliG).
Il fatto è che facendo l'arcoseno per ricavare i gradi dall'accelerazione, le angolazioni che ottengo sono ben lontane dalla realtà Very Happy (invece di stare a 30° ottengo 60°)

Poi ho provato anche le routine a 16BIT ed ho ottenuto questi dati:
Codice:
//Parallelo al pavimento
15  CB  13  88  15  C6  13  86 
15  C3  13  89  15  C6  13  86 
15  A0  13  8F  15  C6  13  86 
15  90  13  98  15  C6  13  86 
15  94  13  93  15  C6  13  86 
15  77  13  8F  15  C6  13  86

//Perpendicolare al pavimento 
17  1B  13  71  15  C6  13  86 
1A  38  13  A1  15  C6  13  86 
1A  39  13  9F  15  C6  13  86 
1A  36  13  9A  15  C6  13  86 
1A  37  13  9A  15  C6  13  86 
1A  3C  13  A0  15  C6  13  86 
1A  38  13  9C  15  C6  13  86 
1A  3A  13  9C  15  C6  13  86 
1A  35  13  88  15  C6  13  86 
1A  37  13  9E  15  C6  13  86

//Sensore +/- a 45°
19  58  13  70  15  C6  13  86 
19  1F  13  82  15  C6  13  86 
19  16  13  7C  15  C6  13  86 
19  1A  13  7A  15  C6  13  86 
19  16  13  7F  15  C6  13  86 
19  16  13  72  15  C6  13  86 
19  01  13  7E  15  C6  13  86
19  D5  13  36  15  C6  13  86 
19  98  13  5B  15  C6  13  86 
19  96  13  4D  15  C6  13  86 
19  AE  13  5E  15  C6  13  86 
19  A3  13  64  15  C6  13  86 
19  94  13  59  15  C6  13  86 
19  9D  13  6B  15  C6  13  86


I dati rispecchiano l'ordine del tuo codice:
Codice:
out_data[0]=make8(dutyX,1);
out_data[1]=make8(dutyX,0);
out_data[2]=make8(dutyY,1);
out_data[3]=make8(dutyY,0);
out_data[4]=zerogXh;
out_data[5]=zerogXl;
out_data[6]=zerogYh;
out_data[7]=zerogYl;


Come ti sembrano Laughing ?


Ora sto provando il codice di esempio dell'adxl210 contenuto nel CCS!

P.S. posso aggiungere il tuo contatto msn?
_________________
Non condivido la tua idea, ma darei la vita perché tu la possa esprimere (Voltaire)
Torna in cima
Profilo Messaggio privato
Demetrius
Site Admin
Site Admin


Registrato: Jul 29, 2002
Messaggi: 1686

MessaggioInviato: Mer 16 Mag 2007, 10:04    Oggetto: Rispondi citando

i valori a 16bit mi sembrano abbastanza corretti.

con 8bit è praticamente impossibile avere risultati attendibili per la misura dell'inclinazione, perché la risoluzione è troppo bassa, tieni anche conto che va fatta una calibrazione molto più accurata proprio perché bastano pochi milliG di differenza e si hanno salti di diversi gradi in inclinazione Wink

per quanto riguarda i timer, settalo in modo che non vada in overflow prima che finisca il periodo dell'onda PWM del sensore: se il periodo è 10ms (quindi mi pare con una resistenza di circa 1.2Mohm) il timer deve essere settato di conseguenza per es. a 10,5ms.Nel PCW c'è una procedura guidata che ti indica ogni quanto un timer viene incrementato e quando va in overflow a secondo del clock e puoi vedere il codice associato a quelle opzioni.

per l'adxl210 ti posso dire chè è tutto uguale, cambia solo per calcolo dell'accelerazione: devi dividere per 4 invece di 12.5 Wink
Torna in cima
Profilo Messaggio privato Invia email HomePage
Kova
Newbie
Newbie


Registrato: Apr 10, 2007
Messaggi: 15
Località: Pianeta terra

MessaggioInviato: Mer 16 Mag 2007, 16:29    Oggetto: Rispondi citando

Demetrius ha scritto:
i valori a 16bit mi sembrano abbastanza corretti.


In che modo li interpreti i valori? Shocked
C'è qualcosa che non riesco a capire Confused

Ti faccio una panoramica sui nuovi sviluppi Very Happy
Allora è assodato che utilizzando un quarzo da 20Mhz (che in realtà sono 48MHz perchè ho abilitato il PLL a 5, in quanto in usb CDC il quarzo deve essere per forza a 48MHz) devo settare il Timer con DIV pari a 2 (ho utilizzato l'utility del CCS che mi conferma che l'overfloy avviene a 10.8ms, avendo utilizzato una resistenza da 1Mohm a 5% di tolleranza sono a riparo (ho usato esattamente il tuo schema con i tuoi stessi valori Very Happy).
Usando invece il DIV a 1 avrei avuto l'overflow a 5ms (circa).

Assodato questo, non riesco a capire i valori Surprised
Ad esempio questi sono gli ultimi dati che ho acquisito dal sensore (16Bit):
Codice:
//Sensore parallelo al pavimento

158D  1389  158D  1389 
1591  1389  158D  1389 
1591  1389  158D  1389 
1592  1388  158D  1389 
158F  138A  158D  1389 
158A  1386  158D  1389

//Sensore perpendicolare al pavimento
1997  1365  158D  1389 
1A38  1330  158D  1389 
1A2E  1346  158D  1389 
1A2B  134B  158D  1389 
1A34  135C  158D  1389 
19CB  138A  158D  1389
1A2B  13A1  158D  1389 
1A2B  13A2  158D  1389 
1A2D  13A3  158D  1389 
1A2A  1375  158D  1389
1A2A  1372  158D  1389 
1A35  1378  158D  1389 


Dove le 4 colonne sono (da sx verso dx):
DutyX, DutyY, zeroGx, zeroGy

Ho già eliminato lo "spazio" tra la parte alta e bassa del numero Smile
Come li interpreti?
Ad esempio, prendendo l'ultima riga e calcolando l'A(g) relativa all'asse X ottengo (in hex):
1A35-158D=4A8
Se convertiamo in decimale otteniamo:
1192
Che dovrei moltiplicare per 1000 e dividere per 12.5, ma cosi ottengo un numero senza senso Embarassed !

P.S. Ho fatto una misurazione con il tester e ho visto che in posizione parallela al pavimento la tensione tra X-Out rispetto a massa è di 2.68V quasi il 50% del duty cycle (devi tener presente dell'errore compiuto dal mio tester che di regola non legge onde quadre, ma solo continue e/o sinusoidali), quando è perpendicolare arriva a 3.25V.

Non ci sto a capire più niente Laughing Laughing
Perdonami se ti sto rompendo i OO Very Happy

Ciao Smile
_________________
Non condivido la tua idea, ma darei la vita perché tu la possa esprimere (Voltaire)
Torna in cima
Profilo Messaggio privato
Demetrius
Site Admin
Site Admin


Registrato: Jul 29, 2002
Messaggi: 1686

MessaggioInviato: Mer 16 Mag 2007, 17:01    Oggetto: Rispondi citando

per la versione a 16bit devi tenere che c'è un ADXL_SCALING_FACTORh 0.0001

che quindi è diverso da quello ad 8 bit e cambia la formula, sarebbe:
(DutyX-zeroGx)*10/12.5;

quindi 1192 * 10/12.5=953,6 mG Wink
Torna in cima
Profilo Messaggio privato Invia email HomePage
Kova
Newbie
Newbie


Registrato: Apr 10, 2007
Messaggi: 15
Località: Pianeta terra

MessaggioInviato: Gio 17 Mag 2007, 8:32    Oggetto: Rispondi citando

Demetrius ha scritto:
quindi 1192 * 10/12.5=953,6 mG Wink


Allèèèè perfetto Shocked !
Purtroppo non avevo pensato al fatto che rilevare angolazioni trai 75 e 90° è praticamente impossibile perchè dai 75° in poi la variazione dell'arcoseno entra in una zona curva e i valori si compattano troppo (= piccolissime variazioni per molti gradi).... Razz
Vabbè pazienza Laughing
Per quanto riguarda il filtro numerico, quale hai utilizzato?
L'hai implementato, per caso in matlab, o direttamente in delphi?

Grazie di tutto Wink
Ciao
_________________
Non condivido la tua idea, ma darei la vita perché tu la possa esprimere (Voltaire)
Torna in cima
Profilo Messaggio privato
Demetrius
Site Admin
Site Admin


Registrato: Jul 29, 2002
Messaggi: 1686

MessaggioInviato: Gio 17 Mag 2007, 16:27    Oggetto: Rispondi citando

tutto in Delphi, con una cosa del genere:
Codice:
    Xpunto:=accX-accXprec;
    accFILTx:=accFILTx+(Xpunto*0.1);
    accX:=accFILTx/StrtoFloat(cost_tempo.Text);
    accXprec:=accX;
    Ypunto:=accY-accYprec;
    accFILTy:=accFILTy+(Ypunto*0.1);
    accY:=accFILTy/StrtoFloat(cost_tempo.Text);
    accYprec:=accY;
Torna in cima
Profilo Messaggio privato Invia email HomePage
Mostra prima i messaggi di:   
Nuovo Topic   Rispondi    Indice del forum -> Schemi e progetti Tutti i fusi orari sono GMT + 1 ora
Vai a pagina Precedente  1, 2
Pagina 2 di 2



 
Vai a:  
Non puoi inserire nuovi Topic in questo forum
Non puoi rispondere ai Topic in questo forum
Non puoi modificare i tuoi messaggi in questo forum
Non puoi cancellare i tuoi messaggi in questo forum
Non puoi votare nei sondaggi in questo forum

Powered by phpBB 2.0.22 © 2001 phpBB Group
phpBB port v2.1 based on Tom Nitzschner's phpbb2.0.6 upgraded to phpBB 2.0.4 standalone was developed and tested by:
ArtificialIntel, ChatServ, mikem,
sixonetonoffun and Paul Laudanski (aka Zhen-Xjell).

Version 2.1 by Nuke Cops © 2003 http://www.nukecops.com


Anti-spam
:: Home :: RSS News :: Privacy :: Disclaimer :: Contatti :: Google Sitemap ::
Copyright by DemiSoft. Tutti i diritti riservati. Leggere attentamente il Disclaimer. Engine by PHP-Nuke
Generazione pagina: 0.85 Secondi