先插句广告,本人QQ522414928,不熟悉PID算法的可以一起交流学习,随时在线
在正式进入正文前,补充一下本人学习PID算法的背景,先自我介绍一下:本人一名大三电子专业的学生,什么学校你就别管了,学校一般,普通的二本院校。到现在可以说我已经研究了快两年的PID,这期间做过帆板角度控制系统,做过平衡车,做过倒立摆,做过板球控制系统,做过openmv小球追踪系统,还做过四旋翼等……,可以说现在已经很熟悉PID算法,包括单级的PID算法和多级的PID算法。到现在感觉其实这个PID算法还是很经典,很有用的,那么简简单单的几行代码,就能实现自动追踪,自动跟随,平衡等操作,用途广泛。如果你不会PID算法,大多数控制其实你是实现不了的,如果这个经典而又简单的算法你不会不会,别的控制类的算法估计你也不会。可能让你做一件产品或是参加某些控制类比赛,显然,不会PID这些算法,你只能做简单的逻辑控制,而逻辑控制又太简单,几个if()语句判断显然是不满足控制类设计的需要的。另外,很多不需要PID算法的设计其实也是可以加入PID算法的,这能让你的设计更有稳定性和挑战性,有些必须需要PID算法的设计,没有PID不能形成闭环控制,是根本不能完成的。
扯淡的不多说,本人就喜欢简单粗暴,喜欢把复杂的东西简单化,很多的电子教程虽然把PID算法介绍的很全面,但是写的复杂的不得了,今天本人就用通俗易懂的语言把复杂的问题简单化:
先解释一下传统的位式算法,也就是简单的逻辑算法:
①先拿恒温烧水系统来说,假如说你要把水烧到80度,简单的逻辑做法是在水里加一个温度传感器和电热烧水器,然后用单片机测温,如果if(温度<80度),那你就给电热烧水器加热烧水,如果if(温度>80度),那我就停止加热。思考一下,最后你得到的水温一定会是80(可以上下有微小差别)度吗?答案肯定是否定的。(这里说明一下,不要教条,不要问你为什么会把水烧到80度,直接把水烧开不行吗,如果你有这样的疑问,不要再看了,你学不明白这个算法。)这是为什么?我来解释一下,当传感器测到温度达到80度时,单片机控制加热器停止加热,虽然加热器断电了,但是加热器的余温还是比水的温度要高,所以加热器不会立即停止加热,而是继续给水加热一会儿直到和水的温度一样,此时水的温度会高于80度,可能电热器的余温就把水加热到了90度,对吧!然后水和加热器又一起降温,一般情况下加热器降温的速度会更快,所以当水的温度下降到80度时,加热器的温度又低于80度,这时传感器检测到水温低于80度,单片机又控制加热器加热,而此时加热器温度不够低于80度,所以需要预热一下再给水加热,在预热的这段时间里水的温度可能又降到了75度才开始加热。所以,水的温度不能保持在80度上下轻微浮动的范围内,水温一直都是在75度到90度之间浮动的!
②再拿平衡车系统来说,你需要一个陀螺仪传感器,比如(mpu6050),先说下平衡车的原理,避免有些人不懂,平衡车为什么两个轮子能站着不到,大家一定都军训过,站过军姿,站军姿的时候教官让你身体前倾,但是只能轻微的前倾,如果你能前倾45度,那你一定控制不住身体平衡,需要往前迈步才能达到平衡。平衡车跟这个原理是一样的,如果车要往前倒,那我让车轮前转来维持平衡,如果车往后倒,那我让车轮后传来维持平衡,原理都应该明白了吧!(如果这个原理还不明白建议不要学了,更不要搞控制方向了,避免学了半天还得转行浪费时间)继续,假设车上的陀螺仪角度0度时车是平衡的,如果角度大于0度我就让车轮前转,如果角度小于0度我就让车轮后转,显然这样做,车是平衡不了的,由于车的惯性作用,一下可能就过调了,直接倒了。原理跟烧水差不多,不多说了。
下面开始说PID算法:
先说PID三个参数,P是比例,I是积分,D是微分;很多人都知道这三个参数,只是不了解其背后代表的含义,为啥用比例积分微分。不着急听我慢慢给你介绍,只要我介绍完,你一下就懂了。
首先介绍一下P,P代表比例,光用一个比例算法其结构是这样的:
err(误差)=setpoint(设定值)-actual_value(传感器测量的实际值) (误差这个概念大家应该都明白)
output(输出值比如PWM)=p(比例系数)*err(误差)
明天继续,今天舍友都睡了,不打扰了。
原文地址:https://www.cnblogs.com/LiuXinyu12378/p/8878582.html