当前位置: 首页 > ds >正文

基于亚博K210开发板——六轴姿态传感器 icm20607陀螺仪读取原始数据测试

开发板

亚博K210开发板
在这里插入图片描述

实验目的

本次测试主要学习 K210 通过 I2C 读取 ICM20607 芯片的 X/Y/Z 轴原始数据。

实验准备

实验元件

六轴姿态传感器 icm20607
在这里插入图片描述

元件特性

ICM20607 是一个六轴运动跟踪设备,它结合了一个 3 轴陀螺仪和一个 3 轴加速度计,具有 1K 字节的 FIFO,可以降低串行总线接口上的流量,并通过允许系统处理器突发读写传感器数据,然后进入低功耗模式来降低功耗。ICM20607 的陀螺仪可编程的范围为±250、±500、±1000 和±2000 度/秒,加速度计的全量程为±2g、±4g、±8g 和±16g。ICM20607 包含芯片上 16 位 ADC,可编程数字滤波器,嵌入式温度传感器和可编程中断,支持 I2C 和 SPI 通讯,VDD 操作范围为1.71V~3.45V。

陀螺仪特性

三轴 MEMS 陀螺仪在 ICM-20607 包括以下特点:

•数字输出 X、Y、Z 轴角速度传感器(陀螺仪),用户可编程的全量程范围为±250、±500、±1000 和±2000°/秒,集成 16 位 adc
•数字可编程低通滤波器
•低功耗陀螺仪操作
•工厂标定的灵敏度标度因子
•自测

三轴 MEMS 加速度计在 ICM-20607 包括以下特点:

•数字输出 X、Y、z 轴加速度计,可编程全量程范围为±2g、±4g、±8g、±16g,集成 16 位 adc
•可编程中断
•Wake-on-motion
•自测

硬件连接

ICM20607 芯片使用 I2C 连接的方式,I2C_SCL 连接的是 IO9,I2C_SDA 连接的是O10,MPU_INT 连接的是 IO11。
在这里插入图片描述

SDK 中对应 API 功能

以头文件 i2c为例

  • I2C 总线用于和多个外部设备进行通信。多个外部设备可以共用一个 I2C 总线。
  • I2C 模块具有独立的 I2C 设备封装外设相关参数,自动处理多设备总线争 用的功能。
  • K210 芯片集成电路总线有 3个 I2C总线接口,都可以作为 I2C 主机(MASTER) 模式或从机(SLAVE)模式来使用。
  • I2C 接口支持标准模式(0 到 100kb/s),快速模式(<=400kb/s),7 位或10 位寻址模式,批量传输模式,中断或轮询模式操作。
• i2c_init:初始化 I2C,配置从机地址、寄存器位宽度和 I2C 速率。
• i2c_init_as_slave:配置 I²C 为从模式。
• i2c_send_data:I2C 写数据。
• i2c_send_data_dma:I2C 通过 DMA 写数据。
• i2c_recv_data:I2C 通过 CPU 读数据。
• i2c_recv_data_dma:I2C 通过 dma 读数据。
• i2c_handle_data_dma:I2C 使用 dma 传输数据。

实验原理

  • 陀螺仪工作的原理:陀螺仪是基于角动量守恒的理论设计出来的一种用来传感与维持方向的装置。陀螺仪主要是由一个位于轴心且可旋转的转子构成,物体高速旋转时,角动量很大,旋转轴会一直稳定指向一个方向,所以陀螺仪的转动速度必须转的够快,不然会影响它的稳定性。
  • 加速度计工作的原理:加速度计是一种惯性传感器,能够测量物体的加速力。
  • 技术成熟的 MEMS 加速度计分为三种:压电式、容感式、热感式。压电式 MEMS加速度计运用的是压电效应,在其内部有一个刚体支撑的质量块,有运动的情况下质量块会产生压力,刚体产生应变,把加速度转变成电信号输出。
  • 容感式 MEMS 加速度计内部也存在一个质量块,从单个单元来看,它是标准的平板电容器。加速度的变化带动活动质量块的移动从而改变平板电容两极的间距和正对面积,通过测量电容变化量来计算加速度。
  • 热感式 MEMS 加速度计内部没有任何质量块,它的中央有一个加热体,周边是温度传感器,里面是密闭的气腔,工作时在加热体的作用下,气体在内部形成一个热气团,热气团的比重和周围的冷气是有差异的,通过惯性热气团的移动形成的热场变化让感应器感应到加速度值。
  • 由于压电式 MEMS 加速度计内部有刚体支撑的存在,通常情况下,压电式 MEMS加速度计只能感应到“动态”加速度,而不能感应到“静态”加速度,也就是我们所说的重力加速度。而容感式和热感式既能感应“动态”加速度,又能感应“静态”加速度。

