旧乡故客
发表于: 2026-5-16 10:36:29 | 显示全部楼层

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六轴惯性测量单元模块.jpg


硬件连接

YBX-ICM42670P传感器模块连接到NUCLEO-G070RB的SPI1接口,对应的引脚分别是PA5(SCK)、PA6(MISO)和PA7(MOSI),片选引脚CSB连接到PB0。模块的VCC连接到+5V引脚,GND引脚连接到NUCLEO-G070RB的任意GND引脚。

然后配置中断引脚,传感器模块的INT1引脚连接至NUCLEO-G070RB开发板的PC7(D9)引脚,用于数据准备完成的中断输入引脚。

YBX-ICM42670模块通过SPI接口与STM32 Nucleo的硬件连接.jpg

使用跳线按照以上示例图连接模块和开发板。


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,并勾选启用中断服务函数。

STM32CubeMX配置参数.jpg


最后,生成基于Keil MDK的工程文件。


驱动文件

TDK提供了基于ICM-42670-P的驱动文件和示例代码,可以在Github进行下载:motion.mcu.icm42670p.driver。也可以在TDK的官网页面下载。


代码

TDK的驱动文件中包含多个示例代码,我们选择基于raw代码进行移植,该代码采用API函数直接读取寄存器的方式采集数据,产生中断后读取数据。以下是代码:

  1. printf("\nYBX-ICM42670P SPI Test\n");
  2.   printf("Yiboard Studio\n");
  3.         
  4.         rc |= setup_mcu();
  5.         SI_CHECK_RC(rc);

  6.         INV_MSG(INV_MSG_LEVEL_INFO, "###");
  7.         INV_MSG(INV_MSG_LEVEL_INFO, "### Example Raw");
  8.         INV_MSG(INV_MSG_LEVEL_INFO, "###");

  9.         /* Reset commands interface states */
  10.         print_si  = 1;
  11.         print_lsb = 0;
  12.         fifo_en   = 0;//1;
  13.         hires_en  = 1;
  14.         use_ln    = 1;

  15.         rc |= setup_imu();
  16.         SI_CHECK_RC(rc);

  17.         /* Reset timestamp and interrupt flag */
  18.         int1_flag      = 0;
  19.         int1_timestamp = 0;
  20.         
  21.   /* USER CODE END 2 */

  22.   /* Infinite loop */
  23.   /* USER CODE BEGIN WHILE */
  24.   while (1)
  25.   {
  26.     /* USER CODE END WHILE */

  27.     /* USER CODE BEGIN 3 */
  28.                                 
  29.                 /* Poll device for data */
  30.                 if (int1_flag) {
  31.                         si_disable_irq();
  32.                         /* Clear interrupt flag */
  33.                         int1_flag = 0;
  34.                         si_enable_irq();

  35.                         if (fifo_en)
  36.                                 rc |= inv_imu_get_data_from_fifo(&imu_dev);
  37.                         else
  38.                                 rc |= inv_imu_get_data_from_registers(&imu_dev);

  39.                         SI_CHECK_RC(rc);
  40.                         rc = 0; /* reset `rc` (contains the number of packet read if above check is passing) */
  41.                 }
  42.                
  43.   }
复制代码

输出结果

使用USB线缆给NUCLEO-G070开发板上电,然后将代码上传至开发板,打开友善串口调试助手,选择正确的端口号,设置波特率115200,在串口中应该能显示数据:

输出结果.jpg


以上就是NUCLEO-G070开发板读取YBX-ICM42670P模块的全部内容,如果有任何疑问,请随时在本帖下面回复。


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 25 | 回复: 28



手机版|

GMT+8, 2026-10-26 12:37 , Processed in 0.234524 second(s), 3 queries , Gzip On, Redis On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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