强奸久久久久久久|草草浮力在线影院|手机成人无码av|亚洲精品狼友视频|国产国模精品一区|久久成人中文字幕|超碰在线视屏免费|玖玖欧洲一区二区|欧美精品无码一区|日韩无遮一区二区

首頁 > 產(chǎn)品 > 知識(shí) > pid控制算法,PID控制算法

pid控制算法,PID控制算法

來源:整理 時(shí)間:2023-08-16 18:24:44 編輯:智能門戶 手機(jī)版

本文目錄一覽

1,PID控制算法

PID控制是將偏差的比例(p)、積分(I)和微分(D)通過線性組合構(gòu)成控制量,對(duì)被控對(duì)象進(jìn)行控制。說到PID控制算法有很多種,好比位置式PID控制算法、增量式PID控制算法、積分分離PID控制算法......根據(jù)系統(tǒng)的連續(xù)性和離散性,PID控制算法也不同,所以不知LZ是在問什么
首先看自動(dòng)控制原理的pid表達(dá)式,然后看懂離散表達(dá)式,不要看網(wǎng)上的pid程序,然后根據(jù)離散表達(dá)式自己就可以寫出程序。網(wǎng)上的pid控制大部分都是用結(jié)構(gòu)函數(shù)寫的,看不太懂。

PID控制算法

2,單片機(jī)中的PID算法是什么意思啊有什么用途呢謝謝

pid就是比例積分微分算法
PID算法是一種經(jīng)典的控制算法.由比例/積分/微分組成.建議看看控制理論.PID就是比例積分微分控制,在工業(yè)里面應(yīng)用非常廣泛,據(jù)統(tǒng)計(jì),現(xiàn)在有一半以上以上的工業(yè)系統(tǒng)直接應(yīng)用PID控制.PID分模擬和數(shù)字,既然用到了單片機(jī)當(dāng)然就得用數(shù)字了,另外PID還分理想,實(shí)際,微分先行,抗積分飽和等等,但都是在理想或者實(shí)際PID式子上面進(jìn)行一些修改得來的.關(guān)于這方面的知識(shí),建議你還是找一本控制理論書刊以下,很簡(jiǎn)單,但卻是非常有用的,搞工業(yè)設(shè)計(jì),不懂PID,說出來都沒人信
就是一算法 用于控制

單片機(jī)中的PID算法是什么意思啊有什么用途呢謝謝

3,什么是PID 算法

PID是工業(yè)控制上的一種控制算法,其中P表示比例,I表示積分,D表示微分。以溫度控制的PID程序?yàn)槔篜(比例)表示在溫度設(shè)定值上下多少度的范圍內(nèi)做比例動(dòng)作,當(dāng)溫度越高,功率越小,溫度越低,功率就越大,功率到底為多大,就看溫度偏差值和比例區(qū)間的大小按反比關(guān)系計(jì)算。I(積分)也是一種比例,是溫度偏差值的累積值與設(shè)定的一個(gè)值之間的反比關(guān)系,但要注意何時(shí)將溫度偏差值的累積值清零。積分就好像當(dāng)溫度比設(shè)定值低很多而你有覺得溫度升的慢的時(shí)候就使勁的加大功率一樣。D(微分)是溫度變化快慢跟功率的比值,即當(dāng)你覺得溫度上升的太快時(shí),就降低功率,一阻止溫度上升過快,反之當(dāng)溫度下降太快時(shí),就加大功率以阻止溫度下降太快一樣。給我郵箱我可以給你發(fā)一份PID溫度控制程序。

什么是PID 算法

4,pid控制的算法

