潘多拉开发板——6轴传感器ICM-20608学习笔记

一、ICM20608和MPU6050的区别

1、都是InvenSense公司推出的6轴传感器。

        官方都提供了相应的SDK,在正点原子指导手册中,称官方提供了ICM20608MPL库(嵌入式运动处理库),称MPU6050自带数字运动处理器DMP( Digital Motion Processor),两者描述的不是同一种东西,但实际上后者也是MPL库,都在正点原子硬件手册中可以直接获取到。当然使用上因为是不同的系列,寄存器会有所区别。
 2、外观与原理图区别:

        ICM20608:3mm*3mm*0.75mm(16 针 LGA 封装)。

        MPU6050:4x4x0.9mm(QFN)。

        可以看到,都是用IIC通信,IIC的通信地址都是由INT引脚接单片机,由单片机对该位的更改来决定器件地址。

二、加速度计和陀螺仪的区别

         6轴传感器其实是由3轴加速度计(Accelerometer)和3轴陀螺仪(Gyroscope)组成。如何理解这两者的区别,对于应用来说,加速度计是检测物体在某个方向上所受力的作用,对于一个平面上静止的加速度计,因为受到重力的原因,另外两个轴为0时,其中必然会有一个轴是g。如果一个无人机飞行航线确认后,持续往一个方向飞(长时间来看),都需要克服重力,使得3轴加速度计的值保持相对一致。

        陀螺仪的模型中,旋转轮的相对位置是不动的,周围三个轴做旋转运动。陀螺仪正是测量周围三个轴的角速度来获取其运动状态。对于一个平面上静止的陀螺仪,陀螺仪的三轴此时都可以是0。如果一个无人机在飞的而飞的过程中,遇到天气等原因,飞机颠簸会使得陀螺仪数值发生变化(短时间来看),一旦恢复稳定,陀螺仪三轴的数值会重新归0(因为一旦静止就没有角速度了)。

三、IIC通信时序

        在正点原子硬件资料(...\7,硬件资料\4,ICM20608资料)中,提供了“ICM-20608.pdf”文件,该文件是ICM20608的数据手册,手册内容详细记录了IIC的通信时序。

        由图中可以看到,start信号开始前,“SDA和SCL都是高电平”,接着SDA延迟一段时间后先置低,最后SCL置低,而stop信号开始前,“SDA为低,SCL为高”,接着SDA延迟一段时间后先置高,SCL一直为高,实际使用时,由于SCL为硬件模拟的时钟信号,可以经过延迟一段时间后置低,方便下一次start前,SCL已经处于低电平,由star函数拉高而形成完整的时钟信号。对应如下程序中硬件模拟IIC。

        对于 Ack和NACK,由下图同样可以分析出,即在一个SCL时钟信号由低电平到高电平期间,SDA为低时即Ack,SDA为高时即NAck,。

        对于"IIC写字节"和"IIC读字节"也分别可以通过下图分析。

        “IIC写字节”:Star—器件地址+写命令bit—Ack应答—写所需寄存器—Ack应答—写入的数据—ACK应答—Stop

        “IIC读字节”:Star—器件地址+写bit命令—Ack应答—写所需寄存器—Ack应答—star—器件地址+读命令bit—Ack应答—读取返回的数据—发送Nack—Stop

四、寄存器

        寄存器可参考硬件资料(...\7,硬件资料\4,ICM20608资料)中文件“ICM-20608-G Register Maps and Description”的描述。        

        ICM20608中,除了本身的加速度计和陀螺仪数据寄存器外,在正点原子的初始化函数中,有关的寄存器如下:

寄存器地址寄存器名称寄存器功能
0x6BPWR_MGMT_1设备复位、设置各传感器模式、设置时钟源
0x6CPWR_MGMT_2

使能在低功耗模式下启用FIFO

加速度计和陀螺仪的使能和关闭

0x1BGYRO_CONFIG陀螺仪配置、陀螺仪自检和满量程范围配置
0X1CACCEL_CONFIG加速度计配置寄存器、加速度计自检和满量程范围配置
0x19SMPLRT_DIV设置采样率,4Hz-1kHz
0x38INT_ENABLE使能中断源
0x6AUSER_CTRL允许用户使能或不使能FIFO、其余bit位设置
0x23FIFO_EN决定哪个传感器的测量值被加载到FIFO缓冲区
0x37INT_PIN_CFG中断/旁路设置寄存器
0x1DACCEL_CONFIG 2

ICM20608比MPU6050多出的寄存器,配置低通滤波器

(正点原子的注释错误)

0x75WHO_AM_I标识设备的身份,默认寄存器内容为0xAF

         初始化要设置哪些寄存器,正点原子是怎么知道的?经过我查找发现,其实这些寄存器中,只有0x75、0x37这个寄存器是需要人为根据电路原理图更改的,其他寄存器在InvenSense提供的MPL库中,都已经做了初始化,电路原理图中INT默认接低电平,甚至可以直接省略0x37的初始化。

 五、初始化

        首先在初始化中,正点原子潘多拉开发板的程序是存在bug的,或者说存在用户使用错误的情况。像上文所说,正点原子对ICM寄存器赋值初始化其实是多余的,MPL库中的“mpu_mpl_init()”函数其实已经对这些进行初始化了。由于正点原子的初始化在前,如果用户想通过更改“ICM20608_Init()”内的初始化来更改加速度计、陀螺仪等量程范围,会被后续才初始的“mpu_mpl_init()”的函数改回来。因此建议可以直接将“ICM20608_Init()”函数内除了IIC初始化外全部注释处理。(如果需要使用0x75对设备进行验证,建议保留IIC初始化后的复位和唤醒语句)

        右侧图片为官方MPL库对上述寄存器进行的初始化:

        (调用路径:mpu_mpl_init() →icm_init() )

        其中比较明显的是下面这几个,基本是看见函数封装名字就猜到里面的内容了。

         这三个隐藏得比较深,其中:

        MPU_Write_Byte(MPU_INT_EN_REG, 0X00);操作0x38寄存器,icm_configure_fifo(0);通过函数内调用的set_int_enable();实现。

        MPU_Write_Byte(MPU_USER_CTRL_REG, 0X00);操作0x6A,icm_set_bypass(0);通过函数内调用i2c_write(st.hw->addr, st.reg->user_ctrl, 1, &tmp)实现。

        MPU_Write_Byte(0x1D, 1);操作0x1D,设置加速度计的低通滤波器,icm_set_accel_lpf(50)通过函数内调用i2c_write(st.hw->addr, st.reg->accel_cfg2, 1, &tmp)实现。

         同理,器件校认完毕后,需要对PWR_MGMT_1、PWR_MGMT_2的初始化,官方的MPL初始化则在初始化上文后,通过icm_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL);函数内调用i2c_write(st.hw->addr, st.reg->pwr_mgmt_2, 1, &data)实现。至此完成全部调用。

             注:由于ICM20608的各个寄存器属性都是read/write,因此也可以通过IIC读字节函数来验证内部寄存器的初始化情况。

read_Reg0x1D = MPU_Read_Byte(0x1D);

六、移植部分

       移植主要用到icm20608硬件资料的部分源代码,其中涉及到的代码原文件路径如下:

        路径1:...\7,硬件资料\4,ICM20608资\MotionDriver608\STM32F4_MD20608\Projects\eMD20608\core

        路径2:...\7,硬件资料\4,ICM20608资料\MotionDriver608\STM32F4_MD20608\Projects\eMD20608\User\src

         如果查看硬件资料里的inv_icm20608.c会发现,其实上述提到的mpu_mpl_init();并非在官方的原文件中。 正点原子在移植MPL库时,对inv_icm20608.c进行了增改。   

        将上述路径2中main.c对icm20608的相关初始化进行封装,形成了mpu_mpl_init();并放置在inv_icm20608.c,此外将main函数中while循环的相关数据读取,也进行封装,形成了u8 mpu_mpl_get_data(float *pitch,float *roll,float *yaw);并放置在inv_icm20608.c,最后调用MPL库中的欧拉角函数获取欧拉角。

         

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
全志T3开发板是一块能够帮助嵌入式初学者进行学习和测试的开发板。该开发板采用了全志公司推出的T3芯片作为主控芯片,拥有强大的处理性能和丰富的硬件接口,非常适合初学者进行嵌入式开发。 在使用全志T3开发板进行学习和测试时,首先需要熟悉该开发板的硬件接口和功能。该开发板提供了丰富的硬件接口,包括GPIO口、SPI口、I2C口、UART口等,这些接口可以用于连接外部硬件模块,实现各种功能。同时,该开发板还具备WiFi和蓝牙功能,方便进行网络通信。 接下来,可以选择一个简单的嵌入式项目进行学习和测试。例如,可以通过GPIO口控制LED灯的亮灭,通过SPI口读取传感器数据等。在这个过程中,需要学习如何使用开发板的各种硬件接口和相应的编程语言,例如C语言或Python。可以查阅开发板的相关文档和教程,以及互联网上的资源,来学习如何编写代码、调试和测试。 此外,全志T3开发板还支持Linux和Android系统,可以学习如何在这些系统上进行嵌入式开发。通过学习和测试,可以深入理解嵌入式系统的原理和开发方法,提升自己的嵌入式开发能力。 总之,全志T3开发板是一块非常适合嵌入式初学者进行学习和测试的开发板。通过学习和测试,可以掌握嵌入式开发的基础知识和技能,并在实践中逐渐提升自己的嵌入式开发水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碎步湖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值