HMC5883L是一種IIC通信的電子羅盤芯片,輸出與北的角度偏差张肾,數(shù)值是0-360度,靠西方向增長锚扎,可以理解為逆時(shí)針為正吞瞪。配合GPS模塊簡直就是四軸飛行器的鐵桿標(biāo)配。
1. 5883的初始化
HMC5883L也是一個(gè)IIC器件驾孔,具體的操作方式和前面介紹的MPU6050類似芍秆,這里就不在贅述了。主要區(qū)別在于5883作為IIC從機(jī)時(shí)翠勉,其地址為0x3C妖啥。
1.1 初始化HMC5883
初始化HMC5883的方法和初始化MPU6050的方法差不太多,主要是模擬出IIC信號(hào)对碌,對(duì)對(duì)應(yīng)的寄存器操作荆虱,具體的可查看HMC5883的說明手冊(cè)。
void HMC5883L_Init()
{? ?
? MPU_IIC_Init();//初始化IIC
? MPU_IIC_Start();
? MPU_IIC_Send_Byte(0x3c);
? MPU_IIC_Wait_Ack();
? MPU_IIC_Send_Byte(0x00);
? MPU_IIC_Wait_Ack();
? MPU_IIC_Send_Byte(0x14);//模擬IIC的信號(hào)時(shí)序
? MPU_IIC_Start();
? MPU_IIC_Send_Byte(0x3c); //寫指令
? MPU_IIC_Wait_Ack();
? MPU_IIC_Send_Byte(0x01);
? MPU_IIC_Wait_Ack();
? MPU_IIC_Send_Byte(0x20);
? MPU_IIC_Wait_Ack();
? MPU_IIC_Stop();
? }
1.2 讀取數(shù)據(jù)
MPU_IIC_Start();
MPU_IIC_Send_Byte(0x3c); // HMC5883L,0x3c,0x03讀取這兩個(gè)地址的寄存器數(shù)據(jù)朽们,分別為LSB和MSB
MPU_IIC_Wait_Ack();
MPU_IIC_Send_Byte(0x03); //
MPU_IIC_Wait_Ack();
MPU_IIC_Start();? ? ? ? ?
MPU_IIC_Send_Byte(0x3d); //讀數(shù)據(jù)
MPU_IIC_Wait_Ack();
for(i=0;i<5;i++)? ? ? ? //第六次不應(yīng)答
{
? XYZ_Data[i]=MPU_IIC_Read_Byte(1);
}
XYZ_Data[5] =MPU_IIC_Read_Byte(0);?
MPU_IIC_Stop();
delay_ms(5);
1.3 數(shù)據(jù)處理
讀出寄存器的原始數(shù)據(jù)之后怀读,下一步應(yīng)該將數(shù)據(jù)進(jìn)行處理,比如多次求和取平均骑脱,然后利用磁偏角方位公式算出偏角菜枷。
void? HMC58X3_newValues(int16_t x,int16_t y,int16_t z)
{
unsigned char i ;
int32_t sum=0;
for(i=1;i<10;i++)
{
? HMC5883_FIFO[0][i-1]=HMC5883_FIFO[0][i];
? HMC5883_FIFO[1][i-1]=HMC5883_FIFO[1][i];
? HMC5883_FIFO[2][i-1]=HMC5883_FIFO[2][i];
}
HMC5883_FIFO[0][9]=x;
HMC5883_FIFO[1][9]=y;
HMC5883_FIFO[2][9]=z;
sum=0;
for(i=0;i<10;i++){ //求和取平均
? ? sum+=HMC5883_FIFO[0][i];
}
HMC5883_FIFO[0][10]=sum/10; //將平均值更新
sum=0;
for(i=0;i<10;i++){
? ? sum+=HMC5883_FIFO[1][i];
}
HMC5883_FIFO[1][10]=sum/10;
sum=0;
for(i=0;i<10;i++){
? ? sum+=HMC5883_FIFO[2][i];
}
HMC5883_FIFO[2][10]=sum/10;
}
取平均值之后,利用磁偏角公式可以求出角度叁丧。
Angle = (atan2(Y,X) * (180 / 3.14159265) + 180);
2. HMC5883的問題
如果前面MPU6050弄明白了犁跪,那5883也很容易弄懂椿息。值得注意的有如下兩個(gè)問題:
1. 接線
HMC5883和MPU605需要連接在同一個(gè)IIC總線上,下圖是我們的接線方式坷衍。
最下方是沒有用到的BMP模塊
2. 四元數(shù)融合算法
要將HMC5883用到自主導(dǎo)航小車的姿態(tài)估算中寝优,我們采用的是四元數(shù)融合算法,需要上傳MPU6050和HMC5883的原始數(shù)據(jù)枫耳。如何進(jìn)行四元數(shù)融合解算乏矾,我準(zhǔn)備在下一篇文章寫出。
本文首發(fā)https://blog.csdn.net/weixin_38172545/article/details/103044853