实验过程

  1. 首先初始化 K210 的硬件引脚和软件功能使用的是FPIOA 映射关系。
#define PIN_ICM_SCL             (9)
#define PIN_ICM_SDA             (10)
#define PIN_ICM_INT             (11)/*****************************SOICMWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define ICM_INT_GPIONUM         (2)/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_ICM_INT             (FUNC_GPIOHS0 + ICM_INT_GPIONUM)
#define FUNC_ICM_SCL             (FUNC_I2C0_SCLK)
#define FUNC_ICM_SDA             (FUNC_I2C0_SDA)
void hardware_init(void)
{/* I2C ICM20607 */fpioa_set_function(PIN_ICM_SCL, FUNC_ICM_SCL);fpioa_set_function(PIN_ICM_SDA, FUNC_ICM_SDA);
}
  1. 初始化 ICM20607 芯片,首先是先让设备复位,然后读取设备 ID 看看是否匹配,接下来是一系列的写入寄存器的操作,这里可以根据实际修改参数,详细的初始化流程及寄存器的作用可以查看硬件资料中的 icm20607 资料
void icm20607_init(void)
{uint8_t val = 0x0, res = 1;i2c_hardware_init(ICM_ADDRESS); // 初始化msleep(10);icm_i2c_write(PWR_MGMT_1, 0x80); //复位设备msleep(100);icm20607_who_am_i();do{ //等待复位成功icm_i2c_read(PWR_MGMT_1, &val, 1);} while(0x41 != val);icm_i2c_write(PWR_MGMT_1, 0x01);     //时钟设置icm_i2c_write(PWR_MGMT_2, 0x00);     //开启陀螺仪和加速度计icm_i2c_write(CONFIG, 0x01);         //176HZ 1KHZicm_i2c_write(SMPLRT_DIV, 0x07);     //采样速率 SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV)icm_i2c_write(GYRO_CONFIG, 0x18);    //±2000 dpsicm_i2c_write(ACCEL_CONFIG, 0x10);   //±8gicm_i2c_write(ACCEL_CONFIG_2, 0x23); //Average 8 samples   44.8HZreturn res;
}
  1. 判断是否是 ICM20607 芯片,从 ICM20607 的 WHO_AM_I 寄存器读出值,然后对比是 ICM20607 的 ID 就行了。
