Pagina 1 di 3

Prelevare segnale dalle ruote foniche ABS

Inviato: 27/01/2011, 18:39
da PierGSi
Per fare delle prove mi servirebbero le velocita' delle singole ruote, come potrei interfacciarmi alle ruote foniche esistenti senza disturbare il funzionamento dell'abs ?
Avrei pensato ad una cosa del genere per rilevare lo zero crossing :
Immagine

Consigli su che micro usare per misurare le velocità... ?
Non ho ancora contato i denti, ma penso siano parecchi, quindi per risalire alla velocità credo basti contare gli impulsi in una finestra di tempo predefinita senza complicarsi la vita misurando la distanza tra i fronti per poi calcolare la frequenza. Il problema à che servono 4 contatori hardware a 16 bit triggerabili dall'esterno :).

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 27/01/2011, 22:03
da Vicus
Per non disturbare i sistemi esistenti puoi interporre un buffer con impedenza di ingresso abbastanza alta tipo un operazionale con ingresso a jfet. Per condizionare il segnale puoi usare o il circuito che usa la mega oppure quello basato sull'LM1815. Per il micro... non saprei, con quali lavori di solito? Per esempio freescale ha un catalogo vastissimo.
Sulla questione se misurare l'intervallo di tempo tra un zero cross e l'altro o contare i denti che intercorrono in un intervallo di tempo fisso dipende tutto dal range di giri al minuto che la ruota fa, dal numero di tacche della ruota e dalla frequenza del counter che però è un problema di poco conto.

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 27/01/2011, 22:32
da PierGSi
Vicus ha scritto:Per non disturbare i sistemi esistenti puoi interporre un buffer con impedenza di ingresso abbastanza alta tipo un operazionale con ingresso a jfet.


Dici che non possa andare uno schema tipo quello linkato nel messaggio iniziale ? 220k mi sembra un'impedenza sufficientemente alta, a questi livelli credo cambi nulla usare un operazionale come lm324 (BJT, input bias current tipica 45nA) piuttosto che un jfet con una corrente dell'ordine dei pA.

Per condizionare il segnale puoi usare o il circuito che usa la mega oppure quello basato sull'LM1815.


lm1815 è il rilevatore di zero crossing, se non sbaglio. Non avendolo mai usato chiedo perche' lo consigli rispetto alla soluzione da me indicata...tutto sommato direi che, contando gli impulsi, cambia poco prendere lo zero crossing in salita o discesa o un istante prima o dopo, il segnale se ricordo bene (avevo guardato tanti anni fa con l'oscilloscopio)è simmetrico.

Per il micro... non saprei, con quali lavori di solito? Per esempio freescale ha un catalogo vastissimo.


di solito atmel atmega, pic 16F/18F...

Sulla questione se misurare l'intervallo di tempo tra un zero cross e l'altro o contare i denti che intercorrono in un intervallo di tempo fisso dipende tutto dal range di giri al minuto che la ruota fa, dal numero di tacche della ruota e dalla frequenza del counter che però è un problema di poco conto.


Si, allora...son andato a controllare e la ruota ha 50 denti, a 50 kmh dato il rotolamento di 1815 mm ho una frequenza di 382Hz.