給你個(gè)PID控制算法的程序段,該程序是西門子PLC的SCL程序。帶"_IN"與帶"_OUT"的變量,如果前綴是一樣的,要求連接同一個(gè)變量。這段程序已經(jīng)在溫度控制上運(yùn)行通過了。FUNCTION FC1 : VOID VAR_INPUT Run:BOOL; //True-運(yùn)行,F(xiàn)alse-停止 Auto:BOOL; //True-自動(dòng),F(xiàn)alse-手動(dòng) ISW:BOOL; //True-積分有效,F(xiàn)alse-積分無效 DSW:BOOL; //True-微分有效,F(xiàn)alse-微分無效 SetMV:REAL; //手動(dòng)時(shí)的開度設(shè)定值 SVSW:REAL; //當(dāng)設(shè)定值低于SVSW時(shí),開度為零 PV:REAL; //測(cè)量值 SV:REAL; //設(shè)定值 DeadBand:REAL; //死區(qū)大小 PBW:REAL; //比例帶大小 IW:REAL; //積分帶大小 DW:REAL; //微分帶大小 dErr_IN:REAL; //誤差累積 LastPV_IN:REAL; //上一控制周期的測(cè)量值 END_VAR VAR_OUTPUT MV:REAL; //輸出開度 dErr_OUT:REAL; //誤差累積 LastPV_OUT:REAL;//上一控制周期的測(cè)量值 END_VAR VAR Err:REAL; //誤差 dErr:REAL; //誤差累積 PBH:REAL; //比例帶上限 PBL:REAL; //比例帶下限 PVC:REAL; //測(cè)量值在一個(gè)控制周期內(nèi)的變化率,即測(cè)量值變化速率 P:REAL; //比例項(xiàng) I:REAL; //積分項(xiàng) D:REAL; //微分項(xiàng) END_VAR IF Run=1 THEN IF Auto=1 THEN IF SV>=SVSW THEN Err:=SV-PV; PBH:=SV+PBW; PBL:=SV-PW; IF PV MV:=1; ELSIF PV>PBH THEN MV:=0; ELSE P=(PBH-PV)/(PBH-PBL); //計(jì)算比例項(xiàng)//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////以下為積分項(xiàng)的計(jì)算////////////////////////////////////////////////////////////// IF ISW=1 THEN dErr:=dErr_IN; IF (PV(SV+DeadBand)) THEN IF (dErr+Err) dErr:=0-IW; ELSIF (dErr+Err)>IW THEN dErr:=IW; ELSE dErr:=dErr+Err; END_IF; END_IF; I:=dErr/IW; dErr_OUT:=dErr; ELSE I:=0; END_IF;/////////////////////////////////////////////以上為積分項(xiàng)的計(jì)算////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////以下為微分項(xiàng)的計(jì)算////////////////////////////////////////////////////////////// IF DSW=1 THEN PVC:=LastPV_IN-PV; D:=PVC/DW; LastPV_OUT:=PV; ELSE D:=0; END_IF;/////////////////////////////////////////////以上為微分項(xiàng)的計(jì)算/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// IF (P+I+D)>1 THEN MV:=1; ELSIF (P+I+D)<0 THEN MV:=0; ELSE MV:=P+I+D; END_IF; END_IF; ELSE MV:=0; END_IF; ELSE MV:=SetMV; END_IF; ELSE MV:=0; END_IF;END_FUNCTION

5,單片機(jī)中的PID算法

