📄 pid.c
字号:
#include "reg52.h"
//#define unsigned char uchar
//#define signed char schar
#define temp_max 255 //最大输出控制量
unsigned char send_data[2];
unsigned int contrl_data;
float temp_in[]={1,2,3,4,5,6,7,7,6,6,5};//,6,7,6,8,10,15,17,19,24};
// 28,33,34,36,37,39,43,46,49,52,55,58,61,64,68,
// 71,73,75,76,77,78,78,78,78,77,77,78,79,79,78};
float temp_now;//保存前面时刻的温度值
float temp_before;
float temp_out;//输出控制量(0——255)
float now_e; //当前偏差值
float old_e1; //前面时刻的偏差值
float old_e2;
//signed char old_e3;
//signed char old_e4;
//signed char old_e5;
float ep; //比例项
float ed; //积分项
float ei; //微分项
float kp; //比例系数
float kd; //积分系数
float ki; //微分系数
//unsigned char kds1=1; //积分分离系数1,为1表示只累计负偏差,用于避免控制量长期停留在饱和区
//unsigned char kds2=1; //积分分离系数2,用于
//unsigned char kis=1; //微分分离系数
extern void COM_send(unsigned char SendData);
extern void URAT_init();
void delay()
{ unsigned char i,j,q;
for(q=0;q<1;q++)
for(i=0;i<255;i++)
for(j=0;j<225;j++);
}
void ctrl_init(void)
{
temp_now=0; //保存前面3个时刻的采样值
temp_before=0;
temp_out=0; //
now_e=0; //当前偏移量
old_e1=0; //前面时刻偏移量
old_e2=0;
kp=1.5;
kd=0;
ki=0;
}
float temperature_ctrl(float temp_in, float temp_to) //temp_in 当前采样值,temp_to目标温度值
{//函数名:温度模糊PID控制算法
//输入:无
//输出:无
temp_before=temp_now;
temp_now=temp_in;
old_e1=now_e;
old_e2=old_e1;
now_e=temp_to-temp_in; //计算当前偏差,既比例项
ep=now_e;
ed=now_e+old_e1+old_e2;
ei=now_e-old_e1; //计算微分项;
/* if(temp_out>=temp_max) //
{
if(now_e<=0)
kds1=1;
else
kds1=0;
}*/
// if(now_e>=-5&&now_e<=5) //设置积分分离阀值
// kds2=1;
// else
// kds2=0;
temp_out=kp*ep+kd*ed+ki*ei;
return temp_out;
//return 18.93;
}
unsigned char i;
void main()
{
ctrl_init();
UART_init();
for(i=0;i<=30;i++)
{
contrl_data=temperature_ctrl(temp_in[i],6)*100;
//contrl_data=1234;
send_data[0]=contrl_data/100;
send_data[1]=contrl_data%100;
COM_send(send_data[0]);
delay();
COM_send(send_data[1]);
// delay();
}
/* for(temp_in=0;temp_in<=200;temp_in++)
{
contrl_data=temperature_ctrl(200);
COM_send(contrl_data);
delay();
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -