1. 平衡小车PID调参前的准备工作
做平衡小车最让人头疼的就是PID调参了,我刚开始玩STM32平衡小车的时候,在这个环节踩了不少坑。今天我就把自己用STM32F103C8T6和HAL库调平衡小车的实战经验分享给大家,让你少走弯路。
首先你得确保硬件部分都正常工作,这是调参的基础。我用的是最常见的STM32F103C8T6最小系统板,这款芯片性价比超高,72MHz的主频完全够用,而且HAL库的开发效率真的很高。电机驱动我用的是TB6612,比L298N发热小多了,编码器电机选的是GM25-370,MPU6050做姿态传感器。
接线这块要特别注意,I2C接口的上拉电阻不能省,不然MPU6050数据会不稳定。电机的PWM频率我设的是10kHz,这个频率既能保证驱动效果,又不会让MOS管太烫。编码器模式配置成上下沿都计数,这样精度更高。
软件方面,我先用STM32CubeMX生成了基础工程,配置好了时钟树、定时器、I2C和GPIO。这里有个大坑要注意:NVIC的优先级设置。如果Systick的中断优先级低于MPU6050的外部中断,程序会卡死,因为DMP库里面用了HAL_Delay()。我的经验是把Systick的抢占优先级设得比外部中断高。
2. PID参数极性判断与直立环调试
调PID的第一步是确定参数极性,这一步千万不能错,否则后面全白搭。我先说说直立环的极性判断方法。
直立环的Kp极性测试:用手扶着小车,让小车稍微前倾,然后给一个很小的Kp值(比如10)。如果小车车轮向前转动试图保持平衡,说明极性正确;如果车轮向后转动导致小车更倒,说明极性反了,需要把Kp取反。Kd的测试方法类似,快速晃动小车,车轮应该产生与运动方向相反的阻力。
我刚开始没注意极性,调了半天发现小车越调越倒,后来才发现是极性设反了。所以一定要先验证极性,再开始调参数。
接下来是直立环的低平振荡调整。先只开直立环,把速度环和转向环的参数都设为0。给Kp一个初始值(我一般从200开始),然后观察小车现象。如果小车出现低频大幅度摆动,就像慢悠悠地摇晃,这就是低平振荡,说明Kp差不多了。
然后调Kd,加入微分项。Kd的作用是抑制振荡,但给太大了会产生高频抖动。我慢慢增大Kd,直到小车开始出现高频小幅度振动,这时候Kd就差不多了。
调到这里,小车应该能短暂站立了,但会慢慢倒向一边。这时候按照工程经验,把调好的Kp和Kd都乘以0.6,这样系统会更稳定。我第一次调的时候没乘这个系数,小车站是能站,但特别敏感,稍微一碰就倒。
3. 速度环的参数整定技巧
直立环调好后,就可以加速度环了。速度环的作用是让小车在平衡的同时保持位置稳定,不会越走越快或者越走越慢。
速度环我用的是PI控制器,因为微分项对速度环效果不明显反而可能引入噪声。根据经验,Kp和Ki有个大概的比例关系,Kp大概是Ki的200倍左右。我一般从Kp=100, Ki=0.5开始试。
调速度环的时候要有耐心,因为参数变化的效果不是立竿见影的。我先给一个较小的Ki,观察小车慢慢移动的趋势。如果小车往一个方向越走越快,说明Ki需要调整。增加Ki会让小车更"恋家",倾向于回到原点。
这里有个实用技巧:在OLED上实时显示编码器的速度值,这样就能直观地看到速度环的效果。我一般都是边调参数边看数据,比单纯看小车现象要准确得多。
如果发现小车在平衡位置附近来回摆动,可能是Ki太大了,需要减小。如果小车总是停不住,一直慢慢移动,可能是Ki太小了,需要增大。这个调整过程需要反复试验,我花了差不多一个下午才找到合适的参数。
记得调速度环的时候,直立环的参数就不要动了,不然两个环互相影响,更难调。这也是为什么我们要先调好直立环再调速度环的原因。
4. 转向环优化与参数协调
当直立环和速度环都调好后,小车基本能稳定平衡了,但可能会发现小车总是偏向一边,或者转向不灵活。这时候就需要调转向环了。
转向环我用的也是PID,但实际调试中发现只要PD就够了,积分项反而容易造成转向过冲。转向环的参数相对小一些,我的Kp一般是直立环的1/10左右。
调试转向环时,我用手轻轻扭转小车,观察车轮的反应。如果扭转时阻力适中,说明参数合适;如果阻力太大转向困难,或者完全没有阻力,说明参数需要调整。
有时候会发现调好转向环后,原本调好的平衡又变差了,这是因为三个环之间相互影响。这时候需要微调各个环的参数,找到最佳平衡点。我的经验是每次只调一个参数,观察效果后再决定下一步。
转向环还有个常见问题是死区设置。如果转向环的死区太大,小车会有明显的转向滞后;死区太小,又容易产生抖动。我一般设置在±2度左右,这个值可以根据实际效果微调。
5. 安全检测机制的实现
调参过程中最让人心疼的就是看到小车突然发疯一样狂转轮子,然后啪的一声摔在地上。这是因为拿起小车时PID算法还在工作,检测到角度变化就拼命修正。
于是我加了个安全检测机制,原理很简单:当编码器速度超过阈值(我设的是40)时,认为小车被拿起来了,就停止电机输出。当检测到小车被放下(编码器速度为0,姿态角也正常)并保持一段时间后,自动重启系统。
代码实现是这样的:用定时器中断定期检查编码器数值和姿态角,如果发现异常就置位标志位。这个机制救了我的小车好几次,特别实用。
还有一个安全措施是PWM限幅,确保不会输出过大的PWM值烧坏电机或驱动芯片。我在输出到电机前都用Limit函数做了限幅处理,把PWM限制在±3600之间(对应10kHz PWM的36%占空比)。
6. 调试工具与实用技巧
工欲善其事,必先利其器。好的调试工具能大大节省调参时间。我最常用的是OLED显示屏,实时显示角度、角速度、编码器速度和PID输出值,这样就能直观地看到参数变化的效果。
串口调试也很重要,我写了个简单的协议,可以通过串口实时修改PID参数,不用每次修改都重新烧录程序。这个功能在精细调参时特别有用。
还有一个技巧是录制调试视频,慢放观察小车的运动细节。有些细微的振动和摆动用肉眼很难捕捉,用视频慢放就能看得很清楚。
调参时我习惯先用保守的参数,确保安全后再慢慢增大。比如先给较小的Kp,让小车勉强能站,再慢慢调整到最佳状态。这样虽然慢一些,但不容易出现失控的情况。
最后要说的是耐心。PID调参是个细活,急不得。我调第一个小车花了一个周末,但掌握了方法后,第二个小车只用了半天就调好了。记住每个小车的参数都不完全一样,需要根据实际情况调整。
最享受的就是看到小车从摇摇晃晃到稳稳站立的那一刻了,所有的努力都值得。希望我的经验对你有帮助,祝你调参顺利!
561



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



