基于单片机的流量控制系统设计讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
过程控制系统课程设计
设计题目:基于单片机的流量控制系统设计
学生姓名:业:测控技术与仪器专班级学号:指导教师2010.6.28-2008.7.11 设计时间:
《过程控制系统》课程设计任务书
专业测控技术与仪器班级姓名
设计题目:基于单片机的流量控制系统设计
一、设计实验条件
过程控制系统实验室实验系统
二、设计任务
1、设计电磁流量计为流量传感器,单片机为核心流量控制系统。
系统主要由水泵、水泵电机、流量传感器、电动阀门、阀门电机、单片机控制系统等组成。
2、写出流量控制过程,绘制控制系统组成框图
3、利用单片机对流量进行控制
(1)系统硬件电路设计
单片机采用89S52;设计键盘及显示电路,电机控制电路(可控硅,光电耦合器)。
(2)编制流量控制程序
三、设计说明书的内容
1、设计题目与设计任务(设计任务书)
2、前言(绪论)(设计的目的、意义等)
3、主体设计部分
4、参考文献
5、结束语
四、设计时间与设计时间安排
1、设计时间: 2 周
2、设计时间安排:
熟悉实验设备、实验、收集资料:4天
设计计算、绘制技术图纸:4天
编写课程设计说明书:5天
答辩:1天
一,流量控制系统设计意义
工业生产中过程控制是流量测量与仪表应用的一大领域,流量与温度、压力和物位一起统称为过程控制中的四大参数,人们通过这些参数对生产过程进行监视与控制。
对流体流量进行正确测量和调节是保证生产过程安全经济运行、提高产品质量、降低物质消耗、提高经济效益、实现科学管理的基1】【础。
流量的检测和控制在化工、能源电力、冶金、石油等领域应用广泛。
在天然气工业蓬勃发展的现在,天然气的计量引起了人们的特别关注,因为在天然气的采集、处理、储存、运输和分配过程中,需要数以百万计的流量计,其中有些流量计涉及到的结算金额数字巨大,对测量和控制准确度和可靠性要求特别高。
此外,在环境保护领域,流量测量仪表也扮演着重要角色。
人们为了控制大气污染,必须对污染大气的烟气以及其他温室气体排放量进行监测;废液和污水的排放,使地表水源和地下水源受到污染,人们必须对废液和污水进行处理,对排放量进行控制。
于是数以百万计的烟气排放点和污水排放口都成了流量测量对象。
同时在科学试验领域,需要大量的流量控制系统进行仿真与试验。
流量计在现代农业、水利建设、生物工程、管道输送、航天航空、军事领域等也都有广泛的应用。
二,系统方案
1、方案整体思路
液体流量控制通常采用电动调节阀实现,近年来,电动调节阀的结构和控制方式发生了很大的变化,
随着计算机进入控制领域,以及新型的电力电子功率元器件的不断出现,使采用全控制的开关功率元件进行脉宽调制(pulse width modulation ,简称PWM)控制方式得到了广泛的应用。
这种控制方式很容易在单片机中实现,从而为电动调节阀的控制数字化提供了基础。
将偏差的比例(proportion)、积分(integral)、微分(differential)通过线性组合构成数字控制量,构成数字PID控制器,它具有非常强的灵活性,可以根据试验和经验在线调整参数,因此可以得到更好的控制性能。
本系统采用C51系列的89S52单片机为核心,通过设置89S52单片机的定时器产生脉宽可调的【2】PWM波,对阀门电机的输入电压进行调制,实现阀门开度的变化,进而实现了对液体流量的控制。
单片机通过电磁流量计采集实际流量信号,根据该信号对其内部采用数字PID算法对PWM变量的值进行修改,从而达到对流量的闭环精确控制。
2、实现流程
流量控制系统是一个过程控制系统,在设计的过程中,必须明确它的组成部分。
过程控制系统的组成部分有:控制器、执行器、被控对象和测量变送单元,其框图如图1所示。
流量过程控制组成框图1 图
电磁流量计:对输出流量进行检测,并与设定值比较,差值作为控制器的输入。
PID控制器:对差值进行P 、I、D运算,输出对应得模拟量控制电机正反转和转速。
直流电机:根据控制器输出正反转,控制阀门开度增大或减小。
阀门:直接控制流量的执行机构。
所以,在这个系统的设计中,主要设计以上几个部分。
除此之外,根据题目要求,还要选取合适的控制算法来达到满足系统参数的要求。
具体就是确定控制器的算法和如何控制阀门开度,因为这两部分是实现本系统控制目的的关键。
它们选取的好坏将直接影响着整个系统实现效果的优劣。
3、控制器算法与PWM波形输出
流量是一个普通而又重要的物理量,在许多领域里人们需对它进行测量和控制。
本系对流量控制采用PID算法,它具有结构简单、易于理解和实现,且一些高级控制都是以PID为基础改进的。
在工业过程控制中90%以上的控制系统回路具有PID结构,
图2 PID控制原理框图
PID调节器的离散化表达式为
K d[e(k)?e(K?Te(k)?k?1)](?u(k)Kek)ip T比例调节的作用是使调节过程趋于稳定,但会产生稳态误差;
积分作用可消除被调量的稳态误差,但可能会使系统振荡甚至使系统不稳定;
微分作用能有效的减小动态偏差。
PWM波形输出:用89S52单片机的定时器0和定时器1交替工作,产生连续的与偏差大小有关的占空比可调的PWM波形。
首先,定时器0定时时间到,产生中断,置位PWM输出口并开启定时器1,定时器1定时期间PWM输出高电平,且定时器1的定时时间可调,与偏差的PID运算结果有关,所以能输出占空比变化的PWM波,控制电机转动,进而控制阀门开度和流量。
三、系统硬件设计
1、总体设计框图及说明
本系统是一个简单的单回路控制系统。
为了实现流量的自动测量和控制,采用了89S52单片机作为系统的控制中心,由数据采集模块检测到的流量信号传入单片机,并根据接收到的数据进行处理和控制运算,同时将数据保存,以便与下一次采样值进行比较,根据系统程序控制,进行PID运算以及PWM输出控制电机转速,最终由CPU控制电机正反转,达到调节流量的目的。
系统还具有键盘设定模块,便于用户与系统之间的对话。
系统的硬件结构较简单,由若干个功能模块组成。
具体结构图图3及说明如下,
功能模块结构图图3
键盘设定:设定控制系统要求的流量大小。
数据采集:用滑动变阻器分压模拟流量大小。
直流电机:接收单片机的控制信号进行正反转和转速调节,带动阀门转动。
2、部分外部电路设计
2.1 数码管显示电路
采用四联排共阴极数码管进行显示,具有四位数码管,这四个数码管的段选a、b、c、d、e、f、g分别接在一起,每一个都拥有一个共阴的位选端。
P3口控制数码管的点亮情况。
因为单片机的IO口输出功率有限,需要使用74LS374芯片进行锁存。
此外还用一个电阻R-PACK8来保护LED。
2.2、直流电机控制电路
直流电机以其良好的线性特性、优异的控制性能等特点成为大多数变速运动控制和闭环位置伺服控制系统的最佳选择。
特别随着计算机在控制领域,高开关频率、全控型第二代电力半导体器件(GTR、直流调速技术的应用,直流电机得到广泛应用。
(PWM)的发展,以及脉宽调制)等IGBT、MOSFET、GTO.
为适应小型直流电机的使用需求,各半导体厂商推出了直流电机控制专用集成电路,构成基于微处理器控制的直流电机伺服系统。
但是,专用集成电路构成的直流电机驱动器的输出功率有限,不适【3】合大功率直流电机驱动需求。
因此采用三极管构建H桥,实现大功率直流电机驱动控制。
该驱动电路能够满足各种类型直流电机需求,并具有快速、精确、高效、低功耗等特点,可直接与微处理器接口,可应用PWM技术实现直流电机调速控制。
单片机的P10引脚输出高低电平控制电机的正反转,P11输出PWM波形控制电机转速。
具体为:①当P10为高电平时,三极管Q3、Q2导通,所以Q4导通,而Q2导通钳制电位为0.9V,所以不论P11是高还是低,Q1、Q7都不导通,即电机电流从左向右流,电机正转。
②当P10为低电平,Q3 Q2不导通,所以Q4不导通。
当P11为高电平时电机反转,当P11为低电平是,电机停转。
四系统软件设计
1、程序结构说明
任何一个系统的软件设计都离不开硬件电路的连接,所以本课题硬件设计的高度模块化决定了软件设计的模块化。
主要包括:主控程序模块、键盘扫描及处理子程序、采样数据处理子程序、PID 算法子程序、电机驱动与控制子程序和显示等子程序几个部分。
结构图如下:
程序结构图图4
主控程序模块在整个结构中充当管理者,管理所有子程序的调用,就相当于个人计算机的操作系统。
它主要负责初始化各个I/O口,等待键盘事件的发生,并作出相应的处理。
并在适当的时候调用数据采样程序,并将采样到的数据与键盘设定值比较。
再通过PID计算后用以控制电机转动,从而控制阀门开度,来达到流量的准确控制。
2、程序流程图及部分程序
2.1 主程序说明
2.1.1 主程序流程图
开始
系统初始化
N
Y
SW=1? 转换键盘设定AD键盘设定键盘设定
N
Y
?DR=1电机正转电机反转
主程序流程图5 图
2.1.2主程序具体程序:
/********************主函数**************************/
main() //主程序
{ TMOD=0x21 ; //0b0010 0001 timer0模式1(16位),timer1自动重装载TH0=0xfc ; //1ms延时常数12M
TL0=0x18 ; //低电平时间调节
TH1=0x7f; //定时器1赋初值
TL1=0 ;
EA=1;
ET0=1;
ET1=1; //开中断
while(1)
{if(sw==1) //循环判断开关状态,并执行相应的程序
{AD_val(); //调用TCL549采集处理
display(uuu);
}
else
{KB_Scan1();
display(sc);
}
PID();} //每个循环的最后执行一次PID运算,实时控制电机
}
从主程序中可以看出,在进行一系列程序调用之前对系统进行初始化,然后判断开关状态程序有所反应。
然后进行一系列子程序,进行A/D转换和PID计算,将其结果用来控制直流电机。
2.2 键盘程序
4】【2.2.1 键盘扫描及键值识别的原理由于机械触点有弹性,在按下或弹起按键时会出现抖动,从最初按下到接触稳定要经过数毫秒的弹跳时间,如图所示。
为了保证探险键识别的准确性,必须消除抖动。
消抖处理有硬件和软件两种方法:硬件消抖是利用加支抖动电路滤避免产生抖动信号;软件消抖是利用数字滤波技术来消除抖动。
我们采用软件的方法,利用主程序循环扫描,主程序每循环一次扫描到的键值相同时,则说明是某键按下。
语句,把按键的编码和键值对应起来。
switch对于键值识别,我们用一条.
2.2.2 键盘具体程序
void KB_Scan1(void)
{ uchar tmp,line,i,flag,press; //定义局部变量
if(lie1==0|lie2==0|lie3==0)return; //判断是否有键按下,如有,返回。
消除重键问题
line=0xFE;
for(i=1;i<=4;i++)
{ P2=line; //依次给P2口低四位送低电平,读高四位判断是否有键按下。
tmp=P2; //读取键盘口数据寄存器
tmp&=0x70;
if(tmp!=0x70)
{ tmp=P2;flag=1;break;}
else line=(line<<1)|0x01;
}
if(i==5) {tmp=0xFF;flag=0; }
switch(tmp) //用switch语句把编码转换为对应的键值。
{ case 0xEE:press=1; break;
case 0xDE:press=2; break;
case 0xBE:press=3; break;
case 0xED:press=4; break;
case 0xDD:press=5; break;
case 0xBD:press=6; break;
case 0xEB:press=7; break;
case 0xDB:press=8; break;
case 0xBB:press=9; break;
case 0xD7:press=0; break;
default: break;
}
if(flag==1) //如果有键按下,把每次的值存放到buf[]中,方便以后调用。
{buf[2]=buf[1];
buf[1]=buf[0];
buf[0]= press;
}
}
2.3 数字PID及电机控制程序
所以一般使用增由于单片机控制是一种采样控制,它只能根据采样时刻的偏差值计算控制量【5】,
量型控制,它控制稳定,误动作影响小。
其算式如下:
?u?u?u i?ii1
TT d(e?2ee??e?K[(e?e)?)]2iiip?1ii?i?1TT i2e]?D?[?e?Ie?K iipi
2e??K?Ke?Ke?iiidip
这个计算的过程可用一个简单的程序来实现。
/***************PID服务程序*************/
void PID( )
{ double e0,e1,e2;
uchar du,out1;
uchar kp=16, kd=0,ki=0; // ts=1;
e0=e1;e1=e2;e2=(sc-uuu);///10; //设定值-采集量
if(e2>=0)
{ direction=1; //设定值-采集量>0, 电机正转,开大阀门。
if(e2>=20) //测得偏差值与设定偏差值进行比较,若不在设定范围内则满功率正转。
{TR0=0;PWM=1;}
else
{ du=10*e2;//(e2-e1)+ki*e2+kd*(e2-2*e1+e0); // PID算法
out1=du;//+out0;
TR0=1; //若到达设定范围则调用PID程序,进行有效功率转动.
}
}
else if(e2<0)
{ direction=0; //设定值-采集量<0, 电机反转,关小阀门。
if(e2<-20) //测得偏差值与设定偏差值进行比较,若不在设定范围内则满功率反转。
{TR0=0;PWM=1;}
else
{ du=10*e2;//(e2-e1)+ki*e2+kd*(e2-2*e1+e0); // PID算法
out1=-du;//+out0;
TR0=1; //若到达设定范围则调用PID程序,进行有效功率运转.
}
}
out0=out1;
}
五、结束语
此次课程设计是基于《过程控制系统》的综合课设,要求通过对工业过程量流量的测量方法、信号处理技术和控制系统的设计,掌握测控对象参数检测方法、变送器的功能、测控通道技术、执行器和调节阀的功能、过程控制仪表的PID控制参数整定方法。
我拿到题目和要求,明确本次的重点是一个控制“系统”的设计,要实现流量的控制,分析流量
怎么测,怎么控。
就是要完成从信号采集→偏差控制→执行器→对象输出整个的设计。
所以我先分模块进行设计,粗略的构思了一个单回路控制系统:即偏差运算用PID,输出PWM波形控制电机,电机驱动阀门开度变化。
接下来就是具体模块的具体设计实现,信号采集模块我就面临了选择,是选择并行AD转换芯片还是串行AD芯片,再后来就是数码管显示不稳定,亮度不够怎么办,每前进一步都是问题,这时就借鉴别人怎么做的,他们的效果是不是比自己的好,这样不断的比较和思考,解决了很多问题。
最大的体会就是设计过程是解决问题的过程,自己也对设计控制系统积累了一定的经验。
通过设计后面的控制器模块、电机控制模块,我使用了PID的理论、PWM 控制电机转速的知识和电机的驱动电路的知识,通过大量的查阅资料,在以前纯理论的基础上有很大提高。
这次课设使我对过程控制系统有了更深的理解,同时对模块设计有了自己的思考和思路,对以后自己设计开发控制系统有很好的铺垫作用。
参考文献
【1】任彦硕等.自动控制系统[M].北京:北京邮电大学出版社,2006,157
【2】张家生. 电机原理与拖动基础[M]. 北京:北京邮电大学出版社,2006, 136
【3】马斌等.单片机原理及应用---C语言程序设计与实现[M].北京:人民邮电出版社,2009,284--290
【4】王宜怀等.嵌入式系统[M]. 北京:北京航空航天大学出版社,2008, 132
【5】顾德英,张健,马淑华.计算机控制技术[M]. 北京:北京邮电大学出版社,2006,106
附页1:流量控制系统总程序
#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
uchar out0=0x7f ; //赋初值
uchar buf[3]={0,0,0};//全局数组
uchar pr[]={0x57,0x6E,0x5E,0x3E,0x6D,0x5D,0x3D,0x6B,0x5B,0x3B};
uchar discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int AD; //转换结果,十六进制
int uuu,sc=0;
int Int_result, //标度变换后的结果
sbit Dataout=P1^0; //数据线
sbit cs=P1^1; //片选
sbit sclk=P1^2; //io口时钟
sbit dx=P1^3; //断码显示控制锁存
sbit wx=P1^4; //位控控制锁存
sbit sw=P1^7;
sbit PWM=P1^5;
sbit direction=P1^6;
void delay1ms(uchar T) //单位时间1ms延时{
uchar time;
while(T--)
for(time=0;time<120;time++);
}
/***********显示程序*************/
void display(uint num)
{ uchar qian,bai,shi,ge;
qian=num/1000; //千,百,十,个处理bai=num/100_x0010_;
shi=num/10_x0010_;
ge=num_x0010_;
wx=0;
P0=0xf7;
wx=1;
dx=0;
P0=discode[ge]; //显示个位
dx=1;
delay1ms(1);
if(num>0)
{
wx=0;
P0=0xfb;
wx=1;
dx=0;
P0=discode[shi];//|0x80; //显示十位
dx=1;
delay1ms(1);
wx=0;
P0=0xfd;
wx=1;
dx=0;
P0=discode[bai]; //显示百位
dx=1;
delay1ms(1);
}
}
/*************AD转换程序************/ AD_val() //TLC549处理
{ uchar i,temp=0;
cs=1; //初始化,启动
sclk=0;
cs=0;
_nop_();
for(i=0;i<8;i++) //读取采集数据,读取的是上一次采集数据{
sclk=1;
temp=temp<<1;
if(Dataout) temp |=0x01;
sclk=0;
}
cs=1;
AD=temp;
for(i=0;i<5;i++) //延时17us以上,进行复位
_nop_();
Int_result=AD*100/256; //处理整数
uuu=Int_result;
/****************键盘扫描程序*************/
void KB_Scan1()
{ uchar tmp,line,i,j,flag,press;
line=0x7E;
for(i=1;i<=4;i++)
{P3=line;
tmp=P3;
tmp&=0x70;
if(tmp!=0x70)
{ tmp=P3;flag=1;break;}
line=(line<<1)|0x01;
else
}
if(i==5) {tmp=0xFF;flag=0; }
for(j=0;j<10;j++)
{if(tmp==pr[j])
press=j;}
if(flag==1)
{ buf[2]=buf[1];
delay1ms(100);
buf[1]=buf[0];
delay1ms(100);
buf[0]= press;
delay1ms(100);
sc=buf[2]*100+buf[1]*10+buf[0];
}
}
/***************PID服务程序*************/
void PID( )
{ double e0,e1,e2;
uchar du,out1;
uchar kp=10, kd=0,ki=0;// ts=1;
e0=e1;e1=e2;e2=(sc-uuu);; //设定值-采集量
if(e2>=0)
{ direction=1; //设定值-采集量>0,电机正转
if(e2>=20) //测得偏差值与设定偏差值进行比较,若不在设定范围内则满功率运转。
{TR0=0;PWM=1;}
else
{ du=kp*e2;//(e2-e1)+ki*e2+kd*(e2-2*e1+e0); // PID算法
out1=du;//+out0;
TR0=1; //若到达设定范围则调用PID程序
}
}
else if(e2<0)
{ direction=0; //设定值-采集量<0,电机反转
if(e2<-20) //测得偏差值与设定偏差值进行比较,若不在设定范围内则满功率反转。
{TR0=0;PWM=1;}
else
{ du=10*e2;//(e2-e1)+ki*e2+kd*(e2-2*e1+e0); // PID算法
out1=-du;//+out0;
TR0=1; //若到达设定范围则调用PID程序.
}
}
out0=out1;
}
*********************/
输出程序/*********************PWM.
/*********************************************************/
// 定时器0中断服务程序.
/*********************************************************/
void timer0() interrupt 1
{ TR0=0 ;
TH0=0xff ;
TL0=0xdb ;
TH1=0xff-out0 ;//初值等于模数减去计数个数
TR1=1 ;
PWM=1 ; //启动输出
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{ TR1=0 ;
PWM=0 ; //结束输出
TR0=1;
}
/***************主函数**************************/
//主程序main()
{
timer1自动重装载1(16位)TMOD=0x21 ; //0b0010 0001 timer0模式12M //1ms延时常数TH0=0xfc ;
// 频率调节TL0=0x18 ;
//高电平时间调节TH1=0x7f;
TL1=0 ;
EA=1;
ET0=1;
ET1=1;
while(1)
{if(sw==1)
TCL549采集处理{AD_val();//调用display(uuu);
}
else
{KB_Scan1();
display(sc);
}
PID();}
}。