Descrizione
This application note explains the minimum hardware and software requirements for obtaining an angular position measurement from a Fredericks electrolytic tilt sensor.
Design di base ed eccitazione del sensore
La Figura 1 mostra i principali componenti necessari per creare un'unità di misura dell'inclinazione funzionante utilizzando un sensore di inclinazione elettrolitico.
Come vedrete più avanti, è importante evitare la corrente continua al sensore. Suggeriamo quindi l'uso di un amplificatore operazionale ad alta impedenza d'ingresso come l'LMC6482 della Texas Instruments. Questo limiterà la dispersione di corrente verso terra e, a sua volta, la corrente continua verso il sensore. La Figura 2 mostra l'equivalente circuitale di un sensore di inclinazione elettrolitico a singolo asse.
Continuiamo con il segnale di eccitazione del sensore. Il segnale di eccitazione è fornito dal microprocessore con il caso più semplice che sia un sensore ad asse singolo. Un sensore monoasse richiede due porte di uscita del microprocessore che sono collegate ai pin esterni del sensore. Le porte sono attivate con un ciclo di lavoro del 50% e un periodo compreso tra 200 e 1000 hertz. Vedi Figura 3.
È necessaria una temporizzazione precisa nel software per mantenere un ciclo di lavoro del 50% per evitare l'asimmetria nel segnale di eccitazione del sensore. Vedere la Figura 4. L'asimmetria è definita come la corrente continua al sensore che causa deriva e, in definitiva, danni permanenti ed irreversibili al sensore. Questo può essere spiegato chimicamente; la corrente continua causa l'elettrolisi, rendendo il sensore inerte.
Esaminiamo il processo di creazione di un segnale di eccitazione nel software per un microprocessore PIC18F utilizzando il compilatore CCS PCW C. Queste istruzioni differiranno significativamente a seconda del vostro specifico microprocessore e compilatore. Inizieremo definendo quali pin saranno utilizzati per l'uscita. Useremo PORTB per l'output, quindi dovremo definirlo come tale. Questo si ottiene impostando il registro di direzione dei dati a 8 bit, chiamato TRISB. I bit in TRISB impostati a 0 definiranno il corrispondente pin PORTB come output, quindi useremo la seguente linea di codice per usare tutti i pin PORTB per l'output:
set_tris_b(0b00000000); |
Per modificare rapidamente i valori dei pin del PORTB, dovremo accedervi in memoria. Su questo particolare microprocessore, PORTB è un registro di funzioni speciali (SFR) che si trova all'indirizzo di memoria 0xf81. Memorizzeremo quindi la posizione di PORTB in una variabile per consentire un facile accesso. Questo si ottiene con la seguente riga di codice:
#byte port_b = 0xf81; |
Ogni bit in port_b ora corrisponde a un pin sul chip. Il bit più significativo è il pin B8 e quello meno significativo è il pin B0. Supponiamo che un sensore a singolo asse sia collegato ai pin B0 e B1. Vedi Figura 3. Se si utilizza un sensore a doppio asse, supponiamo che sia collegato ai pin B0, B1, B2 e B3.
Per un sensore monoasse, ci sono due stati per il segnale di eccitazione. Vedere Figura 4. Per imitare questo diagramma di temporizzazione, i due stati possono essere memorizzati in un array di numeri a 8 bit. Questo si ottiene con la seguente riga di codice:
int8 output_arr[2] = { 0b00000010, 0b00000001 }; |
Per un sensore a doppio asse, ci sono quattro stati per il segnale di eccitazione. Vedere figura 5. Per imitare questo diagramma di temporizzazione, i quattro stati possono essere memorizzati in un array di numeri a 8 bit. Questo si ottiene con la seguente riga di codice:
int8 output_arr[4] = { 0b00000011, 0b00001100, 0b00001010, 0b00000101 }; |
I timer sono uno strumento comunemente usato per generare interrupt ad intervalli precisi nel software e possono essere usati per generare facilmente un segnale di eccitazione. È importante utilizzare un interrupt ad alta priorità in modo che il segnale di eccitazione mantenga un ciclo di lavoro del 50%. Il codice seguente crea un interrupt ad alta priorità che commuta le porte per generare un segnale di eccitazione per un sensore a doppio asse:
int isr_counter = 0; #int_timer1 HIGH void timer1_isr(void) { set_timer1(64535); port_b = output_arr[ (isr_counter++) % 4]; // this is for a dual axis sensor } |
In questo esempio il timer1 è un contatore a 16 bit (da 0 a 65535). Ciò significa che esso conterà dal valore impostato da set_timer() e, quando trabocca (raggiunge 65535), verrà generato un interrupt e verrà eseguito il codice all'interno della funzione timer1_isr(). La quantità di tempo necessaria per lo overflow è definita da una serie di fattori, tra cui la velocità dell'orologio del microprocessore e i parametri di impostazione del timer1, tra gli altri. È importante mantenere un tempo di interruzione compreso tra 1 e 5 millisecondi per garantire una corretta eccitazione del sensore. Per queste informazioni, consultare il manuale del proprio microprocessore individuale.
L'attivazione della porta funziona utilizzando la funzione modulo. Ogni volta che viene generato un interrupt, isr_counter viene incrementato e il modulo 4 viene eseguito su di esso. Questo essenzialmente fa un contatore che conta da 0 a 3, incrementando ad ogni interrupt. Questo accede a ciascuno dei quattro stati memorizzati in output_arr che compongono il segnale di eccitazione.
Uscita del sensore
Ora che abbiamo creato un segnale di eccitazione, esaminiamo l'uscita del sensore. L'uscita è una tensione analogica riferita alla tensione di eccitazione. L'uscita deve essere letta in fase con il segnale di eccitazione. Si suggerisce di prelevare più campioni durante ciascuno dei quattro stati (due stati per un sensore ad asse singolo).
La forma d'onda in Figura 6 mostra un esempio di uscita dal convertitore analogico a quello digitale collegato all'uscita di un sensore a doppio asse. Questa particolare uscita indica un angolo di inclinazione positivo sia per l'asse x che per l'asse y. Vedere la Figura 7 per un'uscita che indica un angolo di inclinazione negativo.
Per leggere l'uscita dovremo utilizzare il convertitore analogico-digitale (ADC) del microprocessore. Guardando la Figura 3 dovremo impostare il pin A0 come ingresso ADC e poi impostare la porta ADC corrente sul pin A0. Possiamo quindi eseguire il seguente codice per leggere l'uscita da un sensore a doppio asse in fase con il segnale di eccitazione:
int samples = 0; int index = 0; int xpos[8], xneg[8], ypos[8], yneg[8] = {0,0,0,0,0,0,0,0}; while(true) { while( (isr_counter % 4) != 0 ); while( (isr_counter % 4) == 0 ) { // loop to read x positive state delay_us(100); if(index <= 7) xpos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 1 ); while( (isr_counter % 4) == 1 ) { // loop to read x negative state delay_us(100); if(index <= 7) xneg[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 2 ); while( (isr_counter % 4) == 2 ) { // loop to read y positive state delay_us(100); if(index <= 7) ypos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 3 ); while( (isr_counter % 4) == 3 ) { // loop to read y negative state delay_us(100); if(index <= 7) yneg[index] = Read_ADC(); index++; } index = 0; // data processing and analysis would then be done here } |
Come potete vedere, all'interno di ogni stato del segnale di eccitazione stiamo raccogliendo 8 campioni con un ritardo di 0,1 ms tra un campione e l'altro. Questi campioni possono poi essere mediati nel codice di analisi dei dati per fornire un risultato più stabile e preciso. Facendo riferimento al contatore isr_counter siamo in grado di garantire che le letture siano effettuate in fase con il segnale di eccitazione.
Angolo di ribaltamento del deretano
L'angolo di inclinazione del sensore può essere ricavato confrontando la differenza tra le tensioni per ogni stato di eccitazione:
Inclinazione asse X = (X+) - (X-)
Inclinazione asse Y = (Y+) - (Y-)
Diciamo che abbiamo un convertitore analogico-digitale a 16 bit (da 0 a 65535 conteggi) che legge l'uscita da un sensore a doppio asse di ±20°. Ciò significa che il nostro campo di uscita è di ±65535 conteggi utilizzando le definizioni di inclinazione degli assi X e Y di cui sopra. Esaminiamo la seguente uscita per un ciclo:
X+ = 45535
X- = 20000
Y+ = 30000
Y- = 35535
Possiamo quindi concludere quanto segue:
Inclinazione asse X = +25535
Inclinazione asse Y = -5535
Ora convertirlo in una misura angolare:
±65535 conteggi = 131070 campo di conteggio
±20° = campo di 40
131070 conteggi / 40° = ~3277 conteggi/°
25535 conteggi / (3277 conteggi/°) = ~+7,79° x inclinazione dell'asse
-5535 conteggi / (3277 conteggi/°) = ~-1,69° di inclinazione dell'asse y
Considerazioni meccaniche durante la derivazione dell'angolo di inclinazione
Tutti i sensori hanno tolleranze meccaniche e le loro specifiche operative spesso indicano solo una parte del loro campo totale. Inoltre, il calcolo di cui sopra presuppone un'uscita lineare, simmetrica e centrata dal sensore e questo non è tipicamente il caso. È quindi importante caratterizzare il tipo specifico di sensore che si sta utilizzando nella propria applicazione per ricavare la vera posizione di inclinazione.
Per esempio, consideriamo un sensore elettrolitico monoasse ±25°. La Figura 8 mostra la funzionalità meccanica di questo sensore di inclinazione:
Diciamo che questa volta abbiamo un convertitore analogico-digitale a 12 bit (da 0 a 4095 conteggi) che legge l'uscita del sensore. Ciò significa che il nostro campo di uscita è di ±4095 conteggi utilizzando la definizione di inclinazione dell'asse X nella sezione precedente. Per caratterizzare individualmente il sensore, lo incliniamo prima a -25° e facciamo una lettura. Esaminiamo la seguente uscita per un ciclo a -25° di inclinazione:
X+ = 400
X- = 3700
Inclinazione asse X a -25° = 400 - 3700 = -3300
Poi si inclinava il sensore a +25° e si effettuava di nuovo la lettura. Esaminiamo la seguente uscita per un ciclo a +25° di inclinazione:
X+ = 3700
X- = 400
Inclinazione asse X a +25° = 3700-400 = 3300
Possiamo quindi fare i seguenti calcoli:
3300 - (-3300) = 6600 campo di conteggio
±25° = campo 50°
6600 conteggi / 50° = 132 conteggi/°
Conoscere il numero di conteggi per grado permette di convertire facilmente una lettura dal convertitore analogico a quello digitale in una posizione angolare. Un'ulteriore compensazione per la linearità, la simmetria e la posizione dello zero aumenterà significativamente la precisione dei calcoli angolari.
Considerazioni sul software
Come per tutti i software, ci sono molti modi diversi per raggiungere lo stesso obiettivo. Questo documento presenta semplicemente un esempio di come il condizionamento del segnale del sensore di inclinazione elettrolitico può essere ottenuto attraverso l'uso di un microprocessore e di un compilatore specifico.