|
ICM-42670-P是TDK InvenSense公司推出的一款高性能六轴惯性测量单元传感器,该IMU集成了三轴陀螺仪和三轴加速度计,专为高精度运动跟踪和姿态感知应用设计。ICM-42670-P传感器采用先进的MEMS制造工艺,具备出色的稳定性、低噪声和低功耗特性,能够在复杂环境下提供可靠的动态运动数据。其紧凑的封装设计和高度集成的架构使其广泛适用于消费电子、可穿戴设备、无人机、智能导航以及工业自动化等领域。ICM-42670-P 支持多种工作模式和灵活的接口配置,便于系统集成与开发,同时具备强大的温度补偿和校准功能,确保在不同工况下的测量精度和长期运行的可靠性。作为物联网和智能设备中关键的感知组件,ICM-42670-P 为各类应用场景提供了精准、实时的运动感知解决方案。该传感器非常适用于可穿戴设备、耳戴式设备、游戏控制器、机器人、无人机和智能家居电器应用。
在本篇帖子中,我们将主要介绍使用NUCLEO-G070开发板通过SPI方式读取YBX-ICM42670P模块的数据,实现读取加速度计和陀螺仪的原始数据。
所需的组件 ● NUCLEO-G070开发板 ● YBX-ICM42670P六轴惯性测量单元模块(淘宝链接) ● 连接跳线 ● USB线缆 ● STM32CubeMX工具 ● 友善串口调试助手
YBX-ICM42670P六轴惯性测量单元模块 YBX-ICM42670P模块是一板科技推出的模块扩展板,采用TDK InvenSense 6轴MEMS运动传感器ICM-42670-P。该传感器模块支持SPI和I2C接口方式,板载电源LDO,支持3.3V和5V电源输入,同时引出两个中断引脚。
硬件连接 YBX-ICM42670P传感器模块连接到NUCLEO-G070RB的SPI1接口,对应的引脚分别是PA5(SCK)、PA6(MISO)和PA7(MOSI),片选引脚CSB连接到PB0。模块的VCC连接到+5V引脚,GND引脚连接到NUCLEO-G070RB的任意GND引脚。 然后配置中断引脚,传感器模块的INT1引脚连接至NUCLEO-G070RB开发板的PC7(D9)引脚,用于数据准备完成的中断输入引脚。
使用跳线按照以上示例图连接模块和开发板。
STM32CubeMX工具配置 STM32CubeMX工具是ST提供的一个免费的软件配置工具,它提供了一些工程模板,可以快速创建基于MCU、开发板以及示例程序的工程。使用该工具,我们可以快速新建一个基于NUCLEO-G070开发板的工程。
首先打开STM32CubeMX工具,点击ACCESS TO BOARD SELECTOR,在弹出的界面中找到NUCLEO-G070RB开发板,然后点击右上角的Start Project。
在Pinout布局中,已经初始化好RCC、Debug、UART2、LED等外设。 我们使用SPI1外设连接传感器模块,设置SPI1的模式为Full Duplex Master,将A5、PA6和PA7分别设为SPI1_SCK、SPI1_MISO和SPI1_MOSI。然后将PB0定义为CS输出。然后根据手册中的SPI时序图,设置SPI通讯的参数。 注意,SPI的时钟频率不能超过12MHz。
将PC7设置成外部输入中断GPIO_EXIT7,并勾选启用中断服务函数。
最后,生成基于Keil MDK的工程文件。
驱动文件 TDK提供了基于ICM-42670-P的驱动文件和示例代码,可以在Github进行下载:motion.mcu.icm42670p.driver。也可以在TDK的官网页面下载。
代码 TDK的驱动文件中包含多个示例代码,我们选择基于raw代码进行移植,该代码采用API函数直接读取寄存器的方式采集数据,产生中断后读取数据。以下是代码: - printf("\nYBX-ICM42670P SPI Test\n");
- printf("Yiboard Studio\n");
-
- rc |= setup_mcu();
- SI_CHECK_RC(rc);
- INV_MSG(INV_MSG_LEVEL_INFO, "###");
- INV_MSG(INV_MSG_LEVEL_INFO, "### Example Raw");
- INV_MSG(INV_MSG_LEVEL_INFO, "###");
- /* Reset commands interface states */
- print_si = 1;
- print_lsb = 0;
- fifo_en = 0;//1;
- hires_en = 1;
- use_ln = 1;
- rc |= setup_imu();
- SI_CHECK_RC(rc);
- /* Reset timestamp and interrupt flag */
- int1_flag = 0;
- int1_timestamp = 0;
-
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
-
- /* Poll device for data */
- if (int1_flag) {
- si_disable_irq();
- /* Clear interrupt flag */
- int1_flag = 0;
- si_enable_irq();
- if (fifo_en)
- rc |= inv_imu_get_data_from_fifo(&imu_dev);
- else
- rc |= inv_imu_get_data_from_registers(&imu_dev);
- SI_CHECK_RC(rc);
- rc = 0; /* reset `rc` (contains the number of packet read if above check is passing) */
- }
-
- }
复制代码
输出结果 使用USB线缆给NUCLEO-G070开发板上电,然后将代码上传至开发板,打开友善串口调试助手,选择正确的端口号,设置波特率115200,在串口中应该能显示数据:
以上就是NUCLEO-G070开发板读取YBX-ICM42670P模块的全部内容,如果有任何疑问,请随时在本帖下面回复。
|