蕾蕾 发表于 2013-4-26 22:23:48

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;
      }
}

19504643 发表于 2013-8-4 23:15:40

楼主,为什么我的5883L读出来的数据变化范围很小,只有一百多啊

yx枫叶 发表于 2013-8-25 16:12:20

楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
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);

ranjiexu 发表于 2013-8-30 12:20:02

3楼正解,学习了
{:smile:}

shuizhb 发表于 2013-10-5 00:03:18

我也用3楼的方法试试

蒋盼盼 发表于 2013-11-7 16:12:46

yx枫叶 发表于 2013-8-25 16:12 static/image/common/back.gif
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、      数据读取
               ...

这个算法是针对一个芯片还是HMC5883说有芯片通用。。。。。

silence2455 发表于 2014-4-4 19:35:01

yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、      数据读取
               ...

请问一下对于倾斜的椭圆还能不能这么用啊?

金牛AKI 发表于 2014-4-4 20:41:20

这东西不好校准

cndavy 发表于 2014-4-11 06:44:16

yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、      数据读取
               ...

mark。磁指南校正

hfjydq 发表于 2014-4-16 10:27:43

yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、      数据读取
               ...

1.空间旋转芯片怎么个旋转法??
2.Xmin、Ymin、Zmin最小值是指绝对值的最小值?还是指真实值的最小值(负数)?

幽灵盾 发表于 2014-7-25 22:12:04

MARK一下

masonson 发表于 2015-4-20 22:49:36

yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、      数据读取
               ...

同问空间旋转怎么旋转?麻烦解答下哈,thanks

flowtcw 发表于 2015-7-12 00:08:44

yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、      数据读取
               ...

请问有没有现成的代码分享一下{:loveliness:}

destiny、 发表于 2015-8-28 12:17:08

请教一下,我读出来角度进行以下实验(水平放置):
1.找到0度的位置;
2.水平旋转180度,圆心可能会偏离;
3.此刻的角度并不是180度,而是150度左右;
4.从0度匀速旋转,角度在50-220度的时候变化均匀,220-360-50度时变化不均匀,问题很大、、、

小憨不傻 发表于 2015-8-28 20:43:18

{:2_38:}{:3_47:}

STOC 发表于 2019-3-8 12:39:50

请问楼主,这个传感器的数值受温度影响大吗

maksyuki 发表于 2019-3-14 22:59:22

mark一下
页: [1]
查看完整版本: HMC5883L校准有问题