Potrei leggere ogni 200 mS avendo una risoluzione superiore ad 1 kmh.
Il sistema mi servirebbe per dataloggare le velocita' ,e lo scorrimento, tra ruote ant e ruote post nelle varie condizioni inviandolo alla mia scheda di acquisizione dati che in futuro vorrei "espandere".
Non mi dispiacerebbe nemmeno provare ad implementare delle routine per realizzare un controllo di trazione...

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 28/01/2011, 1:23
da masterx81
Allora, il circuito da te proposto non so se funzioni come previsto, immagino tu voglia alimentare l'operazionale con tensione singola (0 / +5v), ma sull'ingresso si troverebbe tensioni di +0.6 / -0.6volt.
Non so quanto possa digerirlo.
Diverso sarebbe mettessi un condensatore prima o dopo la resistenza, poi metti due resistenza di eguale valore, una verso massa ed una verso +5v, così da aggiungere un bias a 2.5 volt continui. I diodi li metti uno con l'anodo sul segnale ed il catodo sul +5 (così da escludere tutte le tensioni superiori ai 5volt), l'altro col catodo sul segnale a l'anodo sulla massa (esclude le tensioni inferiori a massa).
Sul pin dell'invertente metti un altro partitore, anch'esso tarato sui 2.5 volt (quindi nuovamente 2 resistenze uguali), così quando il segnale passa lo 0 ottieni chiaramente un passaggio da 0volt a +5volt in uscita.
Credo sia la cosa piu' economica e semplice da fare...
Per misurare la velocità, la cosa piu' precisa e di veloce risposta credo sia sfruttare la funzione 'compare' della pic, ad esempio ogni fronte di salita del segnale. Il timer si misura quanto tempo è passato tra un fronte e l'altro, e così sai la valocita' con ottima precisione. Una volta che hai misurato il tempo tra un dente a l'altro, sapendo quanti denti ci sono (o meglio, quanti gradi ci son tra ogni singolo dente), è un attimo misurare la velocità.
Pero' forse è fin troppo preciso per quello che devi fare tu, è possibile che si siano variazioni e fluttuazioni della misura. Forse un valore 'medio' puo' essere sia meno intensivo epr il processore, sia piu' pulito come misura.
Volendo puoi mettere un timer ogni tot ms, e portare il segnale ad un pin che fa da contatore, tot ms vai a leggere quanti eventi ci sono stati.
Il problema di entrambi i sistemi è che ad esempio le pic piccole hanno un solo pin che puo' fare da timer/contatore. Problema che aggiri facilmente con un mux, o semplicemente 4 porte AND, misuri a rotazione una ruota per volta, selezionando quella di interesse.

Forse la funzione counter è quella per te piu' azzeccata, se misuri quanti denti passano ogni 100ms, in 400ms hai misurato la velocita' di tutte le ruote...

Per la funzione di controllo trazione, come manderesti il segnale alla centralina?

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 28/01/2011, 13:16
da PierGSi
masterx81 ha scritto:Allora, il circuito da te proposto non so se funzioni come previsto, immagino tu voglia alimentare l'operazionale con tensione singola (0 / +5v), ma sull'ingresso si troverebbe tensioni di +0.6 / -0.6volt.
Non so quanto possa digerirlo.


Si, non è una cosa bella ma non dovrebbe succedere niente con correnti cosi' irrisorie, nei datasheet dicono che nei casi estremi potrebbe andare a +V l'uscita pero' non mi è mai successo. Forse basterebbe invertire gli ingressi, in modo che con tensione inferiore a zero l'uscita sia gia' a +V :mrgreen:
Questo schema comunque funziona, l'ho usato anni fa per pilotare l'ingresso velocita' di uno strumentino con una ruota posteriore (per evitare false letture dovute ai pattinamenti).

Immagine


Diverso sarebbe mettessi un condensatore prima o dopo la resistenza, poi metti due resistenza di eguale valore, una verso massa ed una verso +5v, così da aggiungere un bias a 2.5 volt continui. I diodi li metti uno con l'anodo sul segnale ed il catodo sul +5 (così da escludere tutte le tensioni superiori ai 5volt), l'altro col catodo sul segnale a l'anodo sulla massa (esclude le tensioni inferiori a massa).
Sul pin dell'invertente metti un altro partitore, anch'esso tarato sui 2.5 volt (quindi nuovamente 2 resistenze uguali), così quando il segnale passa lo 0 ottieni chiaramente un passaggio da 0volt a +5volt in uscita.


