标题:
避免过冲的PID算法 控制对象是温度
[打印本页]
作者:
wlw5651
时间:
2021-4-14 08:29
标题:
避免过冲的PID算法 控制对象是温度
这是一个避免过冲的PID算法,控制对象是温度
单片机源程序如下:
#include "pid.h"
PID pid; //存放PID算法所需要的数据
void PID_Calc() //pid计算
{
float DelEk;
float ti,ki;
// float Iout;
// float Pout;
// float Dout;
float td;
float kd;
float out;
if(pid.C10ms<(pid.T)) //计算周期未到
{
return ;
}
pid.Ek=pid.Sv-pid.Pv; //得到当前的偏差值
pid.Pout=pid.Kp*pid.Ek; //比例输出
pid.SEk+=pid.Ek; //历史偏差总和
DelEk=pid.Ek-pid.Ek_1; //最近两次偏差之差
ti=pid.T/pid.Ti;
ki=ti*pid.Kp;
pid.Iout=ki*pid.SEk*pid.Kp; //积分输出
td=pid.Td/pid.T;
kd=pid.Kp*td;
pid.Dout=kd*DelEk; //微分输出
out= pid.Pout+ pid.Iout+ pid.Dout;
//////////////////////////////////////////////////////////
if(out>pid.pwmcycle)
{
pid.OUT=pid.pwmcycle;
}
else if(out<0)
{
pid.OUT=pid.OUT0;
}
else
{
pid.OUT=out;
}
//pid.OUT+=; //本次的计算结果
pid.Ek_1=pid.Ek; //更新偏差
pid.C10ms=0;
}
void PID_Calc_overshoot() //pid计算-过冲处理?
{
float DelEk;
float ti,ki;
// float Iout;
// float Pout;
// float Dout;
float td;
float kd;
float out;
float SvSave;
if(pid.C10ms<(pid.T)) //计算周期未到
{
return ;
}
//判断Sv
SvSave=pid.Sv;
if(pid.Pv<(SvSave*0.55))//温度达到计数开始 66度
{
pid.times=0;
}
if(pid.times<=60)//3分钟 72度 100s
{
pid.Sv=SvSave*0.6;
}
if((pid.times>60)&&(pid.times<=100))//3分钟 96度 100s
{
pid.Sv=SvSave*0.8;
}
if((pid.times>100)&&(pid.times<=200))//2分钟 102度 100s
{
pid.Sv=SvSave*0.85;
}
if((pid.times>200)&&(pid.times<=300))//2分钟 108度 100s
{
pid.Sv=SvSave*0.9;
}
if((pid.times>300)&&(pid.times<=400))//2分钟 114度 100s
{
pid.Sv=SvSave*0.95;
}
if(pid.times>400)
{
pid.Sv=SvSave;
}
//////////////////////////////////
pid.Ek=pid.Sv-pid.Pv; //得到当前的偏差值
pid.Pout=pid.Kp*pid.Ek; //比例输出
pid.SEk+=pid.Ek; //历史偏差总和
DelEk=pid.Ek-pid.Ek_1; //最近两次偏差之差
ti=pid.T/pid.Ti;
ki=ti*pid.Kp;
pid.Iout=ki*pid.SEk*pid.Kp; //积分输出
td=pid.Td/pid.T;
kd=pid.Kp*td;
pid.Dout=kd*DelEk; //微分输出
out= pid.Pout+ pid.Iout+ pid.Dout;
//////////////////////////////////////////////////////////
if(out>pid.pwmcycle)
{
pid.OUT=pid.pwmcycle;
}
else if(out<0)
{
pid.OUT=pid.OUT0;
}
else
{
pid.OUT=out;
}
//pid.OUT+=; //本次的计算结果
pid.Ek_1=pid.Ek; //更新偏差
pid.C10ms=0;
pid.Sv=SvSave;
}
复制代码
51hei.png
(4.54 KB, 下载次数: 84)
下载附件
2021-4-14 17:40 上传
所有资料51hei提供下载:
PID 避免过冲.zip
(1.58 KB, 下载次数: 82)
2021-4-14 08:28 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
紫色的云
时间:
2021-4-14 18:44
谢谢楼主的资料学习了,能讲解一下就改好了
作者:
usaboy
时间:
2021-4-15 06:18
Thank you so much!
作者:
地方的纷纷扰扰
时间:
2021-6-2 12:31
紫色的云 发表于 2021-4-14 18:44
谢谢楼主的资料学习了,能讲解一下就改好了
放在main函数哪里呀
作者:
woyaodwn
时间:
2021-12-28 10:07
这个函数能直接使用吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1