《微型计算机控制技术》课程设计造纸原料蒸煮过程压力微机控制系统.doc

上传人:文库蛋蛋多 文档编号:3898924 上传时间:2023-03-26 格式:DOC 页数:32 大小:410.50KB
返回 下载 相关 举报
《微型计算机控制技术》课程设计造纸原料蒸煮过程压力微机控制系统.doc_第1页
第1页 / 共32页
《微型计算机控制技术》课程设计造纸原料蒸煮过程压力微机控制系统.doc_第2页
第2页 / 共32页
《微型计算机控制技术》课程设计造纸原料蒸煮过程压力微机控制系统.doc_第3页
第3页 / 共32页
《微型计算机控制技术》课程设计造纸原料蒸煮过程压力微机控制系统.doc_第4页
第4页 / 共32页
《微型计算机控制技术》课程设计造纸原料蒸煮过程压力微机控制系统.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《《微型计算机控制技术》课程设计造纸原料蒸煮过程压力微机控制系统.doc》由会员分享,可在线阅读,更多相关《《微型计算机控制技术》课程设计造纸原料蒸煮过程压力微机控制系统.doc(32页珍藏版)》请在三一办公上搜索。

1、微型计算机控制技术课程设计任务书学院:信息工程学院班级:自动化0701姓名: 学号:指导老师: 目 录一、 设计题目-3二、 工艺要求-3三、系统的组成和工作原理-3四、硬件电路-41、压力变送及A/D转换电路-42、D/A转换及隔离输出电路-63、显示电路-74上下限报警电路-8 5控制系统的总电路图-8五、数字控制器的设计-9六、软件设计-101、内存地址分配-102、主程序流程图-113、定时中断处理程序流程图-124、AD转换自检程序流程图-125DA转换自检程序流程图-136RAM自检程序流程图-137按键处理程序流程图-14七、程序清单-151主程序- - -15 2AD转换程序-

2、19 3标度变换程序-20 4滤波程序- -20 5RAM自检程序-22 6数字控制器程序-23 7显示及按键处理程序- -23 8DA转换程序-30八、系统调试- - -30九、设计总结- - - -31十、参考文献- - -31一、设计题目 造纸原料蒸煮过程压力微机控制系统二、工艺要求造纸原料蒸煮过程压力微机控制系统蒸煮过程是制浆造纸生产中的关键工序之一,对于整个造纸生产过程中纸浆得率和纸的质量有很大影响,它要求根据原料的特点、纸浆的质量和生产设备的实际情况制定出合理的蒸煮工艺,确定装球量、用碱量、蒸煮温度和压力。造纸厂蒸煮车间有五个蒸球,依靠调节其进气量以达到控制蒸球工作压力和温度,调节

3、喷料阀控制装料量。用微机控制技术实现该过程的自动控制,要求蒸球的实际工作压力准确跟踪给定压力曲线。P1:低压保压值,P2:高压保压值,T1: 空转时间,T2:升低压时间,T3:低压保持时间,T4:升高压时间,T5:高压保持时间 装料控制系统示意图三、系统的组成和工作原理本压力控制系统的原理框图如下图所示 它采用Atmel公司的AT89S51单片机作为控制核心,AT89S51是低功耗的8位CMOS单片机,具有8K字节在线可编程Flash存储器,内部有带看门狗。通过其ISP接口线可以方便地在线调试程序。A/D转换器采用具有8通道输入的ADC0809。DBY-131型压力变送器将0-1.28Mpa的

4、压力信号转换为0-10mA的电流输出,通过500电阻转化为0-5V的电压信号供给A/D转换器采样。单片机定时(预定值为5s,用户可根据实际在调试时进行修改)依次对5个蒸球的压力进行采样。采样值经过内部程序数字滤波后与给定值进行比较(给定值通过程序计算按照用户给定的压力曲线变化),得到的偏差信号经PID算法程序后输出8位的阀门控制数字量。该数字量经D/A转换器AD558转换成0-10V的电压信号,0-10V的电压信号再经隔离放大器IC ISO1002与工业现场隔离,输出4-20mA 的标准电流信号控制蒸汽调节阀的开度。当蒸球的压力大于给定值时,偏差信号E=R-C小于零,经PID运算后输出量减小,

