Registrato: Apr 10, 2007 Messaggi: 15 Località: Pianeta terra
Inviato: Mar 10 Apr 2007, 18:32 Oggetto: ADXL202
Un saluto a tutto il forum ,
ho letto con interesse l'articolo sull'adxl202http://demisoft.altervista.org//modules.php?name=Sections&op=viewarticle&artid=13
Siccome sto facendo un progettino universitario basato proprio su questo sensore, volevo chiedere se fosse possibile avere i sorgenti
Non voglio copiare (anche perchè l'adxl è solo una parte del progetto), ma capire in che modo è stato catturato, tramite il pic, il segnale PWM!
per scrivere e compilare il formware ho utilizzato il programma CCS PIC-C, che al suo interno ha diverse librerie ed esempi, tra cui c'erano anche quelli per gestire i sensori adxl2XX, non posso pubblicare la libreria nel forum per non violare i copyright vari
Questo è il sito, dove puoi ottenere una copia demo:
http://www.ccsinfo.com/
Cmq ti posso dire in generale come viene fatta la lettura... si usano i moduli CCP del PIC per "catturare" i fronti di salita-discesa dell'onda PWM. Nella routine di gestione degli interrupt che viene chiamata ad ogni fronte, ti calcoli i due periodi T1 e T2 del clock sottraendo il valore del timer tra due fronti consecutivi.
Se non riesci a procurarti questo compilatore, che ti consiglio molto, cerco di mandarti quello che posso.
Registrato: Apr 10, 2007 Messaggi: 15 Località: Pianeta terra
Inviato: Mer 11 Apr 2007, 6:50 Oggetto:
Demetrius ha scritto:
Ciao Kova,
Se non riesci a procurarti questo compilatore, che ti consiglio molto, cerco di mandarti quello che posso.
Ciao Demetrius,
innanzi tutto grazie per avermi risposto
Si ho il compilatore CCS (la versione 4.023), anche se volevo utilizzare il mikroC (lo trovo più semplice ).
Non sapevo che all'interno del CCS ci fossero delle librerie dedicate agli ADXLxyz
Non appena finisco di rispondere al tuo post corro ad installarlo
....................
.....scusa se insisto, ma non si possono proprio avere i sorgenti del progetto ?
La parte sw lato pc l'hai sviluppata in delphi, vero?
Hai avuto problemi con la gestione della usb?
Per quanto riguarda Delphi/USB, ho usato un componente da installare in Delphi che, se non sbaglio, si chiama HIDKomponente, e che gestisce tutto lui.
E' compatibile anche con Borland C++ Builder, se preferisci lavorare in C.
Registrato: Apr 10, 2007 Messaggi: 15 Località: Pianeta terra
Inviato: Mer 11 Apr 2007, 14:34 Oggetto:
Demetrius ha scritto:
ti ho inviato i sorgenti in email
Per quanto riguarda Delphi/USB, ho usato un componente da installare in Delphi che, se non sbaglio, si chiama HIDKomponente, e che gestisce tutto lui.
E' compatibile anche con Borland C++ Builder, se preferisci lavorare in C.
occhio al PIC che usi (il file .h che ti ho mandato è per il 16C745), se usi i nuovi PIC18FXXX USB hai bisogno di un altro file .h secondo le impostazioni di questi nuovi PIC che sono diverse.
Usa anche direttamente le nuove librerie USB incluse nel CCS, le trovi nella cartella \PICC\Drivers, ovvero:
Registrato: Apr 10, 2007 Messaggi: 15 Località: Pianeta terra
Inviato: Sab 14 Apr 2007, 19:01 Oggetto:
Demetrius ha scritto:
(cambia quando riportato nel file .c)
Grazie per le info
Ho provato a compilarlo (come se stessi usando il tuo PIC ) e in effetti mi da qualche errore (forse perchè uso il CCS più nuovo).
In questa istruzione:
setup_spi(FALSE);
Error 12 "usb_ccp.c" Line 193(4,13): Undefined identifier setup_spi
In questa:
usb_gets(1, in_data, USB_EP1_RX_SIZE);
Error 102 "usb_ccp.c" Line 219(46,47): Expect comma
In questa:
usb_put_packet(1, out_data, USB_EP1_TX_SIZE, TOGGLE);
Error 12 "usb_ccp.c" Line 246(58,64): Undefined identifier TOGGLE
Nella prima non ho capito il perchè
Nelle altre due molto probabilmente (domani con piu calma lo vedrò meglio) sarà cambiata la funzione usb_gets e usb_put_packet
Registrato: Apr 10, 2007 Messaggi: 15 Località: Pianeta terra
Inviato: Dom 15 Apr 2007, 9:09 Oggetto:
OK!
Ho risolto tutto
Da quello che ho capito, nelle vecchie versioni del CCS potevi settare ad OFF (False) l'spi (che non è presente nel 16C745), mentre nella nuova versione, restituisce un errore.
Gli altri due errori sono dovuti al cambiamento delle funzioni e le ho corrette in questo modo:
usb_put_packet(1, out_data, USB_EP1_TX_SIZE, USB_DTS_TOGGLE);
(Mettendo USB_DTS_TOGGLE invece di TOGGLE)
usb_gets(1, in_data, USB_EP1_RX_SIZE,0);
(Aggiungendo lo 0 alla fine, che indica che non verrà rilevato il timeout)
La compilazione è andata a buon fine
Correggimi se sbaglio:
in pratica tu (mi riferisco solo alla routine a 8bit) procedi prima alla calibrazione e calcoli:
zerogXr=tx/10;
zerogYr=ty/10
Che non sono altro che la media di 10 rilevazioni di accelerazione consecutive.
Poi procedi alla rilevazione dell'accelerazione attuale X e Y e costruisci il vettore out_data in cui:
Il primo elemento è l'accelerazione attuale X.
Il secondo è l'accelerazione attuale di Y.
Il terzo è la media di X.
Il quarto è la media di Y.
Giusto?
Il calcolo dello spostamento e della velocità, invece, lo hai implementato nel programma utente (in delphi), dico bene?
Grazie ancora per tutto quanto
P.S.
ti va bene la discussione qui sul forum o tramite email?
OK!
Ho risolto tutto
Da quello che ho capito, nelle vecchie versioni del CCS potevi settare ad OFF (False) l'spi (che non è presente nel 16C745), mentre nella nuova versione, restituisce un errore.
Gli altri due errori sono dovuti al cambiamento delle funzioni e le ho corrette in questo modo:
usb_put_packet(1, out_data, USB_EP1_TX_SIZE, USB_DTS_TOGGLE);
(Mettendo USB_DTS_TOGGLE invece di TOGGLE)
usb_gets(1, in_data, USB_EP1_RX_SIZE,0);
(Aggiungendo lo 0 alla fine, che indica che non verrà rilevato il timeout)
La compilazione è andata a buon fine
esatto, ti confermo quello per usb_put_packet in quanto l'ho usato in un altro programma con i PIC18F, mentre per usb_gets non saprei, ma credo cmq che non dovresti avere problemi.
Citazione:
Correggimi se sbaglio:
in pratica tu (mi riferisco solo alla routine a 8bit) procedi prima alla calibrazione e calcoli:
zerogXr=tx/10;
zerogYr=ty/10
Che non sono altro che la media di 10 rilevazioni di accelerazione consecutive.
Poi procedi alla rilevazione dell'accelerazione attuale X e Y e costruisci il vettore out_data in cui:
Il primo elemento è l'accelerazione attuale X.
Il secondo è l'accelerazione attuale di Y.
Il terzo è la media di X.
Il quarto è la media di Y.
Giusto?
Il calcolo dello spostamento e della velocità, invece, lo hai implementato nel programma utente (in delphi), dico bene?
tutto giusto, però per la precisione non è l'accelerazione che viene calcolata nel PIC, ma solo il duty cycle rilevato che viene trasmesso via USB, l'accelerazione, velocità e tutto il resto invece viene fatto nel PC, cmq puoi benissimo farlo nel PIC, non dovresti avere particolari problemi con i nuovi PIC che sono più veloci.
Citazione:
P.S.
ti va bene la discussione qui sul forum o tramite email?
Registrato: Apr 10, 2007 Messaggi: 15 Località: Pianeta terra
Inviato: Dom 15 Apr 2007, 18:27 Oggetto:
Demetrius ha scritto:
esatto, ti confermo quello per usb_put_packet in quanto l'ho usato in un altro programma con i PIC18F, mentre per usb_gets non saprei, ma credo cmq che non dovresti avere problemi.
OK
Citazione:
tutto giusto, però per la precisione non è l'accelerazione che viene calcolata nel PIC, ma solo il duty cycle rilevato che viene trasmesso via USB, l'accelerazione, velocità e tutto il resto invece viene fatto nel PC, cmq puoi benissimo farlo nel PIC, non dovresti avere particolari problemi con i nuovi PIC che sono più veloci.
Si, ho commesso un'inesattezza
Quindi in pratica per il calcolo dell'accelerazione di gravità (X e Y), hai usato la formula presente sul datasheet:
A(g)=(T1/T2-0.5)/12.5%
Con T2=Rset/125Mohm
Con T1=il periodo (duty) calcolato dalle due funzioni presenti sul pic (accelerometer_read8y e accelerometer_read8x).
Giusto?
Mentre per il calcolo della velocità e dello spostamento come hai fatto?
Inoltre ho letto sul datasheet (pagina 9) che tramite queste due formule:
Asin(Ax/1g)
Asin(Ay/1g)
è possibile convertire l'accelerazione in gradi.
Ne hai fatto uso?
Citazione:
si, va benissimo sul forum
P.S. se ho scritto qualche castroneria, perdonami, ma oggi sono proprio a pezzi
Ciao
Quindi in pratica per il calcolo dell'accelerazione di gravità (X e Y), hai usato la formula presente sul datasheet:
A(g)=(T1/T2-0.5)/12.5%
Con T2=Rset/125Mohm
Con T1=il periodo (duty) calcolato dalle due funzioni presenti sul pic (accelerometer_read8y e accelerometer_read8x).
Giusto?
Per l'accelerazione ho usato la formula:
accX=(dx-zeroX)*1000 / ppgX;
dove:
dx è il duty cycle inviato tramite USB, ed è appunto T1/T2,
zeroX è il valore di calibrazione,
ppgX è appunto 12.5 (in realtà si potrebbe fare una calibrazione anche di questo valore, se ti interessa ti dico come, mi pare ci sia scritto anche del datasheet),
il 1000 per avere il valore in milliG.
Citazione:
Mentre per il calcolo della velocità e dello spostamento come hai fatto?
devi "integrare" l'accelerazione per ottenere la velocità, e la velocità per ottenere la posizione, io ho usato queste formule in delphi:
Codice:
if (not ((accX<0) and (vel=0))) then
accTOTx:=accTOTx+accX;
vel:=(accTOTx/1000)*9.81*0.1; // 9.81 per convertire g in m/s^2
if vel<0 then vel:=0;
velTOT:=velTOT+vel;
Velocita.Caption:=FloattoStr(Round(vel)*3.6); // 3.6 per convertire m/s in km/h
Distanza.Caption:=FloattoStr(Round(velTOT)*0.1);
0.1 è una sorta di tempo di campionamento
Citazione:
Inoltre ho letto sul datasheet (pagina 9) che tramite queste due formule:
Asin(Ax/1g)
Asin(Ay/1g)
è possibile convertire l'accelerazione in gradi.
Ne hai fatto uso?
si, basta applicare quelle formule che hai scritto, ti può essere utile se devi calcolare l'inclinazione del sensore. Per ottenere valori abbastanza attendibili però devi fare una calibrazione del valore di accelerazione che ti segna il sensore quando è ad 1G, in quanto molte volte è impreciso.
Citazione:
P.S. se ho scritto qualche castroneria, perdonami, ma oggi sono proprio a pezzi Very Happy
Registrato: Apr 10, 2007 Messaggi: 15 Località: Pianeta terra
Inviato: Lun 16 Apr 2007, 7:54 Oggetto:
Demetrius ha scritto:
devi "integrare" l'accelerazione per ottenere la velocità, e la velocità per ottenere la posizione, io ho usato queste formule in delphi:
Ummm, non è il contrario
Cioè sapendo l'accelerazione, per calcolare la velocità faccio la derivata, derivando ancora una volta ho la posizione
Citazione:
Codice:
if (not ((accX<0) and (vel=0))) then
accTOTx:=accTOTx+accX;
vel:=(accTOTx/1000)*9.81*0.1; // 9.81 per convertire g in m/s^2
if vel<0 then vel:=0;
velTOT:=velTOT+vel;
Velocita.Caption:=FloattoStr(Round(vel)*3.6); // 3.6 per convertire m/s in km/h
Distanza.Caption:=FloattoStr(Round(velTOT)*0.1);
0.1 è una sorta di tempo di campionamento
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?
Come mai hai messo nell'if accX<0 e anche vel<0, può accadere che questi siano negativi?
Tutti i fusi orari sono GMT + 1 ora Vai a pagina 1, 2Successivo
Pagina 1 di 2
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
:: 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.55 Secondi