资源描述
陶瓷隧道窑微机温度控制系统
摘 要
目前我国陶瓷隧道窑炉大多采用人工或简单仪表控制,要想使窑炉长期达到最佳工作状态是不可能的,造成产品合格率、一级品率一直处于较低的水平。陶瓷隧道窑炉是由预热带、烧成带和冷却带三个部分组成,瓷件烧成温度在1320℃左右,窑内温度场主要由烧成带12对喷嘴燃冷煤气产生,窑炉系统用8组风机来调节窑内的压力场。排烟风、助燃风将直接影响烧成带的温度场,急冷风会影响最终产品的质量。
温度控制系统将采集的各点温度值,经A/D转换后与设定值进行比较,控制器输出经由D/A变换,变成 4~20mA形式模拟量输出给电动执行器,驱动蝶形阀调节喷嘴的煤气进给量,从而控制烧成带的温度。12只温度传感器与12个喷嘴一一对应。
关键词: MSP430F149单片机、热电偶,变送器、大林算法、
I2C总线、多路开关
一.总体方案设计
1.对象的工艺过程
陶瓷隧道窑炉是由预热带、烧成带和冷却带三个部分组成,瓷件烧成温度在1320℃左右,窑内温度场主要由烧成带12对喷嘴燃冷煤气产生,窑炉系统用8组风机来调节窑内的压力场。排烟风、助燃风将直接影响烧成带的温度场,急冷风会影响最终产品的质量。
温度控制系统将采集的各点温度值,经A/D转换后与设定值进行比较,控制器输出经由D/A变换,变成 4~20mA形式模拟量输出给电动执行器,驱动蝶形阀调节喷嘴的煤气进给量,从而控制烧成带的温度。12只温度传感器与12个喷嘴一一对应。
窑温控制示意图
2.对象分析
被控过程传递函数是一个大的延迟环节,而且温度的控制对系统的输出超调量有严格的限制,用最少拍无纹波数字控制器的设计,和PID算法效果欠佳,所以本设计采用大林算法设计数字控制器。
3.控制系统设计要求
窑温控制在1320±10℃范围内。微机自动调节:正常工况下,系统投入自动。模拟手动操作:当系统发生异常,投入手动控制。
微机监控功能:显示当前被控量的设定值、实际值,控制量的输出值,参数报警时有灯光报警。
二、硬件的设计和实现
1.选择计算机机型和系统总线
本系统控制的回路12个,所以只需要一片微控制器即可实现,本设计采用TI公司的MSP430系列单片机,MSP430 系列是一个 16 位的、具有精简指令集的、超低功耗的混合型单片机,有较高的处理速度,在 8MHz 晶体驱动下指令周期为 125 ns 。这些特点保证了可编制出高效率的源程序。采用的是 1.8~3.6V 电压。MSP430 系列单片机的各成员都集成了较丰富的片内外设。它们分别是看门狗( WDT )、模拟比较器 A 、定时器 A ( Timer_A )、定时器 B ( Timer_B )、串口 0 、 1 ( USART0 、 1 )、硬件乘法器、液晶驱动器、 10 位 /12 位 ADC 、 I 2 C 总线直接数据存取( DMA )、端口 O ( P0 )、端口 1~6 ( P1~P6 )、基本定时器( Basic Timer )等的一些外围模块的不同组合。16 位定时器( Timer_A 和 Timer_B )具有捕获 / 比较功能,大量的捕获 / 比较寄存器,可用于事件计数、时序发生、 PWM 等;具有较多的 I/O 端口,最多达 6*8 条 I/O 口线; P0 、 P1 、 P2 端口能够接收外部上升沿或下降沿的中断输入; A/D 转换器有较高的转换速率,最高可达 200kbps ,能够满足大多数数据采集应用;硬件 I 2 C 串行总线接口实现存储器串行扩展;
2.设计支持计算机工作的外围电路(EPROM、RAM、键盘、显示、通信端口等)
本设计采用MSP149作为主控芯片,内有2K的RAM和60K的 FLASH在程序运行中已经足够了不需扩展RAM了,扩展一片AT24C128(EPROM) 以保存一些断电时的RAM的值和一些报警信息值以便查询,AT24C128采用I 2 C总线进行传
输数据方便且占用端口少,可用MSP149的I/O端口的一位即可实现。键盘采用非编码键盘,设计5个按键,其中一个+键,一个-键,用于设定数据时的数据值
的加和减 ,一个菜单键按一下进入设定模式,用+键 -键 查找需要设定的模式选项(模式有设定手自动控制,设定报警限度,),还有一个确定键,确定键按下后系统将按照设定值运行,和一个显示切换按键,以显示不同组的温度值。显示部分采用数码管显示,采用两片4级联的共阳极数码管实现,用以显示温度值 ,通信端口采用单片机内部的串行异步通信模块用RS485标准通信,实现下位机到上位机的通信,以使数据传入计算机,通过计算机可实现联网,从而实现远程监控。
3.设计输入输出通道(温度测量、控制输出电路等);
陶瓷隧道窑炉中温度通过热电偶传感器变换为微弱电压信号再经变送器转换为1-5v电压信号,送单片机A/D转换器,单片机msp430f149内部有一个带有采样保持器8通道的12位A/D转换器,由于本设计中有12个通道的值要送A/D转换,所以需外接多路开关,多路开关选用16通道的CD4067,分时地将12组模拟量送A/D转换器,实现数据的采集,输出通道有12组输出,单片机数据处理后送出数字量经D/A转换器DAC8830芯片,转换为模拟量再经过16通道的CD4067多路分配器输出经变送器变为4-20mA标准信号再通过电动调节阀来控制阀位的开度,以达到控制温度的目的。
4.所选用传感器、变送器及执行器的类型、型号及量程范围
4.1传感器部分
采用标准化把B型热电偶铂铑30--铂铑6测量温度。该元件长期最高使用温度为1600℃,短期使用最高温度为1800℃。具有准确度高,稳定性好,测温范围宽,使用权用寿命长等优点,适用于氧化性和惰性气氛中,也可短期用于真空中,但不适用于还原性气氛或含有金属或非金属蒸气中。能用做工业测温元件,且此元件线形较好。等级3,允许偏差±0.5% * t,符合控制精度的要求,同时也满足长期测量1310℃-1330℃的要求。
4.2变送器部分
由于热电偶输出毫伏信号所以需要变送器将其转换为1-5v标准电压信号送A/D进行转化,本设计选用产品型号为: XPZX温度变送器主要特点 :
1. 二线制传送。信号转换器供电的两根导线同时也传送输出信号。
2. 输出恒流信号(4~20mA)。抗干扰能力强、远传性能好。
3. 信号转换器用环氧树脂封装成模块,具有抗震动、耐腐蚀、防潮湿等优点,可用于条件较差的场所。
4. 热电偶的毫伏信号经信号转换器直接转换成4~20mA电流输出、用普通电缆线传送信号,可省去价格昂贵的补偿导线。
5. 带现场显示的温度变送器既输出4~20mA的电流信号,又能在测温现场读到实测温度,给操作人员带来很大方便。
供电电压:13~30V,DC 负载电阻:0~850Ω, 输出信号:4~20mA ,基本误差:±0.2%,±0.5%
当负载电阻为250欧姆时输出1-5伏电压信号
4.3电动调节阀
选用3610系列电子式电动调节阀其主要特点:
1.伺服控制器和执行器合二为一,集机电于一体,控制精度高,可构成高品质的调节系统。
2.伺服控制器功能多,高度集成化,可靠性高,操作简便。
3.具有选择功能: 控制信号:DCO~10mA/DC4~20mA.动作方向:正作用/反作用。
4.位置检测采用高可靠性器件,并有间隙补偿装置,通过发送器可输出DCO-10MA、DC4-20MA阀位信号。具有自诊断及处理和指示功能。
5.具有状态设定功能,断信号后自动进入设定状态(开启、保持原位、关闭)。
6.在运行过程中,遇到断电,具有自锁功能,保持其原位。
7.行程零位及满位、死区、反馈零位及满位调整方便。
型号
量程范围
传感器
铂铑30--铂铑6
温度0-1800℃
变送器
XPZX 变送器
输出4mA~20mA
执行器
3610系列
输入4mA~20mA
三.数字控制器的设计
被控过程传递函数: 是一个大的延迟环节,而且温度的控制对系统的输出超调量有严格的限制,用最少拍无纹波数字控制器的设计,和PID算法效果欠佳,所以本设计采用大林算法设计数字控制器。
大林算法的设计目标是设计一个合适的数字控制器,使整个闭环系统的传递函数相当于一个带有纯滞后的一阶惯性环节,即:通常认为对象与一个零阶保持器相串联,相对应的整个闭环系统的脉冲传递函数是: 由于三阶大林算法太复杂,而且实际生产中的传递函数也不一定是三阶,所以本设计将传递函数简化为一阶惯性环节,取T=10s,N=4
连同零阶保持器在内的系统广义被控对象的传递函数
系统闭环传递函数
数字控制器:
由于选取系统时间常数大于被控对象的时间常数所以不会产生振铃现象。离散后数字控制器为:
其中:K1= K2=
最终得:
U(K)= 0.128e(K)—0.086e(K—1)+0.905U(K—1)+0.095 U(K—5)
四.软件的设计
1.系统程序框图
2.数字调节器软件模块
float Dalin(float M,floatR)
{
int i;
float u; //用于返回输出值
float e[2]={0}; //定义数组用于存放偏差e(k)和输出u(k)
float u[5]={0};
e[0]=R-M; //本次偏差
u[0]=0.128e[0]-0.086e[1]+0.905u[1]+0.0095u[4];
u=u[0];
e[1]=e[0];
for(i=0;i<4;i++) //将最后面的输出赋以新值
{
u[i+1]=u[i];
}
return(u) //返回控制量
}
3.A/D及 D/A转换器处理程序模块
A/D转换程序:
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭WDT
ADC12CTL0 = SHT0_2 + ADC12ON; // 设置采样时间, 打开ADC12
ADC12CTL1 = SHP; // 使能采样保持器
ADC12IE = 0x01; // 中断使能
ADC12CTL0 |= ENC; // 转换使能
P6SEL |= 0x01; // P6.0 ADC 作为输入通道t
P3DIR |= 0x02; // P3.1 设为输出
for (;;)
{
ADC12CTL0 |= ADC12SC; // 采集开始
_BIS_SR(CPUOFF + GIE); // 进入低功耗, 等待转化完毕
}
}
i#pragma vector=ADC_VECTOR // ADC12中断处理程序
__interrupt void ADC12_ISR (void)
{
P3OUT |= ADC12MEM0 ; // P3.1输出转换值
}
D/A转换程序:
void convert (int nValue)
{
unsigned char hi_byte;
unsigned char lo_byte;//取出高字节
hi_byte = (char)(nValue >> 8);//取出低字节
lo_byte = (char)(nValue & 0x0ff);//选通DAC8830
CS_Enable();//等待传输完成
while ((IFG1 & UTXIFG0) == 0) ;//发送数据
U0TXBUF = lo_byte;//等待传输完成
while ((IFG1 & UTXIFG0) == 0) ;//发送数据
U0TXBUF = hi_byte;//不选通DAC8830
CS_Disable();
return ;
}
4.数字滤波程序模块
由于温度量变化缓慢所以采用中值滤波效果较好下面为中值滤波程序N值可根据实际情况调整,排序采用冒泡法
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for ( count=0;count<N;count++)
{
value_buf[count] = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (i=0;i<N-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}
5.输出控制程序模块
void DataOut(unsigned char nValue)
{
int i;
int j;
for(i = 0;i < 8;i++)
{
if ((nValue & 0x01) == 1)
{
P1OUT |= BIT0;//输出高电平
}
else
{
P1OUT &= ~(BIT0);//输出低电平
}
SHCLK_Hi();//时钟高电平,上升沿有效
for(j = 10; j > 0; j--) ;//延迟一点时间
SHCLK_Lo();//时钟低电平
for(j = 10; j > 0; j--) ;
nValue >>= 1;
}
return;
}
void main(void)
{
unsigned char nValue;//初始化时钟
Init_CLK();//端口初始化
Init_Port(); //清除锁存信号
STCLK_Lo()//输出0
nValue = 0;
DataOut(seg[nValue]);//输出2
nValue = 2;
DataOut(seg[nValue]);//显示上面的8位数据
STCLK_Hi();
return;
}
6.按键程序模块程序:
unsigned char key(void)
{
unsigned char x=0xff;
P1DIR=0X0F;
P1OUT=0X01; //扫描第一行
if((P1IN&0X70)==0X10)
x=0;
else
if((P1IN&0X70)==0X20)
x=1;
else
if((P1IN&0X70)==0x40)
x=2;
else
{
P1OUT=0X2; //扫描第二行
if((P1IN&0X70)==0X10)
x=3;
else
if((P1IN&0X70)==0X20)
x=4;
else
if((P1IN&0X70)==0x40)
x=5;
else
{
P1OUT=0X4; //扫描第三行
if((P1IN&0X70)==0X10)
x=6;
else
if((P1IN&0X70)==0X20)
x=7;
else
if((P1IN&0X70)==0x40)
x=8;
else
{P1OUT=8; //扫描第四行
if((P1IN&0X70)==0X10)
x=9;
else
if((P1IN&0X70)==0X20)
x=10;
else
if((P1IN&0X70)==0x40)
x=11;
}
}
}
return(x);
}
7.报警程序模块程序:
void alarm()
{
P3DIR=0X0F;
if(out>outmax)
{
P3OUT=0X7F; //高于上限值时p3.7输出低电平
out=0; //同时将输出置0
}
if(out<outmin)
{
P3OUT=0Xbf; /低于下限值时p3.6输出低电平
}
}
8.I2C模块程序:
bit shout(uchar write_data) // 从MCU移出数据到AT24C128
{
uchar i;
bit ack_bit;
for(i = 0; i < 8; i++) // 循环移入8个位
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
delayNOP();
SCL = 0;
write_data <<= 1;
}
SDA = 1; // 读取应答
delayNOP();
SCL = 1;
delayNOP();
ack_bit = SDA;
SCL = 0;
return ack_bit; // 返回AT24C128应答位
}
五.总结
六.参考文献
展开阅读全文