5、蒸汽调节阀的开度随之减小,从而使蒸球内的压力降低,重新回到平衡状态。通过对PID参数的整定可以使蒸球的实际工作压力准确跟踪给定压力曲线。四、硬件电路1、压力变送及A/D转换电路电路如图所示:压力变送器为DBY-131型,其量程可调范围为01 Mpa至03Mpa。本系统中调整为01.28Mpa。ADC0809的每个输入通道前对地接有一500的电阻,用于将压力变送器送来的010mA电流信号转换为05V的电压信号,ADC0809八个输入通道的地址为FE00HFE07H。单片机执行写总线指令后启动A/D转换,通过查询EOC的状态判断转换是否结束。执行读总线指令后将转换后的数据读入单片机内部。被测压力与

6、输出量关系:压力(Mpa)输出数字量 0 0. 635 1.27500000000 10000000 11111111DBY-131压力变送器性能指标:输出电流010m ADC振幅0.1mm(双向)灵敏限0.1%供电电源220V 50Hz负载电阻01.5k消耗功率6W来回变差不大于基本误差的绝对值结构形式现场安装式工作条件环境温度:-10C55C仪表重量约15Kg相对湿度85%仪表管结头螺纹M201.5/M181.5工作振动频率25HzADC0809技术指标供电电源单一+5V模拟量输入范围0-5V分辨率8位最大不可调误差1LSB功耗15mW转换速度取决于芯片的时钟频率2、D/A转换及隔离输出电

7、路D/A转换器采用8位电压输出型D/A转换器DAC0832DAC0832数/模转换器的内部,具有两极输入数据缓冲器和一个R-2R T型电阻网络。即包括一个数据寄存器、DAC 寄存器和D/A转换器三大部分。数据寄存器和DAC 寄存器实现两次缓冲,故在输出的同时,还可以接收一个数据,提高了转换速度。当多芯片工作时,可用同步信号实现各模拟量的同时输出。 该器件采用先进的CMOS工艺,功耗低,输出漏电流误差小,主要特性有:输出电流线性度可在满量程下调节;转换时间为1s;数据输入可采用双缓冲、单缓冲或直通方式;增益温度补偿为0.02%FS/;每次输入数字为8 为二进数;功耗为20mW;逻辑电平与TTL

8、兼容;单一电源供电,可在515V 内。DAC0832 可工作在单,双缓冲器方式。单缓冲器方式即输入寄存器的信号和DAC 寄存器的信号同时控制,使一个数据直接写入DAC 寄存器。 这种方式适用于只有一路模拟量输出或几路模拟量不需要同步输出的系统; 双缓冲器方式即输入寄存器的信号和DAC 寄存器的信号分开控制, 这种方式适用于几路模拟量需要同步输出的系统。为了提高转换精度,可增加D/A转换器的位数。隔离放大器采用ISO1002,ISO系列隔离放大器在同一芯片上提供了电源及信号的隔离,该混合集成芯片在同一芯片上集成了一个磁电耦合DC/DC变换电源及一个 电流/ 电压输出的光电耦合隔离放大器。该芯片除

9、为内部放大电路供电外,还可向外部输出一路隔离电压,供外部电路扩展使用。这一特点可方便地为外部电路基准电源及外部放大电路或其他用户应用电路供电。输入及输出侧宽爬电距离及内部隔离措施使该芯片可提供3000VAC绝缘电压。ISO系列产品使用非常方便,几乎无需外部元件,即可实现信号电流源长线传输(如图)。3显示电路LED显示器 LED显示块是由发光二极管显示字段的显示器件,常使用七段LED。这种显示块有共阴极与共阳极两种接法。N位LED显示器有N根位选线和8N根段选线。根据显示方式不同,位选线与段选线的连接方法不同。段选线控制字符选择,位选线控制显示器的亮暗。LED显示方式有静态显示方式(因其占用 I

10、/O资源较多,故在位数较多时不采用)和动态显示方式,如八位LED动态显示电路只需要两个8位I/O口。其中一个控制段选码,另一个控制位选码。由于所有位的段选码皆由一个I/O控制,因此,在每个瞬间,八位LED只可能显示相同的字符,必须采用扫描显示方式。即在每一瞬间只使某一位显示相应字符。在此瞬间,段选控制I/O口输出相应字符段选码,位选控制I/O口在该显示位送入选通电平以保证该位显示相应字符。如此轮流,使每位显示该位应显示字符,并保持延时一段时间,以造成视觉暂留效果。段选、位选码每送一次后延时15ms。本控制系统的采用8255A进行I/O扩展,而后接LED数码管电路加以显示,各数码管含义及电路如图

11、所示:4上下限报警电路本控制系统的采用8255A进行I/O扩展,报警输入信号由PA口输入,由PB口输出以提示报警及正常工作状态,电路如图所示:5控制系统的总电路图五、数字控制器的设计本设计采用最小拍随动系统数字控制器因为所以 (T=0.5s)所以 ( 式1-1)由式1-1知,该数字控制器为最少拍无波纹随动系统控制。假设输入为单位阶跃,取,所以又取采样周期T=0.5s,得 (式1-2)从而有 由差分方程得控制器输出为:(式1-3)最少拍随动系统的误差为:其中分为:1) 碱液设定值与实际输出碱液之差 2)水设定值与实际输出水之差因为=1.5所以 为第k次采样时实际输出碱液或实际输出水六:软件设计1

12、 内存地址分配2.主程序流程图3.定时中断处理程序流程图4.AD转换自检程序流程图5.DA转换自检程序流程图6按键处理程序流程图7.数字控制器流程图 七程序清单1 主程序#include#include#define unchar unsigned char#define unint unsigned int #define PORT_4A8255 XBYTE0X4000#define PORT_4B8255 XBYTE0X4001#define PORT_4C8255 XBYTE0X4002#define PORT_4COM8255 XBYTE0X4003 /定义4口8255的地址端#def

13、ine PORT_0A8255 XBYTE0X0000#define PORT_0B8255 XBYTE0X0001#define PORT_0C8255 XBYTE0X0002#define PORT_0COM8255 XBYTE0X0003 /定义0口8255的地址端#define ADC0809IN_0 XBYTE0x1000#define ADC0809IN_1 XBYTE0x1001#define ADC0809IN_2 XBYTE0x1002#define CHANNELS 3 /3个通道,IN0接液位检测,INT1接水流量变送器信号,IN2接碱液流量变送器信号#define DA

14、C0832BUFF XBYTE0X2000 /DAC转换地址#define CD4051IN_1 XBYTE0X3001 /输出通道1#define CD4051IN_2 XBYTE0X3002 /输出通道2#define P1 XBYTE0x5000 /碱液控制手动操作地址#define P2 XBYTE0x6000 /水控制手动操作地址#define Set_water DBYTE0X60 /定义水设定值地址#define Set_lye DBYTE0X61 /定义碱液设定值地址#define Set_up_alarm DBYTE0X62 /定义上限报警设定值地址#define Set_d

15、own_alarm DBYTE0X63 /定义下限报警设定值地址#define Real_water DBYTE0x64 /定义水实际输出值地址#define Real_lye DBYTE0x65 /定义碱液实际输出值设定值地址#define High DBYTE0X66 /定义液位高度值地址#define Water_Sample DBYTE0x67 /定义水采样值起始地址,采样6个值,67H6CH为存放采样值地址,#define Lye_Sample DBYTE0x6D /定义碱液采样值起始地址,采样6个值,6DH72H为存放采样值地址#define High_Sample DBYTE0x

16、73 /定义液位采样值起始地址,采样6个值,73H78H为存放采样值地址unchar code table=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F; /共阴极LED显示数字09unint T_count=0; /定义一个定时器定时0.5s计数单元unchar sam_count=0;/定义一个采样数的单元unchar data *Water_sam,*Lye_sam,*HIGH_sam; /定义分别指向水、碱液、液位采样值的指针float Water_control,Lye_control; /定义水和碱液控制器输出单元bit ADC

17、heck(void);bit DACheck(void); /定义A/D和D/A自检程序void set_init(void) /设定值初值子程序unchar *add_set /定义设定值指针addr_set=&Set_water ; /指向水设定值地址 *add_set=40; /水设定初值为40 addr_set+; /指向碱液设定值地址 *add_set=60; /碱液设定初值为60 addr_set+; /指向上限报警设定值地址 *add_set=90; /上限报警设定初值为90 addr_set+; /指向下限报警设定值地址 *add_set=10; /下限报警设定初值为90 un

