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. 操作系统综合题之“采用短进程优先调度算法(Shortest-Process-First,SPF)和先来先服务调度算法(First-Come,First-Served,FCFS)计算开始运行时间、结束时间、等待时间、周转时间、带权周转时间、平均周转时间”

    一.问题:某系统中有四个进程,他们进入系统的时间和需要服务的时间如题下表所示(表中数值均为十进制) 进程 进入系统的时间 需要服务的时间 P1 0 100 P2 10 60 P3 25 25 P4 3 ...

  2. MySQL高可用搭建方案之MHA

    MHA架构介绍 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL ...

  3. WebAssembly在实际应用中的案例探究

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  4. Ubuntu 16.04 系统(解释器为 python3.12)在Pycharm虚拟环境中安装 pyspider 爬虫工具

    一:安装步骤步骤1. 系统Terminal命令行执行如下命令安装依赖的组件 PhantomJS $ wget https://bitbucket.org/ariya/phantomjs/downloa ...

  5. C++ 容器(STL容器)

    容器(container)用于存放数据的类模板.可变长数组.链表.平衡二叉树等数据结构在STL中都被实现为容器. 在使用容器时,即将容器类模型实例化为容器类,会指明容器中存放的元素是什么类型. 容器可 ...

  6. 用鼠标画圆点(java GUI)

    话不多说,先看效果 当然你也可以发挥脑洞绘制更更棒的 源码如下: package javaBasic; import java.awt.*; import java.awt.event.*; impo ...

  7. 为什么使用MQ

    在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 开发中消息队列通常有如下应用场景: 1.任务异步处理 ...

  8. Web前端入门第 58 问:JavaScript 运算符 == 和 === 有什么区别?

    运算符 JavaScript 运算符是真的多,尤其是 ES6 之后还在不停的加运算符,其他编程语言看 JS 就像怪物一样,各种骚操作不断~~ 运算符分类 1.算术运算符 算术运算符的作用就是用来基础计 ...

  9. 🚀 开源提示词优化神器来了!一键优化Function Calling和MCP提示词,让你的AI应用性能飞跃

    还在为Function Calling调用不准确而头疼?MCP提示词写得不够规范?今天给大家推荐一个开源的提示词优化平台,专门解决这些痛点! 背景:为什么需要专业的提示词优化? 在AI应用开发中,我们 ...

  10. ArkUI-X构建Android平台AAR及使用

    本教程主要讲述如何利用ArkUI-X SDK完成Android AAR开发,实现基于ArkTS的声明式开发范式在android平台显示.包括: 1.跨平台Library工程开发介绍 2.AAR在And ...