Beschreibung
In diesem Anwendungshinweis werden die Mindestanforderungen an Hardware und Software für die Messung der Winkelposition mit einem elektrolytischen Neigungssensor von Fredericks erläutert.
Grundlegender Aufbau und Sensoranregung
Abbildung 1 zeigt die wichtigsten Komponenten, die zum Aufbau einer funktionierenden Neigungsmesseinheit mit einem elektrolytischen Neigungssensor erforderlich sind.
Wie Sie später noch sehen werden, ist es wichtig, Gleichstrom zum Sensor zu vermeiden. Wir empfehlen daher die Verwendung eines Operationsverstärkers mit hoher Eingangsimpedanz wie z. B. des LMC6482 von Texas Instruments. Dadurch wird der Leckstrom zur Masse und damit der Gleichstrom zum Sensor begrenzt. Abbildung 2 zeigt das Schaltungsäquivalent eines einachsigen elektrolytischen Neigungssensors.
Fahren wir mit dem Erregungssignal für den Sensor fort. Das Anregungssignal wird vom Mikroprozessor bereitgestellt, wobei der einfachste Fall ein einachsiger Sensor ist. Ein einachsiger Sensor benötigt zwei Ausgangsports des Mikroprozessors, die mit den äußeren Pins des Sensors verbunden sind. Die Ports werden mit einem Tastverhältnis von 50 % und einer Periode zwischen 200 und 1000 Hertz umgeschaltet. Siehe Abbildung 3.
Ein präzises Timing in der Software ist erforderlich, um ein Tastverhältnis von 50 % beizubehalten, um eine Asymmetrie im Sensoranregungssignal zu vermeiden. Siehe Abbildung 4. Asymmetrie ist definiert als Gleichstrom zum Sensor, der eine Drift und schließlich eine dauerhafte und irreversible Beschädigung des Sensors verursacht. Dies kann chemisch erklärt werden; Gleichstrom verursacht Elektrolyse, wodurch der Sensor schließlich inert wird.
Untersuchen wir den Prozess der Erstellung eines Erregungssignals in Software für einen PIC18F-Mikroprozessor unter Verwendung des CCS PCW C-Compilers. Diese Anweisungen werden sich je nach Ihrem spezifischen Mikroprozessor und Compiler erheblich unterscheiden. Wir beginnen mit der Definition der Pins, die für die Ausgabe verwendet werden. Wir werden PORTB für die Ausgabe verwenden, also müssen wir es als solches definieren. Dies wird durch das Setzen des 8-Bit-Datenrichtungsregisters, genannt TRISB, erreicht. Bits in TRISB, die auf 0 gesetzt sind, definieren den entsprechenden PORTB-Pin als Ausgang, so dass wir die folgende Codezeile verwenden, um alle PORTB-Pins als Ausgang zu verwenden:
set_tris_b(0b00000000); |
Um die Werte des PORTB-Pins schnell zu ändern, müssen wir auf diesen im Speicher zugreifen. Auf diesem speziellen Mikroprozessor ist PORTB ein spezielles Funktionsregister (SFR), das sich an der Speicheradresse 0xf81 befindet. Wir werden daher die Position von PORTB in einer Variablen speichern, um einen einfachen Zugriff zu ermöglichen. Dies wird mit der folgenden Code-Zeile erreicht:
#Byte port_b = 0xf81; |
Jedes Bit in port_b entspricht nun einem Pin auf dem Chip. Das höchstwertige Bit ist Pin B8 und das niederwertige Bit ist Pin B0. Nehmen wir an, dass ein Einzelachsensensor an die Pins B0 und B1 angeschlossen ist. Siehe Abbildung 3. Wenn Sie einen Zweiachsensensor verwenden, nehmen wir an, dass er an die Pins B0, B1, B2 und B3 angeschlossen ist.
Für einen einachsigen Sensor gibt es zwei Zustände für das Anregungssignal. Siehe Abbildung 4. Um dieses Zeitdiagramm nachzubilden, können die beiden Zustände in einem Array von 8-Bit-Zahlen gespeichert werden. Dies wird mit der folgenden Code-Zeile bewerkstelligt:
int8 output_arr[2] = { 0b00000010, 0b00000001 }; |
Für einen Zweiachsensensor gibt es vier Zustände für das Anregungssignal. Siehe Abbildung 5. Um dieses Zeitdiagramm nachzubilden, können die vier Zustände in einem Array von 8-Bit-Zahlen gespeichert werden. Dies wird mit der folgenden Code-Zeile bewerkstelligt:
int8 output_arr[4] = { 0b00000011, 0b00001100, 0b00001010, 0b00000101 }; |
Timer sind ein häufig verwendetes Werkzeug, um Interrupts in präzisen Intervallen in der Software zu erzeugen, und sie können verwendet werden, um auf einfache Weise ein Erregungssignal zu erzeugen. Es ist wichtig, dass wir einen Interrupt mit hoher Priorität verwenden, damit das Erregungssignal ein Tastverhältnis von 50 % beibehält. Der folgende Code erzeugt einen Interrupt mit hoher Priorität, der die Anschlüsse umschaltet, um ein Erregungssignal für einen Zweiachsensensor zu erzeugen:
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 diesem Beispiel ist timer1 ein 16-Bit-Zähler (0 bis 65535). Das bedeutet, dass er ab dem mit set_timer() gesetzten Wert hochzählt und bei einem Überlauf (Erreichen von 65535) ein Interrupt erzeugt und der Code in der Funktion timer1_isr() ausgeführt wird. Die Zeit, die bis zum Überlauf benötigt wird, wird durch eine Vielzahl von Faktoren definiert, u. a. durch die Taktfrequenz des Mikroprozessors und die Timer1-Setup-Parameter. Es ist wichtig, eine Unterbrechungszeit zwischen 1 und 5 Millisekunden einzuhalten, um eine korrekte Erregung des Sensors zu gewährleisten. Diese Informationen finden Sie im Handbuch Ihres individuellen Mikroprozessors.
Die Portumschaltung funktioniert mit Hilfe der Modulus-Funktion. Jedes Mal, wenn ein Interrupt erzeugt wird, wird isr_counter inkrementiert und modulus 4 darauf ausgeführt. Dadurch wird im Wesentlichen ein Zähler erzeugt, der von 0 bis 3 zählt und bei jedem Interrupt inkrementiert wird. Dies greift auf jeden der vier in output_arr gespeicherten Zustände zu, die das Erregungssignal umfassen.
Sensor-Ausgang
Nachdem wir nun ein Erregungssignal erzeugt haben, wollen wir nun den Ausgang des Sensors untersuchen. Der Ausgang ist eine analoge Spannung, die auf die Erregerspannung bezogen ist. Der Ausgang muss in Phase mit dem Erregungssignal gelesen werden. Es wird empfohlen, während jedes der vier Zustände (zwei Zustände für einen einachsigen Sensor) mehrere Proben zu nehmen.
Die Wellenform in Abbildung 6 zeigt einen Beispielausgang des Analog-Digital-Wandlers, der mit dem Ausgang eines Zweiachsensensors verbunden ist. Dieser spezielle Ausgang zeigt einen positiven Neigungswinkel sowohl für die x- als auch für die y-Achse an. Siehe Abbildung 7 für einen Ausgang, der einen negativen Neigungswinkel anzeigt.
Um den Ausgang zu lesen, müssen wir den Analog-Digital-Wandler (ADC) des Mikroprozessors verwenden. In Abbildung 3 müssen wir Pin A0 als ADC-Eingang einrichten und dann den aktuellen ADC-Port auf Pin A0 setzen. Wir können dann den folgenden Code ausführen, um den Ausgang eines Zweiachsensensors in Phase mit dem Erregungssignal zu lesen:
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 } |
Wie Sie sehen können, sammeln wir innerhalb jedes Zustands des Anregungssignals 8 Proben mit einer Verzögerung von 0,1 ms zwischen den Proben. Diese Proben können dann im Datenanalysecode gemittelt werden, um ein stabileres und genaueres Ergebnis zu erhalten. Durch die Referenzierung des isr_counters können wir sicherstellen, dass die Messwerte in Phase mit dem Erregungssignal aufgenommen werden.
Ableitung des Neigungswinkels
Der Neigungswinkel des Sensors kann durch Vergleich der Differenz zwischen den Spannungen für jeden Anregungszustand abgeleitet werden:
Neigung der X-Achse = (X+) - (X-)
Neigung der Y-Achse = (Y+) - (Y-)
Nehmen wir an, wir haben einen 16-Bit-Analog-Digital-Wandler (0 bis 65535 Zählwerte), der den Ausgang eines ±20°-Zweiachsensensors liest. Das bedeutet, dass unser Ausgabebereich ±65535 Zählwerte beträgt, wenn wir die obigen Definitionen der X- und Y-Achsenneigung verwenden. Lassen Sie uns die folgende Ausgabe für einen Zyklus untersuchen:
X+ = 45535
X- = 20000
Y+ = 30000
Y- = 35535
Daraus können wir folgendes schließen:
Neigung der X-Achse = +25535
Neigung Y-Achse = -5535
Dies soll nun in ein Winkelmaß umgerechnet werden:
±65535 Zählungen = 131070 Zählungen Bereich
±20° = 40° Bereich
131070 Zählungen / 40° = ~3277 Zählungen/°
25535 Zählungen / (3277 Zählungen/°) = ~+7,79° x-Achsen-Neigung
-5535 Zählungen / (3277 Zählungen/°) = ~-1,69° y-Achsen-Neigung
Mechanische Überlegungen bei der Ableitung des Neigungswinkels
Alle Sensoren haben mechanische Toleranzen und ihre Betriebsspezifikationen geben oft nur einen Teil ihres Gesamtbereichs an. Außerdem geht die obige Berechnung von einem linearen, symmetrischen und zentrierten Ausgang des Sensors aus, was in der Regel nicht der Fall ist. Es ist daher wichtig, den spezifischen Sensortyp zu charakterisieren, den Sie in Ihrer Anwendung verwenden, um die wahre Neigungsposition abzuleiten.
Betrachten wir zum Beispiel einen einachsigen ±25°-Elektrolyt-Sensor. Abbildung 8 zeigt die mechanische Funktionsweise dieses Neigungssensors:
Nehmen wir diesmal an, dass wir einen 12-Bit-Analog-Digital-Wandler (0 bis 4095 Zählerstände) haben, der den Ausgang des Sensors liest. Das bedeutet, dass unser Ausgabebereich ±4095 Zählwerte beträgt, wenn wir die Definition der X-Achsen-Neigung aus dem vorherigen Abschnitt verwenden. Um den Sensor individuell zu charakterisieren, würden wir ihn zunächst auf -25° neigen und eine Messung durchführen. Untersuchen wir die folgende Ausgabe für einen Zyklus bei -25° Neigung:
X+ = 400
X- = 3700
X-Achsen-Neigung bei -25° = 400 - 3700 = -3300
Wir würden dann den Sensor auf +25° neigen und erneut eine Messung vornehmen. Untersuchen wir die folgende Ausgabe für einen Zyklus bei +25° Neigung:
X+ = 3700
X- = 400
X-Achsen-Neigung bei +25° = 3700-400 = 3300
Wir können dann die folgenden Berechnungen durchführen:
3300 - (-3300) = 6600 Zählungen Bereich
±25° = 50° Bereich
6600 Zählungen / 50° = 132 Zählungen/°
Wenn Sie die Anzahl der Zählungen pro Grad kennen, können Sie einen Messwert aus dem Analog-Digital-Wandler leicht in eine Winkelposition umrechnen. Eine weitere Kompensation für Linearität, Symmetrie und Nullposition erhöht die Genauigkeit der Winkelberechnungen erheblich.
Software-Überlegungen
Wie bei jeder Software gibt es viele verschiedene Wege, um das gleiche Ziel zu erreichen. Dieses Dokument stellt lediglich ein Beispiel dafür dar, wie die Signalaufbereitung des elektrolytischen Neigungssensors durch die Verwendung eines bestimmten Mikroprozessors und Compilers erreicht werden kann.