18、char alarm(unchar height) /越限报警子程序 if(heightSet_up_alarm) /如果液位高于上限报警值,则报警并显示,返回1 PORT_4B8255 =0x84; /上限报警灯亮,电笛响 return 1; else if(heightSet_down_alarm) /如果液位低于下限报警值,则报警并显示,返回1 PORT_4B8255 =0x82; /下限报警灯亮,电笛响 return 1; else /液位高度正常,则正常工作指示灯亮,返回0 PORT_4B8255 =0x88; return 0; main()bit ADCheck(void);bi

19、t DACheck(void);bit ROMCheck(void);uncharmulti_filter(void);void DAC0832(unchar x,unchar y);void key(void);float Dignal_Contoller(unchar Rk,unchar Ck); /函数声明 /初始化8255定时器等 TMOD=0x02; /初始化定时器0,自动重装入初值工作方式2 TH0=0x38; /初值为56,单片机主频为12MHz。定时0.5s需要2500个200us TL0=0x38; PT0=1; /置定时器0高优先级 ET0=1; /允许定时器0中断 IT0

20、=1; /IT0=1:置外部中断0为边沿触发方式 EX0=1; /开放外部中断0 IT1=1 /IT1=1:置外部中断1为边沿触发方式 EX1=1; /开放外部中断1,且EA=1(允许单片机响应中断) EA=1; / EA=1,允许单片机响应中断 PORT_0COM8255=0x8000; /初始化0口8255,其A口,B口C口均作为输出(接数码管显示) PORT_4COM8255=0x90; /4口8255初始化,其A口作输入,其B口作输出(接键盘和指示灯) set_init();/对水、碱液、上限报警、下限报警各值初始化 Water_sam=Water_Sample; Lye_sam=Ly

21、e_Sample; HIGH_sam=High_Sample ; /分别指向各自采样值地址if(ROMCheck) /开机检测ROM是否正常工作 P1=1;/如果有故障则转到手动操作 P2=1; PORT_4B8255;/系统故障显示灯亮且电笛响 EA=0;/不允许中断 while(1);/死循环等待处理 set_init(); /设定默认值 while(1)/死循环 if(ADCcheck|DACheck)/调用A/D和D/A自检程序 P1=1;/如果有故障则转到手动操作 P2=1; PORT_4B8255;/系统故障显示灯亮且电笛响 EA=0;/不允许中断 while(1);/死循环等待处

22、理 key(); /调用键盘程序 display(); /调用数码管显示程序 ADC0809IN_0=1; /启动A/D转换 TR0=1; /启动定时器 2AD转换程序 #include#include#define unchar unsigned char#define ADC0809IN_0 XBYTE0x1000#define ADC0809IN_1 XBYTE0x1001#define ADC0809IN_2 XBYTE0x1002#define CHANNELS 3 /3个通道,IN0接液位检测,INT1接水流量变送器信号,IN2接碱液流量变送器信号bit bdata flag; /

23、设置标志位void ADC0809(unchar data *a,unchar data *b,unchar data *c) unchar i; unchar xdata *addr; addr=&ADC0809IN_0; /指针指向ADC0809通道0地址 IT1=1; /IT1=1:置外部中断1为边沿触发方式EX1=1; /开放外部中断1 EA=1; / EA=1,允许单片机响应中断 for(i=0;iCHANNELS;i+) flag=0; /设置标志 *addr=0; /启动转换 while(!flag); if(i=0) *a=*addr; /转换出来的值给通道0 else if(

24、i=1) *b=*addr; /转换出来的值给通道1 else *c=*addr; /转换出来的值给通道2 addr+; service_int1() interrupt 2 using 1 /INT1中断服务程序,使用第一组寄存器 flag=1; /转换结束标志 3标度变换程序#include#include#define unchar unsigned char#define unint unsigned int unchar data Conversion(unchar x)/标度转换子程序 return 100*x/255; /Ax=100*Nx/255 4滤波程序#include#i

25、nclude#define unchar unsigned char#define unint unsigned int uncharmulti_filter(unchar GET_COUNT,unchar data *BUFF)/采用复合数字滤波法,GET_COUNT为采样值个数 /*BUFF为指向采样值存储地址的指针 unchar data *addr; /定义一个地址 int i,j; unchar data buffer; unsigned int SUM=0; /累加值 BUFF=0x67; /指针指向67H addr=BUFF; for(j=0;jGET_COUNT-1;j+) /

