PID温控器系统设计与仿真.doc_第1页
PID温控器系统设计与仿真.doc_第2页
PID温控器系统设计与仿真.doc_第3页
PID温控器系统设计与仿真.doc_第4页
PID温控器系统设计与仿真.doc_第5页
免费预览已结束,剩余21页可下载查看

下载本文档

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

文档简介

课 程 设 计 报 告课程名称专 业: 班 级: 指导老师:姓 名: 同组成员: PID温控器系统设计与仿真一、系统概述PID温控器系统的工作原理图如图1,电炉内的热电阻温度传感器测出的温度信号经运算放大器放大和模/数转换后,由8051单片机读出电阻炉炉温,PID控制程序根据当前炉温和目标温度的偏差,按照一定的控制方法控制开关K的通与断,提供适当的加热功率,以使炉温尽快趋近目标温度。PID温控器还通过串口与PC通信,以实现远程监控。LED和键盘用于人机接口,交流电过零检测部分可使8051只在正弦交流电零点附近控制开关K的通与断,以避免对交流电斩波而造成干扰。图1二、系统设计及仿真1.PID温控器存储系统设计PID温控器的存储系统设计中使用了一片3-8译码器74LS138来产生个芯片所需的片选信号。6264的信号来自于74LS138的输出,要使为低电平选中6264,则C、B、A的输入应为011,由此可计算出6264的地址范围为0x60000x7FFF,2764的地址范围为0x00000x1FFF。在Proteus仿真软件中建立如图2所示的温控器存储系统的Memory.dsn模型文件。图22.人机接口和PID温控器的输入/输出设计及仿真2.1 PID温控器LED显示及仿真图3是PID温控器LED显示部分的Proteus仿真原理图。8255A是较复杂的并行接口芯片,在PID控制器主要用作I/O口拓展,用于LED的显示。在编程时应注意,由于8255A的复位时间较长,在应用程序访问8255A之前,应有足够的延时保证8255A已正确复位,仿真时可不延时,但实际电路中必须加足够的延时。另外,在Proteus中建立仿真模型时,要保证8255A的器件编号小于8051的编号,否则仿真不能成功。打开建立的Memory.dsn模型文件,在其中新建一个名为LED的设计页,将图3的内容画在该设计页中,然后将文件保存为Led.dsn。图3编写程序,在图3上的6位数码管上循环显示数字05。程序代码如下:/*display.h*/*8255A端口地址*/#define BASE 0x0000#define PORT_A (BASE)#define PORT_B (BASE+1)#define PORT_C (BASE+2)#define PORT_CONTROL (BASE+3)#define LEDS 6 /共有6位LED#define CA 0 /共阳#define CC 1 /共阴/函数声明void turn_On(char led,char ChNumber,char mode);void LedsOff();void OneByOne(char datas);extern void Init8255();unsigned char code Select;unsigned char code LED_CODES;/*display.c*/#include absacc.h#include Reg51.h#include display.h/led灯选通信号/高电平位选unsigned char code Select=0x01,0x02,0x04,0x08,0x10,0x20;unsigned char code LED_CODES=0xc0,0xF9,0xA4,0xB0,0x99,/0-40x92,0x82,0xF8,0x80,0x90,/5-90x88,0x83,0xC6,0xA1,0x86,/A,b,C,d,E0x8E,0xFF,0x0C,0x89,0x7F,0xBF/F,空格,P,H,.,-;/初始化8255A/各led位全灭void Init8255()unsigned char i,j; for(j=0;j10;j+) for(i=0;i1; t1=t1; t1=t1|0x0f;/低4位置1 P1=t1; t1=P1;t2=0x08;t1=t1; for(i=4;i!=0;i-) t3=t2&t1; if(t3!=0) *row=i-1;break; else t2=t21; exit: return Result;/*main.c 源程序,现实所识别键的行、列号*/#include display.h#include absacc.h#include Reg51.hextern char keyCheck(char*row,char *col);void main()char row,col,r;char strIndexs6=20,20,20,20,20,20;unsigned char i,k; Init8255(); while(1) r=keyCheck(&row,&col);if (r=0) strIndexs5=20;strIndexs4=20; strIndexs1=20;strIndexs0=20; else strIndexs5=0;strIndexs1=0; strIndexs4=row;strIndexs0=col; for(k=6;k!=0;k-) LedsOff(); for(i=50;i!=0;i-); turn_On(k-1,strIndexsk-1,CC); for(i=50;i!=0;i-); 程序运行结果如图7,当按下图5中第3行第1列上按键时,将在LED上显示键的行列号。图73.PID温控器的炉温采样接口及仿真图8是PID温控器的仿真原理图。图中74LS161用于提供ADC0808所需的时钟信号,其Q1、Q2、Q3、Q4输出信号的频率分别是其CLK引脚输入时钟信号频率的1/2、1/4、1/8、1/16,CLK输入信号来自于51单片机的ALE引脚输出,多路开关SW1为ADC0808选取不同的时钟频率。图中P1为CPU访问片外数据存储空间地址0x2XXX时74LS138的译码输出,当CPU写0x2XXX时,可使ADC0808锁存数据总线上D0、D1、D2的输入通道号;CPU读0x2XXX时,可将A/D转换结果读入到CPU中。P2为CPU访问片外数据存储空间地址0x4XXX时74LS138的译码输出,当CPU读地址0x4XXX时,可将EOC信号从数据总线D7位读入到CPU中;、信号来自于51单片机的、引脚P3.6、P3.7。打开前面完成的仿真模型文件KeyBoard.dsn,并另存为Adc.dsn.新建一个名为ADC0808的设计页,将图8的内容画在该设计页中;在进入External Memory设计页,为其中的AT89C51的P3口加上所需的端子并正确命名;在P3.3上加一个端子将其命名为EX1,P3.5加一个端子并将其命名为START,然后保存仿真文件。图8用端口查询方式编写程序从图8的ADC0808通道1读取AD转换值并显示在LED上。程序代码如下:/*ADC.H*/#define ADC_0808 1#define ADC0808_DATA_PORT 0x2000#define ADC0808_QUERY_PORT 0x4000#define ADC0808_START_PORT 0x2000/function :gets data from ADC chip,/parameters:/unsigned char ADC_Chip-the adc chip such as ADC_0808(9),/AD574 and so on.the chips resolution shouldnt be higher/than 12 bits/unsigned char channel:the channel that data from/return value:if succeed,the data between 0 to 4095(12bits) read from selected channel of Adc chip, /else return -1. unsigned char getData1(unsigned char ADC_Chip,unsigned char channel); unsigned char getData2(unsigned char ADC_Chip,unsigned char channel);/*ADC0808.c*/#include Adc.h#include absacc.h#include Reg51.h /端口(P3.3)查询方式unsigned char getData2(unsigned char ADC_Chip,unsigned char channel)unsigned char flag=0; unsigned char value=-1; unsigned xdata ale; switch (ADC_Chip) case ADC_0808: P3=P3|0x08;/读入端口前相应位先置1 XBYTEADC0808_START_PORT=channel;/输入通道锁存 /P3.4低-高-低脉冲启动AD转换 P3=P3&0xdf;/P3.4置低 P3=P3|0x20;/P3.4置高 P3=P3&0xdf;/P3.4置低 /查询转换是否完成(P3.3是否为0) flag=P3; while(1) ale=1;/注意:Proteus中8051模型有问题,在不访问片外RAM时ALE无输出, /故在此加入了一条访问片外RAM的语句ale=1 , /以产生ADC0808所需的时钟信号,实际的应用程序是不需要这条语句的 flag=flag & 0x08; if(flag=0) break; flag=P3; /step 3:read data and return it value=XBYTEADC0808_DATA_PORT; return value; break; /*main.c*/#include Adc.h#include display.h#include Reg51.hvoid dispStr(char strIndexs,unsigned char value,char channel)char i,k; for(i=0;i3;i+) strIndexsi=value%10; value=value/10; strIndexs4=channel; LedsOff(); for(i=50;i!=0;i-); for(k=6;k!=0;k-) LedsOff(); for(i=50;i!=0;i-); turn_On(k-1,strIndexsk-1,CC); for(i=50;i!=0;i-); /端口查询读取通道1的值并显示void main()unsigned char value;unsigned int k; char strIndexs6=20,20,20,20,1,12;/待显示字符下标 Init8255(); while(1) value= getData2(ADC_0808,1); for(k=100;k!=0;k-) dispStr(strIndexs,value,1); LedsOff(); 运行程序结果如图9,数码管左边两位表示通道号,右边三位为读入的数据。图94.PID温控器的温度测量电路设计及仿真PID温控器的测温放大电路原理图如图10。 图10打开以上所建立的Adc.dsn仿真图,在其中LED_KeyBoard设计页上建立如图(a)所示的放大子电路Amp,用以封装测温放大电路(b)。Amp子电路和模仿热电阻阻值变化的R放置道0。进入子电路设计页,将图(b)绘制在子电路设计页,最后将仿真图保存为Measure.dsn。图(b)中的R用于调整放大电路的倍数,使电路在测温上限200时输出Uto刚好为5V;R用于调节电桥的初始平衡,即在测温下限0时使电桥平衡,Uto为零。实际电路调整时,Uto的上下限与5V、0V有微小偏差。在Measure.dsn温度测量仿真模型上编写程序,将ADC0808输入通道0上读入的数据转换为温度后显示在LED上。程序代码如下:/*main.c源程序*/#include Adc.h#include display.h#include Reg51.h/读取通道0输入并换算成温度(保留一位小数)显示并显示/量程:0-200度void main()unsigned char value; /通道0读入的数据 unsigned long t; /标度换算出的温度值 unsigned char i,m,n; Init8255(); while(1) value= getData1(ADC_0808,0); /标度变换时,为避免浮点运算,将算出的温度放大10倍,并对第二位小数四舍 /五入,结果保留一位小数,如读入的value为103,则200*103*100)/255=8078 /t=(8078+5)/10=808(注意:C整除运算只取商的整数部分) /则算出的温度为80.8度 t=(200*(unsigned long)value*100)/255+5)/10; LedsOff(); for(i=200;i!=0;i-) for(m=100;m!=0;m-);/延时 for(i=0;i+) m=t%10; if(i=1) turn_On_WithDot(i,m,CC); else turn_On(i,m,CC); for(n=50;n!=0;n-); t=t/10; if(t=0) break; 程序仿真结果如图11。图111、 PID温控器上/下位机串口通信及仿真PID温控器串口通信的原理如图12所示。 图12虚线边框内是PID温控器的串行通信口设计部分;黑色边框内部分用于模拟PC,便于调试通信程序,在PID温控器的实际电炉中是不需要的。打开前面建立的Adc.dsn仿真原理图,进入External Memory设计页,为AT89C51的TXD、RXD引脚各连上一个接线端子并取名为T和R。将图12的内容画在External Memory设计页中,将AT89C51的时钟频率设为12MHz,两个虚拟终端的波特率设为2400。然后将仿真原理图另存为Comm.dsn。运行如下程序。/*-INTRINS.HIntrinsic functions for C51.Copyright (c) 1988-2010 Keil Elektronik GmbH and ARM Germany GmbHAll rights reserved.-*/#ifndef _INTRINS_H_#define _INTRINS_H_extern void _nop_ (void);extern bit _testbit_ (bit);extern unsigned char _cror_ (unsigned char, unsigned char);extern unsigned int _iror_ (unsigned int, unsigned char);extern unsigned long _lror_ (unsigned long, unsigned char);extern unsigned char _crol_ (unsigned char, unsigned char);extern unsigned int _irol_ (unsigned int, unsigned char);extern unsigned long _lrol_ (unsigned long, unsigned char);extern unsigned char _chkfloat_(float);#if !defined (_CX2_)extern void _push_ (unsigned char _sfr);extern void _pop_ (unsigned char _sfr);#endif#endif/*KeyCheck.c*/#include display.h#include Reg51.h#include intrins.hvoid delay()char i; for(i=255;i!=0;i-);/用扫描法检查按键的行列号(只检查单键)/按仿真图设计,无键按下时行信号为低电平/有键按下时,行信号为高电平/row返回行号,col返回列号/若有键按下,函数返回1,否则返回0sbit P1_0 =0x90;/第0行信号sbit P1_1=0x91; /第1行信号sbit Clear=0x92; /74LS164清零信号char keyCheck(char *row,char *col)char Result=0;char i,mask=0x7f; char column=0; P1_0=1;P1_1=1; /读之前先置1 Clear=0;Clear=0; /74LS清全零 Clear=1; if(P1_0&P1_1) /无键按下,两行信号均为高电平 goto exit; for(i=11;i!=0;i-)/去抖延时约20ms delay(); if(P1_0&P1_1) /无键按下,两行信号均为高电平 goto exit; /记录行号 if(P1_0=0) *row=0; else *row=1; Result=1; /求列号 Clear=1;Clear=1;/允许74LS164串入并出 while(column7) Result=0; exit: return Result; /*main.c*/#include display.h#include absacc.h#include Reg51.hextern char keyCheck(char*row,char *col);void main()char row,col,r; char strIndexs6=20,20,20,20,20,20;/待显示字符下标组 unsigned char i,k; SCON=0; /* 将串行口设置成工作方式0 */ ES=0; /* 禁止串口中断 */ EA=0; Init8255(); strIndexs5=20;strIndexs4=20; strIndexs1=20;strIndexs0=20; while(1) r=keyCheck(&row,&col); if (r!=0) / /保存按键行列号 strIndexs5=0;strIndexs1=0; strIndexs4=row;strIndexs0=col; for(k=6;k!=0;k-) LedsOff(); for(i=100;i!=0;i-); turn_On(k-1,strIndexsk-1,CC); for(i=100;i!=0;i-); 打开两个虚拟终端,右击“发往单片机”虚拟终端,在弹出的快捷菜单选择Echo Typed Characters选项,在该虚拟终端中输入“hello world”字符串,单片机将接收到的字符串原样返回,并显示在“从单片机接收”虚拟终端上。仿真结果如图13。 图135、PID温控器直流电源与加热功率控制子系统的设计及仿真5.1直流电源和过零检测设计所有单片机系统都需要直流电源供电,本系统需要+12V、-12V、+5V这三种规格的直流电,将220V交流电通过降压、整流、滤波、稳压后,可得到各种规格的直流电。当运算放大器的输出与输入之间无反馈回路时,由于运算放大器的放大倍数很大,即使两输入端只有微小的电位差,其输出都会饱和,其值接近运算放大器的工作电源电平。直流电源和过零检测设计的仿真原理图如图14。 图14利用Proteus分析模拟及数字信号的Graph仿真,可得到LM358工作时输出的脉冲波形。LM358工作时的输入/输出信号的波形分析如下:在零点附近,同相端电压高于反相端电压,LM358输出正饱和,为+4V左右;在离交流电过零点稍远的地方,反相端电压高于同相端电压,LM358输出负饱和,为0V左右,按TTL电平规范,则LM358输出的是100Hz的矩形波;LM358的输出经74LS04反相器接至8051的外部中断0引脚P3.2。打开前面建立的Comm.dsn模型文件,新建标题为Pulse的设计页,将图14的内容画在该页上,然后在External Memory页面中8051的EX0引脚上连接一个名为EX0的输入端子,最后将文件另存为Power_Control_Pulse.dsn仿真模型文件。在Power_Control_Pulse.dsn仿真模型上编写程序,测量LM358输出的过零脉冲频率,并在LED_KeyBoardy页面中的LED上显示所测得的过零脉冲频率。程序代码如下:/*main.c*/#include reg51.h#include Display.hunsigned char COUNT=0;/每个测量周期(1秒)过零脉冲信号计数值unsigned char PRECOUNT=0;/ 上个测量周期的COUNT值,用于显示unsigned char OVER_FLAG=0;/一个测量周期结束标志unsigned int T1_OC=5000;void main()/定时器1,方式2,自动重装 unsigned char i,j,value; Init8255(); P3=P3|0x04; SCON=0x52; TMOD=0x20;/定时器1自动重装 ET1=1;EX0=1; IT0=1;/外部中断零0为边沿触发 TH1=56;TL1=56;/当8051晶振频率Fosc=12Mhz时,200x12/12e6=0.2ms秒溢出一次,溢出5000次为1秒 TR1=1; EA=1; while(1) if(!OVER_FLAG) continue; /从第二秒钟才开始不显示 for(value=PRECOUNT,i=0;i+) turn_On(i,value%10,CC);for(j=50;j!=0;j-); value=value/10;if(!value) break; void int_EX0() interrupt 0 COUNT+;/测量周期定时器void int_T1() interrupt 3 T1_OC-; if(T1_OC=0) EA=0; OVER_FLAG=1;PRECOUNT=COUNT;COUNT=0;T1_OC=5000;EA=1;5.2开关K的控制和仿真由于Proteus没有SSR仿真模型,可用继电器来代替,为便于观察,用一个灯泡来代替发热丝。打开前面建立的Power_Control_Pulse.dsn仿真文件,将Pulse页面名称改为Switch,在该页面增加图15部分,然后将仿真文件另存为Power_Control_Switch.dsn。图中的光耦用于光电隔离,三极管用于驱动继电器,灯泡的亮与灭由SW信号控制。图15在新建的Power_Control_Switch.dsn仿真模型上编写程序使灯泡在奇数秒亮,偶数秒灭。程序代码如下:/*main.c*/#include reg51.h/奇数秒接通,偶数秒断开,50HZ交流电源,整流后100个脉冲为1秒unsigned char COUNT=0;/每个周期(1秒)过零脉冲信号计数值unsigned char FLAG=0;void main() EX0=1; IT0=1; EA=1; while(1) if(!FLAG) P3=P3|0x10; else P3=P3&0xef; void int_EX0() interrupt 0 COUNT+; if(COUNT=100) FLAG=!FLAG; COUNT=0; 6.炉温闭环PID控制系统仿真PID

温馨提示

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

评论

0/150

提交评论