Con i diodi cosi' collegati avresti un clamp a 5.7 ed uno a -0.7 circa, ovvero come adesso.
Inoltre, se ho ben capito quel che intendi (forse sbaglio, stasera rileggo con attenzione, ora sono molto di fretta), con i partitori connessi in quel modo avresti i fronti in corrispondenza delle creste (quando dopo aver raggiunto il picco positivo la tensione inizia a scendere uscita a zero, quando l'onda inizia a risalire dal massimo punto negativo commutazione a livello 1) e non sullo zero crossing. E neanche sempre nello stesso punto, perche' con la frequenza varia la reattanza del condensatore, che volevo evitare di mettere.

Per misurare la velocità, la cosa piu' precisa e di veloce risposta credo sia sfruttare la funzione 'compare' della pic, ad esempio ogni fronte di salita del segnale.


capture, non compare :D

Il timer si misura quanto tempo è passato tra un fronte e l'altro, e così sai la valocita' con ottima precisione. Una volta che hai misurato il tempo tra un dente a l'altro, sapendo quanti denti ci sono (o meglio, quanti gradi ci son tra ogni singolo dente), è un attimo misurare la velocità.
Pero' forse è fin troppo preciso per quello che devi fare tu, è possibile che si siano variazioni e fluttuazioni della misura.


Uso questa tecnica spesso per misurare i giri e la velocita', i pic permettono anche di triggerare ogni 4 impulsi, pero' come hai detto è molto "delicata" la lettura fatta in questo modo, perche' basta una minima variazione di velocita' istantanea, che poco influenza la velocità media misurata su qualche giro, per avere una grande variazione sulla misura, poi si hanno tanti interrupt...inoltre qui si' serve una rilevazione precisa dello zero crossing.

Forse un valore 'medio' puo' essere sia meno intensivo epr il processore, sia piu' pulito come misura.
Volendo puoi mettere un timer ogni tot ms, e portare il segnale ad un pin che fa da contatore, tot ms vai a leggere quanti eventi ci sono stati.



Quello che vorrei fare, penso bastino 5 letture al secondo per un traction control...oppure è troppo poco ?

Il problema di entrambi i sistemi è che ad esempio le pic piccole hanno un solo pin che puo' fare da timer/contatore.


Gli 876 hanno due pin che fanno capo ad un unico contatore a 16 bit, quindi abbiamo due capture

Problema che aggiri facilmente con un mux, o semplicemente 4 porte AND, misuri a rotazione una ruota per volta, selezionando quella di interesse.

Forse la funzione counter è quella per te piu' azzeccata, se misuri quanti denti passano ogni 100ms, in 400ms hai misurato la velocita' di tutte le ruote...


ogni 100 mS è pochino...con una tale finestra, a 50 kmh avrei 47.2 impulsi, ovvero meno di 1 kmh di risoluzione...

Per la funzione di controllo trazione, come maderesti il segnale alla centralina?


L'idea sarebbe quella di inserire una AND tra l'uscita della ecu ed il modulo di potenza della bobina (che ti ricordo essere una sulla mia auto, la distribuzione dell'alta tensione è fatta con spazzola) per spegnere a turno uno (mai lo stesso) o piu' cilindri a seconda dell'entità dello scorrimento.
Un taglio dell'iniezione richiederebbe dei driver di potenza ed inoltre, condizione imprscindibile, voglio che escano fiamme dallo scarico. :D :mrgreen: :D

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 28/01/2011, 16:33
da masterx81
Asp, ho fatto un po di casino con al 'routine' per la lettura, la mia idea (fatta alle 2.30 del mattino :) ) non funzionava :)

Le tensioni è vero, sono ~+5.6 e -0.6, nel tuo caso invece sono +0.6 e -0.6.
Il fatto è che in teoria l'operazionale dovrebbe mandare in uscita il segnale a -v se la tensione sull'ingresso non invertente passa sotto a quella dell'invertente. Ma in pratica la tensione sul non invertente non puo' andare a meno di quella dell'invertente perchè il riferimento è a 0, e la tensione negativa non viene vista. Probabilmente funziona lo stesso perchè la tensione va a 0, ed un po di tolleranza permette al tutto di funzionare.
Il partitore in ingresso è un'idea presa dagli impianti audio per amplificare un segnale senza avere una tensione duale, e funziona.
Basta un partitore che aggiunge un offset. Poi metti un secondo partitore sul - dell'operazionale (in modo che anche li ci siano 2.5volt), e quando sul non invertente la tensione passa sotto i 2.5v l'uscita va a massa, quando invece passa sopra i 2.5volt va a +5v, in coincidenza del zero crossing. Praticamente lo usi come comparatore. Il condensatore in serie se ben dimensionato non crea problemi, esattamente come non lo crea negli impianti audio che no usano una tensione duale. Alla peggio sfasa il segnale, ma non è un problema.

