罗盘校准
概述
该应用笔记以LSM303DLHC为例子,简单讲解了磁力计的校准方式并简要进行代码讲解。
预备知识
如果没有了解过磁力计校准的,可以先看这两篇文章:
http://blog.sina.com.cn/s/blog_8240cbef0101i7gn.html
http://www.dzsc.com/data/html/2010-11-29/87454.html
如果磁力计在含有附加的局部磁场的环境中进行操作,磁力计的输出做附加的修正将是必要的。
在没有任何本地磁场的影响下 ,下图1可以通过旋转设备360°产生的平面 ,图2为引入本地磁场。
一.
修正的输出可以根据下面的方法来计算:
1)在磁场干扰的条件下进行,数据收集设备被旋转360°。
2)数据进行分析,以产生偏差的偏移和灵敏度的比例因子,以补偿所述干扰。
例子:
从数据中发现的X和Y磁强计的最大输出:
从中可以看出X轴的数据,X具有更大的反应,我们设置其比例系数为1
再计算其他比例系数:
对于偏置补偿:
正确的输出:
二.
1)水平匀速旋转,收集XY轴数据
2)转动器材90度(Z轴)匀速转动以收集Z轴数据
将磁力计读到的裸值减去offset,得到用做角度计算的Heading值
水平测试,得到的方位角 = arctanYH/XH 非水平测试,需要使用加速计进行倾角补偿,先计算出翻滚角Roll和俯仰角Pitch,然后计算Heading值:
实例讲解
这里以Open103Z+ LSM303DLHC Board + FT232 USB UART Board 为例
步骤0
硬件连接如下:
下载示例程序,打开Magnetic calibration工程
步骤1
- 修改STEP注释,编译STEP1部分代码,下载并运行程序。
- 打开串口调试助手(波特率:115200),正常可以看到串口输出相应的方位角。
一般情况下,此时输出的角度误差比较大,因为一方面受到了环境中的磁干扰,另一方面是由于本身传感器制造工艺导致。
这里为了简化代码,只使用了水平测试方位角的计算公式。由于没有把加速度计数据耦合进去,所以在非水平条件下输出误差会比较大。
方位角 = arctanYH/XH (其中YH为磁力计Y轴输出,XH为X轴输出)
注:这一步骤对于磁力计校准来说不是必须的,仅为了与校准后的角度进行对比。
步骤2
- 修改STEP注释,编译STEP2部分代码,下载并运行程序。
- 打开串口工具(波特率:115200),正常可以看到串口输出XYZ三个方向的原始数据。
- 先点击清除窗口,将串口助手中原来的数据清空,在对XYZ三轴分别缓慢旋转模块几周(为了得到足够的样本),点击关闭串口,在将串口助手里的内容复制到一个TXT文件,如下:
- 新建一个Excel表格:MagData.xlsx,选择 数据 -》 自文本,选择刚新建的data.txt -》按提示操作(注意选择分格符为逗号) -》保存文件
- 打开AntMag_v1.0.1 (该软件由WalkAnt提供),选择 加载数据文件-》选择刚新建的MagData.xlsx,最终可以得到校准后的相关参数。
步骤3
- 修改STEP注释,编译STEP3部分代码。
- 将步骤2得到的参数填入到相应该的位置:
- 下载并运行程序。
- 打开串口工具(波特率:115200),正常可以看到串口输出校准后的数据和校准后的角度。
- 在于步骤1输出的角度进行对比,可以看到输出的精度有所提升。有时如果得到的输出角度偏差还比较大,则重复步骤2。
其它
由于上述方法使用的计算量很大,一般不会将这部分代码添加到MCU的程序中。如果你对这部分的代码实现感兴趣,请自行查阅相关资料。
国外也有很多类似的开源上位机,有兴趣的可自行研究。
https://github.com/mjs513/FreeIMU-Updates/wiki/04.-FreeIMU-Calibration
如果你在使用中,对精度要求不高,可以用以下简单的校准方式。这种方式的优点是可以集成到代码中,只需要很少的计算量就可以得到比较精确的数据。
·修改STEP注释,编译STEP4部分代码。
·把传感器水平放置,绕Z轴旋转一周后,将可以得到3轴的修正值,通过将原始数据减去修正值,在计算角度,可以得到比步骤1要精确一些的方位角。