简介:这份资源是面向电子设计竞赛参赛者、自动控制与机器人方向学生的轮腿式自平衡小车完整项目包,聚焦动态平衡原理与嵌入式控制实践。压缩包共1311个文件,约49.48MB,以C源码(619个)与头文件(316个)为主体,辅以汇编启动文件、链接脚本、CMake构建配置及数学库文件,并包含工程配置、说明文档与固件镜像,覆盖从底层驱动到算法实现的完整链路。项目围绕轮式推进与腿部支撑相结合的创新结构展开,涉及陀螺仪与加速度计数据采集、传感器融合滤波、PID等平衡控制策略、电机驱动逻辑及运动控制实现,同时提供硬件设计资料与调试测试记录,便于理解电力系统、传感器配置与嵌入式软件架构。目前已有585人学习下载,适合希望深入掌握自平衡控制、传感器应用与嵌入式系统开发的读者参考复现。
1. 电赛平衡小车:从“能站住”到“拿高分”的考点拆解
电赛平衡小车这道题,表面考的是轮腿式结构能不能立起来,实际考的是控制周期、姿态解算和电机响应这三条命脉。很多人一上来就调PID,结果车像喝醉一样来回晃,最后连基本站立分都拿不到。真正拿分的队伍,往往在开赛前就把MPU6050零漂校准、互补滤波系数、串级PID内外环频率这些参数摸透了。这份资源适合正在准备电赛控制类赛题的人,也适合想搞懂轮腿式平衡车底层逻辑的嵌入式学习者。它不教你从零画板子,而是把“能站住、能走稳、能抗扰”这条主线上的高频考点和翻车点直接摊开。你如果正在找电赛平衡小车真题、轮腿式控制考点或者平衡车PID面试题,接下来的内容就是按这个顺序推的。
2. 考点分布:轮腿式平衡小车的三个得分层
2.1 基础层:姿态解算与零漂处理
轮腿式平衡小车和普通两轮平衡车最大的区别在于,轮腿结构让重心投影点不在轮轴连线上,姿态解算稍微偏一点,腿长变化就会放大成剧烈摆动。MPU6050是绝大多数电赛方案里的惯性单元,但原始陀螺仪数据有零漂,加速度计有振动噪声。互补滤波的系数不是拍脑袋定的,通常取0.98左右,但具体要看你的控制周期。如果控制周期是5ms,陀螺仪积分占的比重可以更高;如果周期抖动大,加速度计权重要适当加大,否则角度会漂到无法收敛。
这里有一个常被忽略的细节:零漂校准必须在车上电但电机未使能时做,且要连续采样几百次取平均。很多队伍上电就立刻使能电机,结果陀螺仪零漂还没算完,车已经冲出去了。这类题在面试里也常问:“你如何保证姿态角在静止时不为零?”答题思路是分三步:静态校准、动态补偿、限幅保护。静态校准解决零偏,动态补偿用互补滤波或卡尔曼滤波抑制振动,限幅保护防止角度突变导致电机满占空比输出。
2.2 控制层:串级PID与电机死区补偿
平衡车的控制核心是串级PID:外环角度环,内环速度环或电流环。角度环的输出作为速度环的输入,速度环的输出再给电机。这里最容易翻车的地方是内外环频率关系。外环频率必须低于内环,通常角度环100Hz到200Hz,速度环可以到500Hz甚至1kHz。如果两个环频率接近,系统会产生拍频,车会周期性抖动。
电机死区是另一个血泪点。直流减速电机在占空比低于某个值时根本不转,这个值就是死区。如果不做死区补偿,PID输出在小角度误差时根本推不动电机,车会缓慢倒下。补偿方法很简单:在PID输出上叠加一个方向相关的死区值。代码里通常这样写:
// 电机死区补偿,DEAD_ZONE需实测 float apply_dead_zone(float pid_out) { if (pid_out > 0) { return pid_out + DEAD_ZONE; // 正向叠加死区 } else if (pid_out < 0) { return pid_out - DEAD_ZONE; // 反向叠加死区 } return 0; }这段代码的逻辑是:只要PID输出非零,就额外加上一个能克服静摩擦的占空比。DEAD_ZONE参数需要实测,通常占空比在5%到15%之间。注意,死区补偿不能加在PID积分项之前,否则积分会饱和。面试里如果问“电机不转但PID有输出怎么办”,先答死区补偿,再答检查驱动使能引脚和PWM频率。
2.3 执行层:轮腿运动学与重心补偿
轮腿式结构让小车可以通过改变腿长来调整重心高度,但这也引入了额外的控制维度。腿长变化会改变系统转动惯量,角度环的PID参数需要跟着变。很多方案采用分段PID:腿短时用一组参数,腿长时用另一组。更简单的做法是只做静态腿长,比赛时固定一个高度,把精力放在平衡和行走上。
重心补偿是轮腿式特有的考点。当腿伸长时,车身重心上移,同样的角度误差需要更大的电机力矩来纠正。补偿方法是在角度环输出上乘以一个与腿长相关的系数。这个系数可以通过实验测定:固定角度误差,记录不同腿长下维持平衡所需的PWM值,拟合出线性关系。面试官如果问“轮腿式比两轮式难在哪”,就从重心投影变化、转动惯量变化、腿长执行器响应延迟这三个角度答。
3. 高频真题与答题思路:从站立到行走的五个必练题
3.1 真题一:车往一个方向加速跑,怎么排查
这是电赛现场最常出现的故障。车不是平衡,而是朝一个方向越跑越快,直到撞墙。答题思路按信号链从后往前查:先看电机是否对称,左右电机同一PWM下转速是否一致;再看姿态角零点是否漂移,静止时角度输出是否稳定在零附近;最后看速度环目标值是否被错误积分。常见原因是速度环没有限幅,车稍微倾斜就积分出很大的速度目标,车为了追这个目标拼命跑。解决办法是给速度环输出加限幅,同时给速度环积分项加抗饱和。
面试时如果被问到,可以这样组织:先描述现象,再给排查顺序,最后说预防措施。预防措施包括上电自动校准、速度环输出限幅、角度环死区。这类题考的是系统化调试思维,不是单一知识点。
3.2 真题二:平衡车受扰动后恢复慢,参数怎么调
扰动恢复慢,通常是角度环P太小或D太大。P决定回复力,D抑制振荡。如果车被推一下,慢慢倒向一边然后缓慢回正,说明P不够;如果车快速回正但过冲来回晃,说明D不够或P太大。调参顺序是先调角度环P到车能基本站立但有小幅振荡,再加D到振荡消失,最后加一点点I消除静态误差。
注意,角度环的I不能大,否则车会缓慢朝一个方向漂。速度环的P和I才是让车保持位置的关键。面试里如果问“平衡车调参步骤”,就按“先立后走、先内后外、先P后I再D”这个口诀答。先让车能原地平衡,再调速度环让车不走,最后调转向环。
3.3 真题三:轮腿式小车腿长变化时车身抖动
腿长变化引起抖动,根源是腿长执行器的响应延迟和角度环参数不匹配。如果腿长用舵机控制,舵机从收到指令到到位有几十毫秒延迟,这期间角度环还在用旧参数,车就会抖。解决办法有两个:一是腿长变化时暂停角度环积分,等腿到位后再恢复;二是用腿长反馈做增益调度,腿长变化时同步调整角度环P和D。
代码里可以这样实现增益调度:
// 根据腿长线性插值角度环P float get_angle_kp(float leg_length) { float kp_min = 8.0; // 腿最短时的P float kp_max = 15.0; // 腿最长时的P float len_min = 100.0; // 腿最短行程,单位mm float len_max = 180.0; // 腿最长行程 // 线性插值,腿越长P越大 return kp_min + (kp_max - kp_min) * (leg_length - len_min) / (len_max - len_min); }这段代码把腿长映射成角度环P值。参数需要实测:固定腿长,调出能稳定平衡的P,记录多组数据后拟合。面试里如果问“变参数系统怎么控制”,就答增益调度或自适应控制,电赛里增益调度足够用。
3.4 真题四:MPU6050数据跳动大,滤波怎么选
MPU6050跳动大,先查硬件:电源是否干净、I2C线是否过长、地线是否单点接地。硬件没问题再上滤波。互补滤波计算量小,适合资源紧张的MCU;卡尔曼滤波效果好但参数难调。电赛里互补滤波足够,关键是系数和周期匹配。如果控制周期是10ms,互补滤波系数取0.95到0.98之间,具体看振动程度。
面试里如果问“互补滤波和卡尔曼滤波区别”,答:互补滤波用加速度计低频修正陀螺仪高频积分,实现简单;卡尔曼滤波用状态空间模型做最优估计,计算量大但能处理噪声统计特性。电赛选互补滤波,因为MCU资源有限且实时性要求高。
3.5 真题五:小车转向时平衡变差
转向时平衡变差,是因为转向环输出叠加到左右电机上,破坏了平衡环的对称性。解决办法是转向环输出限幅,且转向环频率要低于平衡环。通常转向环50Hz足够,平衡环200Hz。另外,转向时内侧电机减速、外侧电机加速,如果差速太大,内侧电机可能进入死区导致失控。所以转向环输出也要做死区补偿。
面试里如果问“差速转向怎么不影响平衡”,答:转向环独立于平衡环,输出限幅且做死区补偿,平衡环始终以左右电机平均值为基准。这样转向只改变左右轮速差,不改变平均速度,平衡不受影响。
4. 易错点:五个让车倒下的致命操作
4.1 上电顺序错误导致校准失效
错在哪:上电就使能电机,MPU6050零漂还没校准完,车已经冲出去。为什么错:零漂校准需要静止采样,电机使能后车会动,采样数据混入运动加速度。怎么答对:上电后先延时500ms等传感器稳定,再采样1000次算零漂,校准完成后再使能电机。面试里如果问“上电流程”,就按“传感器初始化、零漂校准、电机使能、进入控制循环”这个顺序答。
4.2 PID积分饱和导致车缓慢漂移
错在哪:速度环积分项没有限幅,车稍微倾斜就积分出很大的速度目标,车为了追目标越跑越快。为什么错:积分项的作用是消除静态误差,但无限积分会让系统失控。怎么答对:给积分项加限幅,同时用反计算抗饱和。代码里积分项累加前先判断是否超过限幅,超过就不再加。
4.3 控制周期抖动导致滤波失效
错在哪:用delay做控制周期,中断一多周期就抖,互补滤波系数失效。为什么错:互补滤波系数是基于固定周期设计的,周期变了滤波效果就变了。怎么答对:用定时器中断做控制周期,周期固定5ms或10ms,主循环只做低优先级任务。面试里如果问“实时性怎么保证”,就答定时器中断加固定周期。
4.4 电机驱动使能引脚悬空
错在哪:电机驱动使能引脚没接,PID输出正常但电机不转。为什么错:使能引脚悬空时驱动芯片处于不确定状态,可能输出高阻。怎么答对:使能引脚接MCU GPIO,上电拉高,同时加下拉电阻防止悬空。面试里如果问“电机不转怎么查”,先查使能引脚,再查PWM输出,最后查电机线序。
4.5 电池电压下降导致参数失效
错在哪:电池电量下降后电压降低,同样PWM占空比下电机转速变慢,平衡参数失效。为什么错:PID参数是在满电时调的,电压降了系统增益就变了。怎么答对:用电池电压做前馈补偿,电压低时适当增大PWM输出。或者比赛前换满电电池,且中途不换电池。面试里如果问“电池电压影响怎么补偿”,答电压前馈或增益调度。
5. 答题技巧:电赛平衡小车现场调试的押题思路
现场调试时间通常只有几个小时,押题思路比盲目调参更重要。我的习惯是:拿到车先不写代码,先用手推一下车,感受机械结构的顺滑度和重心位置。如果轮子转起来有卡顿,先解决机械问题,再调控制。机械不顺,PID调出花来也没用。
然后按“先站后走、先内后外、先P后I再D”的顺序调。先调角度环P到车能站立但有小幅振荡,再加D到振荡消失。这时候车能原地平衡了,再调速度环让车不走。速度环P从0开始加,加到车能抵抗轻微推动但不振荡。最后调转向环,转向环P从小往大加,加到车能转但不过冲。
现场最怕的是参数调好了但一换场地就倒。原因是场地地面摩擦系数变了,或者电源电压变了。所以调参时要在比赛场地上调,且用比赛用的电池。如果时间允许,调两组参数:一组用于硬地面,一组用于软地面。切换参数用拨码开关或按键。
面试里如果问“现场调试思路”,就按“机械检查、姿态校准、角度环调参、速度环调参、转向环调参、场地适配”这个顺序答。每个环节说清楚调什么、看什么现象、怎么判断调好了。面试官最想听的是你有没有系统化调试的经历,而不是背参数。
最后说一个玄学但真实的现象:有时候车调好了,放一晚上第二天又不行了。原因是陀螺仪零漂随温度变了。所以比赛当天要重新校准零漂,且车要预热几分钟再调参。从那以后我每次调车前都强制走一遍“上电预热、零漂校准、机械检查、参数微调”这个流程,再也不敢省步骤。希望帮到你。
本文还有配套的精品资源,点击获取