HMC5883L校准有问题
各位,麻烦帮我看看为什么进行磁阻传感器的校准不行啊,校准出来的数据不稳定,我平行地放在桌面上,角度还是不断地在乱变,变化范围很大,不过当我旋转180度之后,角度显示就稳定了,不知道是什么原因?恳请帮忙啊!!void main()
{
delay(200); //上电延时
LCD_init(); //初始化液晶
LCD_clear();
while(1) //循环
{
keyscan();
if(jiaozhun==0)
{
Init_HMC5883(); //初始化HMC5883L
HMC5883_Multiple_Read(MagAdd,MagREG_Add,&Magscal); //采集数据,计算校准后的三轴值
if(jiaozhun2==1)
CalcScale(); //算出校准后的Xscal、Yscal、Zscal值
angle= atan2((double)Magscal.y,(double)Magscal.x) * (180 / 3.14159265) + 180; // angle in degrees
diplay_yuan(); //显示航向角中文和画圆
RefreshScreen(); //显示scop[]数组里边的内容
ClearnGraph();
}
if(jiaozhun==1)
{
RegulateXY();
}
if(jiaozhun==2)
{
regulateZ();
}
if(jiaozhun==3)
{
jiaozhun=0;
jiaozhun2=1;
CalcOffsetSen(); //计算偏移量offset和灵敏度sen
}
}
}
idata MagnetDataMagMax = {-0x7FFF, -0x7FFF, -0x7FFF};//最大值设成int最小值
idata MagnetDataMagMin = {0x7FFF, 0x7FFF, 0x7FFF}; //最小值设成int最大值
//计算偏移量offset和灵敏度sen
void CalcOffsetSen(void)
{
Magoffset.x=-(MagMin.x+MagMax.x)/2; //用这个代替CalcOffsetScale(&MagMax,&MagMin);
Magsen.x=1;
Magoffset.y=-(MagMin.y+MagMax.y)/2;
Magsen.y=(MagMax.y-MagMin.y)/(MagMax.x-MagMin.x);
Magoffset.z=-(MagMin.z+MagMax.z)/2;
Magsen.z= (MagMax.z-MagMin.z)/(MagMax.x-MagMin.x);
}
//得到校准后的Xscal、Yscal、Zscal值
void CalcScale(void)
{
Magscal.x=((long)(Magscal.x+Magoffset.x)* (long)Magsen.x);//方法4,不要右移12
Magscal.y=((long)(Magscal.y+Magoffset.y)* (long)Magsen.y);
Magscal.z=((long)(Magscal.z+Magoffset.z)* (long)Magsen.z);
}
//获取磁阻水平时XY轴的最大、最小值,从而计算校准后X、Y、Z值
void RegulateXY(void)
{
MagnetData xdata Magtmp;
diplay_intstr(0,39,MagMax.y);
diplay_intstr(0,31,MagMax.x);
diplay_intstr(0,23,MagMin.y);
diplay_intstr(0,15,MagMin.x);
Draw_english_string(0,7,"regulate XY");
RefreshScreen(); //显示scop[]数组里边的内容
ClearnGraph();
HMC5883_SetMeasure();
if(s2==0)
{
delay(10);
if(s2==0)
{
jiaozhun=2;
while(!s2);
}
}
HMC5883_Multiple_Read(MagAdd,MagREG_Add,&Magtmp);
if(Magtmp.x > MagMax.x)
{
MagMax.x = Magtmp.x;
}
else if(Magtmp.x < MagMin.x)
{
MagMin.x = Magtmp.x;
}
if(Magtmp.y > MagMax.y)
{
MagMax.y = Magtmp.y;
}
else if(Magtmp.y < MagMin.y)
{
MagMin.y = Magtmp.y;
}
}
void regulateZ(void)
{
MagnetData xdata Magtmp;
diplay_intstr(0,23,MagMax.z);
diplay_intstr(0,15,MagMin.z);
Draw_english_string(0,7,"regulate z");
RefreshScreen(); //显示内容
ClearnGraph();
HMC5883_SetMeasure();
if(s2==0)
{
delay(10);
if(s2==0)
{
jiaozhun=3;
while(!s2);
}
}
HMC5883_Multiple_Read(MagAdd,MagREG_Add,&Magtmp);
if(Magtmp.z > MagMax.z)
{
MagMax.z = Magtmp.z;
}
else if(Magtmp.z < MagMin.z)
{
MagMin.z = Magtmp.z;
}
}
楼主,为什么我的5883L读出来的数据变化范围很小,只有一百多啊 楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、 数据读取
X_HMC =(IOBuf << 8) + IOBuf;
Z_HMC =(IOBuf << 8) + IOBuf;
Y_HMC =(IOBuf << 8) + IOBuf;
2、 水平校准:把椭圆修到正圆,一、修偏心,二、修半径。
a)、选定中心点,以固定半径R水平旋转,找出x和y的最大最小值x_max、x_min、y_max 、y_min。
b)、于是,x的偏移: Xoffset = (x_max + x_min) / 2;
c)、x的比例取:x_gain=1
d)、y的偏移:Yoffset = (y_max + y_min) / 2;
e)、y的比例:y_gain= (x_max - x_min) / (y_max - y_min);
X_HMC = Xgain *(X_HMC -Xoffset);
Y_HMC = Ygain * (Y_HMC -Yoffset);
3、空间校准:把椭球修到正球
a)、空间旋转芯片,找出x yz的最大最小值xmax、xmin、ymax 、ymin、zmax 、zmin。
b)、于是,x的偏移: Xoffset = (xmax + xmin) / 2;
c)、x的比例取:x_gain=1
d)、y的偏移:Yoffset = (ymax + ymin) / 2;
e)、y的比例:y_gain= (xmax - xmin) / (y_max -y_min);
f)、 z的偏移:Zoffset = (zmax + zmin) / 2;
g)、z的比例:z_gain= (xmax - xmin) / (z_max -z_min);
X_HMC = HMC_Xgain *(X_HMC - HMC_Xoffset);
Y_HMC = HMC_Ygain * (Y_HMC - HMC_Yoffset);
Z_HMC = HMC_Zgain * (Z_HMC- HMC_Zoffset);
3楼正解,学习了
{:smile:} 我也用3楼的方法试试 yx枫叶 发表于 2013-8-25 16:12 static/image/common/back.gif
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、 数据读取
...
这个算法是针对一个芯片还是HMC5883说有芯片通用。。。。。 yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、 数据读取
...
请问一下对于倾斜的椭圆还能不能这么用啊?
这东西不好校准 yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、 数据读取
...
mark。磁指南校正 yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、 数据读取
...
1.空间旋转芯片怎么个旋转法??
2.Xmin、Ymin、Zmin最小值是指绝对值的最小值?还是指真实值的最小值(负数)? MARK一下 yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、 数据读取
...
同问空间旋转怎么旋转?麻烦解答下哈,thanks yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、 数据读取
...
请问有没有现成的代码分享一下{:loveliness:} 请教一下,我读出来角度进行以下实验(水平放置):
1.找到0度的位置;
2.水平旋转180度,圆心可能会偏离;
3.此刻的角度并不是180度,而是150度左右;
4.从0度匀速旋转,角度在50-220度的时候变化均匀,220-360-50度时变化不均匀,问题很大、、、
{:2_38:}{:3_47:} 请问楼主,这个传感器的数值受温度影响大吗 mark一下
页:
[1]