《微型计算机控制技术》课程设计-造纸原料蒸煮过程压力微机控制系统.doc_第1页
《微型计算机控制技术》课程设计-造纸原料蒸煮过程压力微机控制系统.doc_第2页
《微型计算机控制技术》课程设计-造纸原料蒸煮过程压力微机控制系统.doc_第3页
《微型计算机控制技术》课程设计-造纸原料蒸煮过程压力微机控制系统.doc_第4页
《微型计算机控制技术》课程设计-造纸原料蒸煮过程压力微机控制系统.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微型计算机控制技术课程设计任务书学院:信息工程学院班级:自动化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转换程序-19 3标度变换程序-20 4滤波程序- -20 5ram自检程序-22 6数字控制器程序-23 7显示及按键处理程序- -23 8da转换程序-30八、系统调试- - -30九、设计总结- - - -31十、参考文献- - -31一、设计题目 造纸原料蒸煮过程压力微机控制系统二、工艺要求造纸原料蒸煮过程压力微机控制系统蒸煮过程是制浆造纸生产中的关键工序之一,对于整个造纸生产过程中纸浆得率和纸的质量有很大影响,它要求根据原料的特点、纸浆的质量和生产设备的实际情况制定出合理的蒸煮工艺,确定装球量、用碱量、蒸煮温度和压力。造纸厂蒸煮车间有五个蒸球,依靠调节其进气量以达到控制蒸球工作压力和温度,调节喷料阀控制装料量。用微机控制技术实现该过程的自动控制,要求蒸球的实际工作压力准确跟踪给定压力曲线。p1:低压保压值,p2:高压保压值,t1: 空转时间,t2:升低压时间,t3:低压保持时间,t4:升高压时间,t5:高压保持时间 装料控制系统示意图三、系统的组成和工作原理本压力控制系统的原理框图如下图所示 它采用atmel公司的at89s51单片机作为控制核心,at89s51是低功耗的8位cmos单片机,具有8k字节在线可编程flash存储器,内部有带看门狗。通过其isp接口线可以方便地在线调试程序。a/d转换器采用具有8通道输入的adc0809。dby-131型压力变送器将0-1.28mpa的压力信号转换为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运算后输出量减小,蒸汽调节阀的开度随之减小,从而使蒸球内的压力降低,重新回到平衡状态。通过对pid参数的整定可以使蒸球的实际工作压力准确跟踪给定压力曲线。四、硬件电路1、压力变送及a/d转换电路电路如图所示:压力变送器为dby-131型,其量程可调范围为01 mpa至03mpa。本系统中调整为01.28mpa。adc0809的每个输入通道前对地接有一500的电阻,用于将压力变送器送来的010ma电流信号转换为05v的电压信号,adc0809八个输入通道的地址为fe00hfe07h。单片机执行写总线指令后启动a/d转换,通过查询eoc的状态判断转换是否结束。执行读总线指令后将转换后的数据读入单片机内部。被测压力与输出量关系:压力(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转换及隔离输出电路d/a转换器采用8位电压输出型d/a转换器dac0832dac0832数/模转换器的内部,具有两极输入数据缓冲器和一个r-2r t型电阻网络。即包括一个数据寄存器、dac 寄存器和d/a转换器三大部分。数据寄存器和dac 寄存器实现两次缓冲,故在输出的同时,还可以接收一个数据,提高了转换速度。当多芯片工作时,可用同步信号实现各模拟量的同时输出。 该器件采用先进的cmos工艺,功耗低,输出漏电流误差小,主要特性有:输出电流线性度可在满量程下调节;转换时间为1s;数据输入可采用双缓冲、单缓冲或直通方式;增益温度补偿为0.02%fs/;每次输入数字为8 为二进数;功耗为20mw;逻辑电平与ttl 兼容;单一电源供电,可在515v 内。dac0832 可工作在单,双缓冲器方式。单缓冲器方式即输入寄存器的信号和dac 寄存器的信号同时控制,使一个数据直接写入dac 寄存器。 这种方式适用于只有一路模拟量输出或几路模拟量不需要同步输出的系统; 双缓冲器方式即输入寄存器的信号和dac 寄存器的信号分开控制, 这种方式适用于几路模拟量需要同步输出的系统。为了提高转换精度,可增加d/a转换器的位数。隔离放大器采用iso1002,iso系列隔离放大器在同一芯片上提供了电源及信号的隔离,该混合集成芯片在同一芯片上集成了一个磁电耦合dc/dc变换电源及一个 电流/ 电压输出的光电耦合隔离放大器。该芯片除为内部放大电路供电外,还可向外部输出一路隔离电压,供外部电路扩展使用。这一特点可方便地为外部电路基准电源及外部放大电路或其他用户应用电路供电。输入及输出侧宽爬电距离及内部隔离措施使该芯片可提供3000vac绝缘电压。iso系列产品使用非常方便,几乎无需外部元件,即可实现信号电流源长线传输(如图)。3显示电路led显示器 led显示块是由发光二极管显示字段的显示器件,常使用七段led。这种显示块有共阴极与共阳极两种接法。n位led显示器有n根位选线和8n根段选线。根据显示方式不同,位选线与段选线的连接方法不同。段选线控制字符选择,位选线控制显示器的亮暗。led显示方式有静态显示方式(因其占用 i/o资源较多,故在位数较多时不采用)和动态显示方式,如八位led动态显示电路只需要两个8位i/o口。其中一个控制段选码,另一个控制位选码。由于所有位的段选码皆由一个i/o控制,因此,在每个瞬间,八位led只可能显示相同的字符,必须采用扫描显示方式。即在每一瞬间只使某一位显示相应字符。在此瞬间,段选控制i/o口输出相应字符段选码,位选控制i/o口在该显示位送入选通电平以保证该位显示相应字符。如此轮流,使每位显示该位应显示字符,并保持延时一段时间,以造成视觉暂留效果。段选、位选码每送一次后延时15ms。本控制系统的采用8255a进行i/o扩展,而后接led数码管电路加以显示,各数码管含义及电路如图所示: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 内存地址分配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的地址端#define 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 dac0832buff 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_down_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 dbyte0x73 /定义液位采样值起始地址,采样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 adcheck(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 unchar 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);bit 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=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=lye_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);/死循环等待处理 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; /设置标志位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(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#include#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+) /采用冒泡法排序,来去除最大值和最小值 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 dbyte0x00/检查内部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(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 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 xbyte0x4000#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 unsigned 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 unchar 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 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;i1; port_0a8255=table(*(addr_pointer+i)%10; /低位显示 port_0b8255=select; /输出位选码到pb口 delay1ms(); /延时1ms select=0x80; for(i=0;i1; port_0c8255=table(*(addr_pointer+i)%10; /低位显示 port_0b8255=select; /输出位选码到pb口 delay1ms(); /延时1ms void dis2_modify(unchar temp, unchar *add) /修改数码管子程序 /temp为欲修改显示某个数码管值的位选端,add为指向修改数码管的地址 unchar i,slct; slct=temp;port_0a8255 =0x00;/高位停止显示 port_0b8255=temp; /输出位选码到pb口 for(i=0;i1; /选择下一位 port_0a8255 =0x00; /低位停止显示 port_0b8255=slct; /输出位选码到pb口 for(i=0;i100;i+) /循环来延迟一段足以让人看出数码管闪烁的效果 delay1ms(); /延时1ms slct=temp; port_0a8255=table(*add)/10;/高位显示 port_0b8255=slct; /输出位选码到pb口 for(i=0;i1; /选择下一位 port_0a8255 =table(*add)%10; /低位显示 port_0b8255=slct; /输出位选码到pb口 for(i=0;i100;i+) /循环来延迟一段足以让人看出数码管闪烁的效果 delay1ms(); /延时1ms void inc_or_dec(unchar temp,unchar *add)/加1或减1子程序 /temp为欲修改显示某个数码管值的位选端,add为指向修改数码管的地址 display(); /数码管扫描显示 dis2_modify(temp,add); /闪烁要修改的数码管display(); /数码管扫描显示 if(k_inc) /如果加1键按下,显示加1 k_inc=0; /加1键每按一次则加1,故在次将其清零(*add)+; /设定值加1if(k_dec) /如果减1键按下,显示减1 k_dec=0; /减1键每按一次则加1,故在次将其清零 (*add)-;/设定值减1 dis2_modify(temp,add); /闪烁显示修改后的数码管display();/数码管扫描显示 void key(void) it0=1; /it0=1:置外部中断0为边沿触发方式 px0=1; /置外部中断0高优先级 ex0=1; /开放外部中断0 ea=1; / ea=1,允许单片机响应中断 port_4com8255=0x90; /4口8255初始化,其a口作输入,其b口作输出 if(!k_start) while(!k_start) port_0b8255=0x20; /如果启动按钮没有按下,则显示等待启动按钮按下灯,并死循环等待按下 port_0b8255=port_0b8255&0xdf;/启动按钮按下,则等待启动信号灯熄灭 if(k_stop) /如果停止按钮按下,则k_start清零,等待其再次按下启动 k_start=0; while(!k_start) /如果启动按钮没有按下,则显示停止信号灯,并且数码管显示停止时的各种值 port_0b8255=0x10; display(); k_stop=0; /启动按钮按下时,使k_stop清零 port_0b8255=port_0b8255&0xef;/启动按钮按下,则停止信号灯熄灭 if(k_water) /当水设定值键按一下,则相应两个数码管闪烁以表示需要设定,当水设定值键再按一下,则停止设定 select=0x80; /水设定值的数码管显示位选端addr_pointer=&set_water; /给指针赋值,指向data区地址60h处,即水设定值存储地址 inc_or_dec(select,addr_pointer); if(k_lye) /当碱液设定值键按一下,则相应两个数码管闪烁以表示需要设定,当碱液设定值键再按一下,则停止设定 select=0x20;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论