⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arithmetic.c

📁 开发的一个温控仪完整代码
💻 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 + -