ICM42605传感器简介

ICM426056轴MEMS运动传感器是集成了3轴陀螺仪和3轴加速度计的运动跟踪器件。陀螺仪支持8个可编程满量程范围设置(从±15.625dps到±2000dps)。加速度计支持8个可编程满量程范围设置(从±2g到±16g)。该运动传感器还包含一个2KB的FIFO,可以降低串行总线接口的流量并降低功耗。通过允许系统处理器突发读取传感器数据然后进入低功耗模式实现了这一点。
ICM-42605运动传感器具有可编程数字滤波器、可编程中断、嵌入式温度传感器、20,000g抗冲击能力和EIS FSYNC支持。该运动传感器还包含I3CSM、SPI和I2C串行接口,具有1.71V至3.6V VDD工作电压范围,以及1.71V至3.6V独立VDDIO工作电压范围。ICM-42605运动传感器采用2.5mm x 3mm x 0.91mm 14引脚LGA封装。典型应用包括智能手机、平板电脑、可穿戴传感器、物联网、虚拟现实耳机和控制器。

ICM42605传感器特性

  • 陀螺仪的可编程满量程范围为±15.625°/sec、±31.25°/sec、±62.5°/sec、±125°/sec、±250°/sec、±500°/sec、±1000°/sec和±2000°/sec
  • 加速度计的可编程满量程范围为±2g、±4g、±8g和±16g
  • 低噪声模式6轴电流消耗为0.65mA
    1. 陀螺仪噪声为3.8mdps/√Hz
    2. 加速度计噪声为70µg/√Hz
  • 2KB FIFO可减少串行总线接口上的流量
  • 电子图像稳定帧同步 (EIS FSYNC) 支持
  • 用户可编程数字滤波器,用于陀螺仪、加速度计和温度传感器
  • 用户可编程中断
  • 数字输出温度传感器
  • 20,000g抗冲击能力
  • 高级计步器和事件检测 – neXt gen (APEX) 运动功能:
    1. 计步器
    2. 倾斜检测
    3. 抬起唤醒/睡眠
    4. 轻敲感测
    5. 运动唤醒
    6. 大幅运动检测
  • 12.5MHz I3CSM、1MHz I2C和24MHz SPI主机接口
  • 1.8V标称VDD工作电压
  • 符合RoHS指令的绿色器件

本文使用SPI接口读取ICM42605的数据

硬件接口

  1. 使用SPI 连接传感器的原理图
  2. 传感器SPI接口描述

    由上述描述可知:
  • SPI传输时,先传输字节高位,再传输字节低位.
  • 在时钟上升沿时锁存数据,下降沿时传输数据
  • SPI时钟最快24MHZ
  • 在执行寄存器进行读写操作时,寄存器的最高位用来表示读写

源码实现

使用STM32G030F6单片机的硬件SPI1读写传感器

  1. STM32G030F6 硬件SPI1的配置
void hal_Spi1Master_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;/* USER CODE BEGIN SPI1_Init 0 *//* Peripheral clock enable */__HAL_RCC_SPI1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**SPI1 GPIO ConfigurationPA1     ------> SPI1_SCKPA6     ------> SPI1_MISOPA7     ------> SPI1_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_6 | GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USER CODE END SPI1_Init 0 *//* USER CODE BEGIN SPI1_Init 1 *//* USER CODE END SPI1_Init 1 *//* SPI1 parameter configuration*/hspi1.Instance = SPI1;hspi1.Init.Mode = SPI_MODE_MASTER;hspi1.Init.Direction = SPI_DIRECTION_2LINES;hspi1.Init.DataSize = SPI_DATASIZE_8BIT;/*SPI_POLARITY_LOWSPI_POLARITY_HIGH*/hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;hspi1.Init.NSS = SPI_NSS_SOFT;/*SPI_BAUDRATEPRESCALER_2:   32MBits/sSPI_BAUDRATEPRESCALER_4:   16MBits/sSPI_BAUDRATEPRESCALER_8:   8MBits/sSPI_BAUDRATEPRESCALER_16:  4MBits/sSPI_BAUDRATEPRESCALER_32:  2MBits/sSPI_BAUDRATEPRESCALER_64:  1MBits/sSPI_BAUDRATEPRESCALER_128: 500KBits/sSPI_BAUDRATEPRESCALER_256: 250KBits/s*/hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi1.Init.TIMode = SPI_TIMODE_DISABLE;hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi1.Init.CRCPolynomial = 7;hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;if(HAL_SPI_Init(&hspi1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN SPI1_Init 2 *//* USER CODE END SPI1_Init 2 */}
  1. 传感器读写寄存器函数的实现