void icm20607_who_am_i(void)
{uint8_t val, state = 1;do{icm_i2c_read(ICM_WHO_AM_I, &val, 1);  // 读ICM20607的IDif (ICM20607_ID != val & state)  // 当ID不对时,只报一次。{printf("WHO_AM_I=0x%02x\n", val);state = 0;}} while(ICM20607_ID != val);printf("WHO_AM_I=0x%02x\n", val);
}
  1. 获取陀螺仪 X 轴的原始数据,直接从陀螺仪的 X 轴输出寄存器从读取两个数据,然后再按照高低位的方式把数据合成最终需要的数据。
int16_t getRawGyroscopeX(void) {uint8_t val[2] = {0};icm_i2c_read(GYRO_XOUT_H, val, 2);return ((int16_t)val[0] << 8) + val[1];
}
  1. 读取陀螺仪 Y 轴和 Z 轴的原始数据也是同样的步骤
/* 读取陀螺仪Y轴原始数据 */
int16_t getRawGyroscopeY(void) {uint8_t val[2] = {0};icm_i2c_read(GYRO_YOUT_H, val, 2);return ((int16_t)val[0] << 8) + val[1];
}/* 读取陀螺仪Z轴原始数据 */
int16_t getRawGyroscopeZ(void) {uint8_t val[2] = {0};icm_i2c_read(GYRO_ZOUT_H, val, 2);return ((int16_t)val[0] << 8) + val[1];
}
  1. 利用同样的方法,也可以读取加速度计的 X/Y/Z 轴的原始数据。
/* 读取加速度计X轴原始数据 */
int16_t getRawAccelerationX(void) {uint8_t val[2] = {0};icm_i2c_read(ACCEL_XOUT_H, val, 2);return ((int16_t)val[0] << 8) + val[1];
}/* 读取加速度计Y轴原始数据 */
int16_t getRawAccelerationY(void) {uint8_t val[2] = {0};icm_i2c_read(ACCEL_YOUT_H, val, 2);return ((int16_t)val[0] << 8) + val[1];
}/* 读取加速度计Z轴原始数据 */
int16_t getRawAccelerationZ(void) {uint8_t val[2] = {0};icm_i2c_read(ACCEL_ZOUT_H, val, 2);return ((int16_t)val[0] << 8) + val[1];
}
  1. 最后是把对应的数据打印出来,这里可以选择打印陀螺仪的数据还是加速度计的数据,默认是打印陀螺仪的数据,可以通过修改 GYRO_DATA 和 ACC_DATA的值来改变显示的设备数据
#define GYRO_DATA     0
#define ACC_DATA      1
    while (1){GetDataFromInvDevice(&imu_event);#if GYRO_DATAval_gx = imu_event.gyro[0];val_gy = imu_event.gyro[1];val_gz = imu_event.gyro[2];printf("gx=%d\t,gy=%d\t,gz=%d\n",val_gx,val_gy,val_gz);#elif ACC_DATAval_ax = imu_event.accel[0];val_ay = imu_event.accel[1];val_az = imu_event.accel[2];printf("ax=%d\t,ay=%d\t,az=%d\n",val_ax,val_ay,val_az);#endifmsleep(5);}
  1. 编译调试,烧录运行
    进入自己项目 build目录,运行以下命令编译。
cmake .. -DPROJ=watchdog -G "MinGW Makefiles"
make

实验现象

烧录完成固件后,系统会弹出一个终端界面,如果没有弹出终端界面的可以打开串口助手显示调试内容。

在这里插入图片描述

实验总结

  • ICM20607 芯片是一个六轴传感器芯片,里面包含一个三轴陀螺仪和一个三轴加速度计。
  • 陀螺仪和加速度计在使用前需要初始化,否则无法正常使用。
  • 本次 icm20607 使用的是 I2C 通讯的方式传输数据,也可以使用 SPI 传输数据的方式。
http://www.xdnf.cn/news/6887.html

相关文章:

  • freertos中xTaskCreate和vTaskDelete详解
  • 如何提高redis缓存命中率
  • display:grid网格布局属性说明
  • 运营级 印度Rummy源码
  • 收放卷“材料停机减速距离“计算FC(算法公式+ST源代码+C++代码)
  • 考研数学微分学(第一讲)
  • 线程和进程
  • std::tuple 用法
  • yocto项目例子
  • 单元化架构
  • AutoCompose - 携程自动编排框架的简单介绍
  • 昇腾NPU环境搭建
  • FC7300 IO 无法正常输出高低电平问题排查
  • C++:赋值重载
  • 开放世界地形渲染:以三角洲行动为例(下篇)
  • 集星云推碰一碰:跨平台发布与源码定制全解析OEM源码部署
  • 携程token纯算分析
  • 【程序员AI入门:模型】19.开源模型工程化全攻略:从选型部署到高效集成,LangChain与One-API双剑合璧
  • 【匹配】Gotoh
  • RoboDual-上海交大-2025-2-6-开源
  • PCIe Switch 问题点
  • 【知识产权出版社-注册安全分析报告-无验证方式导致安全隐患】
  • 文章记单词 | 第82篇(六级)
  • 如何与“不安”和平共处?
  • 召回12:曝光过滤 Bloom Filter
  • 03算法学习_977、有序数组的平方
  • 经典案例 | 筑基与跃升:解码制造企业产供销协同难题
  • Go语言之路————并发
  • 【基础】Windows开发设置入门5:WinGet开发者完全指南(AI整理)
  • Spring 框架中适配器模式的五大典型应用场景