Vai al contenuto
PLC Forum


Interfacciare Un Microcontrollore Con Un Sensore


MusicIsLife

Messaggi consigliati

Ciao a tutti.

Ho a disposizione un sensore che fornisce un'uscita digitale su un bus bifilare con una modulazione in corrente.

Vorrei collegare a questo sensore un uC per leggere i valori che questo sensore rileva ma non so come fare l'interfaccia.

La mia domanda è la seguente: per leggere i valori dei dati trasmessi dal sensore devo interporre un dispositivo tra il mio sensore e il microprocessore in modo da adattare in qualche modo la modulazione in corrente con la quale escono i dati dal sensore ad uno standard classico tipo I²C o SPI oppure è già possibile leggere i valori usando solamente il uC che senza interporre nulla?

Insomma, non so se è necessario qualcosa per convertire i segnali modulati in corrente che escono dal sensore con impulsi di tensione che dovrebbe leggere il uC.

Inoltre devo poter scrivere sulla memoria del sensore. La corrente di idle sul bus è 6mA mentre quella di segnale è 31mA (quella di modulazione, quindi, di 25mA).

Cosa devo fare?

Modificato: da MusicIsLife
Link al commento
Condividi su altri siti


Cosa significa? Forse intendi che 6mA ===> "0" e 31mA ===> "1"? Oppure che varia con continuità tra 6mA e 31mA?

Il bus bifilare incosa consiste? Un filo per il segnale e l'altro per il ritorno? Oppure sono entrambi di segnale e fanno riferimento al comune (0V)?.

Se il segnale è di tipo digitale, "0" e"1", bisogna conoscere il protocollo.

Prova a spiegarti meglio e più compiutamente.

Link al commento
Condividi su altri siti

In effetti mi sono spiegato un pò male.

Il segnale è inviato su un bus bifilare dove sono presenti un pin del BUS POSITIVE e un pin del BUS NEGATIVE; la comunicazione da parte del sensore avviene con segnale modulato in corrente su questi 2 fili e, al contempo, l'alimentazione necessaria al funzionamento del sensore avviene sempre tramite questi 2 fili. Il segnale è digitale codificato con codifica Manchester e, come dici tu, Livio, a 6mA corrisponde lo 0 logico mentre a 31mA corrisponde l'1 logico.

Credo, quindi, che sia necessario un convertitore I/V per convertire il segnale in uscita dal sensore in modo che il uC possa interpretarlo e, viceversa, un convertitore V/I per far si che il uC possa mandare segnali al sensore quali, ad esempio, la programmazione della memoria onboard sul sensore.

Il ragionamento è corretto?

Link al commento
Condividi su altri siti

Devi fare un'interfaccia simile a quella in current loop delle vecchie TTY.

Quello che mi lascia perplesso sono i livelli di corrente.

Link al commento
Condividi su altri siti

Ehm... Che tipo di interfaccia sarebbe? Non l'ho mai sentita!

Uno schemino o qualcosa di simile?

In effetti anche a me sembravano strani i valori di corrente ma, a quanto pare, sono proprio questi: 6mA corrente di IDLE, 25mA corrente di modulazione, 6+25=31mA corrente di segnale ALTO.

Link al commento
Condividi su altri siti

Era nata con le telescriventi (TTY) ma molto usata anche in altri dispositivi.

Le seriali (RS232) dei (molto) vecchi PC avevano dei pin dedicati a questo tipo di comunicazione perche' permetteva di raggiungere distanze di qualche decina di metri.

