900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > HMC5883L电子罗盘/指南针实现 附带校准方法(附STM32 源码)

HMC5883L电子罗盘/指南针实现 附带校准方法(附STM32 源码)

时间:2021-09-16 03:57:32

相关推荐

HMC5883L电子罗盘/指南针实现 附带校准方法(附STM32 源码)

HMC5883L电子罗盘/指南针实现,附带校准方法(附STM32 源码)

前言一、寄存器详解1.配置寄存器A2.配置寄存器B3.模式寄存器4.数据寄存器5.状态寄存器6.识别寄存器二、使用步骤1.STM32CubeMX设置2.初始化3.读取原始数据三、校准程序四、方位角计算五、测试结果六、总结七、获取工程源码

前言

HMC5883L是一款高集成的弱磁传感器芯片,带有能使罗盘精度控制在1°-2°的模数转换器。其灵敏度较高,开发难度不高。本文内容是将HMC5883L的XY两轴数据转换成指南针方位角,仅在水平面上使用。


一、寄存器详解

此款芯片的寄存器比较少,使用起来很简单。下面来逐一分析各个寄存器功能。

1.配置寄存器A

CRA7 :清除后才能使用;CRA6 - CRA5 : 采样平均数,默认8次;CRA4 - CRA2 : 输出速率,在连续测量模式下使用,默认15Hz;CRA1 - CRA0 : 设置XYZ轴正偏压或负偏压,默认00即可。

2.配置寄存器B

CRB7 - CRB5:设置增益位,即多大的值为1高斯,默认1090/高斯,见下图;CRB4 - CRB0:清零

3.模式寄存器

4.数据寄存器

每个轴的数据共16位,存储在两个寄存器(高八位MSB,第八位LSB)。只有把所有寄存器都读取完后,才会清除RDY位和DRDY信号。

5.状态寄存器

6.识别寄存器

用来识别装置。

二、使用步骤

1.STM32CubeMX设置

使用一个I2C、UART和一个IO输入,如下图。

2.初始化

根据以上寄存器设置进行初始化。

void hmc5883l_init(){uint8_t data = 0x70;HAL_I2C_Mem_Write(&hi2c1,HMC5883L_ADDER,CONFIGURATION_A, 1, &data, 1,1000); //配置寄存器Adata = 0x20;HAL_I2C_Mem_Write(&hi2c1,HMC5883L_ADDER,CONFIGURATION_B, 1, &data, 1,1000); //配置寄存器Bdata = 0x0;HAL_I2C_Mem_Write(&hi2c1,HMC5883L_ADDER,HMC5883L_MODE, 1, &data, 1,1000); //配置模式寄存器,连续模式}

3.读取原始数据

void hmc5883l_rawread(float *GaX, float *GaY){uint8_t data[6];HAL_I2C_Mem_Read(&hi2c1,HMC5883L_ADDER, 0x03,1,data,6 , 1000); //连续读取int16_t dxra,dyra;dxra = (data[0] << 8) | data[1]; *GaX = (float)dxra /1090;dyra = (data[4] << 8) | data[5]; *GaY = (float)dyra /1090 ;/*dzra = (data[2] << 8) | data[3];float GaZ = (float)dzra /1090 ;*/}

经过旋转一周测试后,发现X轴的测量值范围是 -0.34 ~ 0.30高斯,Y轴的范围是 -0.6 ~0.12 高斯

三、校准程序

通过以上发现传感器测量的数据并不准确,原因是磁阻传感器属于比较精密的器件,在生产时会产生误差,所以需要进行校准。因为最后转换的是角度值,所以将原始数据进行归一化处理,X,Y轴的测量值都转化为 -1~1的范围内。具体步骤如下:上电后大约20s内将传感器缓慢旋转几周,测得最大值和最小值,然后获得校准值。

uint8_t i=0 ;float GaX,GaY,GaXmax=0,GaXmin=0,GaYmax=0,GaYmin=0;while(i != 100){hmc5883l_rawread(&GaX, &GaY);GaXmax = GaXmax < GaX? GaX:GaXmax;GaXmin = GaXmin > GaX? GaX:GaXmin;GaYmax = GaYmax < GaY? GaY:GaYmax;GaYmin = GaYmin > GaY? GaY:GaYmin;HAL_Delay(200);i++;}*Xoffest = (GaXmax+GaXmin)/2;*Yoffest = (GaYmax+GaYmin)/2;*Kx = 2/(GaXmax-GaXmin);*Ky = 2/(GaXmax-GaXmin);

最后由下列式子得到 -1~1 范围内的最终数值

GaX = (rawGaX - Xoffest) * Kx;GaY = (rawGaY - Yoffest) * Ky;

经过校准后输出,X的取值范围是 -0.98 ~ 1.02 , Y轴取值范围是-1.08 ~ 1.12。(受环境磁场和测量偏离水平面的误差影响),对于特定一个传感器,可在没有环境磁场干扰情况下测定校准数值,直接应用,不必每次上电后进行校准。

四、方位角计算

方位角的计算公式如下:

但由于测试后发现与手机上的指南针不相符,可能是传感器镜像方位的原因,于是自行修改了计算方法,如下(方法可能不准确,仅供参考):

if((GaX > 0)&&(GaY > 0)) Magangle = atan(GaY/GaX)*57;else if((GaX > 0)&&(GaY < 0)) Magangle = 360+atan(GaY/GaX)*57;else if((GaX == 0)&&(GaY > 0)) Magangle = 90;else if((GaX == 0)&&(GaY < 0)) Magangle = 270;else if(GaX < 0) Magangle = 180+atan(GaY/GaX)*57;

五、测试结果

用手机指南针软件和模块X轴对准同一个方向,随机测取几个数,串口输出和手机截图如下:

六、总结

总的来说,精确度还是很高的。但是可能是用的是模块原因,测量的时候很飘,稍微一动测量结果就相差很多,并且受环境磁场影响大(电脑手机电器之类的),在PCB板或者面包板上可能有所改善。另外,DRDY引脚中断信号和GPIO未用到,可根据需要使用。

七、获取工程源码

关注下方公众号,回复 “HMC5883L” 获取源码;若有疑问,请在公众号回复“交流群”,进群一起讨论分享!


参考资料: HMC5883L 磁力计校准 /s/blog_402c071e0102v8ie.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。