Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Messungen mit einer inertialen Messeinheit (IMU)

Eine inertiale Messeinheit (IMU - inertial measurement unit) ist eine Ansammlung mehrerer Inertialsensoren (Beschleunigung, Gyroskop) auf einem Chip oder einem Modul, die als Messeinheiten eines Trägheitsnavigationssystems (INS - inertial navigation system) dienen. Anwendungen finden IMUs in Mobilephones, Raketen, Schiffen, Flugzeugen, PKWs, Motorrädern etc..

In den folgenden Versuchen wird mit dem Sensor LMS330 gearbeitet, der als 6-Achsen-Bewegungssensor-Modul 6D-BS von der Firma ELV verkauft wird. Einen ersten Zugang zur Ansteuerung dieses Moduls habe ich im Abschnitt I2C besser verstehen (3) aufgezeigt. Die dort gesammelten Erfahrungen gehen hier ein. Mit Hilfe eines ATmega8-Mikrocontrollers wird der Inertialsensor angesteuert und die Rohdaten über ein BASCOM-Programm ausgelesen.

Einige Kenndaten des LMS330

# Eigenschaft
1 Normal- und Lowpower-Modus
2 jeweils drei voneinander unabhängige Beschleunigungs- und Drehwinkelkanäle
3 I2C- und SPI Schnittstelle (16-Bit Datenbreite)
4 wählbare Einstellungen g-Sensor: +/- 2g ; +/- 4g - +/- 8g - +/- 16g
5 wählbare Einstellungen Gyroskop: +/- 250 ; +/- 500 ; +/- 2000 dps 

Pinbelegung eines 6-Achsen-Bewegungssensor-Moduls

Richtungen der wahrnehmbaren Beschleunigungsgrößen

Richtungen der wahrnehmbaren Drehbewegungen

Versuch 1 - Auslesen von Gyroskop-Rohdaten

Im ersten Versuch geht es darum, Rohdaten eines Gyroskops (Drehratensensor) über die I2C-Schnittstelle des Moduls auszulesen und im Terminalfenster von CoolTerm darzustellen. Als Hilfe dienen die Ergebnisse aus dem Kapitel I2C besser verstehen (3); dort wurden bereits die Ansteuerungsbefehle für eine Datenauslese mit einem USB-I2C-Adapter ausprobiert und besprochen. Wir greifen auf diese Erfahrung hier zurück.

Auslesen von Gyroskopdaten des Inertialsensors LSM330 mit einem ATmega8 und BASCOM
Material
  • USB-ISP-Programmer
  • 1x  Nullkraftsockel für Programmer
  • 1x  AVR Mikrocontroller - ATmega8A
  • 1x  Energiequelle, 5V
  • 1x  6-Achsen-Bewegungssensor-Modul
  • 1x  Steckbrett mit USB-UART Converter
  • 1x  USB-Kabel
  • diverse Steckkabel
  • 1x  PC oder Laptop mit Programm CoolTerm
  • 1x  Software BASCOM
  • Datenblatt LSM330DLC aus dem Internet
Aufgaben
  • Trenne alle Kabelverbindungen zwischen Steckbrett und PC.
  • Baue die Schaltung nach Verdrahtungsplan auf dem Steckbrett auf.
  • Starte BASCOM und übertrage das Programm m8a_6d_sensor_1.bas in den Editor.
  • Speichere das Programm ab, überprüfe es auf Syntaxfehler und korrigiere diese gegebenenfalls.
  • Compiliere das Programm und brenne es anschließend in den ATmega8A.
  • Trenne die Kabelverbindung zum Programmer und entnimm den ATmega8A.
  • Setze den Controller in die aufgebaute Schaltung ein und lege die Spannungsversorgung an.
  • Starte das Programm CoolTerm und stelle den korrekten COM-Port und Baud-Wert ein.
  • Überprüfe, ob im Terminal von CoolTerm Rohdaten ausgegeben werden.

Schaltungsaufbau

Das Programm

Ausgabe von Rohdaten im Terminalprogramm CoolTerm

Welche Messdaten wurden ausgelesen und im Terminalfenster dargestellt?

Um das herauszufinden, muss das Datenblatt des LSM330DLC herangezogen werden. Die Ausgaberegister für das Gyroskop sind dort mit

  • 0x28 (OUT_X_L_G), 0x29 (OUT_X_H_G) ... 0x2D (OUT_Z_H_G)

angegeben (S. 40). Das heißt, dass pro Achsenrichtung ein 16-Bit Wert (High- und Lowbyte) ausgegeben wird.

  • Damit ist das Programm noch fehlerhaft und die Darstellung im Terminalfenster falsch.

Statt G_y = 0 müsste dort G_x_HIGH = 0 und statt G_z  =  250 neu G_y_LOW = 250 stehen.

