1. 平衡小车PID调参的核心思路
做平衡小车最让人头疼的就是PID调参了,很多新手一开始就被这三个环搞得晕头转向。我自己调过不下十台平衡小车,从最初的完全懵逼到现在的得心应手,中间踩过的坑真是数不胜数。
平衡小车用的是串级PID控制,包含三个核心环节:直立环、速度环和转向环。这三个环不是独立工作的,而是像俄罗斯套娃一样层层嵌套。直立环负责保持小车不倒,速度环控制小车移动,转向环则负责控制方向。调参时必须按照特定顺序来,否则永远调不好。
为什么要用串级PID而不是并级?实测下来串级虽然调参复杂一些,但控制效果和稳定性要好得多。并级PID容易产生环间干扰,经常会出现调好一个环另一个环又失控的情况。
2. 硬件准备与基础配置
2.1 核心硬件选型
STM32F103C8T6这个芯片真的是性价比之王,我做过对比测试,同价位的芯片里它的性能和外设丰富程度都是顶尖的。72MHz的主频完全够用,而且HAL库的支持也很完善。
电机一定要选择带编码器的直流减速电机,GM25-370是个不错的选择。编码器精度建议在500线以上,太低的速度反馈会不够灵敏。MPU6050现在基本都是标配了,记得要买带DMP库的版本,这样可以直接输出欧拉角,省去了自己写滤波算法的麻烦。
电源部分很多人会忽视,其实很关键。我用的是三节18650电池,通过XL6009升压到15V给电机供电,再用LM2596S降压到5V和3.3V给控制板和外设供电。电机和控制电路一定要分开供电,否则电机启动时的电流波动会导致单片机重启。
2.2 CubeMX配置要点
时钟树配置要特别注意,HSE选择晶体振荡器,主频设置为72MHz。I2C1用于MPU6050,要配置为高速模式;I2C2用于OLED,标准模式就够了。
TIM2和TIM4配置为编码器模式,这里有个坑要注意:编码器模式要选择"Encoder Mode TI1 and TI2",这样才能实现四倍频计数。TIM3和TIM4的通道1和通道2配置为PWM输出,频率设置为10kHz比较合适。
NVIC配置是关键中的关键!一定要把Systick的中断优先级设置得比外部中断高,否则MPU6050的中断会卡死系统。我当初调试的时候就在这里卡了整整两天,最后发现是优先级问题。
GPIO配置:电机驱动引脚设置为推挽输出,编码器引脚设置为上拉输入,MPU6050的中断引脚设置为下降沿触发。这些细节配置不对后面调试会很痛苦。
3. 直立环PID调参实战
3.1 参数极性测试
调直立环前必须先测试参数极性,这是最容易出错的地方。具体方法是:先给Kp一个较小的正值(比如10),然后用手扶住小车慢慢倾斜。如果小车往倾斜的方向加速,说明极性正确;如果往反方向运动,就要把Kp改为负值。
同样的方法测试Kd的极性:快速晃动小车,如果电机产生与运动方向相反的阻力,说明极性正确。记住一定要先测试极性,否则后面所有调试都是白费功夫。
3.2 Kp参数整定
把Ki和Kd都设为0,只调节Kp。从小值开始慢慢增加,直到小车出现低频振荡。这个振荡频率大概在1-2Hz左右,幅度会比较大。这时候的小车就像喝醉了一样左右摇摆,但不会完全倒下。
我通常从Kp=10开始,每次增加5,直到出现明显的振荡。这个过程中要特别注意安全,因为振荡幅度过大会导致电机飞转。一定要用手扶着小车,随时准备断电。
3.3 Kd参数整定
Kp调好后保持不动,开始调节Kd。同样从小值开始,慢慢增加直到出现高频振荡。这个振荡频率会在5-10Hz,幅度较小但频率很高。小车会发出嗡嗡的声音,电机高速抖动。
Kd的作用是抑制振荡,但过大的Kd会导致高频抖动。找到那个刚好能抑制低频振荡但又不会引起高频抖动的值很重要。我一般从Kd=0.5开始,每次增加0.2。
3.4 工程经验系数
调出振荡点后,按照工程经验要把Kp和Kd都乘以0.6。这个系数是很多前辈总结出来的,实测下来确实效果最好。乘以0.6后的参数既能保持稳定性,又有足够的响应速度。
为什么是0.6不是其他值?因为振荡点是最佳参数的理论值,但实际应用中需要留一些余量来应对各种干扰。0.6这个系数在稳定性和响应速度之间取得了很好的平衡。
4. 速度环PID调参技巧
4.1 速度环特点分析
速度环用的是PI控制,没有微分项。这是因为速度本身就是一个变化相对缓慢的量,加入微分项容易引入噪声。速度环的输出是作为直立环的输入,所以调节速度环会影响整个系统的稳定性。
速度环的Kp和Ki有一个经验比例关系:Kp ≈ 200 * Ki。这个比例不是绝对的,但可以作为调试的起点。我一般先设Ki=0.1,Kp=20,然后根据实际情况微调。
4.2 参数整定方法
先把转向环参数设为0,只调节速度环。用手推动小车,观察小车的反应。理想状态是小车会轻微抵抗推力,但不会过度反应。
如果小车过于敏感,一动就剧烈振荡,说明Kp太大需要减小。如果推了没反应或者反应很迟钝,就要增大Kp。Ki的调节要更谨慎,过大的Ki会导致积分饱和,小车会突然加速或减速。
4.3 常见问题解决
速度环最常见的问题是静差和振荡。静差就是小车始终有微小的移动,这时候需要增大Ki来消除静差。但Ki增大会降低稳定性,所以要慢慢调节。
振荡问题通常是因为Kp太大,但有时候也可能是Ki过大导致的。区分方法是:如果是高频振荡,一般是Kp太大;如果是低频的周期性摆动,可能是Ki过大。调节时要耐心,每次只调一个参数,观察效果后再决定下一步。
5. 转向环PID调参要点
5.1 转向环的特殊性
转向环通常只用P控制就够了,因为转向要求的是快速响应,积分和微分反而会带来问题。转向环的输入是陀螺仪的Z轴角速度,输出是左右电机的差速。
调试时先给一个较小的Kd值(注意转向环用的是Kd,虽然只是P控制),观察小车直线行驶时是否偏移。如果往一边偏,就适当增加Kd值直到能够走直线。
5.2 参数整定步骤
让小车在光滑地面上直线行驶,观察偏移情况。如果向左偏,就增大Kd;向右偏就减小Kd。这里要注意的是,Kd的极性很重要,如果极性反了会出现反方向转向。
转向环的参数不需要很精确,只要小车能基本走直线就行。因为在实际使用中,我们通常会用遥控器来控制方向,转向环主要起辅助稳定作用。
5.3 转向环与速度环的协调
转向环和速度环会相互影响,所以在调好速度环后再调转向环。如果调节转向环后发现速度环又不稳定了,可能需要回过头微调速度环参数。
有时候会出现转向时小车抖动的问题,这通常是转向环参数过大导致的。适当减小Kd值就能解决。记住一个原则:在满足基本要求的前提下,参数越小越稳定。
6. 安全保护机制实现
6.1 拿起检测功能
调试时最危险的就是拿起小车时的电机飞转问题。我吃过这个亏,手指被高速旋转的电机打出一道血痕。后来加了拿起检测功能,完美解决了这个问题。
检测原理很简单:当小车被拿起时,轮子会空转,编码器读数会突然增大。通过检测编码器速度是否超过阈值来判断是否被拿起。检测到拿起后就立即停止电机输出。
if(Encoder_L > 40 || Encoder_R > 40 || Encoder_L < -40 || Encoder_R < -40) {
T_up++;
if(T_up > 1) UpFlag = 1;
T_down = 0;
}
6.2 自动复位机制
光检测拿起还不够,还要有自动复位功能。当检测到小车被放下并且处于平衡状态时,自动重新启用电机控制。
我用的判断条件是:编码器读数为0(轮子不动),姿态角小于10度(小车基本直立),并且之前已经检测到拿起状态。满足这些条件后延时一段时间再复位,避免误触发。
if(Encoder_L == 0 && Encoder_R == 0 && pitch < 10 && pitch > -10
&& roll < 10 && roll > -10 && UpFlag == 1) {
T_down++;
if(T_down > 3) NVIC_SystemReset();
T_up = 0;
}
6.3 其他保护措施
除了拿起检测,我还加了倾角保护。当姿态角超过45度时强制停止电机,防止小车倒下时轮子还在转。
电压检测也很重要,当电池电压低于设定值时降低电机输出功率,避免突然断电导致小车失控。这些保护措施虽然简单,但能极大提高调试安全性。
7. 调试技巧与常见问题
7.1 调试工具的使用
OLED显示屏是调试的好帮手,我通常同时显示姿态角、编码器读数、PID输出值和电池电压。通过观察这些数据的变化趋势,可以快速定位问题所在。
串口绘图工具更好用,可以实时绘制参数曲线。我常用SerialPlot这个开源工具,能同时绘制多条曲线,特别适合观察PID参数的调节效果。
蓝牙模块也很实用,可以通过手机APP实时修改PID参数,不用每次都重新烧录程序。这样调试效率能提高好几倍。
7.2 常见问题解决
电机异响通常是PWM频率不合适导致的,10kHz是比较合适的值。频率太低电机会有啸叫声,太高则驱动芯片可能发热严重。
小车往一边偏不一定是参数问题,先检查机械结构是否对称,轮胎是否充气均匀,电机性能是否一致。很多时候问题出在机械部分而不是控制算法。
突然失控可能是电源问题,电机启动时的电流很大,会导致电压瞬间跌落。一定要用低ESR的电容做电源滤波,我通常在电机驱动旁边加一个1000μF的电解电容。
7.3 性能优化建议
中断优先级要合理安排,MPU6050的数据读取优先级最高,编码器次之,其他任务优先级最低。确保姿态数据能够及时更新。
算法里面可以加一些滤波处理,比如对编码器读数做移动平均滤波,对陀螺仪数据做互补滤波。但滤波不能过度,否则会引入滞后影响控制效果。
代码优化也很重要,PID计算中的浮点运算可以改成定点数运算,能提高计算速度。我测试过,改成定点数后计算时间能减少30%左右。
8. 实际效果验证与参数微调
8.1 静态平衡测试
调完参数后首先要做静态平衡测试:把小车放在地面上,观察能否保持平衡。理想状态是小车基本不动,或者只有微小的抖动。
如果抖动幅度过大,可以适当减小Kp或增大Kd。但要注意平衡点,参数过小会导致响应迟钝,过大又会引起振荡。需要反复微调找到最佳值。
用手轻推小车测试恢复能力,好的参数应该能快速恢复平衡又不产生过大超调。推力和恢复时间要适中,太慢了说明参数偏小,太快了容易振荡。
8.2 动态性能测试
让小车在粗糙地面上测试,观察抗干扰能力。好的参数应该能适应不同地面条件,不会因为地面不平就失控。
加减速测试也很重要,突然的加速或减速会考验系统的稳定性。我通常用手突然推一下小车,观察恢复过程。恢复时间应该在0.5秒左右,过长过短都不好。
续航测试不能少,不同的参数对功耗影响很大。在满足性能要求的前提下,尽量选择更省电的参数。我测试过,优化后的参数能延长20%的续航时间。
8.3 参数长期稳定性
参数调好后要长时间运行测试,我通常让小车连续运行1小时以上,观察是否有参数漂移或性能下降现象。
温度变化会影响电机和传感器性能,所以要在不同环境温度下测试。特别是冬天和夏天的温差很大,可能需要准备两套参数。
最后要说的是,参数没有绝对的最佳值,只有最适合当前硬件条件的值。换了电机或传感器后,可能都需要重新调参。所以理解原理比记住参数值更重要。
319



被折叠的 条评论
为什么被折叠?



