《2022年C语言实现PID算法 .pdf》由会员分享,可在线阅读,更多相关《2022年C语言实现PID算法 .pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C 语言实现 PID 算法#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_
2、gain, d_gain, integral_val,new_integ; /*- pid_init DESCRIPTION This function initializes the pointers in the _pid structure to the process variable and the setpoint. *pv and *sp are integer pointers. -*/ void pid_init(struct _pid *warm, int process_point, int set_point) struct _pid *pid; pid = warm;
3、 pid-pv = process_point; pid-sp = set_point; /*- pid_tune DESCRIPTION Sets the proportional gain (p_gain), integral gain (i_gain), derivitive gain (d_gain), and the dead band (dead_band) of a pid control structure _pid. -*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - -
4、- 第 1 页,共 10 页 - - - - - - - - - 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; /*- pid_setinteg DESCRIPTION Set a new value f
5、or the integral term of the pid equation. This is useful for setting the initial output of the pid controller at start up. -*/ void pid_setinteg(struct _pid *pid,float new_integ) pid-integral = new_integ; pid-last_error = 0; /*- pid_bumpless DESCRIPTION Bumpless transfer algorithim. When suddenly ch
6、anging setpoints, or when restarting the PID equation after an extended pause, the derivative of the equation can cause a bump in the controller output. This function will help smooth out that bump. The process value in *pv should be the updated just before this function is used. -*/ void pid_bumple
7、ss(struct _pid *pid) pid-last_error = (pid-sp)-(pid-pv); /*- pid_calc 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - DESCRIPTION Performs PID calculations for the _pid structure *a. This function uses the positional form of the pid equati
8、on, and incorporates an integral windup prevention algorithim. Rectangular integration is used, so this function must be repeated on a consistent time basis for accurate control. RETURN V ALUE The new output value for the pid loop. USAGE #include control.h*/ float pid_calc(struct _pid *pid) int err;
9、 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 integral = 0.0; else pid-integral += pid-igain * ferror; if (pid-integral 100.0) pid-integra
10、l = 100.0; else if (pid-integral 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) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
11、第 3 页,共 10 页 - - - - - - - - - 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_gai
12、n = (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 %4fn, process_point, set_point, p_gain, i_gain, d_gain); printf(Enter the values of Process pointn); while(count409
13、5000) PID_UK = 4095000; else if(PID_UKSetPoint - NextPoint; / 偏差pp-SumError += Error; / 积分dError = pp-LastError - pp-PrevError; / 当前微分pp-PrevError = pp-LastError; pp-LastError = Error; return (pp-Proportion * Error / 比例项+ pp-Integral * pp-SumError / 积分项+ pp-Derivative * dError / 微分项); /*= Initialize
14、 PID Structure =*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 10 页 - - - - - - - - - void PIDInit (PID *pp) memset ( pp,0,sizeof(PID); /*= Main Program =*/ double sensor (void) / Dummy Sensor Function return 100.0; void actuator(double rDelta) / Dummy Actua
15、tor Function void main(void) PID sPID; / PID Control Structure double rOut; / PID Response (Output) double rIn; / PID Feedback (Input) PIDInit ( &sPID ); / Initialize Structure sPID.Proportion = 0.5; / Set PID Coefficients sPID.Integral = 0.5; sPID.Derivative = 0.0; sPID.SetPoint = 100.0; / Set PID Setpoint for (;) / Mock Up of PID Processing rIn = sensor (); / Read Input rOut = PIDCalc ( &sPID,rIn ); / Perform PID Interation actuator ( rOut ); / Effect Needed Changes 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -
限制150内