MMA7455 Accelerometer Ansteuerung

posted by: Claudio Hediger

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 dem 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 das 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 tollerant 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 geschrieben Software Library... Also Software I2C. Dies hat den Vorteil, das die I2C Leitungen frei gewählt werden können und auch absolut System unabhä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 3Achsen sind auf jeweils 2 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 den Messmodus und noch einige andere Dinge konfigurieren.

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

Er bietet zudem 2 Interrupt Ausgänge. Im Standardmodus zeigt einer der beiden an, wenn neue Daten anliegen.

Initialisierung

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

Danach lässt sich bereits aus den Registern 0x06 (XOUT8) 0x07 (YOUT8) und 0x08 (ZOUT8) der 8Bit werd 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. addiert.

Es gilt dabei zu beachten, das 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, das der Sensor dazu wie folgt liegen muss!

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

 

 

 

 

 

 

 

 

Der Treiber funktioniert OutOfTheBox also ohne grosse Konfiguration.
Du musst lediglich zwei Funktionen bereitstellen.

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

Adresse ist ein 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 unter der entsprechenden CreativeCommon Lizenz 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 maximal Ausschlag auch erst in der Hälfte. Da bei maximal Ausschlag 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.

 

 

 

Treiber Download: MMA7455_Driver.c

Treiber Download: MMA7455_Driver.h