MMA7455 – Accelerometer

| assistant | ~5min


Projektdatum: 02.01.2011

 

Der MMA7455 von Freescale ist ein äusserst vielseitiger und einfach zu verwendender Beschleunigungssensor. Er liefert seine Daten wahlweise über ein SPI-Interface oder über eine I2C-Leitung. Ich beschäftige mich hier mit der Ansteuerung mittels I2C, da man dabei eine Leitung einsparen kann im vergleich zur SPI-Lösung.

Zum Testen des Sensors habe ich mir einen Testprint geätzt. Den Chip habe ich mit einigem Flussmittel im Reflowofen aufgelötet. Doch mit einigem Geschick klappts auch mit einem Lötkolben.

Anleitung für das Löten mit dem Lötkolben:

  1. Pads der Platine alle mit einer dünnen Schicht Lötzinn überziehen.
  2. Ein wenig Flussmittel bzw. Lötfet auf die verzinnten Pads geben.
  3. Chip-Pads ebenfalls einfetten mit Lötfet bzw. Flussmittel.
  4. Eine Leiterbahn mit dem Lötkolben aufheizen, so dass das Zinn auf dem Pad flüssig wird.
  5. Mit der Pinzette den Chip auf dem nun flüssigen Zinn platzieren.
  6. Die nächste Leiterbahn nache am Chippad heizen, so dass das Zinn unter dem Chip flüssig wird.
  7. Etwas lötzinn zuführen und hoffen, dass ein kleines bisschen unter den Chip fliesst.
  8. Bei allen Pads gleichermassen vorgehen.

 

Dies ist der Testprint

Man sieht vorne in der Mitte den MMA7455 Beschleunigungssensor.

Ebenfalls auf der Platine (hinter den Leitungen) befindet sich ein Pegelwandler von Texasinstruments um auch 5V tolerant zu sein!

 

 

Zum Programmieren habe ich bei meinem Aufbau das MSP430 LaunchPad von TexasInstruments verwendet. Dies deshalb, weil es Debugging ermöglicht und sofort einsatzbereit ist!

Für I2C verwende ich eine selbst geschriebene Software-Library… Also software I2C. Dies hat den Vorteil, dass die I2C Leitungen frei gewählt werden können und auch absolut systemunabhängig sind.

Der MMA7455 im Detail

Der Chip nutzt zur Bestimmung seiner Lage mikromechanische Plättchen. Diese ergeben je nach Position eine bestimmte Kapazität.

Das obige Bild ist dem Datenblatt entnommen. Es zeigt sehr schön die Funktionsweise der sogenannten „mikromechanischen Zelle“.

Die Kapazität dieser Zelle wird intern in eine Spannung gewandelt. Diese wird verstärkt und danach durch einen ADC in einen digitalen Wert gewandelt.

Durch die Konfiguration kann man die Empfindlichkeit (interne Verstärkung) einstellen.
Dabei gibt es folgende Möglichkeiten: +-2g, +-4g und +-8g

Bei 2g und 4g befindet sich das Resultat als 8Bit-Wert im Chip und bei 8g als 10Bit-Wert.
Die 10Bit-Werte der drei Achsen sind auf jeweils zwei 8Bit-Register aufgeteilt.

Der MMA7455 hat insgesamt 32 Register. Dabei sind jedoch nur einige wenige wirklich interessant. Dazu gehört z.B. das Mode Control Register (MCTL 0x16).
In diesem Register lässt sich die Empfindlichkeit des Sensors sowie der Messmodus und noch einige andere Dinge konfigurieren.

Der Sensor bietet nebst der Messung der drei Achsen auch die Möglichkeit, selbstständig auf bestimmte Ereignisse wie z.B. die Beschleunigung eines bestimmten Vektors zu reagieren.

Er bietet zudem zwei interrupt Ausgänge. Im Standardmodus signalisiert einer der beiden, wenn neue Daten anliegen.

Initialisierung

Zur Minimalinitialisierung genügt es, im MCTL Register die gewünschte Empfindlichkeit einzustellen. Bei 2g würde dies bedeuten, dass man in das Register 0x16 den Wert 0x05 Schreibt.

Danach lässt sich bereits aus den Registern 0x06 (XOUT8) 0x07 (YOUT8) und 0x08 (ZOUT8) der 8Bit-Wert der entsprechenden Achsen auslesen.

 

Kalibration

Für eine einwandfreie Verwendung ist es notwendig den Sensor zu kalibrieren. Dazu gibt es eine Application-Note von Freescale (AN3745 siehe Link oben).

Es gibt die Möglichkeit, die gemessenen Offset-Werte in internen Registern zu speichern. Diese werden dann dem Messergebniss abgezogen bzw. aufaddiert.

Es gilt dabei zu beachten, dass diese Werte bei Spannungsunterbruch verloren sind.

Deshalb habe ich mich dazu entschieden, die Offsetkorrektur „on the fly“ zu machen. Also direkt in meinem Code im Mikrocontroller.

 

MMA7455 Treiber

Während dem Testen dieses Sensors ist einiges an Code zusammengekommen. Ich habe daraus ein Treiber-File für den Chip erstellt. Damit lässt sich der Chip initialisieren und die 8Bit-Werte der Register auslesen.

Zudem enthält er die Möglichkeit den Chip zu kalibrieren.

Für die Kalibration gilt zu beachten, dass der Sensor dazu wie folgt liegen muss!

Nach der Kalibration werden die Offset-Werte in meinem Treiber automatisch abgezogen oder aufaddiert.

 

 

 

 

 

 

 

 

Der Treiber funktioniert „OutOfTheBox“ also ohne grosse Konfiguration.
Es müssen lediglich zwei Funktionen bereitgestellt werden.

I2C_Write_8bit(Adresse, Wert)
return Byte I2C_Read_8bit(Adresse)

Adresse ist ein einzelnes Byte. Genau wie der zu übertragende Wert auch.
I2C-Read gibt ein Byte zurück und benötigt eine Byte-Adresse.

Den Treiber für den MMA7455 könnt ihr wie immer herunterladen und verwenden.

 

Proof of concept – Der Beweis 

Zum Schluss seht ihr noch den Sensor als Beweis für die Funktion in Aktion 

Die Daten werden durch den UART-Backchannel des Launchpads übertragen und auf dem Computer in meinem Programm entsprechend dargestellt.

Die Empfindlichkeit im Video ist 2g. Deshalb sind die Trackbars bei Maximalausschlag auch erst in der Hälfte. Da bei Maximalausschlag 2g erreicht wäre und die Erdanziehung jedoch nur 1g beträgt.

Im Video werden ca 10 Messungen pro Sekunde durchgeführt und übertragen.

Noch etwas zu der Darstellung… In der Mitte der Trackbars ist 0g. Nach unten werden negative g-Werte angezeigt und nach oben positive.