使用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、范寒柏,陈邵权,王涛,王磊-《电子罗盘倾角补偿和干扰补偿的理论分析及实验验证》