说到PID,我们最先想到的就是闭环控制,那么什么是闭环控制呢?举个例子,我们很难在沙漠这样的环境中走成一条直线,因为没有参照物,或者参照物本身就是歪的,但是我们很容易在一条笔直的马路上走成直线,那我们是如何在马路上走成直线的呢?首先,我们得先设定一个目标量,就是沿着一条直线行走,其次我们需要一个执行器,也就是我们的双腿,还需要一个传感器,就是我们的眼睛,判断是否偏移了白线,以及获得一个偏差量,把得到的偏差量送给我们的执行器,,双腿就会微调方向,以及保证沿着这条白线行走,所以这六个环节组成的环就称为闭环控制。
闭环控制的控制原理就是当输出量与目标量不一致时,通过计算调整到与目标量一致。其中,PID算法是闭环算法中最简单的一种算法。PID是比例 (Proportion)、积分 (Integral)、 微分 ,(Differential coefficient) 的缩写,分别代表了三种控制算法。通过这三个算法的组合可有效地纠正被控制对象的偏差,从而使其达到一个稳定的状态。它不依赖任何被控对象具体的数学模型,所以几乎可以应用于各种场合。
比例P
比例P的作用最明显,原理也是最简单的。举个例子,当我们要加热一桶水到一定的温度时,这时有“设定水温”和“当前水温”两个值,而这两个值之间也会有一个误差值,比例P的作用就是将这个误差值按照一定的比例去升高或者降低水温。比例P越大,加热的速度就越快,但是容易产生震荡。比例P越小,加热的速度就越慢,但是不容易产生震荡。
偏差量 = 目标量 - 当前量
比例P = 偏差量 * 比例系数P
执行量 = 比例P
积分I
积分I作用是累计误差量,减小静态情况下的误差,让受控物理量尽可能的接近目标值。还是以加热水为例子。当在一个非常寒冷的环境是,我们需要将一桶水加热到50℃,但是当我们把水加热到45℃时,比例P的加热速度和水的散热速度达到平衡,这时水温将不再升高和降低,但是离我们的目标值还差5℃,这时我们会增加一个积分量,这个积分量只要存在 误差,就会不断的对偏差进行积分(累加),并反应在调节力度上,也就是加热量上,将水温不断的加热到50℃。积分的系数越大,积分的效果越明显,但是需要设置积分限制,防止在刚开始加热时,就把积分的累计的过大,在后期难以调节。
偏差量 = 目标量 - 当前量
积分I = 积分I + 偏差量 * 积分系数I
执行量 = 比例P + 积分I
微分D
D的作用可以作为一个先知,通俗的来说就是预测未来,它的作用是对误差的趋势进行预测,提前对输出量做出预判性的调整。它可以得到误差的变化趋势,有利于减小超调,克服震荡,提高系统响应速率,但是在干扰信号严重的系统中不适宜加入微分环节。
偏差量 = 目标量 - 当前量
微分D = (偏差量 - 上一次误差量) * 微分D
执行量 = 比例P + 积分I + 微分D
得到的完整的PID算法为:
e(k)为上一次的误差值,e(k-1)为上上次的误差值
程序编写
error1_V = (Vset_target - Vout_actual); //当前误差
e1_V = error1_V - error2_V; //上上次误差
ERROR_Increase_V += Kp_V * e1_V + Ki_V * error1_V + Kd_V * (e1_V - e2_V); //PID算法
error2_V = error1_V; //移位
e2_V = e1_V; //移位
Execution = ERROR_Increase_V ; //给执行量赋值