基于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)

posted @ 2025-07-20 11:44  loong2525  阅读(41)  评论(0)    收藏  举报