PID控制原理讲解经常有人问有关PID的用法,看一些有关单片及应用的书上都有关于PID的应用原理,但是面对具体的问题就不知道如何应用了,主要的问题是里面所用到的参数以及计算结果需要进行什么?????经常有人问有关PID的用法,看一些有关单片及应用的书上都有关于PID的应用原理,但是面对具体的问题就不知道如何应用了,主要的问题是里面所用到的参数以及计算结果需要进行什么处理,通过什么样的换算才能具体的应用于实际,另外在计算方法上也存在着数值计算的算法问题,今天我在这里例举温度控中的PID部分,希望能够把PID的具体应用说明白。一般书上提供的计算公式中的几个名词:1.?直接计算法和增量算法,这里的所谓增量算法就是相对于标准算法的相邻两次运算之差,得到的结果是增量,也就是说,在上一次的控制量的基础上需要增加(负值意味着减少)控制量,例如对于可控硅电机调速系统,就是可控硅的触发相位还需要提前(或迟后)的量,对于温度控制就是需要增加(或减少)加热比例,根据具体的应用适当选择采用哪一种算法,但基本的控制方法、原理是完全一样的,直接计算得到的是当前需要的控制量,相邻两次控制量的差就是增量;2.?基本偏差e(t),表示当前测量值与设定目标间的差,设定目标是被减数,结果可以是正或负,正数表示还没有达到,负数表示已经超过了设定值。这是面向比例项用的变动数据。3.?累计偏差Σ(e)=e(t)+e(t-1)+e(t-2)+…e(1),这是我们每一次测量到的偏差值的总和,这是代数和,考虑到他的正负符号的运算的,这是面向积分项用的一个变动数据。4.?基本偏差的相对偏差e(t)-e(t-1),用本次的基本偏差减去上一次的基本偏差,用于考察当前控制的对象的趋势,作为快速反应的重要依据,这是面向微分项的一个变动数据。5.?三个基本参数:Kp,Ki,Kd.这是做好一个控制器的关键常数,分别称为比例常数、积分常数和微分常数,不同的控制对象他们需要选择不同的数值,还需要经过现场调试才能获得较好的效果。6.?标准的直接计算法公式:Pout(t)=Kp*e(t)+Ki*Σe(t)+Kd*(e(t)-e(t-1));上一次的计算值:Pout(t-1)=Kp*e(t-1)+Ki*Σe(t-1)+Kd*(e(t-1)-e(t-2));两式相减得到增量法计算公式:Pdlt=Kp*(e(t)-e(t-1)+Ki*Σe(t)+Kd*(e(t)-2*e(t-1)+e(t-2));*这里我们对Σ项的表示应该是对e(i)从1到t全部总和,但为了打字的简便就记作Σe(t).三个基本参数Kp,Ki,Kd.在实际控制中的作用:????比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。积分调节作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,甚至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决于积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。?微分调节作用:微分作用反映系统偏差信号的变化率,具有预见性,能遇见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下。可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。此外,微分反应是变化率,而当输入没有变化时,微分作用输出为零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。具体应用中的数值量化处理:?????上面只是控制算法的数学方法,似乎有点抽象,在具体的控制项目中怎样对应呢?也就是具体的量化问题。下面举一个在温度控制中的处理方法。对于加温的温度控制可以采用调节供电电压或在一定的时间循环周期内的供电时间比例来调节加温控制温度,一般以调节加温时间比例比较简单,也是控制上比较常用的方法。调压法控制的原理是通过可控硅的处罚相位角达到对电压的调节,这个电压是指有效电压,直观上就是对一个正弦波形的前边切掉一块,用不同的切割位置以保留剩余的面积。为了叙述方便,我们还是采用控制时间比例的办法:我们设定一个标准的加温周期,例如2分钟,我们就在这个两分钟周期内对输出进行控制,也就是说在这个2分钟内加温多少时间,全速加温就是连续整个周期(2分钟)都加温,当然停止加温就是完全不输出,根据我们的计算可以让加温时间在0-2分钟内变化,比如计算所得我们在这一个周期内应该加温1分30秒,经过两分钟以后再测量被加温物体的温度,通过计算我们应该加温1分28秒,等等等等,这里除了加温以外的时间就是不加温,等等下一个周期到来,再进行实际测量计算下一周期我们的输出量,周而复始,不断地修正我们的输出量,以达到对温度有效控制。为了对应我们的程序处理上的方便,我们在程序内部一般并不是用时分秒来计算的,通常我们会使用系统的一个定时器用于系统全部时钟,例如显示刷新、键盘扫描等,相对于计算来说,我们的控制周期比较长,所以我们可以对2分钟进行细分,例如我们用每分钟进行100等分,则两分钟就是200等分,用于我们的温度控制,这样的输出比例的变化已经足够了,我们可以有200个输出等级了。取200的另一个好处是,对应于我们的8位单片机刚好可以在一个字节内进行运算,程序简单运算速度快。当需要改变我们的定时周期时,有些不同的加热对象,例如较大热惯性的加热对象时,可能2分钟周期太短了,我们可以通过修改基本定时常数的办法来实现,而保持我们的200等分不变。我们对2分钟进行200等分,算一下他的每一个基本单位的具体时间?To=60*2/200=0.6s=600ms这对于单片机来说太长了,因为如果我让我的定时器做到这么慢的定时周期就干不了别的事了,为了显示、键盘等的处理一般我们定时在5-10ms,所以就需要另外设定一个变量tTempl在每一个定时中断发生时对tTempl计数。例如我的系统定时器的定时常数对应于10ms,则设定tTempl在达到60的时候才确认是达到600ms了,才作为一个基本的输出时间单位。对应于总周期的修改,我们的200等分可以不用修改,而只要修改我们的变量tTempl的判断边界就可以了,例如对应于2分钟时是60,则在3分钟为周期时边界改为90就行了,定下了我们的基本控制时间分辨率以后,我们的计算就可以不用改变了。当然,根据您的具体对象也可以修改这个等分数,我这里只是作为一个举例:例如200等分。温控仪器不离开测温器件,无论用什么测温器件(传感器),对于控制上来说,首先需要将测到的值换算为温度数据,一般我们国内都采用摄氏度℃,工业上使用的测温器件一般都是非线性的器件,经过放大、A/D转换所得到的电压数据与温度呈非线性关系,存在着微小的差异,一般采用电压值表的办法获得实际温度,这个表格是以每一个温度点上的电压值来表述的,由于我们的单片机rom的大小限制,这个表格也不可能做得很细,基本上以度作为间隔,也就是说直接查表只能获得度为单位的温度值,而实际测量的温度可能是介于T与T+1度之间,在PID控制计算上,这样的分辨率是不够的,所以我们还需要进一步获得具体的温度精确数据,一般采用将T与T+1之间的电压差和AD实际值(mv)进行定分比分点的办法(更精确的是采用二次插值计算法)获得温度的精确数值,也就是获得小数部分。如果能够做到1/10度的温度分辨率精度就可以基本满足控制运算要求了,所以我们可以用定点数的办法处理。不采用浮点数是因为单片机的运算速度不适合用浮点数,定点数处理,就是将温度的内部运算单位放大10倍,在用于显示的时候再除以10也就是固定显示一个小数点位置。如果想让我们的控制做的更好,还可以再提高温度的内部精度,例如精确到1/100度,这也是现在高级温控仪采用的精度,但在通常情况下这个精度似乎有点过剩。PID的三个基本参数Kp,Ki,Kd,一般由试验确定,根据我们的实际工作对象去初步确定,然后在实际运行过程中进行调节,以达到相对理想的效果,为了达到比较好的控制效果,这三个参数一般不采用整数,但同时为了减轻单片机的运算量,通常采用2的整倍数放大的办法确定这些参数,在运算结果中再除以2的整倍数,因为单片机运算中可以用移位来完成,速度比较快,常用的是8倍或16倍放大,注意这三个参数采用相同的放大比例。编程的过程中自己从头到尾要清楚我的参数是经过放大了的,就不会忘记对运算结果还原。通过怎样的运算来获得2-200加温比例数据呢?很简单,为了说明这个问题,我们先假定只考虑最简单的比例控制算法,假定我们的控制范围是在200度,则设定温度与实践温度的差的最大值就是200(度),我们就用去他去输出,这时的参数Kp=1,当我们为了提高加热速度,而使受控制的区域缩小,例如只控制50度范围,如目标温度设定为230,我们控制的范围就在180-230范围内,这时的差值不够200,我们就把计算得到的数字乘以4就得到0-200的数据了,假定当前实测温度为222,则230-222=8再乘以4算得32,这就作为我们的输出比例数据。当然我们这里还没有考虑超温的情况,计算产生了负数。这一部分将作为我们控制输出的基本量,上面的计算是对应于Kp=4DE,再加入微分和积分项,这时我们的Kp可以基本保持不变。Kp在这里基本确立了我们的起始控制点到目标值之间的控制范围,微分和积分项在这里只是作为附加部分,基本不影响控制范围。当温度突然下降一度时,我们希望补上多少比例区进行下一轮的加热呢?这就是微分系数:早我经过这么久的控制,目标温度还是低了一点,我希望用多少的比例去弥补这个长期欠温呢?这就是积分常数,我想你已经大概已经确定了这些数据了。一句话,比例常数决定我们参与在目标点以前真正控制的范围,Kp=基本时间总周期/控制范围。Ki,Kd是您希望的反应对策速度,看你有没有耐心去逐步达到稳定点,过激了会起反作用的,过于胆小怕事是达不到预期目标的。最后,在计算结果交付于输出之前,还需要进行一些修正,例如当计算结果大于200时按200输出,计算结果小于零时按零输出。???????????????????????????????处理上的一些常用方法为了提高测温的准确性,往往需要进行多次测温。然后剔除测得结果中的最大值和最小值。把剩余值的数值相加在计算平均值,这样比较有利于抗干扰,或者由于其他原因引起的测量值波动,初期的处理是很必要的。测温工作和PID计算一般安排在上一个输出周期的最后阶段就提前进行的最后阶段就提前进行,测温次数一般在7-13次,去掉最大最下数以后保留5-11次用于运算,均值运算的累加部分将安排在每一次测温以后逐步进行,不会过多占用系统时间。只有系统的时间允许,尽可能的测多几次,所得到的结果也会相对精确点。运算将会占用很长的时间,这是相对于我们的一个基本定时周期来讲的,一个系统定时周期内我们的系统还要处理很多事情,例如显示的刷新、键盘的扫描、键盘码的处理执行等等,如果我们的运算占用很多时间的话那么就会出现一个系统定时周期内完不成的情况。所以如果您的系统仅仅是一台温控仪的话,就可以将运算部分放到主程序中进行,而常规的刷新扫描之类的才放在定时中断里处理,这样编制的主程序就非常清晰明了,这是比较理想的情况。如果温度控制仅仅作为您的系统中的一部分小插曲,那就需要认真考虑程序的布局了,主程序有更重要的任务要处理,温度控制运算部分就只能委托系统定时器来承担了,时间不够用怎么办?假定我们的定时周期是10ms,显示刷新部分要用1ms,键盘扫描处理要1ms,PID运算要2ms(假定),留给主程序的时间可能不够了,我们就需要对我们的PID运算进行任务的分割,把运算分成几个部分进行,每一次进入运算程序只计算其中的一小部分,经过N次的调才完成一个完整的PID运算,这样就不会影响整个系统的运作了,这里面需要细细