C语言实现PID算法_第1页
C语言实现PID算法_第2页
C语言实现PID算法_第3页
C语言实现PID算法_第4页
C语言实现PID算法_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言实现PID算法#i nclude struct _pid int pv; /*i nteger that contains the process value*/int sp; /*i nteger that contains the set point*/float in tegral;float pga in;float iga in;float dga in;int deadba nd;in t last_error;struct _pid warm,*pid;int process_po int, set_po in t,dead_ba nd;float p_ga in, i_g

2、ain, d_ga in, in tegral_val, new_in teg;/*pid_i nitDESCRIPTION This fun ctio n in itializes the poi nters in the _pid structure to the process variable and the setpo int. *pv and *sp arein teger poin ters.*/void pid_ in instruct _pid *warm, int process_po in t, i nt set_po int)struct _pid *pid;pid =

3、 warm;pid-pv = process_po int;pid-sp = set_po int;/*pid_t uneDESCRIPTION Sets the proportional gain (p_gain), integral gain (i_gain), derivitive gain (d_ga in), and the dead band (dead_ba nd) ofa pid con trol structure _pid.*/void pid_tune(struct _pid *pid, float p_gain, float i_gain, float d_gain,

4、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_setintegDESCRIPTION Set a new value for the integral term of the pid equation. This is useful for setting the initial output of the pid controller a

5、t start up. */ void pid_setinteg(struct _pid *pid,float new_integ) pid-integral = new_integ;pid-last_error = 0; /*pid_bumplessDESCRIPTION Bumpless transfer algorithim. When suddenly changing setpoints, or when restarting the PID equation after an extended pause, the derivative of the equation can ca

6、use 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_bumpless(struct _pid *pid) pid-last_error = (pid-sp)-(pid-pv);/*pid_calcDESCRIPTION Performs PID calculations for the _pid

7、structure *a. This function uses the positio nal form of the pid equation, and incorporates an integral windup prevention algorithim. Rectangu lar integration is used, so this function must be repeated on a consistent time basis for accurate con trol.RETURN V ALUE The new output value for the pid lo

8、op.USAGE #include control.h*/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 integral = 0.0;elsepid-integ

9、ral += pid-igain * ferror;if (pid-integral 100.0)pid-integral = 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)float display_value; int c

10、ount=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;integ

11、ral_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(count4095000) PID_UK = 4095000;else if(PID_UKSetPoint - NextPoint; / 偏差pp-

12、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 PID Structure =*/void PIDI nit (PID *pp)memset ( pp,0,sizeof(PID);/*=M

13、ai n Program double sen sor (void) / Dummy Sen sor Fun cti onreturn 100.0;void actuator(double rDelta) / Dummy Actuator Function void mai n(void)PID sPID; / PID Con trol Structure double rOut; / PID Response (Output) double rIn; / PID Feedback (I nput)PIDI nit ( & sPID ); /In itialize Structure sPID.Proportion = 0.5; / Set PID Coefficie nts sPID.I ntegral = 0.5;sPID.Derivative = 0.0;sP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论