⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pid.c

📁 实现PID控制的函数
💻 C
字号:
#include <stdio.h>
#include <math.h>         
 
 struct _pid
 {  float pv;
 	float sp;
 	float integral;
 	float pgain;
 	float igain;
 	float dgain;
 	float deadband;
 	float last_error;
 	} ;
    
    struct _pid warm,*pid ;
    float process_point,set_point,dead_band;  
    float p_gain,i_gain,d_gain,integral_val,new_integ; 
    float ts;
    /*------------------------------------------------------------------------ 
  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,float process_point,float set_point)
{struct _pid *pid;
	pid=warm;
	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. 
  ------------------------------------------------------------------------*/
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 for the integral term of the pid equation. 
  This is useful for setting the initial output of the 
  pid controller at start up. 
  ------------------------------------------------------------------------*/ 
void pid_setingteg(struct _pid *pid,float new_integ)
{pid->integral=new_integ;
	pid->last_error=0;
}
/*------------------------------------------------------------------------ 
  pid_bumpless 
  
  DESCRIPTION Bumpless transfer algorithim. When suddenly changing 
  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_bumpless(struct _pid *pid)
{
	pid->last_error=(pid->sp)-(pid->pv);
}
/*------------------------------------------------------------------------ 
  pid_calc   
  DESCRIPTION Performs PID calculations for the _pid structure *a. This function uses the positional form of the pid equation, 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 VALUE The new output value for the pid loop.   
  USAGE #include "control.h"*/
float pid_calc(struct _pid *pid,float ts)
{   
	float err;
	float pterm,dterm,result,ferror;
	err=(pid->sp)-(pid->pv);
	if (abs(err)>pid->deadband)
	{
		ferror=(float)err;
		pterm=pid->pgain*ferror;
		
			pid->integral+=pid->igain*ferror*ts;
			
			
			dterm=((float)(err-pid->last_error))*pid->dgain/ts;
			result=pterm+pid->integral+dterm;
		 
	}
	else result=pid->integral; 
	
		pid->last_error=err;
		return(result);
	   
}
void main(void)
{
	float display_value;
	
	pid=&warm;  
	
	process_point=0;
	set_point=2;
	p_gain=(float)(1);
	i_gain=(float)(8);
	d_gain=(float)(0);
	dead_band=0.0001;
	integral_val=(float)(0.01);


	
		
		pid_init(&warm,process_point,set_point);
		pid_tune(&warm,p_gain,i_gain,d_gain,dead_band);
		pid_setingteg(&warm,0);
		pid_bumpless(&warm);
		display_value=pid_calc(&warm,2);
	    printf("%f\n", display_value);

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -