STM32读取HMC5883L的偏航角数据

HMC5883L是一种IIC通信的电子罗盘芯片,输出与北的角度偏差,数值是0-360度,靠西方向增长,可以理解为逆时针为正。配合GPS模块简直就是四轴飞行器的铁杆标配。

1. 5883的初始化

HMC5883L也是一个IIC器件,具体的操作方式和前面介绍的MPU6050类似,这里就不在赘述了。主要区别在于5883作为IIC从机时,其地址为0x3C。

1.1 初始化HMC5883

初始化HMC5883的方法和初始化MPU6050的方法差不太多,主要是模拟出IIC信号,对对应的寄存器操作,具体的可查看HMC5883的说明手册。

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的信号时序

  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 读取数据

MPU_IIC_Start();

MPU_IIC_Send_Byte(0x3c); // HMC5883L,0x3c,0x03读取这两个地址的寄存器数据,分别为LSB和MSB

MPU_IIC_Wait_Ack();

MPU_IIC_Send_Byte(0x03); //

MPU_IIC_Wait_Ack();

MPU_IIC_Start();         

MPU_IIC_Send_Byte(0x3d); //读数据

MPU_IIC_Wait_Ack();

for(i=0;i<5;i++)        //第六次不应答

{

  XYZ_Data[i]=MPU_IIC_Read_Byte(1);

}

XYZ_Data[5] =MPU_IIC_Read_Byte(0); 

MPU_IIC_Stop();

delay_ms(5);

1.3 数据处理

读出寄存器的原始数据之后,下一步应该将数据进行处理,比如多次求和取平均,然后利用磁偏角方位公式算出偏角。

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也很容易弄懂。值得注意的有如下两个问题:

1. 接线

HMC5883和MPU605需要连接在同一个IIC总线上,下图是我们的接线方式。



最下方是没有用到的BMP模块

2. 四元数融合算法

要将HMC5883用到自主导航小车的姿态估算中,我们采用的是四元数融合算法,需要上传MPU6050和HMC5883的原始数据。如何进行四元数融合解算,我准备在下一篇文章写出。

本文首发https://blog.csdn.net/weixin_38172545/article/details/103044853

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容