旧乡故客
发表于: 2024-11-12 14:49:11 | 显示全部楼层

ICM-40609-D是一款高性能的六轴MEMS传感器芯片,集成了一个3轴加速度计和一个3轴陀螺仪,专为无人机市场设计。可以替代之前的ICM-42688、ICM-20602、MPU6500等。该芯片采用先进的MEMS技术制造,具有体积小、功耗低、精度高等特点。其内部结构紧凑,集成度高,能够实时监测物体的运动状态,为各类应用提供精确的数据支持。


在本篇帖子中,我们将使用NUCLEO-G070开发板通过SPI方式读取YBX-ICM40609D模块的数据。该传感器是一个三轴加速度计,可输出X、Y和Z三个方向的加速度值,非常适用于工业应用,可以轻松、稳定和准确地进行惯性和振动测量。


所需的组件

●  NUCLEO-G070开发板

●  YBX-ICM40609D传感器模块

●  连接跳线

●  STM32CubeMX工具

●  友善串口调试助手


YBX-ICM40609D传感器模块简介

YBX-ICM40609D模块采用TDK公司的最新一代高性能六轴MEMS惯性测量组件传感器ICM-40609-D。该传感器采用先进的架构设计,可提高IMU的性能和温度准确性,使其成为在可能经历高温变化的长时间飞行过程中控制平台稳定性的理想无人机解决方案。


ICM-40609-D的最大输出数据速率ODR为32KHz,是消费级设备中可用的最佳采样率。能够以如此高的ODR捕获数据,让客户能够轻松发现飞行过程中需要解决的任何异常或错误。加速度全量程范围也已增加到32g,可以轻松跟踪相当大的线性运动。


该模块支持SPI和I2C接口进行系统集成,可以快速实现与Arduino和STM32等控制器直接相连。该模块板载一颗电源芯片,支持3.3-5V供电。

YBX-ICM40609D六轴惯性测量单元模块.jpg

硬件连接

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

YBX-ICM40609-D模块通过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。然后将PB2定义为CS输出。然后根据手册中的SPI时序图,设置SPI通讯的参数。

注意,SPI的时钟频率不能超过12MHz


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


驱动文件

TDK未提供ICM-40609-D的驱动文件和示例代码,我们需要进行代码移植,在官网提供了DK-40609-D SmartMotion eMD代码,下载并对其中的代码进行优化移植。

注意:代码中的ICM406XX_FIFO_MIRRORING_SIZE需要重新定义为2081

ICM406XX_FIFO_MIRRORING_SIZE.jpg

代码

打开工程文件,将移植的驱动文件添加工程文件中。本文的代码采用FIFI读取的方式,数据区满时进入中断。以下是代码:

  1. printf("\nICM-40609-D SPI Test\n");
  2.   printf("Bolgen Studio\n");
  3.            
  4.   inv_icm406xx_sleep_ms(1000);
  5.         
  6.   /* Initialize MCU hardware */
  7.   rc = setup_mcu(&icm406xx_serif);
  8.   check_rc(rc, "Error while setting up MCU");

  9.   /* Initialize Icm406xx */
  10.   rc = setup_inv_device(&icm406xx_serif);
  11.   check_rc(rc, "error while setting up INV device");
  12.          
  13.   /* Configure Icm406xx */
  14.   rc = configure_inv_device((uint8_t)IS_LOW_NOISE_MODE, ICM406XX_ACCEL_CONFIG0_FS_SEL_4g,
  15.                             ICM406XX_GYRO_CONFIG0_FS_SEL_2000dps, ICM406XX_ACCEL_CONFIG0_ODR_1_KHZ,
  16.                             ICM406XX_GYRO_CONFIG0_ODR_1_KHZ);

  17.   check_rc(rc, "error while configuring INV device");

  18.   do
  19.   {
  20.     /* Poll device for data */
  21.     if (irq_from_device & TO_MASK(INV_GPIO_INT1))
  22.     {
  23.       rc = get_data_from_inv_device();
  24.       check_rc(rc, "error while processing FIFO");

  25.       //      inv_disable_irq();
  26.       irq_from_device &= ~TO_MASK(INV_GPIO_INT1);
  27.       //      inv_enable_irq();
  28.     }

  29.   } while (1);
复制代码

输出结果

将代码上传至开发板,打开串口工具,设置波特率115200,在串口中应该能显示数据:

输出结果.jpg


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

本版积分规则

主题 14 | 回复: 14



手机版|

GMT+8, 2024-12-22 00:57 , Processed in 0.064165 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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