完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
BNO055很牛逼,买一个来摸一摸。集成了自己的磁力计,不需要再学习去文档外围电路,9轴陀螺能比6轴获取更多的信息,数据的准确率也很高,最重要的,而且这个模块有详细的官方说明,博世还写了快速使用手册,这极大的方便了使用,延长了产品的设计周期,是用户在消费电子领域最重要的原因之一,总之50块的价格绝对不吃亏。虽然
准备 第一批BNO055肯定会出手相对于传统的PU6XXX要而且贵上的我也说过了,但是用过的人多好。 另外,STM32开发板,仿真器,我的这些模块不用多说了,是你有基本的STM32开发能力的,使用 前导认识 这里我使用HAL库+MX编程,标准库或者编程方法的原理都一样,甚至德州仪器和NXP的单片机,移植都是类似的,走一个05号的官方文档是在这里进行参考官方的API快速开发和应用 的,另一个是用户指南上的快速手,非常简单重要的是附加了手教的步骤,非常适合您使用 API 介绍和支持的关键步骤: BNO055 是一种微封装系统(SiP)芯片,包含一个 3 轴 14 位加速计,一个 3 轴 16 位陀螺仪,一个 3 轴磁力计,和一个 BSX3.0 FusionLib 软件的 Cortex M0 +除了可以访问不同的传感器,如加速,和强度)之外,传感器还提供发射器模式(包括五种的传感模式) 。一看就知道,由于芯片中集成M0+的情况,这让Cortex很快低了它的结果,我们输出的集成处理的能力,所以通常使用它自带的融合模式,减轻了外部处理的更多处理压力,单元的应用领域广泛。 融合模式:
程序。 假设,比如我的代码就是这样,当然可以全部放出,这是该有的部分: #include "main.h" #include "i2c.h" #include "usart.h" #include "gpio.h" MX_GPIO_Init(); MX_I2C1_Init(); MX_USART1_UART_Init(); 其实主要的东西就是两个头文件,那个C文件是演示如何使用的,我们用不到。下载后复制这个头文件到自己的工程中,直接把官方文件夹拷贝到你的工程文件夹中,然后帮助到下面这样 : 第2步:创建BNO的句柄结构体,这个句柄将装载BNO055的各种配置数据。但是这个结构体类型的声明在头文件里,所以首先我们需要添加头文件,再按照说明声明句柄: #include "bno055.h" struct bno055_t myBNO; //全局变量 第3步:给这个控制块的结构体成员赋值,或者说传参更准确。这是最最关键的一步,这一步有问题的话一定会出玄学问题。我们进入结构体定义的地方看看: struct bno055_t { u8 chip_id; /**< chip_id of bno055 */ u16 sw_rev_id; /**< software revision id of bno055 */ u8 page_id; /**< page_id of bno055 */ u8 accel_rev_id; /**< accel revision id of bno055 */ u8 mag_rev_id; /**< mag revision id of bno055 */ u8 gyro_rev_id; /**< gyro revision id of bno055 */ u8 bl_rev_id; /**< boot loader revision id of bno055 */ u8 dev_addr; /**< i2c device address of bno055 */ BNO055_WR_FUNC_PTR; /**< bus write function pointer */ BNO055_RD_FUNC_PTR; /** }; 其实我们这一步是给最后三个成员进行配置,可以看到是三个宏,我们再转到宏定义的地方: /***************************************************************/ /**name BUS READ AND WRITE FUNCTIONS */ /***************************************************************/ #define BNO055_WR_FUNC_PTR s8 (*bus_write) (u8, u8, u8 *, u8) #define BNO055_BUS_WRITE_FUNC(dev_addr, reg_addr, reg_data, wr_len) bus_write(dev_addr, reg_addr, reg_data, wr_len) #define BNO055_RD_FUNC_PTR s8 (*bus_read)(u8, u8, u8 *, u8) #define BNO055_BUS_READ_FUNC(dev_addr, reg_addr, reg_data, r_len) bus_read(dev_addr, reg_addr, reg_data, r_len) #define BNO055_DELAY_RETURN_TYPE void #define BNO055_DELAY_PARAM_TYPES u32 #define BNO055_DELAY_FUNC(delay_in_msec) delay_func(delay_in_msec) 从变量的简写就已经很清晰了吧,两个结构体成员是为了和用户的IIC读写函数进行对接的,应该传入用户IIC读写函数的地址,也就是函数名,我们已经有读写函数了,那就是HAL库的读写函数,但是这个读写函数是不符合要求的,参数的数量和意义与API需要的函数都有些出入,所以我们需要定义一个用户函数,用来对接用户函数和模块API。 s8 BNO_read(u8 dev_addr,u8 reg_addr,u8 *reg_data,u8 wr_len) { HAL_StatusTypeDef ret; ret = HAL_I2C_Mem_Read(&hi2c1, dev_addr << 1, reg_addr, sizeof(reg_addr), reg_data, wr_len, 0xFF); return 0; } s8 BNO_write(u8 dev_addr,u8 reg_addr,u8 *reg_data,u8 wr_len) { HAL_StatusTypeDef ret; ret = HAL_I2C_Mem_Write(&hi2c1, dev_addr << 1, reg_addr, sizeof(reg_addr), reg_data, wr_len, 0xFF); return 0; } 这个也很好理解,函数指针的类型必须和API指定的类型一致,剩下的就是把对应的参数填入HAL库的IIC读写函数,这里使用STM32平台进行移植的读者需要注意两点,第一点就是,写函数必须使用HAL_I2C_Mem_Write(),函数的作用是在阻塞状态下向器件写入大量数据,同理,读函数也需要HAL_I2C_Mem_Read(),而不是HAL库的主机读写模式:HAL_I2C_Master_Transmit和HAL_I2C_Master_Receive;第二点就是,STM32的HAL库的读写函数并不会自动移位,所以我们需要在器件地址上手动左移2位。然后就可以将函数指针传入API的初始化句柄了: myBNO.bus_read = BNO_read; //再main函数中进行 myBNO.bus_write = BNO_write; myBNO.delay_msec = HAL_Delay; myBNO.dev_addr = BNO055_I2C_ADDR1; 这里我直接把第4步一起做了。 第4步,关于地址的头文件在bno055.h头文件中定义 /* bno055 I2C Address */ #define BNO055_I2C_ADDR1 (0x28) #define BNO055_I2C_ADDR2 (0x29) 这里主要看模块的IIC_Arr引脚,如果拉低就是0x28的器件地址,拉高就是0x29。 第5步,初始化配置 bno055_init(&myBNO); 第6步,自检并设置模式 bno055_set_sys_rst(BNO055_BIT_ENABLE); HAL_Delay(700); bno055_set_operation_mode(BNO055_OPERATION_MODE_IMUPLUS); 模式的宏定义也在头文件 如果要读融合数据的角度,定义储存三轴角度的结构体,然后调用官方函数: while(1) { bno055_get_gyro_calib_stat(&gyro_calib_status); if (gyro_calib_status == 3) { break; } HAL_Delay(500); HAL_UART_Transmit(&huart1, (uint8_t *)waiting, sizeof(waiting), 0xFF); } 注意这个在main函数中,但是不在while(1)的死循环中,目的是判断获取是否成功。比如这里我要读取Gyro陀螺仪,那么就要等到设置完毕才可以继续。所以就有了这个判断过程。 可以开始读取数据了: while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); s8 stat = bno055_convert_float_euler_hpr_deg(&buff); if (stat == BNO055_SUCCESS) //接收成功 { sprintf(temp, "%.1f, %.1f, %.1frn", buff.h, buff.r, buff.p); HAL_UART_Transmit(&huart1, (uint8_t *)temp, sizeof(temp), 0xFF); } else //接收失败 { HAL_UART_Transmit(&huart1, (uint8_t *)error, sizeof(error), 0xFF); } //HAL_Delay(50); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } 总结 对于应用BNO055来说还是很简单的,主要是没有MPU6XXX那样的漂移,并且数据稳定,传输速度较快,自动融合,自带滤波,这些特性使它成为了现在比较优秀的民用陀螺仪传感器。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:08 , Processed in 1.023624 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号