- #include "pid.h"
- #include "tm1640.h"
- #define K_percent 50
- #define T 0.1 //采样周期为1s
- #define Ti 10000 //积分常数
- #define Td 0 //微分常数
- Struct_pid_def PID_Temp;
- extern u16 Pump_Temp;
- void PID_init(void)
- {
- /*
- PID_Temp.Kp=20;//K_percent;
- PID_Temp.Ki=0.2;//K_percent*(T/Ti);//积分系数
- PID_Temp.Kd=1;//K_percent*(Td/T);//微分系数
- */
-
- PID_Temp.Kp=50;//K_percent;
- PID_Temp.Ki=1.5;//K_percent*(T/Ti);//积分系数
- PID_Temp.Kd=2.5;//K_percent*(Td/T);//
-
- PID_Temp.Set_value=50;//设定输出值
-
-
- PID_Temp.Now_value=Pump_Temp; //当前输出值
- PID_Temp.Last_value=0;//上一次输出值
- PID_Temp.Pre_value=0; //前一次输出值
- }
- int Pid_calc(Struct_pid_def *PID)
- {
- int Ek=0,Ek_Last=0,Ek_Pre=0;
- volatile float Pid_out=0;//定义当前误差,上一次误差,前一次误差及pid的调整输出值
- PID->Now_value=Pump_Temp; //当前输出值
-
- Ek=(PID->Set_value)-(PID->Now_value);//计算当前误差
-
-
-
- Ek_Last=PID->Set_value-PID->Last_value;//计算当前误差
- Ek_Pre=PID->Set_value-PID->Pre_value;//计算当前误差
-
-
- Pid_out=(Ek-Ek_Last)*PID->Kp + PID->Ki*Ek + (PID->Kd)*(Ek-2*Ek_Last+Ek_Pre);
-
-
- PID->Pre_value= PID->Last_value;//存储前次值
- PID->Last_value=PID->Now_value;//存储上次值
-
- return (int)Pid_out;
- }
- u16 PID_Ctrl(void)
- {
- int Hot_percent;
-
- Hot_percent+=Pid_calc(&PID_Temp);
- if(Hot_percent<0)
- {
- Hot_percent=0;
- }
- if(Hot_percent>100)
- {
- Hot_percent=100;
- }
-
- SEG_display(PID_Temp.Set_value,Hot_percent,Pump_Temp);
- return Hot_percent;
- }
复制代码
全部资料51hei下载地址:
PID实验.rar
(374.52 KB, 下载次数: 270)
|