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. 信息资源管理综合题之“公钥密码体系中同一个用户拥有的密钥特点 和 如何使用密钥加解密才能保证传输数据的机密性 和 如何身份认证 和 CA的作用”

    一.公钥密码体制在认证技术中是广泛使用的.结合加密和认证技术知识回答以下问题: 1.公钥密码体系中同一个用户拥有的密钥的特点是什么? 2.假设A.B是公钥密码体系的用户,A向B发送数据,A.B之间如何 ...

  2. 阿里云手工配置Nginx

    Nginx服务器是网站反向代理,负载均衡,以及动静分离的神器,由于是第一次在阿里云上配置这个,花费了大半天,终于配置成功了.下面简要的介绍下其流程,以备后面又搞忘了.前提是自动装装不上 购买阿里云服务 ...

  3. 【MySQL】字符串截取函数substring_index

    业务场景描述:如何根据分隔符切割字符串?使用函数SUBSTRING_INDEX()根据指定分隔符切割,分隔符可以是字符串等. 语法:substring_index(str,delim,count) 说 ...

  4. Java泛型<T> T与T的用法

             泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...

  5. docker部署mysql5.7后登录时出现Access denied for user 'root'@'localhost' (using password: YES)的解决方法

    1.先进去容器中安装vim工具 docker exec -it mysql bash apt-get update apt-get -y install vim 2.修改/etc/mysql/conf ...

  6. 「Log」2023.8.18 小记

    序幕 七点到校,博客整理一下,补全目录. 写 AC 自动机练习题. \(\color{blueviolet}{P3966\ [TJOI2013]\ 单词}\) 挺板的,每个模式串当匹配串统计一遍答案即 ...

  7. 技术分享:主流GUI自动化框架的窗口置顶机制实现对比

    前言 在自动化测试和RPA开发过程中,窗口置顶是一个常见且关键的需求.无论是确保测试窗口始终可见,还是保证自动化操作的准确性,各大Python自动化框架都提供了相应的窗口置顶功能.本文将深入分析主流框 ...

  8. 使用rust给图片增加文字

    使用rust实现在图片上增加文字信息(水印) [dependencies] image = "0.25" # 图像读写与基础操作 imageproc = "0.25&qu ...

  9. Unity Shader入门精要个人学习笔记

    Unity Shader入门精要 渲染流水线 数学基础 1.点和矢量 类型 定义 表达 含义 性质 点(point) 点 (point) 是n 维空间(游戏中主要使用二维和三维空间)中的一个位置,它没 ...

  10. 几分钟了解下java虚拟机--02

    几分钟应该看不完,私密马赛, 俺是标题党 既然来了, 看看吧, 球球你了 Java类加载器 类的生命周期和加载过程 加载 加载所有的.class文件/jar文件/网络流 →字节流 (JVM 与java ...