基于c8t6的平衡小车(CubeMX+MDK)(2)IIC和陀螺仪
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()读取六轴数据。
六轴数据和平衡车
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和陀螺仪的更多相关文章
- 两轮自平衡小车双闭环PID控制设计
两轮自平衡小车的研究意义 ...
- 使用msp432搭建的平衡小车(一)
1.前言 笔者是一名大二学生曾经荒废一年学业,现在不断学习,所以有任何问题都希望讨论提出,你们的支持就是我的动力. 关于硬件搭建的步骤,笔者就不提网上方案太多了,笔者使用编码器电机,驱动采用tb661 ...
- 基于STM32的平衡车机器人设计-硬件电路设计
今天分享一个STM32F103为主控的自平衡车机器人的硬件电路设计.(亲测完全可用,且没有任何问题) 电路原理图: 电源部分采用12V锂电池作为输入,分三路稳压,其中7805作为5V传感器的供电以及后 ...
- 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(2)
主要解决 vs2017中,printf无法打印数据的问题. 在keil环境下正常使用printf功能,但是以下的重定向代码在vs2017下使用不了: #ifdef __GNUC__ /* With G ...
- 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(0)
(1)安装visual studio 2017 官网下载安装即可 (2)安装visual GDB 链接:https://pan.baidu.com/s/1TgXI1BRQLAWiWlqCcIS9TA ...
- 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(1)
参考如下文档: 传送门:http://www.stm32cube.com/article/128 如果链接不存在的话,下载我截屏好的图: 传送门:https://pan.baidu.com/s/1NC ...
- msp432搭建平衡小车(二)
前言 上一节掌握了使用pwm驱动电机,接下来介绍如何使用msp432读取mpu6050数据 正文 首先我们得知道mpu6050通信方式,由于mpu6050只能用i2c通信,所以学会使用msp432的i ...
- Keil MDK STM32系列(九) 基于HAL和FatFs的FAT格式SD卡TF卡读写
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
随机推荐
- 信息资源管理综合题之“公钥密码体系中同一个用户拥有的密钥特点 和 如何使用密钥加解密才能保证传输数据的机密性 和 如何身份认证 和 CA的作用”
一.公钥密码体制在认证技术中是广泛使用的.结合加密和认证技术知识回答以下问题: 1.公钥密码体系中同一个用户拥有的密钥的特点是什么? 2.假设A.B是公钥密码体系的用户,A向B发送数据,A.B之间如何 ...
- 阿里云手工配置Nginx
Nginx服务器是网站反向代理,负载均衡,以及动静分离的神器,由于是第一次在阿里云上配置这个,花费了大半天,终于配置成功了.下面简要的介绍下其流程,以备后面又搞忘了.前提是自动装装不上 购买阿里云服务 ...
- 【MySQL】字符串截取函数substring_index
业务场景描述:如何根据分隔符切割字符串?使用函数SUBSTRING_INDEX()根据指定分隔符切割,分隔符可以是字符串等. 语法:substring_index(str,delim,count) 说 ...
- Java泛型<T> T与T的用法
泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...
- 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 ...
- 「Log」2023.8.18 小记
序幕 七点到校,博客整理一下,补全目录. 写 AC 自动机练习题. \(\color{blueviolet}{P3966\ [TJOI2013]\ 单词}\) 挺板的,每个模式串当匹配串统计一遍答案即 ...
- 技术分享:主流GUI自动化框架的窗口置顶机制实现对比
前言 在自动化测试和RPA开发过程中,窗口置顶是一个常见且关键的需求.无论是确保测试窗口始终可见,还是保证自动化操作的准确性,各大Python自动化框架都提供了相应的窗口置顶功能.本文将深入分析主流框 ...
- 使用rust给图片增加文字
使用rust实现在图片上增加文字信息(水印) [dependencies] image = "0.25" # 图像读写与基础操作 imageproc = "0.25&qu ...
- Unity Shader入门精要个人学习笔记
Unity Shader入门精要 渲染流水线 数学基础 1.点和矢量 类型 定义 表达 含义 性质 点(point) 点 (point) 是n 维空间(游戏中主要使用二维和三维空间)中的一个位置,它没 ...
- 几分钟了解下java虚拟机--02
几分钟应该看不完,私密马赛, 俺是标题党 既然来了, 看看吧, 球球你了 Java类加载器 类的生命周期和加载过程 加载 加载所有的.class文件/jar文件/网络流 →字节流 (JVM 与java ...