电阻炉温度控制系统设计
2. 温度采集转换源程序
#include
Sbit MAX6675_CS=P1.2;
Sbit MAX6675_SCK=P1.1; Sbit MAX6675_SO=P1.3;
#define SCK_DELAY=10; /*温度值读取程序*/
Unsigned int ReadMAX6675(void) {
unsigned int Value=0; unsigned char count;
MAX6675_CS=0; /*CS置低电平,启动NAX6675*/ MAX6675_SCK=0;
for(count=0;count<3*SCK_DELAY;count++);
for(count=0;count<16;count++) /*得到16位高字节*/ { Value<=1;
MAX6675_SCK=1; /* SCK置高电平*/ for(i=0;i MAX6675_SCK=0; /*SCK置低电平*/ } MAX6675_CS=1; /*停用MAX6675*/ return Value; } #define ERROR10xffff; #define ERROR20xfffe; /*数据转换程序 */ Unsigned int GetCunrrent Temperaure(unsigned int CurrentValue) { Unsigned int TempValue; /* 定义转换温度值(取D14到D3转换温度值)*/ TempValue= CurrentValue; /*定义从MAX6675读到的数据 */ if(TempValue&0x8000) /*D15=1;标识位错*/ return ERROR1; if(TempValue&0x0004) /*D2=1;热电偶开路*/ return ERROR2; TempValue&=0x7ffb; /*取D14位到D3的值*/ TempValue>=3; /*转换温度值*/ return TempValue; } 3. PID控制算法源程序 #define FiltA 0.1 /*PID控制输出的滤波系数*/ #define FiltB 0.9 /*PID控制输出的滤波系数*/ #define Kp 1.75 /*PID控制器的比例系数*/ - 40 - 四川理工学院本科毕业(设计)论文 #define Ki 0.012 /*PID控制器的积分系数*/ #define Kd 3.5 /*PID控制器的微分系数*/ int Err[4][2]; int InteE[]4[2]; int OnMs[4][2]; /* funetion: unsigned char pid(unsigned char i,unsigned char j,unsigned char k,unsigned char l) deseription: this funetion for pid control parameter: i:->channel j:->time k:->set temprature l:->actual temprature retturn: adjust_time一>adjust time */ viod pid(undigned char ch.,int refval) { int DiscE,Tmpr; Err[ch][1]=refval-GetTmp(GetData6675(ch+1)); /*e(k)*/ if(Err[ch][1]>=Emax) InteE[ch][1]= InteE[ch][0]+ Err[ch][1]; else InteE[ch][1]= InteE[ch][0]; DiscE= Err[ch][1]- Err[ch][0]; Tmpr=Kp* Err[ch][1]+Ki* InteE[ch][1]+Kd* DiscE. OnMs[ch][1]=GetOnMs(FiltA*OnMs[ch][0]+ FiltB*Tmpr); Err[ch][0]= Err[ch][1]; InteE[ch][0]= InteE[ch][1]; OnMs[ch][0]= OnMs[ch][1]; } /* funetion: int GetonMs(int OnTime) deseription: output control time parameter: none return: ftmp */ int GetOnMs(int OnTime) { int ftmp; if(OnMs<=0) ftmp=0; else if(OnMs<=100) ftmp=100; - 41 - 电阻炉温度控制系统设计 else ftmp= OnTime; return; } 4. 看门狗程序 #include #include sfr AUXR = 0x8E; /*定义寄存器*/ sfr WDTRST = 0xA6; void clr_wdt(); main() { AUXR = 0xff; /*初始化看门狗相关寄存器*/ while(1) /*主循环*/ { clr_wdt(); /*8191个机器周期内必须至少调用此程序一次,否则看门狗会溢出*/ } } void clr_wdt() { WDTRST = 0x1E; /*清除看门狗指令*/ WDTRST = 0xE1; } - 42 -