Hallo miteinander
Ich versuche gerade ein wenig mit dem HMC5883L zu spielen. Kommunikation
läuft soweit, aber leider gibt er mir nicht die richtigen Werte aus.
Wenn ich eine 180° Drehung mache, dann bekomme ich nur ein Winkel
zwischen 240 und 300°.
Ich habe mich mitlerweile durch diverse Foren gewühlt, wo Anleitungen zu
diesem Kompass sind, aber dabei komme ich immer auf den gleichen Wert.
Kann mir jemand sagen, was ich übersehen habe?
1 | void HMC5883L_init(void)
|
2 | {
|
3 | // write CONFIG_A register
|
4 | uint8_t tmp = (HMC5883L_AVERAGING_8 << (HMC5883L_CRA_AVERAGE_BIT - HMC5883L_CRA_AVERAGE_LENGTH + 1)) |
|
5 | (HMC5883L_RATE_15 << (HMC5883L_CRA_RATE_BIT - HMC5883L_CRA_RATE_LENGTH + 1)) |
|
6 | (HMC5883L_BIAS_NORMAL << (HMC5883L_CRA_BIAS_BIT - HMC5883L_CRA_BIAS_LENGTH + 1)) ;
|
7 |
|
8 | /*ENABLE*/
|
9 | I2C_Cmd(HMC5883L_I2C, ENABLE);
|
10 |
|
11 | HMC5883L_I2C_ByteWrite(HMC5883L_DEFAULT_ADDRESS, &tmp ,HMC5883L_RA_CONFIG_A);
|
12 |
|
13 | // write CONFIG_B register
|
14 | HMC5883L_SetGain(HMC5883L_GAIN_1090);
|
15 |
|
16 | // write MODE register
|
17 | HMC5883L_SetMode(HMC5883L_MODE_SINGLE);
|
18 | }
|
19 |
|
20 | void HMC5883L_GetHeading(int16_t* Mag)
|
21 | {
|
22 | uint8_t tmpbuff[6]={0};
|
23 | int i = 0;
|
24 | HMC5883L_I2C_BufferRead(HMC5883L_DEFAULT_ADDRESS, tmpbuff, HMC5883L_RA_DATAX_H, 6);
|
25 |
|
26 | uint8_t tmp = HMC5883L_MODE_SINGLE << (HMC5883L_MODEREG_BIT - HMC5883L_MODEREG_LENGTH + 1);
|
27 |
|
28 | if (HMC5883Lmode == HMC5883L_MODE_SINGLE)
|
29 | HMC5883L_I2C_ByteWrite(HMC5883L_DEFAULT_ADDRESS, &tmp ,HMC5883L_RA_MODE);
|
30 | for(i=0; i<3; i++)
|
31 | Mag[i]=((int16_t)((uint16_t)tmpbuff[2*i] << 8) + tmpbuff[2*i+1]);
|
32 | }
|
33 |
|
34 | systick_ticks = 0;
|
35 | HMC5883L_GetHeading(MagneticHeading);
|
36 | Heading = atan2(MagneticHeading[1], MagneticHeading[0]);
|
37 | declinationAngle = 25.02 / 1000.0; // Your mrad result / 1000.00 (to turn it into radians).
|
38 | Heading += declinationAngle; // If you have an EAST declination, use += declinationAngle, if you have a WEST declination, use -= declinationAngle
|
39 | if(Heading < 0) Heading += 2 * M_PI; // Correct for when signs are reversed.
|
40 | if(Heading > (2* M_PI)) Heading -= 2 * M_PI; // Check for wrap due to addition of declination.
|
41 | Heading = Heading * (180 / M_PI); // Convert radians to degrees for readability.
|
42 | sprintf((char *)buf, "\r\nX: %d\t\tY: %d\t\tZ: %d\t\tHeading: %3.2f",
|
43 | (int)MagneticHeading[0], (int)MagneticHeading[1], (int)MagneticHeading[2], Heading);
|
44 | VCP_send_str(&buf[0]);
|
Besten Dank für die Antowrt
MFG
Patrick