資源描述:
《PID算法原理,PID源碼,自整定,及工具》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、一、PID的數(shù)學(xué)模型在工業(yè)應(yīng)用中PID及其衍生算法是應(yīng)用最廣泛的算法之一,是當(dāng)之無(wú)愧的萬(wàn)能算法,如果能夠熟練掌握PID算法的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程,對(duì)于一般的研發(fā)人員來(lái)講,應(yīng)該是足夠應(yīng)對(duì)一般研發(fā)問(wèn)題了,而難能可貴的是,在很多控制算法當(dāng)中,PID控制算法又是最簡(jiǎn)單,最能體現(xiàn)反饋思想的控制算法,可謂經(jīng)典中的經(jīng)典。經(jīng)典的未必是復(fù)雜的,經(jīng)典的東西常常是簡(jiǎn)單的,而且是最簡(jiǎn)單的。PID算法的一般形式:二、PID的C語(yǔ)言實(shí)現(xiàn)1.位置式PID的C語(yǔ)言實(shí)現(xiàn)上邊已經(jīng)抽象出了位置性PID和增量型PID的數(shù)學(xué)表達(dá)式,這里重點(diǎn)講解C語(yǔ)言
2、代碼的實(shí)現(xiàn)過(guò)程。第一步:定義PID變量結(jié)構(gòu)體,代碼如下:structt_pid{floatSetSpeed;//定義設(shè)定值floatActualSpeed;//定義實(shí)際值floaterr;//定義偏差值floaterr_last;//定義上一個(gè)偏差值floatKp,Ki,Kd;//定義比例、積分、微分系數(shù)floatvoltage;//定義電壓值(控制執(zhí)行器的變量)floatintegral;//定義積分值}pid;第二部:初始化變量,代碼如下:voidPID_init(){pid.SetSpeed=0.
3、0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.voltage=0.0;pid.integral=0.0;pid.Kp=0.2;pid.Ki=0.015;pid.Kd=0.2;}統(tǒng)一初始化變量,尤其是Kp,Ki,Kd三個(gè)參數(shù),調(diào)試過(guò)程當(dāng)中,對(duì)于要求的控制效果,可以通過(guò)調(diào)節(jié)這三個(gè)量直接進(jìn)行調(diào)節(jié)。第三步:編寫(xiě)控制算法,代碼如下:floatPID_realize(floatspeed){pid.SetSpeed=speed;pid.err=pid.
4、SetSpeed-pid.ActualSpeed;pid.integral+=pid.err;pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);pid.err_last=pid.err;pid.ActualSpeed=pid.voltage*1.0;returnpid.ActualSpeed;}注意:這里用了最基本的算法實(shí)現(xiàn)形式,沒(méi)有考慮死區(qū)問(wèn)題,沒(méi)有設(shè)定上下限,只是對(duì)公式的一種直接的實(shí)現(xiàn),后面的介紹
5、當(dāng)中還會(huì)逐漸的對(duì)此改進(jìn)。到此為止,PID的基本實(shí)現(xiàn)部分就初步完成了。下面是測(cè)試代碼:intmain(){PID_init();intcount=0;while(count<1000){floatspeed=PID_realize(200.0);printf("%f",speed);count++;}return0;}2.增量型PID的C語(yǔ)言實(shí)現(xiàn)上一節(jié)中介紹了最簡(jiǎn)單的位置型PID的實(shí)現(xiàn)手段,這一節(jié)講解增量式PID的實(shí)現(xiàn)方法。#include#includestru
6、ctt_pid{floatSetSpeed;//定義設(shè)定值floatActualSpeed;//定義實(shí)際值floaterr;//定義偏差值floaterr_next;//定義上一個(gè)偏差值floaterr_last;//定義最上前的偏差值floatKp,Ki,Kd;//定義比例、積分、微分系數(shù)}pid;voidPID_init(){pid.SetSpeed=0.0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.err_next=0.0;pid.K
7、p=0.2;pid.Ki=0.015;pid.Kd=0.2;}floatPID_realize(floatspeed){pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;floatincrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);pid.ActualSpeed+=incrementSp
8、eed;pid.err_last=pid.err_next;pid.err_next=pid.err;returnpid.ActualSpeed;}intmain(){PID_init();intcount=0;while(count<1000){floatspeed=PID_realize(200.0);printf("%f",speed);count++;}return0;}3.積分分離的PID控制算法在普通PID控制中,引入積分環(huán)