此已去经年 2025-07-10 17:24 采纳率: 85.7%
浏览 62
已结题

平衡车里pid和mpu6050姿态角之间的关系

我想问问,现在我想要做一个平衡车,我知道了由mpu6050dmp得知的pitch、roll、yaw角度,这个角度和pid串级之间有什么关系呢,代码要怎么写,我自己知道各自之间的关系,他们两者怎么联系起来?还有速度环、直立环,机械中值,这些又怎么看,怎么联系起来(基于标准库)

  • 写回答

8条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-07-10 17:26
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。

    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!
     
    若您愿意支持,欢迎直接打赏,将不胜感激!
     

    平衡车PID控制与MPU6050姿态角的关系

    基本原理

    在平衡车系统中,MPU6050提供的姿态角(特别是pitch角)与PID控制密切相关:

    1. 直立环:使用MPU6050的pitch角作为反馈量,通过PID控制保持车身直立
    2. 速度环:通过编码器获取电机转速作为反馈量,通过PID控制维持期望速度
    3. 转向环:使用yaw角或直接通过左右轮差速实现转向控制

    控制关系

    "MPU6050获取姿态角"

    代码实现框架(基于STM32标准库)

    // PID结构体定义
    typedef struct {
        float Kp, Ki, Kd;
        float error, last_error;
        float integral, derivative;
        float output;
    } PID;
    
    
    // 初始化PID控制器
    void PID_Init(PID* pid, float Kp, float Ki, float Kd) {
        pid->Kp = Kp;
        pid->Ki = Ki;
        pid->Kd = Kd;
        pid->error = pid->last_error = 0;
        pid->integral = pid->derivative = 0;
        pid->output = 0;
    }
    
    
    // PID计算
    float PID_Calculate(PID* pid, float setpoint, float feedback) {
        pid->error = setpoint - feedback;
        pid->integral += pid->error;
        pid->derivative = pid->error - pid->last_error;
        
        pid->output = pid->Kp * pid->error + 
                     pid->Ki * pid->integral + 
                     pid->Kd * pid->derivative;
        
        pid->last_error = pid->error;
        return pid->output;
    }
    
    
    // 主控制循环
    void Balance_Control(void) {
        // 初始化PID控制器
        PID angle_pid, speed_pid;
        PID_Init(&angle_pid, 10.0, 0.0, 0.5);  // 直立环参数
        PID_Init(&speed_pid, 1.0, 0.01, 0.0);  // 速度环参数
        
        float target_angle = 0.0;  // 目标平衡角度(机械中值)
        float target_speed = 0.0;  // 目标速度
        
        while(1) {
            // 1. 读取MPU6050数据
            MPU6050_GetData(&pitch, &roll, &yaw);
            
            // 2. 读取编码器速度
            int16_t left_speed = Encoder_GetSpeed(LEFT_MOTOR);
            int16_t right_speed = Encoder_GetSpeed(RIGHT_MOTOR);
            float current_speed = (left_speed + right_speed) / 2.0;
            
            // 3. 速度环PID计算
            float speed_output = PID_Calculate(&speed_pid, target_speed, current_speed);
            
            // 4. 直立环PID计算(将速度环输出作为角度补偿)
            float angle_output = PID_Calculate(&angle_pid, target_angle + speed_output, pitch);
            
            // 5. 电机控制
            Motor_SetPWM(LEFT_MOTOR, angle_output);
            Motor_SetPWM(RIGHT_MOTOR, angle_output);
            
            // 延时或等待下一次控制周期
            delay_ms(5);
        }
    }
    

    关键概念解释

    1. 机械中值:平衡车静止平衡时的角度,需要通过实验测定
    2. 串级PID
      • 外环(速度环)输出作为内环(直立环)的输入补偿
      • 直立环优先级高于速度环
    3. 参数整定顺序
      • 先调直立环(Kp使车能站住,Kd消除抖动)
      • 再调速度环(Ki消除静态误差)
      • 最后调转向环

    调试建议

    1. 先用示波器或串口绘图观察姿态角变化
    2. 单独调试直立环,确保车能基本保持平衡
    3. 加入速度环时,初始参数要小,避免干扰直立环
    4. 机械中值需要实际测量,不同安装方式值不同

    扩展建议

    *

    通过这种分层调试方法,可以逐步构建稳定的平衡车控制系统。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 7月22日
  • 已采纳回答 7月14日
  • 创建了问题 7月10日