平衡车项目学习笔记,一、

发布时间:2026/6/8 18:41:38

平衡车项目学习笔记,一、 核心硬件驱动模块1.驱动电机用motor相关函数2.读取速度用encoder相关函数3.获取姿态数据用MPU6050相关函数4.调试时调用两个串口相关函数平衡方案本项目使用两轮平衡小车仅需关注俯仰角只有精准实时获取车身前倾 / 后倾角度后续才能通过 PID 算法控制电机正反转抵消倾斜、维持车身直立是整个控制系统的 “感知基础”。实现方案因此利用 MPU6050计算小车的俯仰角并通过互补滤波算法解析。单独用加速度计计算俯仰角测加速度就是测每个面受到的重力Fma成正比。根据MPU6050在小车上安装的方向和位置这里我们根据x轴和z轴的夹角来计算俯仰角优点静态精度高小车静止时测出的角度稳定、无漂移缺点抗干扰极差小车电机振动、车身移动、加减速都会严重干扰数据加速时会受到力测量出加速度值再用上面的公式计算会有偏移。测绝对角度单独使用陀螺仪计算俯仰角测角速度方法简单来说就是两个球绕一根杆旋转转动速度越快力越大圆周运动时角速度的积分就是角度所以只要简单的对角速度进行积分就能测出角度。而这里的角度不是绝对值而是变化的角度。由于小车绕xoz平面旋转因此只要测绕y轴的角速度就能测出俯仰角。由于只能隔一段时间采样角速度是离散系统因此只能计算矩形面积的和还要知道采样间隔T优点动态响应快车身倾斜瞬间就能检测到角速度短期测角精度高不受振动影响缺点存在积分漂移问题。陀螺仪只能输出角速度需要不断积分得到角度随着时间推移微小误差会持续累积。测相对角度且要明确初始值。核心算法互补滤波两者结合思路就是以陀螺仪为主加速度计为辅。通过参考加速度计角度来修正陀螺仪角度的漂移同时为陀螺仪提供绝对角度参考值。下面的式子就是在陀螺仪算出的角度上加一个偏移量使陀螺仪算出的角度不断偏向加速度计算出的角度同时这之间的差值越大偏移量越大。这里α的值大了算出的值易受冲击影响更明显加速度计的缺点小了算出的值在稳定时的稳态误差越大陀螺仪的缺点。一般给0.01或0.02。最后还要抑制零度漂移得到小车平放时的y轴角速度然后让其减去这个值使y轴角速度归零。PID控制结构这里只包括了角度环和转向环当差分PWM给零时左右轮转动速度一样小车直行。当平均PWM给10差分PWM给4时左轮PWM为12右轮PWM为8左轮转速快小车右转。因此只要控制平均PWM和差分PWM就可以控制小车运动同时前后和左右控制能实现解耦前后只要控制平均PWM左右只要控制差分PWM。主要代码计算俯仰角平均PWM差分PWMMPU6050_GetData(AX, AY, AZ, GX, GY, GZ); GY - 37; AngleAcc -atan2(AX , AZ) / 3.14159 * 180; AngleGyro Angle GY / 32768.0 * 2000 *0.01; float Alpha 0.01; Angle Alpha * AngleAcc (1 - Alpha) * AngleGyro;//angle为俯仰角 if(Angle 50 || Angle -50) { RunFlag 0; } if(RunFlag) { AnglePID.Actual Angle; PID_Update(AnglePID); AvePWM -AnglePID.Out; LeftPWM AvePWM DifPWM / 2; RightPWM AvePWM - DifPWM / 2; if(LeftPWM 100) {LeftPWM 100;} else if(LeftPWM -100) {LeftPWM -100;} if(RightPWM 100) {RightPWM 100;} else if(RightPWM -100) {RightPWM -100;} Motor_SetPWM(1, LeftPWM); Motor_SetPWM(2, RightPWM); } else { Motor_SetPWM(1, 0); Motor_SetPWM(2, 0); }PID的参数如下PID_t AnglePID { .Kp 3.1, .Ki 0.1, .Kd 3.7, .OutMax 100, .OutMin -100, };

相关新闻