式中,e(t)=r(t)-y(t)称为偏差值,可作为温度调节器的输入信号,其中r(t)为给定值,y(t)为被测变量值;Kp为比例系数;Td为积分时间常数;u(t)为调节器的输出控制电压信号。
但计算机只能处理数学信号,故上述数学方程必须加以变换。若设温度的采样周期为T,第n次采样得到的输入偏差为en,调节器输出为Un,则有: 为T,第n次采样得到的输入偏差为en,调节器输出为Un,则有:
(微分用差分代替)
这样,式(3.1)便可改写为:
Un?Kp[en?(3.2)
写成递推形式为:
改写成:
U(n)?U(n?1)?Kp{E(n)?E(n?1)?KiE(n)?Kd[E(n)?2E(n?1)?dE(n?2)]}?U(n?1)?Pp?Pi?Pd
tde?t (积分用求和代替)
1TiK?0?ekT?Tdnen?en?1T]
(3.3)
4.2 温度控制程序
///////////////////主程序////////////////// #include
#define uchar unsigned char #define uint unsigned int
sbit ds=P2^2; //温度传感器信号线 sbit dula=P2^6; //数码管段选线 sbit wela=P2^7; //数码管位选线 sbit beep=P2^3; //蜂鸣器
uint temp; float f_temp; uint warn_l1=260; uint warn_l2=250; uint warn_h1=300; uint warn_h2=320;
sbit led0=P1^0; sbit led1=P1^1;
sbit led2=P1^2; sbit led3=P1^3;
unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0xbf,0x86, 0xdb,0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef}; //不带小数点的编码
void delay(uint z)//延时函数 {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void dsreset(void) //18B20复位,初始化函数 { uint i; ds=0; i=103; while(i>0)i--; ds=1; i=4; while(i>0)i--; }
bit tempreadbit(void) //读1位函数 { uint i; bit dat;
ds=0;i++; //i++ 起延时作用 ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return (dat); }
uchar tempread(void) //读1个字节 {
uchar i,j,dat; dat=0;
for(i=1;i<=8;i++) {
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里 }
return(dat); }
void tempwritebyte(uchar dat) { uint i; uchar j; bit testb; for(j=1;j<=8;j++) {
testb=dat&0x01; dat=dat>>1; if(testb) //写 1 { ds=0; i++;i++; ds=1;
i=8;while(i>0)i--; } else {
向18B20写一个字节数据 // ds=0; //写 0 i=8;while(i>0)i--; ds=1; i++;i++; } } }
void tempchange(void) //DS18B20 开始获取温度并转换 {
dsreset(); delay(1);
tempwritebyte(0xcc); // 写跳过读ROM指令 tempwritebyte(0x44); // 写温度转换指令 }
uint get_temp() //读取寄存器中存储的温度数据 {
uchar a,b;
dsreset(); delay(1);
tempwritebyte(0xcc); tempwritebyte(0xbe);
a=tempread(); //读低8位 b=tempread(); //读高8位 temp=b;
temp<<=8; //两个字节组合为1个字 temp=temp|a;
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库电阻炉炉温自动控制系统(6)在线全文阅读。
相关推荐: