基于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 ...
随机推荐
- 操作系统综合题之“采用短进程优先调度算法(Shortest-Process-First,SPF)和先来先服务调度算法(First-Come,First-Served,FCFS)计算开始运行时间、结束时间、等待时间、周转时间、带权周转时间、平均周转时间”
一.问题:某系统中有四个进程,他们进入系统的时间和需要服务的时间如题下表所示(表中数值均为十进制) 进程 进入系统的时间 需要服务的时间 P1 0 100 P2 10 60 P3 25 25 P4 3 ...
- MySQL高可用搭建方案之MHA
MHA架构介绍 MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL ...
- WebAssembly在实际应用中的案例探究
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- Ubuntu 16.04 系统(解释器为 python3.12)在Pycharm虚拟环境中安装 pyspider 爬虫工具
一:安装步骤步骤1. 系统Terminal命令行执行如下命令安装依赖的组件 PhantomJS $ wget https://bitbucket.org/ariya/phantomjs/downloa ...
- C++ 容器(STL容器)
容器(container)用于存放数据的类模板.可变长数组.链表.平衡二叉树等数据结构在STL中都被实现为容器. 在使用容器时,即将容器类模型实例化为容器类,会指明容器中存放的元素是什么类型. 容器可 ...
- 用鼠标画圆点(java GUI)
话不多说,先看效果 当然你也可以发挥脑洞绘制更更棒的 源码如下: package javaBasic; import java.awt.*; import java.awt.event.*; impo ...
- 为什么使用MQ
在项目中,可将一些无需即时返回且耗时的操作提取出来,进行异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 开发中消息队列通常有如下应用场景: 1.任务异步处理 ...
- Web前端入门第 58 问:JavaScript 运算符 == 和 === 有什么区别?
运算符 JavaScript 运算符是真的多,尤其是 ES6 之后还在不停的加运算符,其他编程语言看 JS 就像怪物一样,各种骚操作不断~~ 运算符分类 1.算术运算符 算术运算符的作用就是用来基础计 ...
- 🚀 开源提示词优化神器来了!一键优化Function Calling和MCP提示词,让你的AI应用性能飞跃
还在为Function Calling调用不准确而头疼?MCP提示词写得不够规范?今天给大家推荐一个开源的提示词优化平台,专门解决这些痛点! 背景:为什么需要专业的提示词优化? 在AI应用开发中,我们 ...
- ArkUI-X构建Android平台AAR及使用
本教程主要讲述如何利用ArkUI-X SDK完成Android AAR开发,实现基于ArkTS的声明式开发范式在android平台显示.包括: 1.跨平台Library工程开发介绍 2.AAR在And ...