Forum: Mikrocontroller und Digitale Elektronik Kalibrieren von HMC5883L


von Jan H. (janiiix3)


Angehängte Dateien:

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?

von Felix A. (madifaxle)


Lesenswert?

Es klingt zumindest korrekt. Bei manchen Quadkoptern sieht dieses 
Kalibrieren so aus, dass man das Teil um alle drei Raumachsen mehrmals 
drehen soll.

von Jan H. (janiiix3)


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
}

von Felix A. (madifaxle)


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.

: Bearbeitet durch User
von Jan H. (janiiix3)


Lesenswert?

Die 10mA werden aber im IC selber generiert und gemessen oder? Ich muss 
mich lediglich um die A/D Werte kümmern?.

von RP6conrad (Gast)


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.

von Felix A. (madifaxle)


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.

von Jan H. (janiiix3)


Lesenswert?

Welches .pdf nutzt du ? Bei mir steht was auf Seite 19 vom "Self Test"

: Bearbeitet durch User
von Wolfgang A. (Gast)


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

von Jan H. (janiiix3)


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".

von Felix Adam (Gast)


Lesenswert?

Ich schaue morgen mal drauf. Jetzt ist erstmal eierfabend.

von Wolfgang A. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.