Dem Datenblatt ist ebenfalls zu entnehmen (S. 40), dass zuerst das Lowbyte gefolgt vom Highbyte ausgegeben wird.

Wie arbeitet das Programm m8a_6d_sensor_1.bas?

Im Abschnitt I2C besser verstehen (3) wurde gezeigt, dass die Befehlsfolge S D4 20 0F P S D4 A8 R03 P die Rohdaten des Gyroskops bezüglich der drei Raumachsen abruft.

Nach Datenblatt wird für das Schreiben von Daten in einen Slave folgende Ablauffolge zwingend vorgeschrieben (Kapitel 6.1.1, S. 33):

 

Master überträgt ein Byte an den Slave (WRITE)

Master überträgt mehrere Bytes an einen Slave (WRITE)

Master empfängt ein Byte vom Slave (READ)

Wie die Ablauffolge aussieht, wenn der Master mehrere Bytes vom Slave empfängt, kann im Datenblatt nachgeschlagen werden.

Die I2C-Befehle unter BASCOM

BASCOM stellt fünf Befehle für die I2C-Schnittstelle bereit:

Befehl Bedeutung Befehlsformat
I2cstart Startbedingung  
I2crepstart erneute Startbedingung  
I2cstop Stoppbedingung  
I2crbyte liest Daten vom Slave I2crbyte var, ack/nack
I2cwbyte schreibt Daten an den Slave I2cwbyte val

Versuch 2 - Auslesen von Beschleunigungs-Rohdaten

Für diesen Versuch bleibt der Aufbau aus Versuch 1 bestehen.

  • Schreibe ein Programm, mit dem sich die Rohdaten des Beschleunigungssensors auslesen und im Terminalfenster ausgeben lassen. Beachte, dass pro Achsenrichtung zwei Bytes ausgegeben werden (Lowbyte, Highbyte).
  • Benutze als Hilfe das Datenblatt des Sensors.

Das Programm

Ausgabe der Rohdaten im Terminalprogramm CoolTerm

Bis jetzt haben wir uns nur damit beschäftigt, die Rohdaten der einzelnen Sensoren im IMU LSM330 zu erfassen. In den folgenden Übungen wird gezeigt, wie man sie zu aussagefähigen Werten umrechnen kann. Dazu fangen wir mit dem einfachsten Fall an und einem Sensor, den wir bisher noch gar nicht erwähnt hatten: Temperaturmessung mit dem im LSM330DLC ebenfalls eingebauten Temperatursensor.

Ein Blick ins Datenblatt (S. 57) verrät, dass für das Auslesen der Temperaturdaten das Register OUT_TEMP_G (0x26) zuständig ist.

Versuch 3 - Temperaturen messen

Die Hinweise aus dem Datenblatt der IMU zum Temperatursensor sind spärlich. Einzig der Hinweis auf das dafür zuständige Register lässt sich entnehmen; kein Hinweis darauf, in welcher Maßeinheit (Fahrenheit oder Celsius) gemessen wird; nur die Bemerkung, dass die Rohdaten in 2-er Komplementdarstellung ausgegeben werden. Das heißt, dass bei vorliegender 8-Bit Datenbreite vorzeichenbehaftete Werte zwischen -128 und +127 ausgegeben werden. Der tatsächliche Messbereich des Sensors liegt zwischen -40 °C und +85 °C; mithin also keine Bereichsprobleme.

Temperaturmessung mit einem LSM330
Material
  • wie bei den Versuchen 1 und 2
Aufgaben
  • Starte BASCOM und übertrage das Programm lsm330_temp0.bas in den Editor.
  • Speichere das Programm ab, überprüfe es auf Syntaxfehler und korrigiere diese gegebenenfalls.
  • Compiliere das Programm und brenne es anschließend in den ATmega8A.
  • Trenne die Kabelverbindung zum Programmer und entnimm den ATmega8A.
  • Setze den Controller in die aufgebaute Schaltung ein und lege die Spannungsversorgung an.
  • Starte das Programm CoolTerm und stelle den korrekten COM-Port in Baud-Wert ein.
  • Überprüfe, ob im Terminal von CoolTerm alle 60s ein Temperaturwert ausgegeben wird.

Schaltungsaufbau

wie in Versuch 1.

Das Programm lsm330_temp0.bas

Datenausgabe im Terminalfenster von CoolTerm

Die erfassten Messwerte zeigen ein merkwürdiges Verhalten. Steigt die Temperatur, sinkt der vom Sensor ermittelte Messwert. Abb. 1 zeigt dieses Verhalten.

Abbildung 1 - Steigt die Umgebungstemperatur, sinkt der angezeigte Temperaturmesswert. Im Terminalfenster wird der Messwert in binärer und dezimaler Form dargestellt.