26、采用冒泡法排序,来去除最大值和最小值 for(i=0;i*(addr+i+1) buffer=*(addr+i);*(addr+i)=*(addr+i+1);*(addr+i+1)=buffer; for(i=0;iGET_COUNT-2;i+)/累加去除最大值和最小值后的值 SUM+=*(addr+i+1);return(SUM/(GET_COUNT-2); /返回采用复合数字滤波法滤波后的值5RAM自检程序#include #include #define unchar unsigned char #define unint unsigned char #define xRAM DBYTE

27、0x00/检查内部128B的RAM #define R_count 0x7F/设计数初值 bit ROMCheck(void) unchar data *x; /设RAM地址指针 unchar bdata FLAG; /设检查标识单元 unchar bdata CHECK; /设检查字单元 unint i,j,k,r; unchar bdata temp; FLAG=0;i=k=r=0; /变量初始化 CHECK=0xAA;/设检查字AAH while(FLAG!=2) /检查标志=02?是,则结束 for(i=R_count;i0;i-) *(x+j)=CHECK; /检查字写入内存单元if

28、(temp=*(x+j)!=0xAA) /写入内容=检查字?return 1; /否,则返回1 j+; /修改地址FLAG+; /检查标志加1CHECK=0x55;/修改检查字(55H)j=0; /设地址指针,从头再检查 return 0; 6 数字控制器程序static float data E_1; /设置E(K-1) static float data E_2; /设置E(K-2) static float data U_1; /设置U(K-1) static float data U_2; /设置U(K-2) float Dignal_Contoller(float Rk,float

29、Ck)/Rk为给定值,Ck为测量值 float data U_0; /设置U(K) float data E_0;/设置E(k) E_0=Rk-Ck;/计算偏差E(k) U_0=4*E_1-3.92*E_2+1.92*U_1+0.92*U_2; /最少拍无波纹控制算式 E_2=E_1; E_1=E_0; /E(k)赋值给E(K-1), E(k-1)赋值给E(K-2) U_2=U_1; U_1=U_0; /U(k)赋值给U(K-1), U(k-1)赋值给U(K-2) return (U_0); 7 显示与按键处理程序 #include#include#define PORT_4A8255 XBY

30、TE0X4000#define PORT_4B8255 XBYTE0X4001#define PORT_4C8255 XBYTE0X4002#define PORT_4COM8255 XBYTE0X4003 /定义4口8255的地址端#define PORT_0A8255 XBYTE0X0000#define PORT_0B8255 XBYTE0X0001#define PORT_0C8255 XBYTE0X0002#define PORT_0COM8255 XBYTE0X0003 /定义0口8255的地址端#define unchar unsigned char#define unint u

31、nsigned int#define Set_water DBYTE0X60 /定义水设定值地址#define Set_lye DBYTE0X61 /定义碱液设定值地址#define Set_up_alarm DBYTE0X62 /定义上限报警设定值地址#define Set_down_alarm DBYTE0X63 /定义下限报警设定值地址#define Real_water DBYTE0x64 /定义水实际输出值地址#define Real_lye DBYTE0x65 /定义碱液实际输出值设定值地址#define High DBYTE0X66 /定义液位高度值地址#define uncha

32、r unsigned char#define unint unsigned intunchar K_Start=0,K_Stop=0,K_Water=0,K_Lye=0,K_Up_Alarm=0, K_Down_Alarm=0,K_INC=0,K_DEC=0;unchar code table=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F; /共阴极LED显示数字09 unsigned Select; /定义一个位选端 unchar data *addr_pointer; /定义一个指向DATA区空间的指针delay1ms() /延迟1ms

33、 unchar i; for(i=0;i173;i+); void display(void) unchar i; Select=0x80; /首先选择最高位 addr_pointer=&Set_water; /给指针赋值,指向DATA区地址60H处,即水设定值存储地址 PORT_0COM8255=0x8000; /初始化0口8255,其A口,B口,C口均作为输出 PORT_4COM8255=0x90; /4口8255初始化,其A口作输入,其B口,C口作输出 for(i=0;i8;i+) PORT_0A8255=table(*(addr_pointer+i)/10; /高位显示 PORT_0B8255=Select; /输出位选码到

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号