基于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()读取六轴数据。
六轴数据和平衡车
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)

浙公网安备 33010602011771号