amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 4714|回复: 16

HMC5883L校准有问题

[复制链接]
发表于 2013-4-26 22:23:48 | 显示全部楼层 |阅读模式
各位,麻烦帮我看看为什么进行磁阻传感器的校准不行啊,校准出来的数据不稳定,我平行地放在桌面上,角度还是不断地在乱变,变化范围很大,不过当我旋转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 MagnetData  MagMax = {-0x7FFF, -0x7FFF, -0x7FFF};//最大值设成int最小值
idata MagnetData  MagMin = {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;
        }
}
发表于 2013-8-4 23:15:40 | 显示全部楼层
楼主,为什么我的5883L读出来的数据变化范围很小,只有一百多啊
发表于 2013-8-25 16:12:20 | 显示全部楼层
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、        数据读取
               X_HMC =(IOBuf[16] << 8) + IOBuf[17];
               Z_HMC =(IOBuf[18] << 8) + IOBuf[19];
               Y_HMC =(IOBuf[20] << 8) + IOBuf[21];
          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);
发表于 2013-8-30 12:20:02 | 显示全部楼层
3楼正解,学习了
发表于 2013-10-5 00:03:18 | 显示全部楼层
我也用3楼的方法试试
发表于 2013-11-7 16:12:46 | 显示全部楼层
yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、        数据读取
               ...

这个算法是针对一个芯片还是HMC5883说有芯片通用。。。。。
发表于 2014-4-4 19:35:01 | 显示全部楼层
yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、        数据读取
               ...

请问一下对于倾斜的椭圆还能不能这么用啊?
发表于 2014-4-4 20:41:20 | 显示全部楼层
这东西不好校准
发表于 2014-4-11 06:44:16 | 显示全部楼层
yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、        数据读取
               ...

mark。磁指南校正
发表于 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一下
发表于 2015-4-20 22:49:36 | 显示全部楼层
yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、        数据读取
               ...

同问空间旋转怎么旋转?麻烦解答下哈,thanks
发表于 2015-7-12 00:08:44 | 显示全部楼层
yx枫叶 发表于 2013-8-25 16:12
楼主,您的公司错了!我用的是这个方法,测出来了,挺准的角度!!!
1、        数据读取
               ...

请问有没有现成的代码分享一下
发表于 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 | 显示全部楼层
发表于 2019-3-8 12:39:50 | 显示全部楼层
请问楼主,这个传感器的数值受温度影响大吗
发表于 2019-3-14 22:59:22 | 显示全部楼层
mark一下
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-5-22 18:18

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表