uint8_t hal_Spi1_ReadWriteByte(uint8_t txdata)
{uint8_t rxdata = 0;HAL_SPI_TransmitReceive(&hspi1, &txdata, &rxdata, 1, 5); //超时5msreturn rxdata;
}#if defined(ICM_USE_HARD_SPI)
#define ICM_RCC_SPIX_CS()    __HAL_RCC_GPIOA_CLK_ENABLE()
#define ICM_PORT_SPIX_CS     GPIOA
#define ICM_PIN_SPIX_CS      GPIO_PIN_4
#define ICM_SPI_CS_LOW()     HAL_GPIO_WritePin(ICM_PORT_SPIX_CS, ICM_PIN_SPIX_CS, GPIO_PIN_RESET)
#define ICM_SPI_CS_HIGH()    HAL_GPIO_WritePin(ICM_PORT_SPIX_CS, ICM_PIN_SPIX_CS, GPIO_PIN_SET)/*******************************************************************************
* 名    称: bsp_IcmSpixCsInit
* 功    能: Icm SPI的CS控制引脚初始化
* 入口参数: 无
* 出口参数: 无
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注:
*******************************************************************************/
void bsp_IcmSpixCsInit(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */ICM_RCC_SPIX_CS();/*Configure GPIO pins */GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Pin = ICM_PIN_SPIX_CS;HAL_GPIO_Init(ICM_PORT_SPIX_CS, &GPIO_InitStruct);HAL_GPIO_WritePin(ICM_PORT_SPIX_CS, ICM_PIN_SPIX_CS, GPIO_PIN_SET);
}/*******************************************************************************
* 名    称: Icm_Spi_ReadWriteNbytes
* 功    能: 使用SPI读写n个字节
* 入口参数: pBuffer: 写入的数组  len:写入数组的长度
* 出口参数: 无
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注:
*******************************************************************************/
static void Icm_Spi_ReadWriteNbytes(uint8_t* pBuffer, uint8_t len)
{uint8_t i = 0;#if defined(ICM_USE_HARD_SPI)for(i = 0; i < len; i ++){*pBuffer = hal_Spi1_ReadWriteByte(*pBuffer);pBuffer++;}
#endif}
#endif/*******************************************************************************
* 名    称: icm42605_read_reg
* 功    能: 读取单个寄存器的值
* 入口参数: reg: 寄存器地址
* 出口参数: 当前寄存器地址的值
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注: 使用SPI读取寄存器时要注意:最高位为读写位,详见datasheet page50.
*******************************************************************************/
static uint8_t icm42605_read_reg(uint8_t reg)
{uint8_t regval = 0;#if defined(ICM_USE_HARD_SPI)ICM_SPI_CS_LOW();reg |= 0x80;/* 写入要读的寄存器地址 */Icm_Spi_ReadWriteNbytes(&reg, 1);/* 读取寄存器数据 */Icm_Spi_ReadWriteNbytes(&regval, 1);ICM_SPI_CS_HIGH();
#elif defined(ICM_USE_HARD_I2C)#endifreturn regval;
}/*******************************************************************************
* 名    称: icm42605_read_regs
* 功    能: 连续读取多个寄存器的值
* 入口参数: reg: 起始寄存器地址 *buf数据指针,uint16_t len长度
* 出口参数: 无
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注: 使用SPI读取寄存器时要注意:最高位为读写位,详见datasheet page50.
*******************************************************************************/
static void icm42605_read_regs(uint8_t reg, uint8_t* buf, uint16_t len)
{#if defined(ICM_USE_HARD_SPI)reg |= 0x80;ICM_SPI_CS_LOW();/* 写入要读的寄存器地址 */Icm_Spi_ReadWriteNbytes(&reg, 1);/* 读取寄存器数据 */Icm_Spi_ReadWriteNbytes(buf, len);ICM_SPI_CS_HIGH();
#elif defined(ICM_USE_HARD_I2C)
#endif
}/*******************************************************************************
* 名    称: icm42605_write_reg
* 功    能: 向单个寄存器写数据
* 入口参数: reg: 寄存器地址 value:数据
* 出口参数: 0
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注: 使用SPI读取寄存器时要注意:最高位为读写位,详见datasheet page50.
*******************************************************************************/
static uint8_t icm42605_write_reg(uint8_t reg, uint8_t value)
{#if defined(ICM_USE_HARD_SPI)ICM_SPI_CS_LOW();/* 写入要读的寄存器地址 */Icm_Spi_ReadWriteNbytes(&reg, 1);/* 读取寄存器数据 */Icm_Spi_ReadWriteNbytes(&value, 1);ICM_SPI_CS_HIGH();
#elif defined(ICM_USE_HARD_I2C)
#endifreturn 0;
}
  1. 传感器初始化的实现
float bsp_Icm42605GetAres(uint8_t Ascale)
{switch(Ascale){// Possible accelerometer scales (and their register bit settings) are:// 2 Gs (00), 4 Gs (01), 8 Gs (10), and 16 Gs  (11).case AFS_2G:accSensitivity = 2000 / 32768.0f;break;case AFS_4G:accSensitivity = 4000 / 32768.0f;break;case AFS_8G:accSensitivity = 8000 / 32768.0f;break;case AFS_16G:accSensitivity = 16000 / 32768.0f;break;}return accSensitivity;
}float bsp_Icm42605GetGres(uint8_t Gscale)
{switch(Gscale){case GFS_15_125DPS:gyroSensitivity = 15.125f / 32768.0f;break;case GFS_31_25DPS:gyroSensitivity = 31.25f / 32768.0f;break;case GFS_62_5DPS:gyroSensitivity = 62.5f / 32768.0f;break;case GFS_125DPS:gyroSensitivity = 125.0f / 32768.0f;break;case GFS_250DPS:gyroSensitivity = 250.0f / 32768.0f;break;case GFS_500DPS:gyroSensitivity = 500.0f / 32768.0f;break;case GFS_1000DPS:gyroSensitivity = 1000.0f / 32768.0f;break;case GFS_2000DPS:gyroSensitivity = 2000.0f / 32768.0f;break;}return gyroSensitivity;
}/*******************************************************************************
* 名    称: bsp_Icm42605RegCfg
* 功    能: Icm42605 寄存器配置
* 入口参数: 无
* 出口参数: 无
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注:
*******************************************************************************/
int8_t bsp_Icm42605RegCfg(void)
{uint8_t reg_val = 0;/* 读取 who am i 寄存器 */reg_val = icm42605_read_reg(ICM42605_WHO_AM_I);icm42605_write_reg(ICM42605_REG_BANK_SEL, 0); //设置bank 0区域寄存器icm42605_write_reg(ICM42605_REG_BANK_SEL, 0x01); //软复位传感器ICM42605DelayMs(100);if(reg_val == ICM42605_ID){icm42605_write_reg(ICM42605_REG_BANK_SEL, 1); //设置bank 1区域寄存器icm42605_write_reg(ICM42605_INTF_CONFIG4, 0x02); //设置为4线SPI通信icm42605_write_reg(ICM42605_REG_BANK_SEL, 0); //设置bank 0区域寄存器icm42605_write_reg(ICM42605_FIFO_CONFIG, 0x40); //Stream-to-FIFO Mode(page61)reg_val = icm42605_read_reg(ICM42605_INT_SOURCE0);icm42605_write_reg(ICM42605_INT_SOURCE0, 0x00);icm42605_write_reg(ICM42605_FIFO_CONFIG2, 0x00); // watermarkicm42605_write_reg(ICM42605_FIFO_CONFIG3, 0x02); // watermarkicm42605_write_reg(ICM42605_INT_SOURCE0, reg_val);icm42605_write_reg(ICM42605_FIFO_CONFIG1, 0x63); // Enable the accel and gyro to the FIFOicm42605_write_reg(ICM42605_REG_BANK_SEL, 0x00);icm42605_write_reg(ICM42605_INT_CONFIG, 0x36);icm42605_write_reg(ICM42605_REG_BANK_SEL, 0x00);reg_val = icm42605_read_reg(ICM42605_INT_SOURCE0);reg_val |= (1 << 2); //FIFO_THS_INT1_ENABLEicm42605_write_reg(ICM42605_INT_SOURCE0, reg_val);bsp_Icm42605GetAres(AFS_8G);icm42605_write_reg(ICM42605_REG_BANK_SEL, 0x00);reg_val = icm42605_read_reg(ICM42605_ACCEL_CONFIG0);//page74reg_val |= (AFS_8G << 5);   //量程 ±8greg_val |= (AODR_50Hz);     //输出速率 50HZicm42605_write_reg(ICM42605_ACCEL_CONFIG0, reg_val);bsp_Icm42605GetGres(GFS_1000DPS);icm42605_write_reg(ICM42605_REG_BANK_SEL, 0x00);reg_val = icm42605_read_reg(ICM42605_GYRO_CONFIG0);//page73reg_val |= (GFS_1000DPS << 5);   //量程 ±1000dpsreg_val |= (GODR_50Hz);     //输出速率 50HZicm42605_write_reg(ICM42605_GYRO_CONFIG0, reg_val);icm42605_write_reg(ICM42605_REG_BANK_SEL, 0x00);reg_val = icm42605_read_reg(ICM42605_PWR_MGMT0); //读取PWR—MGMT0当前寄存器的值(page72)reg_val &= ~(1 << 5);//使能温度测量reg_val |= ((3) << 2);//设置GYRO_MODE  0:关闭 1:待机 2:预留 3:低噪声reg_val |= (3);//设置ACCEL_MODE 0:关闭 1:关闭 2:低功耗 3:低噪声icm42605_write_reg(ICM42605_PWR_MGMT0, reg_val);ICM42605DelayMs(1); //操作完PWR—MGMT0寄存器后 200us内不能有任何读写寄存器的操作return 0;}return -1;
}
  1. 读取传感器内部温度传感器
/*******************************************************************************
* 名    称: bsp_IcmGetTemperature
* 功    能: 读取Icm42605 内部传感器温度
* 入口参数: 无
* 出口参数: 无
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注: datasheet page62
*******************************************************************************/
int8_t bsp_IcmGetTemperature(int16_t* pTemp)
{uint8_t buffer[2] = {0};icm42605_read_regs(ICM42605_TEMP_DATA1, buffer, 2);*pTemp = (int16_t)(((int16_t)((buffer[0] << 8) | buffer[1])) / 132.48 + 25);return 0;
}
  1. 读取传感器加速度的值
/*******************************************************************************
* 名    称: bsp_IcmGetAccelerometer
* 功    能: 读取Icm42605 加速度的值
* 入口参数: 三轴加速度的值
* 出口参数: 无
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注: datasheet page62
*******************************************************************************/
int8_t bsp_IcmGetAccelerometer(icm42605RawData_t* accData)
{uint8_t buffer[6] = {0};icm42605_read_regs(ICM42605_ACCEL_DATA_X1, buffer, 6);accData->x = ((uint16_t)buffer[0] << 8) | buffer[1];accData->y = ((uint16_t)buffer[2] << 8) | buffer[3];accData->z = ((uint16_t)buffer[4] << 8) | buffer[5];accData->x = (int16_t)(accData->x * accSensitivity);accData->y = (int16_t)(accData->y * accSensitivity);accData->z = (int16_t)(accData->z * accSensitivity);return 0;
}
  1. 读取传感器陀螺仪的值
/*******************************************************************************
* 名    称: bsp_IcmGetGyroscope
* 功    能: 读取Icm42605 陀螺仪的值
* 入口参数: 三轴陀螺仪的值
* 出口参数: 无
* 作  者: Roger-WY.
* 创建日期: 2021-05-21
* 修    改:
* 修改日期:
* 备    注: datasheet page63
*******************************************************************************/
int8_t bsp_IcmGetGyroscope(icm42605RawData_t* GyroData)
{uint8_t buffer[6] = {0};icm42605_read_regs(ICM42605_GYRO_DATA_X1, buffer, 6);GyroData->x = ((uint16_t)buffer[0] << 8) | buffer[1];GyroData->y = ((uint16_t)buffer[2] << 8) | buffer[3];GyroData->z = ((uint16_t)buffer[4] << 8) | buffer[5];GyroData->x = (int16_t)(GyroData->x * gyroSensitivity);GyroData->y = (int16_t)(GyroData->y * gyroSensitivity);GyroData->z = (int16_t)(GyroData->z * gyroSensitivity);return 0;
}

调用以上函数即可实现对应的功能,已经实测过,没有问题.

完整的工程

可点击此处下载完整工程STM32G030硬件SPI读取ICM42605六轴运动传感器(有积分或者是会员的小伙伴可以支持一下!

PS:鉴于积分实在有点糟心,后面我把工程上传到 gitee 上了,没有积分的小伙伴可以直接去 gitee 上下载

结束语

如果觉得文章对您有帮助,请关注、点赞,谢谢!

ICM-42605 6轴MEMS加速度计陀螺仪运动传感器数据的读取相关推荐

  1. MEMS加速度计应用前景分析

    MEMS加速度计应用前景分析 MEMS加速度计的运用现状:  (1)MEMS传感器在汽车产业中的应用  (2)MEMS 运动传感器在移动电话中的应用  (3)光标或游戏机控制  (4)惯性导航  (5 ...

  2. 村田美洲推出三轴MEMS加速度传感器

    村田美洲公司宣布推出SCA3300系列三轴MEMS加速度计,适用于工业和汽车应用领域.该产品尺寸为7.6mm*8.6mm*3.3mm.该表面贴装式传感器提供1.5,3或6g的几个测量范围,提供小于10 ...

  3. 树莓派基础实验31:MPU6050陀螺仪加速度传感器实验

    一.介绍    MPU6050是世界上第一款也是唯一一款专为智能手机.平板电脑和可穿戴传感器的低功耗.低成本和高性能要求而设计的6轴运动跟踪设备.    它集成了3轴MEMS陀螺仪,3轴MEMS加速度 ...

  4. 陀螺仪,加速计,MEMS,传感器,六轴MEMS惯性测量单元,齐步走向国产化

    深迪半导体(上海)有限公司是由美国海外留学人员创立的中国设计.生产商用MEMS陀螺仪系列惯性传感器的MEMS芯片公司,成立于2008年8月,总部位于上海张江高科技园区.公司研发了拥有完全自主知识产权的 ...

  5. 【传感器大赏】6轴加速度计陀螺仪

    Grove-6 Axis AccelerometerAndGyroscope Grove - 6-Axis Accelerometer&Gyroscope 是一种把 Grove 接口和集成传感 ...

  6. ICM-42670-P六轴MEMS运动传感器无人机智能手表运动设备IMU

    TDK InvenSense品牌各类产品,可支持算法定制与开发 TDK InvenSense公司的ICM-42670-P六轴MEMS运动跟踪装置结合了一个三轴陀螺仪和一个三轴加速度计.该设备针对的是需 ...

  7. 芯片FXAS21002CQR1 (Freescale) -- 3轴 MEMS 陀螺仪

    3axis MEMS Gyroscope, 1.9V~3.6V, QFN-24. 3轴 MEMS 陀螺仪,3.3V供电.QFN24封装. QFN焊接有点麻烦,使用单片机连接或使用CP2112或CP21 ...

  8. STM32实现六轴姿态测量陀螺仪模块JY61P(标准库与HAL库实现)

    本模块支持串口采用串口实现数据采集和处理 设备型号选择 目录 设备型号选择 六轴姿态测量陀螺仪模块简介 产品概述 产品特点 引脚说明 模块UART与MCU连接 应用领域 模块与单片机的接线表设计 标准 ...

  9. 惯性导航原理(一)-航位推算+加速度计+陀螺仪+IMU+INS

    文章目录 导航定位原理分类 航位推算(Dead-Reckoning) 牛顿运动定律 惯性传感器--加速度计 力反馈原理 加速度计种类 惯性传感器--陀螺仪 转子陀螺-陀螺定轴性 振动陀螺-哥氏效应(C ...

最新文章

  1. PHP程序员如何突破成长瓶颈(转)
  2. NHibernate初学者指南(2):一个完整的例子
  3. 39页作业(还款年限—月还款额表)
  4. 爱立信:5G将加速物联网发展
  5. centos7手动更新、每天自动更新
  6. hadoop入门学习教程--DKHadoop完整安装步骤
  7. python双目视觉三维重建代码_双目立体视觉的三维重建方法与流程
  8. java调用perl脚本_Java中调用Perl脚本的应用
  9. Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
  10. 电信光猫HG2201T超级管理员模式
  11. 程序设计语言诞生——程序设计语言的发展历史
  12. excel文件分割器
  13. 驱动开发:Win10枚举完整SSDT地址表
  14. 罗克韦尔AB PLC RSLogix5000中的位指令使用方法介绍
  15. Python爬虫大众点评字体加密评论采集!听说这个网站很难?
  16. 基于麒麟SP10服务器版的Kubernetes集群安装
  17. 为什么我选择csdn写blog
  18. 隐马尔可夫模型 #博学谷IT学习技术支持#
  19. python 远程关机_Python 远程开关机
  20. 全球与中国血液透析液市场深度研究分析报告

热门文章

  1. 计算机粘贴复制快捷键,详细教你使用电脑复制粘贴快捷键
  2. 保姆式RecyclerView下拉刷新、上拉加载更多Kotlin
  3. php文件是不是死链,什么是死链?
  4. 一行代码搞定Android弧形卫星动画菜单(附Demo)
  5. 用C++操作Excel
  6. 2021年辽宁省大学生数学建模
  7. 银行储蓄管理系统 课程设计
  8. robomongo 连不上mongodb 权限问题
  9. LVGL-gui_user.c
  10. 电路与模拟电子技术第一次作业及要点(一、二两章)