Per la misurazione, o misuri come gia' detto a tempi regolari, oppure puoi fare una misura ogni x eventi (clock source del timer un piedino esterno), e con la funzione compare fai scattare un interrupt ogni x eventi (che reputi necessari per avere una misura di velocita' abbastanza affidabile). Pero' piu' vai piano e piu' la frequenza dia ggiornamento è inferiore (ma la precisione è sempre la medesima).

Se tagli la candela, credo che ti piacciono i botti allo scarico :) E che non hai un cat :p

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 28/01/2011, 18:41
da PierGSi
masterx81 ha scritto:Il partitore in ingresso è un'idea presa dagli impianti audio per amplificare un segnale senza avere una tensione duale, e funziona.
Basta un partitore che aggiunge un offset. Poi metti un secondo partitore sul - dell'operazionale (in modo che anche li ci siano 2.5volt), e quando sul non invertente la tensione passa sotto i 2.5v l'uscita va a massa, quando invece passa sopra i 2.5volt va a +5v, in coincidenza del zero crossing. Praticamente lo usi come comparatore. Il condensatore in serie se ben dimensionato non crea problemi, esattamente come non lo crea negli impianti audio che no usano una tensione duale. Alla peggio sfasa il segnale, ma non è un problema.


Non mi è chiara una cosa...intendi uno schema cosi', con eventualmente un'altra resistenza in serie al condensatore ?

Immagine

Per la misurazione, o misuri come gia' detto a tempi regolari, oppure puoi fare una misura ogni x eventi (clock source del timer un piedino esterno), e con la funzione compare fai scattare un interrupt ogni x eventi (che reputi necessari per avere una misura di velocita' abbastanza affidabile). Pero' piu' vai piano e piu' la frequenza dia ggiornamento è inferiore (ma la precisione è sempre la medesima).


Quindi, incremento di uno dei counter del micro da pin esterno e compare settato ad un dato valore. Quando scatta l'interrupt compare che fai ? Misuri il tempo tra due interruzioni con un altro timer ? Potrebbe essere un'idea, a quel punto CTC sarebbe ancora meglio..
Piu' alto è il numero di eventi conteggiati e piu' la lettura è mediata, pero' come fai con un solo micro ?
Bisogna multiplexare con una rete esterna, pero' puo' essere un bel casino fare le letture in momenti diversi :D

Altrimenti, due 16F876 ciascuno dei quali contiene due capture (riferiti ad un unico timer a 16 bit, quindi bisogna lasciarlo andare sempre e calcolare gli offset) e si misura la distanza tra i fronti...

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 28/01/2011, 18:53
da masterx81
Lo schema che ho in mente è quello, amncano solo i diodi di protezione, ed un'eventuale resistenza. I 2.5 volt tirati fuori dal partitore sul pin invertente puoi portarlo a tutti gli operazionali.

Per la lettura con un solo micro è una rogna, bisogna trovare il giusto equilibrio di eventi da catturare per avere una misura stabile, e vedere se si riesce una volta scattato un interrupt perchè il conteggio è stato raggiunto a fare a rotazione tutti e 4 gli ingressi...
Il problema di leggere piu' ingressi contemporaneamente, è che la cpu tanto puo' processare un solo interrupt per volta... Tanto vale a quel punto leggerli gia' uno per volta a rotazione... Secondo me non è il caso di disturbare 2 micro...
Oppure fai una cosa piu' furba, metti per ogni segnale ruota un convertitore frequenza-tensione (basta anche solo un passa-basso) ed aquisisci con l'adc gli ingressi alla velocita' che vuoi... Molto meno sbattimento nel codice, ed un naturale smorzamento delle oscillazioni di velocita' grazie al passa basso.
Puo' essere una semplice alternativa...

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 28/01/2011, 19:21
da Vicus
Secondo me nemmeno quel circuito funziona bene, meglio inserire un po' di isteresi.