PID算法 下面對(duì)控制點(diǎn)所采用的PID控制算法進(jìn)行說明。 控制點(diǎn)目前包含三種比較簡(jiǎn)單的PID控制算法,分別是:增量式算法,位置式算法,微分先行。 這三種PID算法雖然簡(jiǎn)單,但各有特點(diǎn),基本上能滿足一般控制的大多數(shù)要求。1) PID增量式算法離散化公式: 注:各符號(hào)含義如下 u(t) 控制器的輸出值。 e(t);;控制器輸入與設(shè)定值之間的誤差。 Kp;; 比例系數(shù)。 Ti;;積分時(shí)間常數(shù)。 Td;微分時(shí)間常數(shù)。 T;;調(diào)節(jié)周期。 對(duì)于增量式算法,可以選擇的功能有: (1) 濾波的選擇可以對(duì)輸入加一個(gè)前置濾波器,使得進(jìn)入控制算法的給定值不突變,而是有一定慣性延遲的緩變量。 (2) 系統(tǒng)的動(dòng)態(tài)過程加速在增量式算法中,比例項(xiàng)與積分項(xiàng)的符號(hào)有以下關(guān)系:如果被控量繼續(xù)偏離給定值,則這兩項(xiàng)...PID算法 下面對(duì)控制點(diǎn)所采用的PID控制算法進(jìn)行說明。 控制點(diǎn)目前包含三種比較簡(jiǎn)單的PID控制算法,分別是:增量式算法,位置式算法,微分先行。 這三種PID算法雖然簡(jiǎn)單,但各有特點(diǎn),基本上能滿足一般控制的大多數(shù)要求。1) PID增量式算法離散化公式: 注:各符號(hào)含義如下 u(t) 控制器的輸出值。 e(t);;控制器輸入與設(shè)定值之間的誤差。 Kp;; 比例系數(shù)。 Ti;;積分時(shí)間常數(shù)。 Td;微分時(shí)間常數(shù)。 T;;調(diào)節(jié)周期。 對(duì)于增量式算法,可以選擇的功能有: (1) 濾波的選擇可以對(duì)輸入加一個(gè)前置濾波器,使得進(jìn)入控制算法的給定值不突變,而是有一定慣性延遲的緩變量。 (2) 系統(tǒng)的動(dòng)態(tài)過程加速在增量式算法中,比例項(xiàng)與積分項(xiàng)的符號(hào)有以下關(guān)系:如果被控量繼續(xù)偏離給定值,則這兩項(xiàng)符號(hào)相同,而當(dāng)被控量向給定值方向變化時(shí),則這兩項(xiàng)的符號(hào)相反。 由于這一性質(zhì),當(dāng)被控量接近給定值的時(shí)候,反號(hào)的比例作用阻礙了積分作用,因而避免了積分超調(diào)以及隨之帶來的振蕩,這顯然是有利于控制的。但如果被控量遠(yuǎn)未接近給定值,僅剛開始向給定值變化時(shí),由于比例和積分反向,將會(huì)減慢控制過程。 為了加快開始的動(dòng)態(tài)過程,我們可以設(shè)定一個(gè)偏差范圍v,當(dāng)偏差|e(t)|= β時(shí),則不管比例作用為正或?yàn)樨?fù),都使它向有利于接近給定值的方向調(diào)整,即取其值為|e(t)-e(t-1)|,其符號(hào)與積分項(xiàng)一致。利用這樣的算法,可以加快控制的動(dòng)態(tài)過程。 (3) PID增量算法的飽和作用及其抑制 在PID增量算法中,由于執(zhí)行元件本身是機(jī)械或物理的積分儲(chǔ)存單元,如果給定值發(fā)生突變時(shí),由算法的比例部分和微分部分計(jì)算出的控制增量可能比較大,如果該值超過了執(zhí)行元件所允許的最大限度,那么實(shí)際上執(zhí)行的控制增量將時(shí)受到限制時(shí)的值,多余的部分將丟失,將使系統(tǒng)的動(dòng)態(tài)過程變長(zhǎng),因此,需要采取一定的措施改善這種情況。 糾正這種缺陷的方法是采用積累補(bǔ)償法,當(dāng)超出執(zhí)行機(jī)構(gòu)的執(zhí)行能力時(shí),將其多余部分積累起來,而一旦可能時(shí),再補(bǔ)充執(zhí)行。2) PID位置算法 離散公式: ;= 對(duì)于位置式算法,可以選擇的功能有: a、濾波:同上為一階慣性濾波 b、飽和作用抑制: (1) 遇限削弱積分法一旦控制變量進(jìn)入飽和區(qū),將只執(zhí)行削弱積分項(xiàng)的運(yùn)算而停止進(jìn)行增大積分項(xiàng)的運(yùn)算。具體地說,在計(jì)算Ui時(shí),將判斷上一個(gè)時(shí)刻的控制量Ui-1是否已經(jīng)超出限制范圍,如果已經(jīng)超出,那么將根據(jù)偏差的符號(hào),判斷系統(tǒng)是否在超調(diào)區(qū)域,由此決定是否將相應(yīng)偏差計(jì)入積分項(xiàng)。(2) 積分分離法在基本PID控制中,當(dāng)有較大幅度的擾動(dòng)或大幅度改變給定值時(shí), 由于此時(shí)有較大的偏差,以及系統(tǒng)有慣性和滯后,故在積分項(xiàng)的作用下,往往會(huì)產(chǎn)生較大的超調(diào)量和長(zhǎng)時(shí)間的波動(dòng)。特別是對(duì)于溫度、成份等變化緩慢的過程,這一現(xiàn)象將更嚴(yán)重。為此可以采用積分分離措施,即偏差較大的時(shí),取消積分作用;當(dāng)偏差較小時(shí)才將積分作用投入。 另外積分分離的閾值應(yīng)視具體對(duì)象和要求而定。若閾值太大,達(dá)不到積分分離的目的,若太小又有可能因被控量無法跳出積分分離區(qū),只進(jìn)行PD控制,將會(huì)出現(xiàn)殘差。 離散化公式:Δu(t) = q0e(t) + q1e(t-1) + q2e(t-2) 當(dāng)|e(t)|≤β時(shí) q0 = Kp(1+T/Ti+Td/T) q1 = -Kp(1+2Td/T) q2 = Kp Td /T 當(dāng)|e(t)|>β時(shí) q0 = Kp(1+Td/T) q1 = -Kp(1+2Td/T) q2 = Kp Td /T u(t) = u(t-1) + Δu(t) 注:各符號(hào)含義如下 u(t);;控制器的輸出值。 e(t);控制器輸入與設(shè)定值之間的誤差。 Kp;;比例系數(shù)。 Ti;;;積分時(shí)間常數(shù)。 Td;;微分時(shí)間常數(shù)。 T;;;調(diào)節(jié)周期。 β;;; 積分分離閾值 (3) 有效偏差法當(dāng)根據(jù)PID位置算法算出的控制量超出限制范圍時(shí),控制量實(shí)際上只能取邊際值U=Umax,或U=Umin,有效偏差法是將相應(yīng)的這一控制量的偏差值作為有效偏差值計(jì)入積分累計(jì)而不是將實(shí)際的偏差計(jì)入積分累計(jì)。因?yàn)榘磳?shí)際偏差計(jì)算出的控制量并沒有執(zhí)行。 如果實(shí)際實(shí)現(xiàn)的控制量為U=U(上限值或下限值),則有效偏差可以逆推出,即:= 然后,由該值計(jì)算積分項(xiàng) 3) 微分先行PID算法 當(dāng)控制系統(tǒng)的給定值發(fā)生階躍時(shí),微分作用將導(dǎo)致輸出值大幅度變化,這樣不利于生產(chǎn)的穩(wěn)定操作。因此在微分項(xiàng)中不考慮給定值,只對(duì)被控量(控制器輸入值)進(jìn)行微分。微分先行PID算法又叫測(cè)量值微分PID算法。公式如下: 離散化公式: 參數(shù)說明同上對(duì)于純滯后對(duì)象的補(bǔ)償 控制點(diǎn)采用了Smith預(yù)測(cè)器,使控制對(duì)象與補(bǔ)償環(huán)節(jié)一起構(gòu)成一個(gè)簡(jiǎn)單的慣性環(huán)節(jié)。PID參數(shù)整定(1) 比例系數(shù)Kc對(duì)系統(tǒng)性能的影響: 比例系數(shù)加大,使系統(tǒng)的動(dòng)作靈敏,速度加快,穩(wěn)態(tài)誤差減小。Kc偏大,振蕩次數(shù)加多,調(diào)節(jié)時(shí)間加長(zhǎng)。Kc太大時(shí),系統(tǒng)會(huì)趨于不穩(wěn)定。Kc太小,又會(huì)使系統(tǒng)的動(dòng)作緩慢。Kc可以選負(fù)數(shù),這主要是由執(zhí)行機(jī)構(gòu)、傳感器以控制對(duì)象的特性決定的。如果Kc的符號(hào)選擇不當(dāng)對(duì)象狀態(tài)(pv值)就會(huì)離控制目標(biāo)的狀態(tài)(sv值)越來越遠(yuǎn),如果出現(xiàn)這樣的情況Kc的符號(hào)就一定要取反。 (2) 積分控制Ti對(duì)系統(tǒng)性能的影響: 積分作用使系統(tǒng)的穩(wěn)定性下降,Ti?。ǚe分作用強(qiáng))會(huì)使系統(tǒng)不穩(wěn)定,但能消除穩(wěn)態(tài)誤差,提高系統(tǒng)的控制精度。 (3) 微分控制Td對(duì)系統(tǒng)性能的影響: 微分作用可以改善動(dòng)態(tài)特性,Td偏大時(shí),超調(diào)量較大,調(diào)節(jié)時(shí)間較短。Td偏小時(shí),超調(diào)量也較大,調(diào)節(jié)時(shí)間也較長(zhǎng)。只有Td合適,才能使超調(diào)量較小,減短調(diào)節(jié)時(shí)間。

