查看: 74|回复: 0

[原创] 【ROHM传感器套件试用】十一、方位校准及获取

[复制链接]

10

主题

5

好友

908

积分

举人

Rank: 4

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 194 天

    [LV.7]常住居民III

    发表于 2017-4-7 16:37:23 |显示全部楼层
    本帖最后由 踏平幼稚园 于 2017-4-9 11:36 编辑


    说明:测试程序使用的开发板为nucleo-f411re,程序下载链接:【ROHM传感器套件试用】二、stm32代码移植(所有模块通过测试)

    本贴使用模块:BM1422(地磁传感器)

    一、增加校准及方位计算功能
        1、本次校准采用模块水平旋转,通过采集X,Y的最小最大值,然后将(最小值+最大值)/2作为偏移值。

        2、代码修改
            a、增加校准函数(offset[3]为x,y,z偏移值,offset_updated为偏移量校准完成标记,以上变量自己添加为BM1422类的私有变量)
    1. void BM1422::calibrate(void)
    2. {
    3.   float x_min = 0, x_max = 0, y_min = 0, y_max = 0;
    4.   uint8_t update = 0;
    5.   uint32_t delay_3s = HAL_GetTick();
    6.   
    7.   offset_updated = 0;
    8.   
    9.   while(HAL_GetTick() - delay_3s < 5000) {
    10.     get_val(offset);
    11.     if(x_min > offset[0])
    12.     {
    13.       x_min = offset[0];
    14.       update = 1;
    15.     }   
    16.     if(x_max < offset[0])
    17.     {
    18.       x_max = offset[0];
    19.       update = 1;
    20.     }
    21.     if(y_min > offset[1])
    22.     {
    23.       y_min = offset[1];
    24.       update = 1;
    25.     }
    26.     if(y_max < offset[1])
    27.     {
    28.       y_max = offset[1];
    29.       update = 1;
    30.     }
    31.     if(update == 1)
    32.     {
    33.       update = 0;
    34.       delay_3s = HAL_GetTick();
    35.     }
    36.   }
    37.   
    38.   offset_updated = 1;
    39.   offset[0] = (x_min + x_max) / 2;
    40.   offset[1] = (y_min + y_max) / 2;
    41. }
    复制代码
    b、修改BM1422::get_val函数,加入偏移计算
    1. uint8_t BM1422::get_val(float *data)
    2. {
    3.   uint8_t rc;
    4.   unsigned char val[6];
    5.   signed short mag[3];

    6.   rc = get_rawval(val);
    7.   if (rc != 0) {
    8.     return (rc);
    9.   }

    10.   mag[0] = ((signed short)val[1] << 8) | (val[0]);
    11.   mag[1] = ((signed short)val[3] << 8) | (val[2]);
    12.   mag[2] = ((signed short)val[5] << 8) | (val[4]);

    13.   convert_uT(mag, data);

    14.   if(offset_updated == 1)
    15.   {
    16.     data[0] -= offset[0];
    17.     data[1] -= offset[1];
    18.   }
    19.   
    20.   return (rc);  
    21. }
    复制代码
    c、main.c文件bm1422初始化部分添加偏移量计算函数
    1. #ifdef BM1422_EN
    2.   bm1422.init();
    3.   bm1422.isr_func(2, bm1422_isr);
    4.   bm1422.calibrate();
    5. #endif
    复制代码
    d、main.c文件增加方位计算及方位打印
    1. #ifdef BM1422_EN
    2.     bm1422.get_val(mag);
    3.     angle = atan2(mag[1], mag[0]) * (180 / 3.14159265) + 180;
    4.     Serial.println("------ BM1422 [uT] ------");
    5.     Serial.print("X = ");
    6.     Serial.print(mag[0]);
    7.     Serial.print(", Y = ");
    8.     Serial.print(mag[1]);
    9.     Serial.print(", Z = ");
    10.     Serial.print(mag[2]);
    11.     Serial.print(", Angle = ");
    12.     Serial.print(angle);
    13.     Serial.println();
    14.     Serial.println();
    15.   #endif
    复制代码
    e、添加数学库,添加方法自行百度,只用到atan2函数

    二、运行程序并立即水平旋转模块,直到串口打印出结果
        1、模块水平放置,模块X正坐标分别指向东、南、西、北四个方位
             5.jpg


        2、X正坐标指向东
             1.jpg


        3、X正坐标指向南
             2.jpg

      
        4、X正坐标指向西
             3.jpg


        5、X正坐标指向北
             4.jpg


    小结:
        从结果看四个方位相差接近90度,x正坐标指向西时方位接近0,顺时针旋转方位角度增加
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /2 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-4-24 02:27 , Processed in 0.172492 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部