前言
在全国大学生电子设计竞赛中,控制类题目(如无人机穿环、两轮平衡车、风力摆、倒立摆)历来是神仙打架的重灾区。
很多队伍在实验室里看着小车跑得挺顺,一到赛场,遇到未知的光线、摩擦力变化,小车直接变“脱缰野狗”;或者无人机刚起飞就疯狂抽搐,最终炸机退赛。
为什么?因为你只写了代码,却没有建立真正的**“鲁棒性控制系统”。
本文将结合历年国一队伍的实战经验,从机械抗震、姿态解算、串级PID调参到系统架构**,带你剥开控制类的底层逻辑,实现真正的降维打击!
@TOC
一、 硬件与机械:被90%程序员忽视的“地基”
控制组有一句血泪名言:“机械结构教做人,硬件电路定生死,软件算法只是锦上添花。”如果你的机械结构拉胯,再牛的算法也救不回来。
1. 震动:IMU(惯性测量单元)的头号杀手
无人机和平衡车全靠 MPU6050/ICM20602 等陀螺仪来感知姿态。电机一旦转动,高频震动会直接传递给 IMU,导致加速度计的数据变成一团乱麻。
避坑指南:不要把 IMU 死死地拧在碳纤维板或亚克力板上!必须使用减震球、减震海绵或者 3M 泡沫胶进行物理隔离。做无人机时,飞控板下方必须有减震结构,否则姿态解算必炸。
2. 重心:物理学定律不可违背
小车类:电池和重型金属结构尽量贴近底盘。重心越低,急转弯时越不容易翻车,PID 也越好调。
平衡车/倒立摆:刚好相反,重心要适度偏上(想想拿手指顶扫把和顶一根牙签,哪个容易?)。倒立摆的摆杆越长、重心越高,系统倒下的频率就越慢,留给单片机控制的余地就越大。
3. 编码器(Encoder):闭环的基石
买电机必须买带 AB 相霍尔编码器或光电编码器的(减速后分辨率至少达到 300 线以上)。没有编码器的电机,单片机就像是个瞎子在开车,稍微遇到一点下坡或者地毯阻力,速度就完全失控了。
二、 核心算法:姿态解算与滤波
要控制姿态,首先要知道姿态。读取到 MPU6050 的原始数据(加速度和角速度)只是第一步,你需要把它们融合成真实的欧拉角(Pitch, Roll, Yaw)。
1. 方案一:官方 DMP 库(萌新/求稳首选)
MPU6050 内部自带了一个数字运动处理器(DMP),可以直接输出四元数。
优点:无需自己写复杂的数学公式,直接调用现成库,极大减轻 CPU 负担。
缺点:初始化极慢(需要十几秒),容易跑飞,且最大输出频率通常只有 100Hz 左右,对无人机来说不够用。
2. 方案二:互补滤波 / Mahony 算法(高阶/国奖标配)
加速度计(长期准,短期受震动干扰极大) + 陀螺仪(短期准,长期有积分漂移)。
Mahony 算法(或 Madgwick 算法)通过四元数运算,将两者的优点完美结合。
建议:在电赛中,强烈建议将姿态解算放在定时器中断中,以200Hz ~ 500Hz的绝对固定频率运行!
三、 控制之王:串级 PID (Cascade PID)
不管是四轴飞行器、两轮平衡车还是云台追踪,单环 PID 根本稳不住,必须上串级 PID!
1. 什么是串级?(以外环角度,内环角速度为例)
外环(角度环 / P环为主):根据当前角度和目标角度的偏差,计算出一个期望的角速度。
“报告,车子往前倾斜了10度!外环命令:立刻以 50度/秒 的速度往后仰!”
内环(角速度环 / PI 或 PID):接收外环给的期望速度,结合陀螺仪读到的实际速度,计算出最终给电机的 PWM。
“报告,收到 50度/秒 的指令,当前实际速度只有 10度/秒。内环命令:立刻加大电机马力,拉满 PWM!”
2. 为什么要用串级?
因为“速度”的响应比“角度”快得多!如果你只用单环控制角度,等系统发现角度到位时,系统已经有了巨大的惯性,必然产生严重的超调(来回疯狂震荡)。内环的速度环,本质上是一个极其强大的“阻尼器”,能把多余的惯性死死按住。
3. 串级 PID 核心代码架构 (C语言)
codeC
// 串级 PID 计算函数 (需放在高频定时器中断中调用) // 假设执行频率:外环 100Hz,内环 500Hz void Cascade_PID_Control(float target_angle, float current_angle, float current_gyro) { static uint8_t loop_count = 0; float target_speed = 0; float final_pwm = 0; // 1. 外环控制 (频率可稍低,比如每 5 次内环执行 1 次外环) if(loop_count % 5 == 0) { // 外环只用 P (或者 PI),输出的是【期望角速度】 target_speed = PID_Calc(&Angle_PID, target_angle, current_angle); } loop_count++; // 2. 内环控制 (必须极高频率) // 内环输入为外环的输出,反馈值为陀螺仪的【真实角速度】 final_pwm = PID_Calc(&Gyro_PID, target_speed, current_gyro); // 3. 将最终输出作用于执行机构 Set_Motor_PWM(final_pwm); }四、 调参玄学与系统时间分配(必杀技)
1. 串级 PID 调参顺序(死记硬背!)
先内环,后外环!内环如果调不好,外环绝对稳不住。
第一步(内环 P):只给内环加 P,让电机对转动产生明显的“抵抗力”。用手晃动飞机/小车,感觉它像在粘稠的液体里一样有阻尼感,且不发生高频抽搐即可。
第二步(内环 I / D):适当加一点 I 消除静态误差,无人机内环通常加 D 来增加极速响应。
第三步(外环 P):开启外环,慢慢加 P。此时给一个目标角度,系统应该能迅速到达目标角度,可能会有极小幅度的来回晃动。
第四步(外环 D):适当加一点 D(作为微分先行),消除最后一点超调,让系统如同钉子一样钉在目标角度上!
2. 控制频率:不要让你的单片机“消化不良”
控制系统对时间极度敏感。千万不要在 main 函数里写 delay。你需要一个基于定时器的严格多任务时间片架构。
黄金频率分配参考表:
| 任务模块 | 推荐运行频率 | 实现方式 | 说明 |
| :--- | :---: | :--- | :--- |
|内环 PID (速度环)| 500Hz - 1000Hz | 定时器中断 | 越快越好,电机的守护神 |
|姿态解算 (IMU)| 200Hz - 500Hz | 定时器中断 | 保证数据实时更新 |
|外环 PID (角度环)| 100Hz - 200Hz | 主循环时间片 | 物理角度变化没那么快 |
|视觉接收解析 (UART)| 30Hz - 60Hz | 串口 RX 状态机 | 跟随摄像头的帧率 |
|OLED 屏幕刷新| 10Hz - 20Hz | 主循环时间片 | 比赛时最好关闭或极低频 |
五、 高维打击:LQR 与 轨迹规划(国一加分项)
如果大家都会 PID,你怎么赢?
LQR(线性二次型调节器):
如果你选了倒立摆题目,放弃传统的 PID 吧,直接建立动力学状态空间方程,使用LQR 算法。它可以实现角度和位置的全局最优解算,抗干扰能力拉满。当评委看到你的论文里写着 LQR 状态矩阵和代价函数时,国奖已经向你招手了。梯形加减速 / S型曲线规划:
对于小车跑轨迹的题目,直接给电机设定目标速度会导致小车在起步和刹车时发生剧烈打滑、履带抖动。在目标速度的给定上套一层S型加速算法(甚至简单的低通滤波),让小车的动作变得极其“丝滑”,评委一看这姿态就知道是高手。
六、 赛场调试求生指南
不要拖着数据线跑!:买两个 HC-12 串口透传模块或者蓝牙模块,插在单片机上,通过无线串口将 PID 数据实时传回电脑。
必须使用上位机波形图!:放弃用 printf 看跳动的数字,用VOFA+或匿名上位机画出目标值和实际值的曲线。波形是震荡还是滞后,一目了然,调参效率提升 100 倍。
急停开关是保命的:尤其是做无人机、大功率电机题目的,一定要在遥控器或者板子上设置一个硬件/软件急停按钮(一键 PWM 归零)。失控的时候一脚刹车,能救下你几百块钱的电机和被螺旋桨支配的恐惧。
结语
控制类电赛,是一场与物理世界的贴身肉搏。它要求你既有“软”的算法逻辑,又有“硬”的动手能力。
当你在四天三夜的第三天凌晨,看着你的飞机稳稳悬停,或者小车沿着黑线丝滑漂移过弯时,那种多巴胺分泌的快乐,是任何纯软件开发都无法比拟的。
记住:敬畏物理规律,深挖控制底层,用波形说话。
预祝各位控制组大佬:抗扰满级,走线如丝,顺滑夺冠!🏆
对你有帮助的话,请:
👍点赞+ ⭐收藏,比赛调参奔溃时拿出来看一遍!
你在调车/调飞机时遇到过什么“灵异”的失控现象?欢迎在评论区分享你的炸机经历或疑问,博主在线接单解答!👇