简述
17届智能车智能视觉组需要获取航向角,为此我尝试了hmc5983这款磁力计,它可以看成hmc5883l的上位替代,相比5883l最快输出75hz频率,它可以达到220hz并且设置了温度补偿位。
一、寄存器
我们主要会用到前8个寄存器,通过配置Register A,Register B,Mode Register来设置传感器模式,通过读取下面6个寄存器来读取x,y,z三个轴上的磁分量。
二、命令
1.代码
/**传感器控制配置参数
*/
// ConfigRegA temperature sensor, 开启后可以自动补偿温漂
#define Temprature_Sensor 0x80
// ConfigRegA valid sample averaging
#define SampleAveraging_1 0x00
#define SampleAveraging_2 0x20
#define SampleAveraging_4 0x40
#define SampleAveraging_8 0x60
// ConfigRegA valid data output rates
#define DataOutputRate_0_75HZ 0x00
#define DataOutputRate_1_5HZ 0x04
#define DataOutputRate_3HZ 0x08
#define DataOutputRate_7_5HZ 0x0C
#define DataOutputRate_15HZ 0x10
#define DataOutputRate_30HZ 0x14
#define DataOutputRate_75HZ 0x18
#define DataOutputRate_220HZ 0x1C
// ConfigRegA Measurement Mode
#define Normal_Measurement 0x00
#define Positive_Measurement 0x01
#define Negative_Measurement 0x10
#define Temperature_Measurement 0x11
//ConfigRegB Gain
#define Ga_0_88 0x00
#define Ga_1_3 0x20
#define Ga_1_9 0x40
#define Ga_2_5 0x60
#define Ga_4_0 0x80
#define Ga_4_7 0xA0
#define Ga_5_6 0xC0
#define Ga_8_1 0xE0
//ModeRegister, 太麻烦,只写出我需要的两种模式,其他的白嫖怪请自己参考英文手册写
#define ContinuousConversion 0x00
#define SingleConversion 0x01
2.命令详解
#define MAG_ADDRESS 0x1E
#define ConfigRegA 0x00
#define ConfigRegB 0x01
#define ModeRegister 0x02
#define MAG_DATA_REGISTER 0x03
#define StatusReg 0x09
#define IDRegA 0x0A
#define IDRegB 0x0B
#define IDRegC 0x0C
先配置寄存器A吗,再配置寄存器B,最后配置模式寄存器;
代码如下(示例):
iic_write_reg(HMC5983_IIC, MAG_ADDRESS, ConfigRegA, Temprature_Sensor|SampleAveraging_4|DataOutputRate_220HZ|Normal_Measurement);
rt_thread_delay(1);
iic_write_reg(HMC5983_IIC, MAG_ADDRESS, ConfigRegB, Ga_2_5);
rt_thread_delay(1);
iic_write_reg(HMC5983_IIC, MAG_ADDRESS, ModeRegister, ContinuousConversion);
一般来说,普通使用的话只用配置SampleAveraging,DataOutputRate,Ga就可以了。
- Ga详解
三、读取详解
可以看到6个寄存器是连在一个的,故可以从0x03开始读6位
- 代码示例
uint8_t buf[6];
iic_read_reg_bytes(HMC5983_IIC, MAG_ADDRESS, MAG_DATA_REGISTER, buf, 6);
x_mag = buf[0] << 8 | buf[1];
z_mag = buf[2] << 8 | buf[3];
y_mag = buf[4] << 8 | buf[5];
四、校准
可以从数据手册中看出hmc5983中拥有内置偏置电流发生器,通过配置寄存器A
#define Positive_Measurement 0x01
#define Negative_Measurement 0x10
可以在内部产生磁场从而来校准;目前我还没有研究出来。至于地磁计,如果只需要获取航向角的话就只需要将磁力计原地旋转进行椭圆校准就行,如果需要做AHRS就需要椭球校准了。