Re: Prelevare segnale dalle ruote foniche ABS

Inviato: 28/01/2011, 19:51
da PierGSi
masterx81 ha scritto:Lo schema che ho in mente è quello, amncano solo i diodi di protezione, ed un'eventuale resistenza. I 2.5 volt tirati fuori dal partitore sul pin invertente puoi portarlo a tutti gli operazionali.


Non capisco proprio come possa capire dov'e' lo zero crossing un circuito del genere, è una specie di derivatore con guadagno infinito :)

Ipotizziamo che l'induttivo abbia raggiunto la tensione negativa minima, -5V (valore a caso). Ai capi del condensatore avremo -5 da una parte e 2.5 dall'altra (il condensatore avra' 7.5 ai suoi capi). Quando la tensione inzia a salire, per forza di cose alzera' il pin non invertente, non essendoci retroazione l'uscita si portera' a livello 1; fintanto che la tensione continuerà ad aumentare avremo sempre l'uscita a livello 1...dal momento in cui iniziera' a scendere, dopo un tempo variabile in funzione dell'impedenza di ingresso dell'opamp, dei valori della rete di polarizzazione dell'ingresso e dello stesso condensatore, l'uscita si portera' a zero e via cosi' all'infinito, avremo delle commutazioni in corrispondenza dei due estremi.


Per la lettura con un solo micro è una rogna, bisogna trovare il giusto equilibrio di eventi da catturare per avere una misura stabile, e vedere se si riesce una volta scattato un interrupt perchè il conteggio è stato raggiunto a fare a rotazione tutti e 4 gli ingressi...
Il problema di leggere piu' ingressi contemporaneamente, è che la cpu tanto puo' processare un solo interrupt per volta...


Beh, oddio...con due capture hardware (16F876) puoi anche permetterti di fare con comodo (vabbe', oddio , con calma :P) processandone uno alla volta, tanto la lettura è "congelata" dall'hardware nel relativo registro quando il fronte commuta.

La frequenza di due ingressi (giri/velocita') la misuro con un 877 sulla mia scheda di acquisizione, oltre a loggare parecchi ingressi analogici a 20Hz, gestire la fotocellula IR del cronometro, ecc.
Facendo un po' di medie (con un numero di campioni variabile in funzione della stessa frequenza per per avere un refresh buono anche a basse cadenze e molti campioni quando i tempi sono brevi) il risultato è tutt'altro che disprezzabile, e riesco anche a mantenere una sincronizzazione temporale perfetta con la telecamera come puoi vedere nel video

http://www.youtube.com/watch?v=J0JnxynaaDM

Pero' le frequenze restano sempre solo due e non quattro...

Il problema, inoltre, è che cio' implica appunto quello che non vorrei fare, ovvero la misurazione tra i fronti...

Secondo me non è il caso di disturbare 2 micro...
Oppure fai una cosa piu' furba, metti per ogni segnale ruota un convertitore frequenza-tensione (basta anche solo un passa-basso) ed aquisisci con l'adc gli ingressi alla velocita' che vuoi... Molto meno sbattimento nel codice, ed un naturale smorzamento delle oscillazioni di velocita' grazie al passa basso.
Puo' essere una semplice alternativa...


Sinceramente, il segnale vorrei inviarlo alla mia scheda di acquisizione per altri utilizzi (ad esempio calcolare il tempo di accelerazione, cosa che gia' fa, usando pero' il segnale di velocita' nel cambio con i problemi di pattinamento) e per dataloggare le singole velocita con precisione. Per cui, non è molto indicata la doppia conversione...