有关温度控制pid参数的问题
时间:10-02
整理:3721RD
点击:
用交流电220v加热铜板 控制温度在32度 上下波动不超过0.05度,想通过pid调节pwm占空比(低电平就加热,高电平不加热)来控制功率。
程序重要参数说明 设定温度3200 放大一百倍
pwm加热是半波加热(由于目标温度较小 防止超调)
0--3000期间 不pid调节
3000--3200 期间 调节占空比。
pid程序为增量式pid
问题:温度在32度上下波动 幅度为0.15左右 具体哪里出问题 请高人指教
#define Kp 75 //比例系数
#define Ki 130 //积分系数
#define Kd 30 //微分系数
int Real_temp; //实际温度值
int Set_temp; //设置温度
uchar last_error; //上次误差
float I_term; //前面温差和
int PID_MAX=12800; //
unsigned int out,PWMT,counter;
void PWM0_set (unsigned char a)
{
CCAP0L= a; //设置值直接写入CCAP0L
CCAP0H= a; //设置值直接写入CCAP0H
}
int PID(int Set_value,int Real_value) //标准PID温度控制算法
{
int error;
float P_term, D_term;
int pid_out;
error=Set_value - Real_value;//误差量
if(error<200)
{
P_term =Kp*error; //比例量
I_term+=Ki*error; //积分量
if(I_term>PID_MAX) I_term=PID_MAX; //限定积分量上限
else if(I_term<0) I_term=0; //限定积分量下限
D_term =Kd*(error - last_error); //微分量
last_error=error; //缓存当前误差量
if(error<20) I_term=130;
else I_term=0;
pid_out=(signed int)(P_term+I_term+D_term); //PID控制量计算
if(pid_out>PID_MAX) pid_out=PID_MAX; //控制量上限=PID_MAX
else if(pid_out<0) pid_out=0; //控制量下限=0
//return(pid_out);
}
else if(error>=200) pid_out=12800;
return(pid_out);
}
void jiare_pid_kongzhi()
{
PWMT=12800; //128级步进PWM控制
PID_MAX=PWMT;
counter=0;
out=0;
I_term=0;
last_error=0;
Set_temp=3200; //初始设定温度为32度
Real_temp=wenduzhi;
out=PID(Set_temp,Real_temp); //PID程序
PWM0_set(12+out/100);
}
程序重要参数说明 设定温度3200 放大一百倍
pwm加热是半波加热(由于目标温度较小 防止超调)
0--3000期间 不pid调节
3000--3200 期间 调节占空比。
pid程序为增量式pid
问题:温度在32度上下波动 幅度为0.15左右 具体哪里出问题 请高人指教
#define Kp 75 //比例系数
#define Ki 130 //积分系数
#define Kd 30 //微分系数
int Real_temp; //实际温度值
int Set_temp; //设置温度
uchar last_error; //上次误差
float I_term; //前面温差和
int PID_MAX=12800; //
unsigned int out,PWMT,counter;
void PWM0_set (unsigned char a)
{
CCAP0L= a; //设置值直接写入CCAP0L
CCAP0H= a; //设置值直接写入CCAP0H
}
int PID(int Set_value,int Real_value) //标准PID温度控制算法
{
int error;
float P_term, D_term;
int pid_out;
error=Set_value - Real_value;//误差量
if(error<200)
{
P_term =Kp*error; //比例量
I_term+=Ki*error; //积分量
if(I_term>PID_MAX) I_term=PID_MAX; //限定积分量上限
else if(I_term<0) I_term=0; //限定积分量下限
D_term =Kd*(error - last_error); //微分量
last_error=error; //缓存当前误差量
if(error<20) I_term=130;
else I_term=0;
pid_out=(signed int)(P_term+I_term+D_term); //PID控制量计算
if(pid_out>PID_MAX) pid_out=PID_MAX; //控制量上限=PID_MAX
else if(pid_out<0) pid_out=0; //控制量下限=0
//return(pid_out);
}
else if(error>=200) pid_out=12800;
return(pid_out);
}
void jiare_pid_kongzhi()
{
PWMT=12800; //128级步进PWM控制
PID_MAX=PWMT;
counter=0;
out=0;
I_term=0;
last_error=0;
Set_temp=3200; //初始设定温度为32度
Real_temp=wenduzhi;
out=PID(Set_temp,Real_temp); //PID程序
PWM0_set(12+out/100);
}
应根据波动的周期频率来确定那个参数不好,一般经验,你将比例系数Kp加大到150~200应该会有明显改善。
另外,你的jiare_pid_kongzhi()函数里将I_term清零了,这似乎是个问题,但因为不知道你的主程序是如何调度jiare_pid_kongzhi()函数和PID()函数的,所以不太确定是否一定有问题。
高手啊!调到0.15,厉害啊!小编能说下你用什么温度传感器吗?似乎能精确到0.05度!
小编,请问下,积分量上限时怎么确定的?为啥子是12800?不解
小编,您仿真的电路图能给我看一下吗?最近做相关的,温度控制部分想参考一下
凄凄切切群群群群群群群群群群群群群群群群群群群群群群群