|
float P=0.800,I=0.15,D=800.0,Set_Temp=60;//初始化P,I,D,当前值,设置值 常数
float PID_OUT=0,PWM_Duty=0; //PID输出
float P_OUT=0,I_OUT=0,D_OUT=0; //比例输出,积分输出,微分输出
float Current_Error=0, Last_Error=0; //当前误差 最后误差
float Sum_Error=0,Prev_Error=0; //误差积分
float Gain=1.2,PID_I_MAX=100.0,PID_I_MIN=-100.0,V_DATA_MAX=100,V_DATA_MIN=0;
float Set_Temp2=60;//初始化P,I,D,当前值,设置值 常数
float PID_OUT2=0,PWM_Duty2=0; //PID输出
float P_OUT2=0,I_OUT2=0,D_OUT2=0; //比例输出,积分输出,微分输出
float Current_Error2=0, Last_Error2=0; //当前误差 最后误差
float Sum_Error2=0,Prev_Error2=0; //误差积分
float Gain2=1.2,PID_I_MAX2=100.0,PID_I_MIN2=-100.0,V_DATA_MAX2=100,V_DATA_MIN2=0;
void PID_calc(void)//PID算法
{
float Rate;//误差变化率
Current_Error = Set_Temp - V_1;//当前误差
Sum_Error +=Current_Error;//误差积分
Prev_Error = Last_Error;//存储误差积分
Last_Error = Current_Error;//存储误差分析
Rate = Prev_Error-Last_Error;//变化速率计算
if(Rate>10)//不让ta大于5也不让ta小于5
Rate = 10;
if(Rate<-10)
Rate = -10;
P_OUT = P*Gain*Current_Error;//比列项
I_OUT = I*Gain*Sum_Error;//积分项
//积分限幅处理
if( I_OUT>PID_I_MAX ) I_OUT = PID_I_MAX;//不能超过最大值不能低于最小值
if( I_OUT<PID_I_MIN ) I_OUT = PID_I_MIN;
//微分输出处理
D_OUT = D*Gain*Rate;
PID_OUT = P_OUT + I_OUT + D_OUT ;
if ( PID_OUT >= V_DATA_MAX ) PID_OUT = V_DATA_MAX;
if ( PID_OUT <= V_DATA_MIN ) PID_OUT = V_DATA_MIN;
/*******************************************************/
/*******************************************************/
float Rate2;//误差变化率
Current_Error2 = Set_Temp2 - V_3;//当前误差
Sum_Error2 +=Current_Error2;//误差积分
Prev_Error2 = Last_Error2;//存储误差积分
Last_Error2 = Current_Error2;//存储误差分析
Rate2 = Prev_Error2-Last_Error2;//变化速率计算
if(Rate2>10)//不让ta大于5也不让ta小于5
Rate2 = 10;
if(Rate2<-10)
Rate2 = -10;
P_OUT2 = P*Gain2*Current_Error2;//比列项
I_OUT2 = I*Gain2*Sum_Error2;//积分项
//积分限幅处理
if( I_OUT2>PID_I_MAX2 ) I_OUT2 = PID_I_MAX2;//不能超过最大值不能低于最小值
if( I_OUT2<PID_I_MIN2) I_OUT2 = PID_I_MIN2;
//微分输出处理
D_OUT2 = D*Gain2*Rate2;
PID_OUT2 = P_OUT2 + I_OUT2 + D_OUT2 ;
if ( PID_OUT2 >= V_DATA_MAX2 ) PID_OUT2 = V_DATA_MAX2;
if ( PID_OUT2 <= V_DATA_MIN2 ) PID_OUT2 = V_DATA_MIN2;
别的地方找的大佬的代码 输入是V 输出是PID_OUT2 这些代码没有涉及型号 里面的一些常数系数需要按你调试的情况来改 |
|