IIC

同步 半双工 通信协议

硬件电路

GPIO配置为OOD,采取强下拉,弱上拉,避免发生短路和输入输出的频繁切换

SCL:所有设备的SCL一起连接,由主机控制

SDA:所有设备的SDA一起连接,谁使用,谁控制

IIC时序

基本时序

  • 起始条件:SCL HIGH && SDA HIGH -> LOW ;
  • 终止条件:SCL HIGH && SDA LOW -> HIGH;

起始与终止都由主机控制和产生

  • 数据传输:SCL LOW && SDA 发送0为LOW,1为HIGH。然后在SCL变为HIGH时候SDA稳定不变,读取数据。(高位先行

主机发送时SDA由主机控制,主机接受时释放SDA,由从机控制SDA,该过程循环8次,传输8位

  • 发送应答:主机在接收之后,重新控制SDA,发送0为应答,发送1为非应答
  • 接受应答:主机在发送之后,释放SDA,接受0为应答,接受1为非应答

完整时序

  • 指定地址写 指定从机(7位)和写操作(1位)+指定地址+指定数据
  • 当前地址读 指定从机(7位)和读操作(1位)+从机发送地址+从机发送数据
  • 指定地址读 指定从机(7位)和写操作(1位)+指定地址+起始条件+指定从机(7位)和读操作(1位)+从机发送地址+从机发送数据
  • 读写多个字节

    注意,主机接受数据结束后要给从机非应答,从而获取SDA的控制

MPU6050(六轴)

三轴加速度计,三轴陀螺仪,三轴磁力计,气压高度计

MPU6050是什么?MPU6050的register?

register如何配置?


江协科技的OLED库中OLED_Init()与HAL_I2C_Init()冲突,不能同时在一个SCL和SDA上连接

OLED库的实现是软件IIC,即用GPIO口模拟IIC时序,使用CPU控制,不是直接配置IIC寄存器。

而HAL_I2C是对IIC的寄存器操作,为硬件IIC


HAL_I2C的函数:

// 初始化I2C
HAL_I2C_Init(I2C_HandleTypeDef *hi2c)
// 主机发送
HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
// 主机接收
HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
// 向设备寄存器写入数据
HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
// 从设备寄存器读取数据
HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

利用HAL_I2C_Mem_Write()配置MPU6050,用HAL_I2C_Mem_Read()读取六轴数据。

六轴数据和平衡车

graph TD
A[MPU6050] -->|六轴数据| B[姿态解算]
B -->|倾角/角速度| C[PID控制器]
C -->|电机控制量| D[电机驱动]
D --> E[车轮运动]
E --> F[车身姿态变化]
F --> A

  • 加速度计具有静态稳定性不具有动态稳定性
  • 陀螺仪具有动态稳定性不具有静态稳定性

    -> 互补滤波得到欧拉角
  • Pitch 俯仰角
  • Roll 滚转角
  • Yaw 航向角

    -> 根据欧拉角和PID来控制电机

姿态解算1_DMP

利用MPU6050内置的DMP(数字运动处理器),直接输出四元数,得到欧拉角,完成姿态解算。

[DMP的库移植](https://www.bilibili.com/video/BV1KaHvesEza?vd_source=baa38ea84d15ef35ccc3ccc2cb16c135)


速食者跳过

出现的问题

  • init返回-1 :

    尝试调整配置采样率的位置,将其放在加速度计和陀螺仪的配置之后,多次上电复位
  • get_data返回-1:

    FIFO数据读取的时机有问题,我的解决方法是将get_data放在定时器中断中定时更新数据

其他的姿态解算

软件方式的欧拉角与旋转矩阵解算,轴角法与四元数解算等(坑+1)

基于c8t6的平衡小车(CubeMX+MDK)(2)IIC和陀螺仪的更多相关文章

  1. 两轮自平衡小车双闭环PID控制设计

                                                                                            两轮自平衡小车的研究意义 ...

  2. 使用msp432搭建的平衡小车(一)

    1.前言 笔者是一名大二学生曾经荒废一年学业,现在不断学习,所以有任何问题都希望讨论提出,你们的支持就是我的动力. 关于硬件搭建的步骤,笔者就不提网上方案太多了,笔者使用编码器电机,驱动采用tb661 ...

  3. 基于STM32的平衡车机器人设计-硬件电路设计

    今天分享一个STM32F103为主控的自平衡车机器人的硬件电路设计.(亲测完全可用,且没有任何问题) 电路原理图: 电源部分采用12V锂电池作为输入,分三路稳压,其中7805作为5V传感器的供电以及后 ...

  4. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(2)

    主要解决 vs2017中,printf无法打印数据的问题. 在keil环境下正常使用printf功能,但是以下的重定向代码在vs2017下使用不了: #ifdef __GNUC__ /* With G ...

  5. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(0)

    (1)安装visual studio 2017 官网下载安装即可 (2)安装visual GDB 链接:https://pan.baidu.com/s/1TgXI1BRQLAWiWlqCcIS9TA ...

  6. 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(1)

    参考如下文档: 传送门:http://www.stm32cube.com/article/128 如果链接不存在的话,下载我截屏好的图: 传送门:https://pan.baidu.com/s/1NC ...

  7. msp432搭建平衡小车(二)

    前言 上一节掌握了使用pwm驱动电机,接下来介绍如何使用msp432读取mpu6050数据 正文 首先我们得知道mpu6050通信方式,由于mpu6050只能用i2c通信,所以学会使用msp432的i ...

  8. Keil MDK STM32系列(九) 基于HAL和FatFs的FAT格式SD卡TF卡读写

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  9. Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  10. Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

随机推荐

  1. 遇到过的错误之“日期计算错误,Java8API导致Unsupported unit: Seconds【时间类错误】"

    一.问题 场景:在计算相差天数时爆出的错误 报错内容:java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Se ...

  2. vue3 基础-data-methods-computed-watch

    本篇来简单了解 vue 的数据, 方法, 计算属性和监听器等相关内容. data ( ) vue 里面的 data ( ) 函数返回一些能供模板 template 直接使用的数据, 以变量的方式进行 ...

  3. 2025最好的Next.js面试

    2025最好的Next.js面试题(一) 最近在面试,就写一些关于问到的面试题,同时也过一下知识点. 基础概念 什么是Next.js?它与React的关系是什么? Next.js是一个基于React的 ...

  4. Nmap 从入门到精通:详细指南

    Nmap 从入门到精通:详细指南 1. Nmap 是什么? Nmap(Network Mapper)是一款开源的网络探测和安全审计工具,广泛用于以下场景: 主机发现:识别网络中的活动设备. 端口扫描: ...

  5. 对比Jira/禅道后,我们为什么选择Leangoo做敏捷项目管理?

    一.敏捷团队的3大隐形痛点 我曾带领过一个6人的Scrum团队,迭代经常遇到: 需求变更黑洞:客户口头需求未及时同步,开发完成后才发现理解偏差(案例:某次迭代因此浪费32人日) 进度监控盲区:用Exc ...

  6. kubernetes集群calico网络组件部署

    一.使用问题背景 关于Calico组件介绍,我们在这个章节已经介绍过. 这里使用Calico组件,是因为集团安全测试通过容器内部检测出内网主机暴露的端口,内网主机的端口暴漏会造成严重的安全风险. 扫描 ...

  7. 智能指标 AIMetrics 赋能:构建一体化数据智能决策中枢

    数据,究竟是静态的历史记录还是流动的企业资产?随着企业依赖数据决策的加深,这个问题变得愈加关键.过去,我们常常把数据看作"存储"的对象,但在今天,数据正逐步成为推动智能决策.创新和 ...

  8. CAE和CAD的区别

    CAE又被叫做"计算机辅助工程",而CAD则是"计算机辅助设计".虽然CAE和CAD是两种不同的技术,但它们却有着一定联系.在如今这个遍布科技与狠活的社会里,C ...

  9. About me and the blog

    About me and the blog About me 坐标\(CQ\),可以叫我\(Luoyu\)/洛雨/呆猫(似乎混入了奇怪的东西,时常模仿呆猫说话故而得名)/猫老大(???不知道啥时候下一 ...

  10. Hadoop入门学习总结系列文章目录

    一.为何要学习Hadoop? 这是一个信息爆炸的时代.经过数十年的积累,很多企业都聚集了大量的数据.这些数据也是企业的核心财富之一,怎样从累积的数据里寻找价值,变废为宝炼数成金成为当务之急.但数据增长 ...