Kalibrieren von HMC5883L

OP #4361522
Lesenswert?
• ▲
▼
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?
Angehängte Dateien:
OP #4361537
Lesenswert?
• ▲
▼
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
}
#4361548
Lesenswert?
• ▲
▼
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.
Gast #4361556
Lesenswert?
• ▲
▼
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.
#4361561
Lesenswert?
• ▲
▼
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.
Gast #4361605
Lesenswert?
• ▲
▼
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
OP #4361631
Lesenswert?
• ▲
▼
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".

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.