2025年3月23日电子电工实验室讲课大纲
哈喽,小伙伴们大家好,今天我们来讲一下PID!首先我们的针对的场景是什么——循迹小车!
就是我们刚入手STM32时,我们可能会制作一个循迹小车。我们想让那个小车走直线,但它怎样才能走直线呢?你给他设置两个相同的PWM,它能不能走直线呢?不能吧,因为两个轮子制作工艺在微观上它是不可能完全一样的,也是这个原因造成了我们的两个轮子。
它速度不一样,可能,你一放下去,这个车就走成一个圆了,对不对。所以我们就要引入我们的一个PID公式来使我们的车走直线。然后基本的原理呢,其实通过不断地改变作用到电机的PWM量,使两个轮子速度看起来一样。
先来看一下PID,它到底是什么东西吧,看这里!有浏览器搜索到的结果,它说。是一个控制系统中。通过三个项的组合来输出一个值,然后控制我们的系统稳定。嗯……也就说它是一个公式了。
通过调节作用到电机的PWM值来使两个轮子的速度一样,从而走直线……
好,那我们看一下这个PID原理图啊,这里是说。这个是我们的一个目标值,然后通过三个项后输出一个值作用到我们的一个东西上,然后再输出作用到某一个东西上,然后呢,这里是一个反馈值。那针对于我们的小车这个场景啊,目标指的是什么?速度吧。输入一个目标速度,输出的是PWM吧,然后作用到什么地方上,是作用到电机上吧。对,然后反馈就是什么?反馈就是我们的编码电机,或者说你用到其他的那些可以测速的传感器测到的一个轮子的转速,就相当于我们的实际速度,是吧?!
我们来看一下代码公式,一般我们调节系数时,其他设为0,先改变我们的P。
这是我们的PID核心部分。可以看到说我们通过P这个系数乘以一个误差,然后得到了一个输出结果。然后误差是什么?是我们的一个to get,是目标速度减去我们的实际编码编辑获取到的一个速度。也就是说我们这个函数它是有输入两个参数的。得到的误差*P之后输出一个结果,也就是PWM输出结果。然后这个一部分呢我们先不看好,回过头来我们来看一下。
好,然后我们打开WPS,来简单演示一下这个公式。为什么要用到这个WPS呢?这是我当初在一个也是在B站上刷到的一个博主,他用这个讲的,我觉得讲的特别的好,可以说是启蒙老师啊。那我就长江后浪推前浪,我再来讲讲。嗯……首先看一下这是P项的系数啊,这是D项的系数呀,
这是一个干扰。干扰是什么?就比如说我们的小车在行驶过程中可能会遇到一个坡度啊,这会不会对我们的速度有结果有干扰,然后是我们的轮子的一个摩擦力啊,它是不是干扰?它们会直接影响到我们的速度,对不对?
好,I也是一个作用项,然后这个图是什么呢?横轴是我们第几次执行后的结果一个坐标,就看做是时间就行了。也就是说我们的PID公式啊,在某一次在程序执行的过程中,它会输出一个结果嘛!这个图就相当于把这个结果图形画出来了。
我们来看一下吧,目标是100,也就是说我们的可能目标速度就是100。然后我们的初始值,也就是说我们的初始速度可能是0。嗯,我们的P就是一个系数,就是这条曲线的我为达到目的的这条曲线的斜率一样。
我们通过改变这个P可以让我们很直观的感受到我们达到目标值的时间变短了。但它如果它比较大呢,会遇到一个什么问题?比如说我们设置到一看看,这个曲线变陡了,但这个没什么关系。如果说如果说我们给他设到2呢,哎这是为何?你猜一下?我们的误差有100的时候,它的补偿就是200。然后我们的目标是目标值是100,哎,他却已经达到200。那这个时候我们就是要到下一次执行的时候呢,它就是-100,也就是说它成了一个这样的形状,看到没有?它成了一个这样的形状。过度补偿了,就导致我们的电机可能就会一下正转、一下反转。那这种情况下我们也就是说我们调节这个P参数了。P越小的话应该是比较好调的。但是你也可能要看实际情况,具体情况具体分析。好,我们再改回来,改成0.9吧。当然我们这个WPS上只是简单讲解一下它的原理啊。
好,我们可以看到一个P好像就已经实现到了我们的目的,从0到100。可惜呀我们还有干扰啊,在实际开发的过程中,我们肯定是有很多很多干扰的。然后这个干扰就会导致什么?我们要达到100,但是因为一个干扰,它达不到那个100了。因为我们的干扰是作用到结果上的。
好,那这个时候我们就引入到了另外一项了,也就是我们的这个积分项,通过对当前时刻、以前的误差进行一个求和乘以 我们那个系数。然后再作用回我们的补偿上。好,我们先给大家看一下效果,0.1,这个东西不能太大!好,挺好的。我们的曲线在干扰的作用下,也达到了我们的目标结果。
这样我们就达到了循迹小车走直线的目的了吧。最后,我们再来看一下,D的作用是什么吧。就是说当我们的I比较大的情况下呢,形成了什么样的效果?就因为刚开始的时候误差比较大,然后我们积分的补偿也比较大。在实际开发过程中,我们的PID代码可能是十几ms运行一次,积分是对误差的一个累积嘛,短时间内不调节好就会爆炸式增长,此时就可能是积分项做主导作用到我们的补偿上。然后输出结果就有点过度补偿了。然后这种情况下我们就通过改变一个D看一下效果啊。我们记住它这个地方最大值是多少,最大值是xxx,那我们就用一个D,来使变化量平缓一点。你看我们通过一个D抑制了增大,对吧?这就是我们的微分效果,就能这个抑制这个突然增大的那种毛刺的那个东西,因为变化量越大,他的值也就越大。好了,我们的PID就这样讲完了。
注意我们在实际的使用当中,对于小车直线行驶的这个场景,D我们一般是不用的。这个是PID应用的一种、也叫速度环,也就是我们只需要控制它的速度的话,前面这两个参数就够了。也许加上D的话可能效果更好吧,但是无疑大大增加了参数调节难度,不如只用前面两个参数。
使用PID公式的细节:
1.限制PID输入到电机的PWM范围(不可越界)
2.代码执行语句放在哪里执行?
一般我们是放在中断里面。不能放主函数里。因为主函数的执行周期会随着代码量的改变而改变
代码执行语句的周期是越短越好,但太短也造成CPU处理资源的浪费,不是么。
3.参数调节——可以使用上位机,比如匿名上位机
在小车运行的过程中,通过串口输出一个数值到上位机,上位机读取后在坐标轴上显示出来。还能边运行边参数, 提高效率。甚至还有大佬开发了自动调参的上位机(当然,也需要手动优化)