当那双明亮的、不受任何干扰的“眼睛”,被成功地安装在甩带机上时,林浩感觉自己像一个刚刚打通了游戏第一关的玩家,虽然过程艰辛,但巨大的成就感,让他瞬间充满了继续挑战下一关的勇气。
他知道,“眼睛”的问题解决了,接下来,他要面对的,是一个更复杂的、也更核心的挑战——为这台“超级跑车”,安装上一个足够聪明、足够快速的“大脑”。
这个“大脑”的核心,就是那个在自动化领域,如雷贯耳,却又让无数工程师“闻风丧胆”的东西——PID控制算法。
PID,即比例(Proportional)、积分(Integral)、微分(Derivative)。这是一种最经典、也最广泛应用的闭环反馈控制算法。它的原理,简单来说,就像一个经验丰富的司机在开车。
比例(P),就像司机看到了前方路况(误差),然后,根据距离的远近,决定踩下油门或刹车的力度。误差越大,踩得越狠。
积分(I),则像司机的“记忆力”。他会记住过去一段时间里,所有的累积误差。如果车子一直偏离车道中心线,哪怕偏离得很小,他也会不断地、持续地修正方向盘,直到把这个累积的误差,彻底消除。
而微分(D),则像司机的“预判能力”。他能根据误差变化的“趋势”,来提前做出反应。如果他看到前方的车辆,正在快速地减速,他就会提前松开油门,而不是等到快撞上了,才猛踩刹车。
这三个参数,听起来,简单明了。
但林浩很快就发现,想把这三个“性格迥异”的家伙,完美地,调校到一起,让它们能像一个配合默契的乐队一样,协同工作,这,简直是一门“玄学”。
他开始了他人吃卯粮中,又一段“炼狱”般的调试之旅。
他先是把自己关在宿舍,从网上,找来了大量的、关于PID算法的教程和代码。他那颗充满了逻辑性的理科生大脑,再次发挥了作用。他很快,就在Arduino的编程环境里,写出了一个最基础的PID控制程序。
然后,他将这个程序,烧录进单片机,连接上甩带机的铜辊电机驱动模块,开始了第一次“空载测试”。
他的目标很简单:让铜辊的转速,能够精准地、快速地,达到并稳定在他设定的任何一个目标值上。
然而,当他第一次,在控制程序里,输入目标转速“3000转/分钟”时,现实,就给了他一记响亮的耳光。
他看到,电机的转速,像一个喝醉了酒的醉汉,先是猛地,冲到了三千五百转,远远地,超过了目标值(超调过大)。然后,它又迅速地,掉了下来,掉到了两千五百转。接着,又再次冲上去,再掉下来……
整个系统,在目标值附近,来来回回,像一个失控的钟摆一样,剧烈地振荡,迟迟无法稳定下来。
“P值太大了。”林浩根据自己刚学到的理论,做出了判断。比例项的反应太“激烈”了,一看到误差,就猛踩油门,结果,次次都冲过头。
于是,他减小了P值。
这一次,振荡,确实减小了。但是,新的问题,又出现了。
他发现,无论他怎么等,电机的最终转速,总是稳定在两千九百五十转左右,离他设定的三千转,永远,都差那么一点点。
“静态误差。”林浩的脑海里,又冒出了一个专业名词。这是因为P值太小,当误差变得很小时,它的“纠错”力度,已经不足以,去克服电机本身的摩擦力等固有阻力了。
“看来,得让‘积分项’出马了。”
他开始,在他的代码里,加入积分(I)的计算。他要让这个有“记忆力”的参数,去不断地累积那个微小的静态误差,然后,持续地,给系统一个“加油”的信号,直到,那个误差,被彻底消除。
然而,当他兴冲冲地,再次进行测试时,他发现,自己,捅了更大的“马蜂窝”。
积分项的加入,确实,消除了静态误差。电机的转速,最终,可以精准地,稳定在三千转了。
但是,它的“反应”,也变得,像一个反射弧超长的老大爷。
当他下达指令后,系统需要很长一段时间,才能慢悠悠地,达到目标。而且,由于积分项会累积过去所有的误差,导致系统在启动初期,产生了巨大的“积分饱和”,超调,变得比之前还要严重!
更要命的是,当他试图,去改变目标转速时,整个系统,会因为之前累积的积分,而产生巨大的“惯性”,反应迟钝,甚至,再次陷入剧烈的振荡。
林浩感觉,自己要疯了。
他发现,P、I、D这三个参数,就像三个互相看不顺眼的、脾气古怪的大爷。P大爷性如烈火,I大爷稳如老狗,而D大爷(林浩还没来得及加),则是个神经质的“预言家”。想让他们三个和平共处,简直比登天还难。
这章没有结束,请点击下一页继续阅读!