Era ad esempio molto utlizzata (anni '80) nei regolatori ambiente della Staefa (PRU,PRBB, ecc.).

Uno dei problemi del metodo "current loop" era/e' quello di richiedere un buon dimensionamento dei cavi (sezione), la distanze raggiungibili raramente superano qualche centinaio di metri.

Per questo e' stata soppiantata dalla RS485 o altri standard.

Detta in breve c'e' un generatore che fa circolare una corrente costante sul bus, i dati vengono trasmessi interrompendo questo flusso in modo da creare dei livelli "alto" "basso".

Le variazioni vengono fatte tramite fotoaccoppiatori in modo da mantenere un isolamento galvanico e non sovraccaricare il generatore di corrente costante.

Ci sono poi tutta una serie di configurazioni circuitali per i vari dispositivi che comunicano su questo bus: passivo, attivo, con o senza eco, ecc..

Forse le variazioni di corrente che vedi sono i treni di impulsi che interrompono la linea.

Tempo fa mi sono dedicato un po' a capire questo standard e ho trovato una buona documentazione qui:

www.bb-elec.com/bb-elec/literature/tech/curentlp.pdf

Non e' circuitalmente molto complicato realizzare uno "sniffer" per catturare la comunicazione: bastano qualche transistor e qualche opto.

Capire come lavora l' interfaccia e' facile, il problema insormontabile (a mio avviso) e' interpretare i dati non conoscendo il protocollo.

Anni fa ci ho provato un po' con gli unici dati che avevo a disposizione: 1200 baud e distanza hamming = 4 come controllo errori.

Ho lasciato perdere quando ho visto i primi log sullo schermo del terminale.smile.gif

C'e' una variante di questo tipo di comunicazione che implementa il protocollo HART.

Questa e' molto usata ad esempio nei misuratori della Endress+Hauser.

Se e' quella che hai a disposizione forse riesci a ricavarci qualcosa perche' e' un protocollo documentato.

Modificato: da mf2hd
Link al commento
Condividi su altri siti

Questo è il sensore che devo interfacciare con il uC: iMEMS ADXL180.

Ho aperto la discussione di qua poichè questo riguarda esclusivamente il problema dell'interfacciamento dato che non avevo mai visto prima d'ora dei segnali di corrente così strani e, neppure, una trasmissione dati di questo tipo. Certo che ne inventano sempre una nuova! Fare qualcosa di standard tipo bus i2c era improponibile?

Link al commento
Condividi su altri siti

Ok, cancellate tutto e ripartiamo da zero. Leggendo meglio il datasheet ho visto che, in realtà, la trasmissione da uC a sensore avviene tramite impulsi di tensione del clock sul bus in questione: praticamente fornisco una tensione continua al bus che funge da alimentazione continua al sensore (ipotizziamo di 5V) e, poi, invio impulsi di clock dal master (il mio uC) che abbiano ampiezza ipotizziamo di 5V (giusto per utilizzare uno standard 0-5V ma potrei anche usare 0-3,3V giusto?) in modo che quando il sensore rileva l'impulso di clock (ovvero quando la tensione supera una certa soglia che si trova nei datasheet) attiva la conversione dell ADC che poi elabora i segnali e dopo il tempo necessario per elaborarli li invia sul bus bifilare utilizzando la famosa modulazione in corrente.

Quindi mi dovrebbe servire questo convertitore I/V (o l'interfaccia che proponevate voi) solo in uscita al BUS ovvero dal sensore al uC, giusto? Questo poichè dal uC al sensore comunico impostando i miei impulsi di clock direttamente dal uC ad una certa frequenza (ad esempio 1MHz --> t=1uS).

'Sti datasheet non è che siano chiarissimi -.-

Modificato: da MusicIsLife
Link al commento
Condividi su altri siti

Non riesco a scaricare il datasheet, ma la butto li...

penso che sia più semplice di quel che si pensi.

Dovrebbe essere sufficiente alimentare il sensore limitando la corrente, in modo che in stato IDLE sul bus ci sia tensione piena (nessuna caduta), mentre in condizione di modulazione ci sia una caduta apprezzabile.

Ti ritroverai una linea che presenta un'oscillazione con codifica manchester di ampiezza X (lo decidi te a seconda della corrente limite del bus) che puoi rivelare nel modo che più ti piace. Potrebbe essere sufficiente un transistor, oppure se vuoi fare il fico usi un operazionale. smile.gif

La stessa cosa probabilmente la devi fare in trasmissione, caricando il bus con un carico da 35mA quando il dato è 1, anche in questo caso ti basta un transistor.

Io però starei più alto con la tensione, sicuramente il dispositivo funziona a tensioni ben maggiori di 3,3 volt.

In modo molto simile funzionano gli RFID, solo che per questi non c'è collegamento galvanico, la modulazione avviene con l'assorbimento per induzione sull'antenna che fornisce il segnale che funge sia da alimentazione che da clock.

Link al commento
Condividi su altri siti

Penso che la corrente non devo essere io a limitarla ma dovebbe essere il sensore che manda impulsi in corrente sul bus. In stato di idle la corrende è 6mA che corrisponderebbe allo "0" logico e quando vuole inviare un "1" logico porta il livello di corrente a 31mA. Quindi credo che l'unica codifica che debba fare sarebbe quella di mettere un operazionale con una resistenza di retroazione in modo da convertire l'impulso di corrente in impulso di tensione e poi collegare un circuito tipo Trigger di Smith con isteresi in modo che quando il segnale di tensione in uscita dall'operazionale supera una certa soglia mi fa scattare l'uscita del trigger a livello logico alto (tipo 5V) e quando scende sotto una certa soglia me la fa scattare a livello logico alto (tipo 0V).

Questo, però, solo per convertire il segnale dal sensore al uC e non viceversa.

Non dovrebbe funzionare così la cosa?

Link al commento
Condividi su altri siti

Ma il sensore come fa a mandarti impulsi in corrente? l'unica cosa che può fare è "assorbire" corrente in misura diversa a seconda se assume lo 0 o l'1.

Fai una prova, ti ci vuole un secondo. Alimentalo a 12 volt con una resistenza in serie da 330 ohm e guarda con l'oscilloscopio se sulla linea di alimentazione hai delle oscillazioni quando dovrebbe trasmettere.

Se lo puoi alimentare a 12 ovviamente... non ho visto il datasheet.

Link al commento
Condividi su altri siti

Ma non mi sembra così strano che un sensore mandi impulsi di qualche tipo. Un sensore piezoelettrico genera una d.d.p. ai suoi capi a seguito di una forza applicata lungo l'asse meccanico senza neppure essere alimentato a volte. Questo sensore, di tipo capacitivo, modula i suoi dati in uscita in corrente e, inoltre, è pure alimentato; non vedo per quali motivi non potrebbe inviare dei dati in quel modo. Comunque in qualche modo i dati li deve generare per fornirli in uscita no?

Comunque se mai faccio quella prova per vedere l'uscita cosa mi fornisce.

Altre considerazioni nel frattempo?

Link al commento
Condividi su altri siti

E' vero, i trasduttori piezo hanno questa caratteristica, ma si tratta di correnti ridicole e comunque non hanno niente a che vedere con il tuo sensore. Non riesco a immaginare niente come dici te che possa trasmettere dati sui fili di alimentazione.

Tu hai per le mani una logica integrata con un sensore, che prende alimentazione da due fili che usa anche come bus dati. Io non ho mai usato questi sensori, ma mi ricorda tanto l'RFID (come già accennato).

L'unica differenza probabilmente è che l'RFID usa un'antenna, per indurre la corrente al chip, e lui per comuicare non fa altro che "assorbire" una diversa corrente a seconda che il bit sia 1 o 0.

Per leggere la sequenza di bit è sufficiente rilevare questa differenza, e la codifica usata (guarda caso) è spesso Manchester.

Link al commento
Condividi su altri siti

Sinceramente pure io non mi sono mai trovato per le mani un sensore di questo tipo; è per questo motivo che sono un pò (tanto) dubbioso su che tipo di interfaccia debba realizzare.

Se non ti è di peso ti chiederei gentilmente di dare un occhiata al datasheet del sensore (iMEMS ADXL180); 4 occhi e 2 cervelli sono sicuramente meglio di 2 occhi e 1 solo cervello (se poi i cervelli diventano 4-8 perchè altri vogliono darmi una mano direi che la cosa potrebbe funzionare ancora meglio smile.gif).

Aspetto qualche confronto nella speranza che arrivino (ovviamente senza alcuna pretesa).

Link al commento
Condividi su altri siti

Nikiki sai che forse hai ragione???????????

Sul datasheet sta scritto "When ADXL180 device is powered on, it uses current modulation to transmit data. Normally, the device pulls Iidle current. When modulating, an addiotional current of Imod is pulled from the sensor bus".

Mi sa che PRELEVA (pulls) una corrente diversa dal bus a seconda che voglia indicare "0" oppure "1", giusto??

Link al commento
Condividi su altri siti

Un circuitino così potrebbe andare?

user posted image

Misuro la caduta di tensione ai capi di R1 in modo da vedere quando ho segnale "0" oppure "1".

Ho i 5V di alimentazione del bus del dispositivo (i due fili che vanno al dispositivo sono segnati con Bus POSITIVE e Bus NEGATIVE). Poichè ho un 7812 che alimenta la R1, ai capi di R1=270ohm avrò (12-5)=7V in caso di corrente massima assorbita (circa 30-31mA) e in caso di corrente minima assorbita =6mA circa 0,5V. Per vedere il segnale trasmesso, quindi, mi basta leggere la variazione di tensione ai capi di R1, giusto?

Link al commento
Condividi su altri siti

Aggiorno la situazione postando lo schemino che ho realizzato su basetta sperimentale e, a quanto pare, sembra funzionare.

user posted image

Il sensore ADXL180 assorbe una corrente di 6mA o di 31mA (a seconda che debba indicare "0" oppure "1") che causa una caduta di tensione sulla resistenza da 100ohm collegata in uscita dall'LM7812. Ho collegato un operazionale in configurazione differenziale ai capi di questa resistenza per avere così in uscita la caduta di tensione ai capi della resistenza stessa. Il segnale in uscita dallo stadio differenziale è un misto tra dente di sega e carica-scarica di un condensatore con ampiezza circa 5V. A questo punto questo segnale entra in un trigger di Schmitt non invertente con soglie di isteresi VL=2,5V (soglia di scatto inferiore) e VH=4V (soglia di scatto superiore) per avere in uscita un'onda quadra con ampiezza pari a VCC=15V. Ho messo poi una resistenza per tagliare l'onda a 5V di ampiezza massima in modo da avere un segnale interfacciabile direttamente con un uC.

Ora, quindi, ho +5V = "1" e 0V = "0".

Vi convince o ho fatto qualche cavolata?

Questa sera posto delle foto dei segnali in uscita dall'oscilloscopio.

Modificato: da Luca Bettinelli
Link al commento
Condividi su altri siti

Come promesso posto le fotografie dei risultato ottenuti all'oscilloscopio collegando la sonda al catodo del diodo zener in uscita dall'intero circuito.

FOTO 1:

user posted image

FOTO 2:

user posted image

Come potete vedere dalla FOTO 2, il dataframe in uscita è composto da 2 bits di start, 3 di controllo (CRC), 3 di state vector che indica le modalità di funzionamento del sensore e i 10 bits di dati veri e propri nei quali, quindi, c'è l'informazione dell'accelerazione misurata.

Link al commento
Condividi su altri siti

FOTO 3:

user posted image

FOTO 4:

user posted image

In FOTO 3 e FOTO 4 ho messo i due segnali a confronto: il segnale ad onda quadra è quello in uscita dal TRIGGER DI SCHMITT e quello frastagliato (la traccia sopra) è quello in uscita dal differenziale, prima del trigger di schmitt.

La codifica è di tipo MANCHESTER-1, con 1 bit di start ed uno di fase (come si può vedere dalla foto seguente)

user posted image

Se serve saperlo, dai calcoli che ho fatto, il tempo intero di trasmissione è ovviamente di 228uS in modalità ASINCRONA (è così di default) (dall'oscilloscopio si legge 230uS), ogni bit occupa circa 8uS. I livelli di tensione sono di +5V --> "1" e 0V --> "0".

La mia domanda ora è questa: come faccio a decodificare il segnale attraverso un micro? Se usassi un PIC (ipotesi) dovrei implementare una routine che esegua questa decodifica per avere il segnale digitale decodificato oppure potrei utilizzare un metedo hardware per eseguire questa decodifica interponendo tra il PIC e il circuito un integrato tipo QUESTO.

Sono un pò bloccato perchè sinceramente non so come muovermi ora...

Modificato: da MusicIsLife
Link al commento
Condividi su altri siti

Io userei l'encoder-decoder Hw, così mi toglierei eventuali dubbi sul funzionamento della decodifica. Poi una volta consolidate le conoscenze si potrebbe ipotizzare di far fare tutto al microcontrollore.

Link al commento
Condividi su altri siti

Inserita: (modificato)

Se optassi per l'utilizzo di un encoder-decoder Manchester di tipo hardware, potreste indicarmi un circuito che esegue questa operazione? O devo necessariamente ripiegare sull'utilizzo di un integrato specifico (tipo HD6409 o altri?? ANCHE CONSIGLIATI DA VOI)?

Modificato: da MusicIsLife
Link al commento
Condividi su altri siti

Non è una decodifica complessa... dipende solo dalla familiarità che hai con i microcontrollori, e la programmazione in genere.

Comunque sei riuscito a tirar fuori i dati... smile.gif

Link al commento
Condividi su altri siti

Mmm... Mi sa che il problema è proprio questo: la programmazione. Direi che sono poco ferrato sulla parte software: per questo motivo pensavo fosse meglio realizzare un decoder a livello hardware in modo che poi lasciassi la parte di gestione dati attraverso il micro a chi si occupa di software qui in azienda.

Oppure sarebbe interessante utilizzare anche una routine che esegue questa decodifica per studiarla come opera.

Voi sapete indicarmi qualcosa sia da autocostruire (HW) oppure un integrato decoder-encoder oppure una routine per PIC che eseguono tutti e tre una decodifica MANCHESTER? Ho cercato qualcosa in rete ma non ho trovato granchè!

Link al commento
Condividi su altri siti

Ho fatto qualcosa molto tempo fa... se ritrovo i sorgenti te li posto.

Nel frattempo prova a dare un'occhiata qui, è un AN di Cypress, il codice è in assembly ma nel PDF potresti trovare spunti interessanti, tra cui il metodo usato da loro per la decodifica con delle logiche.

Qui invece trovi un'AN di Atmel, in fondo al PDF c'è anche un sorgente C che puoi adattare facilmente su un PIC.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...