Hallo zusammen,
kurz zum Projekt. Ich möchte über einen Gyrosensor + Magnetfeldsensor
die Horizontallage messen. Die Sensorkombination muss sein, da auf das
Projekt später Fliehkräfte einwirken und ich dann vom Gyro alleine keine
sauberen Werte erwarten kann. Daher habe ich mir einen LSM303DLH
(3-Achsen Beschleunigungssensor und 3-Achsen Magnetometer) bei den
Kollegen
Spark Fun organisiert.
Hardware: - STK500
- ATmega32 mit 16MHz Quarz
- LSM303DLH (Kom. I2C)
- Alles andere lasse ich mal außen vor
Software: - AVR Studio 6
Status, die Kommunikation funktioniert Grundsätzlich. Der Sensor gibt
mir
auch Werte zurück:
X:-64.00 A.Y:-16.00 A.Z:4112.00
M.X:0.34 M.Y:0.04 M.Z:0.02
A.X:-96.00 A.Y:0.00 A.Z:4144.00
M.X:0.43 M.Y:0.28 M.Z:-0.10
A.X:-64.00 A.Y:0.00 A.Z:4112.00
M.X:0.44 M.Y:0.30 M.Z:-0.10
A.X:-80.00 A.Y:-16.00 A.Z:4112.00
M.X:0.42 M.Y:0.29 M.Z:-0.08<\r>
Problem: Der Gyrosensor Arbeitet gut, ich habe bereits die einzelen
Achsen getestet und skaliert. Jedoch der Magnetfeld Sensor scheint
irgendwie nich alles auszugeben. Als ob das High Byte fehlt, oder er
garnicht arbeitet.
Ich wälze nun seid einigen Tagen die Datasheets, Application Notes, etc.
Aber denen kann man Anscheinend nicht so recht trauen, da diverse
Register und Parameter in verschiedenen Unterlagen/Beispielen
unterschiedlich sind.
So bekomme ich z.B. vom Gyro nur Schrott zurück, wenn ich das Output
register nach dem Datasheet auslese.
Folgendermaßen gehe ich vor:
//Initialisiere Beschleunigungsmesser
void init_Beschleunigung (void)
{
i2c_start();
i2c_write_byte(0x30); // write acc
i2c_write_byte(0x20); // CTRL_REG1_A
i2c_write_byte(0x27); // normal power mode, 50 Hz data rate, all axes
enabled
i2c_stop();
i2c_start();
i2c_write_byte(0x30); // write acc
i2c_write_byte(0x23); // CTRL_REG4_A
i2c_write_byte(0x30); //keep a full scale range ±8 gauss in
continuous data update mode
i2c_stop();
}
//Initialisiere Erdmagnetfeldmessung
void init_Magnetfeld (void)
{
i2c_start();
i2c_write_byte(0x3C); // write mag
i2c_write_byte(0x02); // MR_REG_M
i2c_write_byte(0x00); // continuous conversion mode
i2c_stop();
i2c_start();
i2c_write_byte(0x3C); // write mag
i2c_write_byte(0x01); // MR_REG_M
i2c_write_byte(0x20); // full scale ±8 Gauss, Output range: -2048-2048
i2c_stop();
}
// Lese einen ganzen Datensatz von beiden Messsensoren
void read_data_raw(vector *a, vector *m)
{
// Lese Beschleunigungsmesser Daten
i2c_start();
i2c_write_byte(0x30); // write acc
i2c_write_byte(0xa8); // OUT_X_L_A, MSB set to enable
auto-increment
i2c_start(); // repeated start
i2c_write_byte(0x31); // read acc
unsigned char axl = i2c_read_byte(); //acc/X-axis/low byte
unsigned char axh = i2c_read_byte(); //acc/X-axis/high byte
unsigned char ayl = i2c_read_byte(); //acc/Y-axis/low byte
unsigned char ayh = i2c_read_byte(); //acc/Y-axis/high byte
unsigned char azl = i2c_read_byte(); //acc/Z-axis/low byte
unsigned char azh = i2c_read_last_byte(); //acc/Z-axis/high byte
i2c_stop();
// Lese Erdmagnetfeldmessung Daten
i2c_start();
i2c_write_byte(0x3C); // write mag
i2c_write_byte(0x03); // OUTXH_M
i2c_start(); // repeated start
i2c_write_byte(0x3D); // read mag
unsigned char mxh = i2c_read_byte(); //mag/X-Axis/high byte
unsigned char mxl = i2c_read_byte(); //mag/X-Axis/low byte
unsigned char myh = i2c_read_byte(); //mag/Y-Axis/high byte
unsigned char myl = i2c_read_byte(); //mag/Y-Axis/low byte
unsigned char mzh = i2c_read_byte(); //mag/Z-Axis/high byte
unsigned char mzl = i2c_read_last_byte(); //mag/Z-Axis/low byte
i2c_stop();
//Verbinde Messdaten Low und High Byte zu einer Variable
a->x = axh << 8 | axl; //Schieben
a->y = ayh << 8 | ayl; //Schieben
a->z = azh << 8 | azl; //Schieben
m->x = mxh << 8 | mxl; //Schieben
m->y = myh << 8 | myl; //Schieben
m->z = mzh << 8 | mzl; //Schieben
}
Hat schon irgendjemand mit dem Sensor Erfahrungen sammeln dürfen oder
einen Tipp für mich wie ich das Problem strukturiert bekämpfen kann?
Hallo, wenn Du ein Python-Script lesen kannst, guckst Du hier: http://www.mikrocontroller.net/attachment/189229/LSM303DLM_python_130828.zip Soweit ich sehen, fehlt bei Dir die Kalibrierung ... Michael S.
Guten Morgen, danke für den Hinweis. Ich werd es mir Heute im Laufe des Tages nochmal anschauen! Ich bin aber übers Wochenende schon ein Bissle weiter gekommen. Ich hab diverse Application Notes etc. gelesen und mir ist aufgefallen dass die Register Adressen aus der Doku nicht Stimmen! Ich verwende nun folgende Werte: Start Adresse zum Auslesen des Magnetfeldsensors: 0x03; //OUT_X_H_M (Steht so auch in der Doku WAR SCHON SPÄT :-) ) Außerdem kommt erste das Low dann das High Byte, hatte ich verdreht Start Adresse zum Auslesen des Beschleunigungssensors: 0xa8; //OUT_X_L_A Laut Doku 0x28 Wichtig auch folgender Hinweis: "When one or more of the output registers are read, new data cannot be placed in any of the output data registers until all six data output registers are read." In allen Web Beispielen werden beide Sensoren gleichzeitig ausgelesen, der Magnetfeldsensor steht default bei "Minimum data output rate (Hz)" auf 0,75. Wird nun zu schnell gelesen, kommt der Sensor nicht zum schreiben. Also Status Byte nicht vergessen!! SR_REG_M (09h) & STATUS_REG_A(27h)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.