📄 arithmetic.c
字号:
#include "TempCtrl.h"
#define NBP (-10)
#define NSP (-2)
#define ZP 2
#define PSP 10
void SamplingProcess()
{
//频率->电阻
k1=TpTH0<<8;
k1+=TpTL0;//k1:freq
//FF功能
if(FFSta)
switch(FFSta)
{
case 3000:
//(EPP_F100,k1);//零点漂移
if(k1>=Fr2Temp[0])
{
k0=k1-Fr2Temp[0];
}
else
{
k0=Fr2Temp[0]-k1;
k0|=0x8000;
}
PassWordLock=0;
Write(EP_FrMin,k0);
PassWordLock=1;
UpdateFrZero(); //使用了k0
AdmitFlag=5;
Led(k1);
LedBuf[0]=LedCode[C_A];
break;
case 3001:
if(k1>=Fr2Temp[45])
{
k0=k1-Fr2Temp[45];
}
else
{
k0=Fr2Temp[45]-k1;
k0|=0x8000;
}
PassWordLock=0;
Write(EP_FrMax,k0);
PassWordLock=1;
UpdateFrZero();
AdmitFlag=5;
Led(k1);
LedBuf[0]=LedCode[C_b];
break;
case 1000://频率显示
AdmitFlag=2;
Led(k1);
LedBuf[0]=LedCode[C_F];
break;
case 2000://补偿显示:100欧时
AdmitFlag=6;
k0=Read(EP_FrMin);
if(k0 & 0x8000)
{
Led(k0 & 0x7fff);
LedBuf[1]=LedCode[C_Fuhao];
}
else
Led(FrZero);
LedBuf[0]=LedCode[C_c];
break;
case 2001://补偿显示:250欧时
AdmitFlag=6;
k0=Read(EP_FrMax);
if(k0 & 0x8000)
{
Led(k0 & 0x7fff);
LedBuf[1]=LedCode[C_Fuhao];
}
else
Led(FrZero);
LedBuf[0]=LedCode[C_d];
break;
default:
AdmitFlag=1;
FFSta=0;
}
if(FrZero>=0)
{
k0=FrZero;
k1=k1-k0;
}
else
{
k0=-FrZero;
k1=k1+k0;
}
//k1为频率值
if(k1<Fr2Temp[0])
k1=Fr2Temp[0];
if((k1>Fr2Temp[0])&&(k1<Fr2Temp[45]))
{
for(i=0;i<46;i++)//(6-1)次即可
if(k1<Fr2Temp[i])
break;
i-=1;
x1=100.0*i+(k1-Fr2Temp[i])*100.0/(Fr2Temp[i+1]-Fr2Temp[i])+0.5;
}
else if(k1<=Fr2Temp[0])
{
x1=0;
}
else
{
LedBuf[0]=LedCode[C_o];LedBuf[1]=LedCode[C_o];
LedBuf[2]=LedCode[C_o];LedBuf[3]=LedCode[C_o];
//return;//超范围则直接返回
}
//Temperature=x1;//kf
if(IdTimeCnt==0)
{
PreTemperature=LastTemperature;
LastTemperature=Temperature;
Temperature=x1;
dError=Error;
Error=Setted_Temperature-Temperature;
dError=Error-dError;
}
else
{
FastLastTemperature=Temperature;
Temperature=x1;
}
//显示温度
if(AdmitFlag==1)
{
LedH(Temperature);
DPA();
LedL(Setted_Temperature);
DPB();
}
///控制算法
//PidOutput范围-100~0~+100,每次趋于0
if(MeterSta!=STA_MAN)
{//---------------在此添加控制算法----------------
/////////////////////Bang-Bang-->Fuzzy-->Pid/////////////////
if((Error>-DeathZone)&&(Error<DeathZone))
{//死区控制:默认0.5
CtrlSta=RL_PID;
Output=0;
}
else if((Error>-LineC)&&(Error<LineC))
{//Pid control
CtrlSta=RL_PID;
if(IdTimeCnt==0)
x1=fK1*(LastTemperature-Temperature)+fK2*Error
+fK3*(2*LastTemperature-Temperature-PreTemperature);
else
x1=fK1*(FastLastTemperature-Temperature);
if(x1>100)
x1=100;
if(x1<-100)
x1=-100;
Output=x1;
}
//Fuzzy control
else if((Error>LineC)&&(Error<LineA)&&(IdTimeCnt==0))//升温区5s/sample
{
switch(CtrlSta)
{
//急升温部分
case NR_FAST://反向关闸门
k0=Read(EP_oH);
CloseOpenTimeCnt=-k0;//kf:uchar<--uint
CtrlSta=NR_WAITING;
WaitingCnt=0;
break;
case NR_WAITING://等候平温
if(dError>0)//降温则退出等待
{
CtrlSta=NR_FUZZY;
CloseOpenTimeCnt=0;
}
else if(dError==0)
{
WaitingCnt++;
if(WaitingCnt>=5)//25s不变则为停止
{
CtrlSta=NR_FUZZY;
CloseOpenTimeCnt=0;
}
}
else
WaitingCnt=0;
break;
case RL_PID://pid失控
case NR_FUZZY://慢速逼进
if(Error>LineB)
k0=0;
else
k0=1;
// LedBuf[0]=LedCode[k0];
if(dError<NBP)//
k1=0;//NB
else if(dError<NSP)
k1=1;//NS
else if(dError<ZP)
k1=2;//ZZ
else if(dError<PSP)
k1=3;//PS
else
k1=4;//PB
// LedBuf[1]=LedCode[k1];
Output=FuzzyRule[k1][k0];
break;
default:
CtrlSta=NR_FUZZY;
}
}
else if((Error>-LineD)&&(Error<-LineC)&&(IdTimeCnt==0))//降温缓冲5s/sample
{//Fuzzy control
switch(CtrlSta)
{
//降温部分
case NL_FAST://闸门已经关了
CtrlSta=NL_FUZZY;
WaitingCnt=0;
break;
case RL_PID:
case NL_FUZZY://逼进
if(dError<NBP)//
k1=0;//NB
else if(dError<NSP)
k1=1;//NS
else if(dError<ZP)
k1=2;//ZZ
else if(dError<PSP)
k1=3;//PS
else
k1=4;//PB
Output=FuzzyRule[k1][2];
break;
default:
CtrlSta=NL_FUZZY;
}
}
//Bang-Bang control
else if(Error>LineA)
{
CtrlSta=NR_FAST;
Output=100;//全速加温
}
else if(Error<-LineA)
{
CtrlSta=NL_FAST;
Output=-100;//全速降温
}
}
//-----------------控制算法结束------------------
//报警检查
if((Temperature>UpperLimit)||(Temperature<LowerLimit))
{
ALM_ON();
ALM_OUT=0;//警报接通
}
else
{
ALM_OFF();
ALM_OUT=1;//警报停止
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -