使用HMC5883L-3轴数字罗盘传感器计算航向角
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用HMC5883L -3轴数字罗盘传感器计算航向角
——中北大学:马政贵
图1 HMC5883L 的电路图
HMC5883L -3轴数字罗盘采用IIC 总线接口,内含12位AD 转换器,能在8Ga 的磁场中实现5mGa 的分辨率。
1. HMC5883L 的初始化:
HMC5883L 的磁场默认测量范围为 1.3Ga ,由于地磁场强度大约是0.5-0.6Ga ,故使用默认的量程即可,此外还需进行采样平均数、数据输出速率、测量模式的初始化配置即可。 /******************************************************************************* 功能:对HMC5883L 进行初始化
参数:无
返回值:无
*******************************************************************************/ void HMC5883_Init(void)
{
HMC_GPIO_Config(); //GPIO 配置
HMC_I2C_Write(0x00,0x78); //(配置寄存器A )采样平均数8;数据输出速率75Hz ;正常测量配置模式 HMC_I2C_Write(0x02,0x00); //(模式寄存器)连续测量模式
}
备注:void HMC_I2C_Write(u8 address,u8 data)为寄存器写入函数,第一个参数
address ±±
为要写入的寄存器地址,第二个参数data 为要写入寄存器的值。
2. HMC5883L 自测:
HMC5883L -3轴数字罗盘内含自测模式。
HMC_I2C_Write(0x00,0x79); //(配置寄存器A )采样平均数8;数据输出速率75Hz ;正偏压自测模式 HMC_I2C_Write(0x02,0x01); //(模式寄存器)单一测量模式
通过将配置寄存器A 的最低位(MS1和MS0)从00更改为01,然后再配置为单一测量模式,即可进入自测模式。自测模式下会在内部创建一个标准的自测磁场,从而支持传感器的比例因子校准。标准磁场的理论值与实际测量值的比值,即可得出传感器的比例因子: calibration[0] = fabs(951.0 / Compass_Data[0]);
calibration[1] = fabs(951.0 / Compass_Data[1]);
calibration[2] = fabs(886.0 / Compass_Data[2]);
其中,calibration[n]为比例因子,Compass_Data[n]为罗盘的原始数据,951是自测模式下在X 、Y 轴的标准输出值,886是自测模式下在Z 轴的标准输出值。
3. HMC5883L 的硬磁失真校正及倾角补偿:
HMC5883L -3轴数字罗盘在工作过程中,由于不可避免的受周围电磁场的干扰,如电路走线、其他电子器件工作时的电磁干扰等,从而造成罗盘XYZ 轴测得的地磁场强度发生不同程度的偏移变形。一般我们将干扰的影响分为硬磁失真和软磁失真两类,从影响效果上来看,硬磁失真会造成磁场输出曲线图的圆心偏移,而软磁失真会把理论上为圆形的地磁场拉伸为椭圆。前期的标定过程中,只对硬磁失真进行了校正,通过分别绕每个轴旋转360°,求另外两个轴的最大值和最小值的和的平均值作为零点偏移量,从而使圆心回到原点: offset[n] = -(max[n]+min[n])/2; // calculate offsets
MagVec[n] = (Compass_Data[n]*calibration[n]+offset[n]);
其中,offset[n]为零点偏移量,MagVec[n]为最终用于计算的罗盘数据。
图2 电子罗盘三维数学模型
此外,由于罗盘不是一直处于水平位置,因此需要使用姿态角(横滚角和俯仰角)对罗盘进行倾角补偿,根据矢量三角形,有:
Head_X = Head_X*cos(pitch)+Head_Y*sin(roll)*sin(pitch)-Head_Z*cos(roll)*sin(pitch);
Head_Y = Head_Y*cos(roll)+Head_Z*sin(roll);
4. 航向角计算:
可使用反三角函数atanf()进行航向角度的计算,需要注意的是,因为角度的4个象限(atanf()返回值为),为了使航向角的范围为0~360°,需要进行不同象限下的相应转换处理。
±2/π
由于地磁北和地理北存在大约11.5°的偏差角度,因此在解算出来的航向角上,还需要进行该偏差角度的补偿作为最终的航向角。
if(Head_X>0 && Head_Y<0)
{
Heading = - atanf(Head_Y/Head_X) * 180/M_PI;
}
if(Head_X<0.05 && Head_X>-0.05 && Head_Y<0)
{
Heading=90;
}
if(Head_X<0)
{
Heading=180 - atanf(Head_Y/Head_X) * 180/M_PI;
}
if(Head_X<0.05 && Head_X>-0.05 && Head_Y>0)
{
Heading=270;
}
if(Head_X>0 && Head_Y>0)
{
Heading=360 - atanf(Head_Y/Head_X) * 180/M_PI;
}
Heading = Heading - 11.5; //地磁北和地理北的偏差角度:11.5
if(Heading < 0)
{
Heading = 360 + Heading;
}
参看:
1、Honeywell-《3-Axis Digital Compass IC HMC5883L》
2、范寒柏,陈邵权,王涛,王磊-《电子罗盘倾角补偿和干扰补偿的理论分析及实验验证》