|
|
#include "PID.h"
|
|
|
#include "Relays.h"
|
|
|
#include "USART.h"
|
|
|
extern u16 tem;
|
|
|
float cold_tem=0;
|
|
|
float red_tem=0;
|
|
|
float ti;
|
|
|
float ki=0.001;
|
|
|
float kd=340;
|
|
|
extern u8 hot_clod_flag;
|
|
|
extern u8 gpio_state;
|
|
|
extern int T;
|
|
|
unsigned int num=0;
|
|
|
PID pid;
|
|
|
|
|
|
void PID_Init()
|
|
|
{
|
|
|
//pid.set_tem=tem;//用户设定温度
|
|
|
pid.Kp=110;
|
|
|
pid.t=500;//PID计算周期
|
|
|
//pid.Ti=5000000;//积分时间
|
|
|
//pid.Td=1000;//微分时间
|
|
|
pid.pwmcycle=200;//pwm周期200
|
|
|
pid.OUT0=1;
|
|
|
pid.C1ms=0;
|
|
|
}
|
|
|
|
|
|
void PID_Calc() //pid计算
|
|
|
{
|
|
|
float DelEk;//最近两次偏差之差
|
|
|
//float td;
|
|
|
float out;
|
|
|
if(pid.C1ms<(pid.t)) //计算周期未到
|
|
|
{
|
|
|
return ;
|
|
|
}
|
|
|
|
|
|
if(pid.set_tem>pid.now_tem)
|
|
|
{
|
|
|
pid.Ek=pid.set_tem-pid.now_tem;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
pid.Ek=pid.now_tem-pid.set_tem;
|
|
|
}
|
|
|
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; //积分输出
|
|
|
|
|
|
// td=pid.Td/pid.t;
|
|
|
// kd=pid.Kp*td;
|
|
|
|
|
|
pid.Dout=kd*DelEk; //微分输出
|
|
|
if(pid.Dout<0)
|
|
|
{
|
|
|
pid.Dout=0-pid.Dout;
|
|
|
}
|
|
|
|
|
|
//out= pid.Pout+pid.Iout+ pid.Dout;
|
|
|
out= pid.Pout;
|
|
|
if(out>pid.pwmcycle)
|
|
|
{
|
|
|
pid.OUT=pid.pwmcycle;
|
|
|
}
|
|
|
else if(out<=0)
|
|
|
{
|
|
|
pid.OUT=pid.OUT0;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
pid.OUT=out;
|
|
|
}
|
|
|
pid.Ek_1=pid.Ek; //更新偏差
|
|
|
pid.C1ms=0;
|
|
|
|
|
|
if(pid.set_tem>pid.now_tem+1)
|
|
|
{
|
|
|
//得到当前的偏差值,设置温度大于实际温度1℃,加热,关闭压缩机,打开加热棒
|
|
|
/*GPIO1->报警铃 GPIO6->压缩机 GPIO3->加热棒 GPIO4—>新风风扇 GPIO5->加湿器 */
|
|
|
//HC595_Send_Byte(gpio_state&=0xDF);//关闭压缩机 &=1101 1111 0xDF
|
|
|
TIM_SetCompare3(TIM3,0);
|
|
|
HC595_Send_Byte(gpio_state|=0x04);//打开加热棒 |=0000 0100 0x04
|
|
|
hot_clod_flag=2;
|
|
|
pid.Iout=0;
|
|
|
}
|
|
|
if(pid.now_tem>pid.set_tem)
|
|
|
{
|
|
|
//得到当前的偏差值,设置温度小于实际温度,制冷,打开压缩机,关闭加热棒
|
|
|
HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 &=1111 1011 0xFB
|
|
|
num=(((pid.OUT*400)/pid.pwmcycle)-1);//请问这个pid.OUT与pwm占空比的值是如何换算过来的
|
|
|
TIM_SetCompare3(TIM3,num);
|
|
|
//printf("%d\r\n",num);
|
|
|
//0-200对应0-100%,如果pid.out=50,占空比就是25%,//num=50*400/200=100,100/400=25%
|
|
|
//HC595_Send_Byte(gpio_state|=0x20);//打开压缩机 |=0010 0000
|
|
|
hot_clod_flag=1;
|
|
|
//pid.Iout=0;
|
|
|
}
|
|
|
if(hot_clod_flag==1 && T<=tem-3)//制冷过程中温度下降低于设定温度0.3℃
|
|
|
{
|
|
|
//HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭加热棒 &=1101 1101 0xDB
|
|
|
TIM_SetCompare3(TIM3,0);//关闭压缩机
|
|
|
HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒
|
|
|
hot_clod_flag=0;
|
|
|
}
|
|
|
|
|
|
if(hot_clod_flag==2 && T>=tem)
|
|
|
{
|
|
|
//HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭四通阀 &=1101 1101 0xDB
|
|
|
TIM_SetCompare3(TIM3,0);//关闭压缩机
|
|
|
HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒
|
|
|
hot_clod_flag=0;
|
|
|
}
|
|
|
}
|