Hallo, Im Internet finde ich zwar ziemlich viele Beispiele aber keins wo ich wirklich durchsteige. Ich möchte den Sensor kalibrieren. Was muss ich dafür tun? In einem Beispiel habe ich gelesen das man die Offsetwerte der 3 Achsen ermitteln muss und diese dann mit den Rohdaten verrechnen muss. Ist das korrekt?
Es klingt zumindest korrekt. Bei manchen Quadkoptern sieht dieses Kalibrieren so aus, dass man das Teil um alle drei Raumachsen mehrmals drehen soll.
Felix A. schrieb: > Es klingt zumindest korrekt. Bei manchen Quadkoptern sieht dieses > Kalibrieren so aus, dass man das Teil um alle drei Raumachsen mehrmals > drehen soll. Okay. Nur ich bekomme bei der "Y" Achse einen Offset von 510. Das kann doch nicht richtig sein?!
1 | if(Y_min < Y_axis) |
2 | {
|
3 | Y_min = Y_axis; |
4 | }
|
5 | else if(Y_max < Y_axis) |
6 | {
|
7 | Y_max = Y_axis; |
8 | }
|
Der Sensor hat keine Flipfunktion wie andere Magnetfeldsensoren (ich meine keine integrierten Sensoren mit Digitalteil, sondern rein analoge). Daher könnte es schon sein, wenn mal ein stärkeres Magnetfeld auf ihn eingewirkt hat. Es gibt aber einen Self test. Hier wird mit einem Strom von +-10mA der Sensor angeregt. Aus den beiden Ergebnissen lässt sich der Offset auch berechnen. Nachtrag: Ergebnis hängt natürlich von der eingestellten Verstärkung ab.
:
Bearbeitet durch User
Die 10mA werden aber im IC selber generiert und gemessen oder? Ich muss mich lediglich um die A/D Werte kümmern?.
Das idee hinter das kalibrieren ist das bei Magnetfeld = 0 sollen auch alle 3 Achsen 0 als Ergebnis haben. Leiter ist das nicht so, die haben immer einen Offset. Jetzt muss du von jeden Achse die Offset vermessen. Das ist nicht so trivial, da wir naturlich in Erdmagnetische Feld leben... Eine mogliche Anzats ist folgendes : Wir gehen davon aus das den Sensor in ein stabiles homoges Feld seine Messung macht. Jetzt dreht du den Sensor mal 360° uber die Z-achse. Wahrend diese Drehung speichert du die Min und Max Werte von alle Achsen. Dan das gleiche noch mal uber die X und Y-achse. In Theorie ist jetzt die offset : (Max+Min)/2, wobei Max und Min naturlich eine negative Wert haben konnen. Den Wert (Max-Min)/2 entsprecht dan die Max Wert die effectif vermessen war irgendwo uber diese 360°. vorsicht, das war noch nicht das Max Magnetfeld von Erde, da du wahrscheinlich nicht genau Parallel an dieses Feld kalobriert haben.
Der Strom wird vom IC intern zur Verfügung gestellt. Aber lies dir das Datenblatt mal genau durch: es scheint als müsstest du selber nicht den Offset berechnen. Der Chip scheint das beim Self Test selber zu machen. In den Registern (X,Y und Z) steht nach dem Selbsttest wohl genau dieser Offsetwert. In meinem Datenblatt findet sich das auf Seite 18, SELF TEST OPERATION.
Welches .pdf nutzt du ? Bei mir steht was auf Seite 19 vom "Self Test"
:
Bearbeitet durch User
Jan H. schrieb: > Ich möchte den Sensor kalibrieren. Was muss ich dafür tun? Wenn du den Sensor im Erdmagnetfeld drehst, müssen die gemessenen Vektoren eine Kugel beschreiben. Aus dieser Dreherei ergibt sich für jede Komponente der Offset (Lage vom Kugelmittelpunkt) und der Skalierungsfaktor (Verstärkung zur Entzerrung auf eine saubere Kugelform) http://diydrones.com/profiles/blogs/advanced-hard-and-soft-iron-magnetometer-calibration-for-dummies
Das hört sich ja alles schon sehr Interessant an. Ich bin jetzt gerade bei dem "Self Test" Hier ist das Datenblatt :
1 | https://www.adafruit.com/datasheets/HMC5883L_3-Axis_Digital_Compass_IC.pdf |
Ich komme bei dem Punkt "6" nicht weiter. Was genau muss ich da jetzt kontrolieren und verrechnen?
1 | unsigned char HMC5883L_self_test(void) |
2 | {
|
3 | i2c_start(HMC5883L_WRITE_ADDR); |
4 | i2c_write(0x00); |
5 | i2c_write(0x71); |
6 | |
7 | i2c_write(0x01); |
8 | i2c_write(0xA0); |
9 | |
10 | i2c_write(0x02); |
11 | i2c_write(0x00); |
12 | |
13 | i2c_stop(); |
14 | |
15 | _delay_ms(10); |
16 | |
17 | i2c_start(HMC5883L_READ_ADDR); |
18 | i2c_write(0x06); |
19 | |
20 | X_axis = (int16_t)i2c_readAck()<<8; |
21 | X_axis |= (int16_t)i2c_readAck(); |
22 | |
23 | Z_axis = (int16_t)i2c_readAck()<<8; |
24 | Z_axis |= (int16_t)i2c_readAck(); |
25 | |
26 | Y_axis = (int16_t)i2c_readAck()<<8; |
27 | Y_axis |= (int16_t)i2c_readNak(); |
28 | |
29 | i2c_stop(); |
30 | |
31 | _delay_ms(100); |
32 | |
33 | i2c_start(HMC5883L_WRITE_ADDR); |
34 | i2c_write(0x03); |
35 | i2c_stop(); |
36 | |
37 | }
|
Hier die Routine (vorläufig) zum Auswerten des "Self Tests".
Jan H. schrieb: > Ich komme bei dem Punkt "6" nicht weiter. > Was genau muss ich da jetzt kontrolieren und verrechnen? Diesen Video zum Thema Self-Test kennst du? http://www.youtube.com/watch?v=Fsd6dAuRURo
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.