Ursache für dieses Verhalten ist ein fehlender oder falscher Bezugspunkt zur Temperaturmessung. Dieses Offset kann durch eine vergleichende Temperaturmessung mit einem geeichten Gerät ermittelt und anschließend in das Programm eingearbeitet werden. In meinem Fall liegt das ermittelte Offset bei 40. Dazu muss in das BASCOM-Programm nach Zeile 45 die Programmzeile

 

  • _temp = 40 - _temp

 

eingefügt werden. Im anschließenden Programmlauf werden dann die tatsächlichen Temperaturwerte korrekt ausgegeben.

Abbildung 2 - Der Sensor wurde angehaucht. Dadurch steigt die gemessene Temperatur.

Versuch 4 - Beschleunigungswerte bestimmen

Nach Datenblatt werden die Rohdaten der Beschleunigungswerte als 2-er Komplement angegeben. Die Beschleunigungswerte werden bezüglich der drei Raumachsen x, y und z bestimmt. Für jede Achsrichtung werden zwei Byte (acc_high und acc_low) gemessen und ausgelesen.

Um reale Datenwerte zu bekommen, wird in zwei Schritten vorgegangen.

Schritt 1  Aus den jeweils zwei Byte Rohdaten pro Achsrichtung wird ein 16-Bit Wert generiert.
Schritt 2 Die 16-Bit-Werte werden nach der jeweiligen Empfindlichkeitseinstellung des Sensors auf Vielfache von g (Gravitationsbeschleunigung) umgerechnet und im Terminal ausgegeben.
Beschleunigungsmessung mit einem LSM330
Material
  • wie bei den Versuchen 1 und 2
Aufgaben
  • Starte BASCOM und übertrage das Programm lsm330_acc0.bas in den Editor.
  • Speichere das Programm ab, überprüfe es auf Syntaxfehler und korrigiere diese gegebenenfalls.
  • Compiliere das Programm und brenne es anschließend in den ATmega8A.
  • Trenne die Kabelverbindung zum Programmer und entnimm den ATmega8A.
  • Setze den Controller in die aufgebaute Schaltung ein und lege die Spannungsversorgung an.
  • Starte das Programm CoolTerm und stelle den korrekten COM-Port in Baud-Wert ein.
  • Überprüfe, ob im Terminal von CoolTerm Beschleunigungswerte ausgegeben wird. Drehe dazu das Inertialmodul um verschiedene Achsen und beobachte die angezeigten Messwerte.

Schaltungsaufbau

wie in Versuch 1.

Das Programm lsm330_acc0.bas - Schritt 1

Datenausgabe im Terminalfenster von CoolTerm

Abbildung 3 - Ah_x, Ah_y und Ah_z geben das High- und Lowbyte in hexadezimaler Darstellung an. In der Zeile darunter, erscheint der vorzeichenbehaftete Messwert als Dezimalzahl (16-Bit).

Schritt 2

Die Messwerte werden auf Vielfache von g umgerechnet (unter Berücksichtigung der Empfindlichkeitseinstellung des Sensors) und anschließend im Terminal ausgegeben.

In der Grundeinstellung arbeitet der Beschleunigungssensor in einem Bereich von +/- 2g. Mit diesem Hinweis lässt sich jetzt das Programm lsm_acc0.bas aus Versuch 4 so umschreiben bzw. ergänzen, dass die Messwerte als Vielfache von g erscheinen.

Abbildung 4 - Berechnung der Messdaten aus den Rohwerten und Ausgabe im Terminalfenster von CoolTerm.

Im Programm lsm_acc0.bas werden alle Programmzeilen ab Zeile 52 durch die in Abb. 4 gezeigten Zeilen ersetzt und das geänderte Programm unter lsm_acc1.bas abgespeichert. Die gemessenen Werte zeigt Abb. 5.

Abbildung 5 - Beschleunigungsmesswerte des lsm330

Das LSM330-Modul lag bei diesem Versuch flach auf dem Tisch; auf den Beschleunigungssensor wirkt in diesem Fall nur die Erdanziehung von 1g. Gut zu sehen ist, dass der gemessene Beschleunigungswert für die z-Komponente (a_z) bei -1.0..g liegt. Ein recht guter Wert, ohne das eine Eichung bisher vorgenommen wurde.

Stellt man das LSM330-Modul auf den Kopf, wird ein Wert von +1.0..g angezeigt. Das Vorzeichen muss sich umkehren und der Messwert sollte zahlenmäßig dem vorherigen gleichen.

Auf diese Weise lassen sich die Genauigkeiten für alle drei kartesischen Raumrichtungen überprüfen und gegebenenfalls korrigieren. Es sollte für die jeweils senkrechte Komponente zur Erdoberfläche ein Wert von +/- 1g angezeigt werden.

Abbildung 6 - Das Modul wird so gehalten, dass seine y-Komponente (a_y) senkrecht zur Erdoberfläche steht.

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf