目录

MPU-6050

MPU-6050是InvenSense生产的六轴运动跟踪芯片, 芯片尺寸4×4×0.9mm, QFN封装. 整合了三轴陀螺仪, 三轴加速度计, 片内温度传感器和数字运动处理器(DMP), 可以使用I2C接口外接三轴电子罗盘的输入,提供完整的九轴运动融合输出.

MPU-6050包含6个16位ADC, 3个用于陀螺仪输出, 3个用于加速度计输出. 用户可以设置的陀螺仪满量程范围为±250,±500,±1000,±2000°/秒(dps), 可设置的加速度计满量程范围为±2g, ±4g, ±8g和±16g. 通信使用 400kHz的 I2C接口或 1MHz的 SPI接口(SPI仅MPU-6000可用).

模块与STC8H的接线

市面上的模块, 一般是8个pin脚, 如果只是获取6轴采样和温度, 与STC8H只需要连接4根线

    P32   -> SCL
P33 -> SDA
GND -> GND
3.3V -> VCC

未连接的其它4个pin分别是

  • XDA和XCL: I2C主设备接口, 用于外接I2C从设备,
  • AD0: I2C从设备地址LSB
  • INT: 中断输出

模块与STC8H的通信

I2C频率最高为400KHz, STC8H的设置如下, 其中I2C功能复用选择的是P32/P33, 如果换到其它复用脚需要相应调整

void I2C_Init(void)
{
// 主节点模式
I2C_SetWorkMode(I2C_WorkMode_Master);
/**
* I2C 时钟 = SYSCLK / 2 / (__prescaler__ * 2 + 4)
* MPU6050 works with i2c clock up to 400KHz
*
* 44.2368 / 2 / (26 * 2 + 4) = 0.39 MHz
*/
I2C_SetClockPrescaler(0x1A);
// 复用口选择
I2C_SetPort(I2C_AlterPort_P32_P33);
// 启动 I2C
I2C_SetEnabled(HAL_State_ON);
}

与MPU6050的通信可以直接使用SDK中的I2C读写方法, 需要注意的几点

  1. 一次性读出的双字节结果, 如果直接转uint16_t, 其高字节和低字节位置是相反的, 需要调换后再转换
  2. 可以一次性读出6轴+温度数据
uint16_t swap(uint16_t num)
{
return (num >> 8) | (num << 8);
} void MPU6050_Write(uint8_t addr, uint8_t dat)
{
I2C_Write(MPU6050_ADDR, addr, &dat, 1);
} uint8_t MPU6050_Read(uint8_t addr)
{
uint8_t ret;
I2C_Read(MPU6050_ADDR, addr, &ret, 1);
return ret;
} // 读取16位数据
uint16_t MPU6050_ReadInt(uint8_t addr)
{
uint16_t ret;
I2C_Read(MPU6050_ADDR, addr, (uint8_t *)&ret, 2);
return swap(ret); // swap high/low bits for correct order
} // 一次性读取7个16位数据
void MPU6050_ReadAll(uint16_t *buf)
{
uint8_t i;
I2C_Read(MPU6050_ADDR, MPU6050_REG_ACCEL_XOUT_H, (uint8_t *)buf, 14);
for (i = 0; i < 7; i++)
{
*(buf + i) = swap(*(buf + i));
}
}

主要的寄存器设置

几个可能会用到的寄存器说明

电源管理寄存器 0x6B 和 0x6C

这两个寄存器控制了MPU6050的工作模式: 睡眠模式(Sleep), 节电模式(Cycle)和正常工作模式

  • 睡眠模式: 0x6B 的第六位置1开启, 睡眠模式下可以通信, 但是所有的检测转换都是停止的, 结果读取的值都是0
  • 节电模式: 是一种睡眠和正常交替的模式, MPU6050每隔一段时间做一次检测转换, 其余时间都处在睡眠状态
    • 进入节电模式, 需要将sleep位置0, cycle位置1, 禁止温度采样位置1, STBY_XG, STBY_YG, STBY_ZG置1
    • 节点模式下的采样频率可以设置为 1.25Hz, 5Hz, 20Hz, 40Hz
  • 正常模式: 正常模式按设置进行正常的检测和转换

在 0x6C 中, 还可以指定六个检测轴中的哪些轴暂停检测

采样速率寄存器 0x19

这个寄存器用于设置陀螺仪输出速率分频系数, 采样速率通过陀螺仪输出速率除以此寄存器的值产生:

采样速率 = 陀螺仪输出速率 / (1 + SMPLRT_DIV)

其中, 禁用DLPF(低通过滤)时陀螺仪输出速率为8KHz(DLPF_CFG = 0 or 7), 当启用DLPF时为1KHz.

配置寄存器 0x1A

这个寄存器用于设置外部帧同步(FSYNC)引脚采样和数字陀螺仪和加速度计的低通滤波器(DLPF). 连接到FSYNC引脚的外部信号可以通过配置EXT_SYNC_SET来采样, FSYNC引脚的信号变化被锁存, 以便捕捉信号, FSYNC信号将以寄存器0x19中定义的采样速率进行采样。采样后锁存器将复位到当前的FSYNC信号状态.

  • 位3,4,5: 设置FSYNC位的位置
  • 位0,1,2: 取值0 - 6, 设置DLPF, 数字越大延迟越大.

角速度检测(陀螺仪)配置寄存器 0x1B

这个寄存器用于设置角速度三轴的自检和满刻度范围

加速度检测配置寄存器 0x1C

这个寄存器用于设置加速度三轴的自检和满刻度范围

模块的中断类型及设置

中断功能通过中断配置寄存器进行配置。 可配置的项目包括INT引脚配置,中断锁存和清除方法以及中断触发器。 可触发中断的项目有:

  1. 时钟发生器锁定到新的参考振荡器(用于切换时钟源)
  2. 可以读取新数据(来自FIFO和数据寄存器)
  3. 加速度计事件中断
  4. MPU-6050 没有收到辅助传感器的确认I2C总线

中断状态可以从中断状态寄存器读取。

检测数据

MPU6050在检测过程中, 根据采样速率不断输出六轴加温度的检测值, 如果设置的满刻度范围较大, 则测量输出的数字较小, 灵敏度较低, 要增加灵敏度可以调小满刻度范围. 相比较 ADXL345, MPU6050更适合运动中的物体检测, 能检测到更准确的运动中物体姿态变化, 同样的, 如果没有接入电子罗盘(磁强计), 只能得到俯仰角和横滚角数据, 不能得到航向角数据.

演示代码

演示代码以100ms的时间间隔, 不断读取7个检测数据并通过UART1串口输出, 接线正确的话, 可以通过串口软件观察到模块运动带来的检测值变化

STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块的更多相关文章

  1. STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  2. STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  3. STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  4. STC8H开发(五): SPI驱动nRF24L01无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  5. 【4412开发板使用经验分享】迅为4412开发板I2C驱动问题

    本文转自迅为论坛:bbs.topeetboard.com 我想写DS3231 的驱动 但是读回的数据老是-6 硬件: 我I2C设备连接的这几个GPIO,看了2.5的手册,接口应该是链接正确的 软件 分 ...

  6. STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  7. STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  8. STC8H开发(十一): GPIO单线驱动多个DS18B20数字温度计

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  9. STC8H开发(十五): GPIO驱动Ci24R1无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

随机推荐

  1. 如何在Uni-app中通过腾讯IM SDK实现社交应用和直播互动等功能

    Uni-app想开发社交应用.IM.店铺客服.嵌入式社交模块.在线直播互动,这些功能Uni-app官方也没提供SDK,怎么办呢?找IM老大腾讯云啊,今天我们就在Uni-app中把腾讯云即时通讯TXIM ...

  2. JS根据日期获取判断星期几

    /** * 根据日期字符串获取星期几 * @param dateString 日期字符串(如:2020-05-02) * @returns {String} */ function getWeek(d ...

  3. 【九度OJ】题目1467:二叉排序树 解题报告

    [九度OJ]题目1467:二叉排序树 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1467 题目描述: 二叉排序树,也称为二叉查找树 ...

  4. 【九度OJ】题目1171:C翻转 解题报告

    [九度OJ]题目1171:C翻转 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1171 题目描述: 首先输入一个5 * 5的数组,然 ...

  5. 1114 - Easily Readable

    1114 - Easily Readable    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  6. 基于MCRA-OMLSA的语音降噪(二):实现

    上篇文章(基于MCRA-OMLSA的语音降噪(一):原理)讲了基于MCRA-OMLSA降噪的原理,本篇讲怎么做软件实现.软件实现有多种方式.单纯看降噪效果可用python,因为python有丰富的库可 ...

  7. Dart 2.15 现已发布

    作者 / Michael Thomsen, Dart & Flutter Product Manager, Google 我们已经正式发布了 Dart SDK 的 2.15 版本,该版本新增了 ...

  8. CS5265 新出TYPEC转HDMI 4K60 高清投屏转接方案|可替代RTD2172

    CS5265是一种高度集成的单芯片,主要用于设计typec转HDMI转接线或者typeC转HDMI转换器,应用在各种手机或者电脑显示端设备当中.用CS5265设计的TYPEC转HDMI 4K高清投屏线 ...

  9. python float运算时存在浮点误差,结果小数点带.00002及解决方法

    背景: 返回一个json字符串,result结果里面嵌套多个内容一样,只有具体数据不一样的列表[字典],现在需要从里面取指定的key值,来计算最后的总额. 原来使用的类型,float 通过取到json ...

  10. gitlab修改(重置)root用户密码

    gitlab修改(重置)root用户密码 1.使用root权限登录到服务器. 2.使用以下命令启动控制台:  gitlab-rails console production 该命令有时候启动比较慢,需 ...