TA的每日心情 | 开心 2022-6-16 19:35 |
---|
签到天数: 649 天 连续签到: 1 天 [LV.9]以坛为家II
|
本帖最后由 踏平幼稚园 于 2017-4-9 11:36 编辑
说明:测试程序使用的开发板为nucleo-f411re,程序下载链接:【ROHM传感器套件试用】二、stm32代码移植(所有模块通过测试)
本贴使用模块:BM1422(地磁传感器)
一、增加校准及方位计算功能
1、本次校准采用模块水平旋转,通过采集X,Y的最小最大值,然后将(最小值+最大值)/2作为偏移值。
2、代码修改
a、增加校准函数(offset[3]为x,y,z偏移值,offset_updated为偏移量校准完成标记,以上变量自己添加为BM1422类的私有变量)- void BM1422::calibrate(void)
- {
- float x_min = 0, x_max = 0, y_min = 0, y_max = 0;
- uint8_t update = 0;
- uint32_t delay_3s = HAL_GetTick();
-
- offset_updated = 0;
-
- while(HAL_GetTick() - delay_3s < 5000) {
- get_val(offset);
- if(x_min > offset[0])
- {
- x_min = offset[0];
- update = 1;
- }
- if(x_max < offset[0])
- {
- x_max = offset[0];
- update = 1;
- }
- if(y_min > offset[1])
- {
- y_min = offset[1];
- update = 1;
- }
- if(y_max < offset[1])
- {
- y_max = offset[1];
- update = 1;
- }
- if(update == 1)
- {
- update = 0;
- delay_3s = HAL_GetTick();
- }
- }
-
- offset_updated = 1;
- offset[0] = (x_min + x_max) / 2;
- offset[1] = (y_min + y_max) / 2;
- }
复制代码 b、修改BM1422::get_val函数,加入偏移计算- uint8_t BM1422::get_val(float *data)
- {
- uint8_t rc;
- unsigned char val[6];
- signed short mag[3];
- rc = get_rawval(val);
- if (rc != 0) {
- return (rc);
- }
- mag[0] = ((signed short)val[1] << 8) | (val[0]);
- mag[1] = ((signed short)val[3] << 8) | (val[2]);
- mag[2] = ((signed short)val[5] << 8) | (val[4]);
- convert_uT(mag, data);
- if(offset_updated == 1)
- {
- data[0] -= offset[0];
- data[1] -= offset[1];
- }
-
- return (rc);
- }
复制代码 c、main.c文件bm1422初始化部分添加偏移量计算函数- #ifdef BM1422_EN
- bm1422.init();
- bm1422.isr_func(2, bm1422_isr);
- bm1422.calibrate();
- #endif
复制代码 d、main.c文件增加方位计算及方位打印- #ifdef BM1422_EN
- bm1422.get_val(mag);
- angle = atan2(mag[1], mag[0]) * (180 / 3.14159265) + 180;
- Serial.println("------ BM1422 [uT] ------");
- Serial.print("X = ");
- Serial.print(mag[0]);
- Serial.print(", Y = ");
- Serial.print(mag[1]);
- Serial.print(", Z = ");
- Serial.print(mag[2]);
- Serial.print(", Angle = ");
- Serial.print(angle);
- Serial.println();
- Serial.println();
- #endif
复制代码 e、添加数学库,添加方法自行百度,只用到atan2函数
二、运行程序并立即水平旋转模块,直到串口打印出结果
1、模块水平放置,模块X正坐标分别指向东、南、西、北四个方位
2、X正坐标指向东
3、X正坐标指向南
4、X正坐标指向西
5、X正坐标指向北
小结:
从结果看四个方位相差接近90度,x正坐标指向西时方位接近0,顺时针旋转方位角度增加
|
|