6,關(guān)于PID算法

所謂比例 ,就是調(diào)節(jié)量與調(diào)節(jié)系數(shù)成正比,加大比例系數(shù)的話肯定就加快調(diào)節(jié)了;但是為了不至于調(diào)節(jié)過量,引如了微分了積分調(diào)節(jié),就是對(duì)應(yīng)其中I D ,具體情況可以查查資料, 引入這些參數(shù)主要是為了保證控制系統(tǒng)的快速性以及穩(wěn)定性 可以看看自動(dòng)控制原理
http://www.ee.zsu.edu.cn/irp/uploadfile/netclass/CONTROL/lesson/ccs2/ccs2-2/ccs2-2-2/ccs2-2-2.htm
#include struct _pid { int pv; /*integer that contains the process value*/ int sp; /*integer that contains the set point*/ float integral; float pgain; float igain; float dgain; int deadband; int last_error; }; struct _pid warm,*pid; int process_point, set_point,dead_band; float p_gain, i_gain, d_gain, integral_val,new_integ;; void pid_init(struct _pid *warm, int process_point, int set_point) { struct _pid *pid; pid = warm; pid->pv = process_point; pid->sp = set_point; } void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain, int dead_band) { pid->pgain = p_gain; pid->igain = i_gain; pid->dgain = d_gain; pid->deadband = dead_band; pid->integral= integral_val; pid->last_error=0; } void pid_setinteg(struct _pid *pid,float new_integ) { pid->integral = new_integ; pid->last_error = 0; } void pid_bumpless(struct _pid *pid) { pid->last_error = (pid->sp)-(pid->pv); } float pid_calc(struct _pid *pid) { int err; float pterm, dterm, result, ferror; err = (pid->sp) - (pid->pv); if (abs(err) > pid->deadband) { ferror = (float) err; /*do integer to float conversion only once*/ pterm = pid->pgain * ferror; if (pterm > 100 || pterm < -100) { pid->integral = 0.0; } else { pid->integral += pid->igain * ferror; if (pid->integral > 100.0) { pid->integral = 100.0; } else if (pid->integral < 0.0) pid->integral = 0.0; } dterm = ((float)(err - pid->last_error)) * pid->dgain; result = pterm + pid->integral + dterm; } else result = pid->integral; pid->last_error = err; return (result); } void main(void) { float display_value; int count=0; pid = &warm; // printf("Enter the values of Process point, Set point, P gain, I gain, D gain \n"); // scanf("%d%d%f%f%f", &process_point, &set_point, &p_gain, &i_gain, &d_gain); process_point = 30; set_point = 40; p_gain = (float)(5.2); i_gain = (float)(0.77); d_gain = (float)(0.18); dead_band = 2; integral_val =(float)(0.01); printf("The values of Process point, Set point, P gain, I gain, D gain \n"); printf(" %6d %6d %4f %4f %4f\n", process_point, set_point, p_gain, i_gain, d_gain); printf("Enter the values of Process point\n"); while(count<=20) { scanf("%d",&process_point); pid_init(&warm, process_point, set_point); pid_tune(&warm, p_gain,i_gain,d_gain,dead_band); pid_setinteg(&warm,0.0); //pid_setinteg(&warm,30.0); //Get input value for process point pid_bumpless(&warm); // how to display output display_value = pid_calc(&warm); printf("%f\n", display_value); //printf("\n%f%f%f%f",warm.pv,warm.sp,warm.igain,warm.dgain); count++; } }
文章TAG:控制控制算法算法pid控制算法

最近更新