液滴速度监控装置的设计报告.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

液体点滴速度监控装置设计
长沙大学
07级电子专业徐姿龙泽亮
摘要:本系统为一个液滴的速度检测与控制装置。

以单片为核心,由水滴速度测试系
统、水速控制系统、显示装置、单片机系统、键盘系统和报警等系统组成。

应用水的压强随着高度差的变化而变化的原理,利用控制步进电动机的升降来控制点滴速度。

点滴速度可用键盘来设定,键盘系统为独立式按键系统,红外对管是为检测液滴的速度提供脉冲。

从改变设定值起到点滴速度基本稳定整个过程的调整时间小于3分钟。

同时在水到达警戒线以下时能发出报警信号。

以上为系统的一个结点,我们还建立了一个由主站控制16 个从站的有线监控系统。

每个从站都可以和主站通信。

主站可以工作在定点和巡回检测两种方式下,可以显示从站传输来的从站号和点滴速度,16个从站中,只有一个从站是按基本要求制作的一套点滴速度监控装置,其它从站为模拟从站(仅制作了一个模拟从站)。

关键字:点滴速度,红外对管,步进电动机,51单片机
Abstract: A droplet of the system for speed detection and control devices. AT89C51 to a
single core test system from the speed drops, water speed control systems, display
devices, microcontroller systems, keyboard systems, and alarm system.Application
of water pressure as the height difference and change the principle, the use of
stepper motor control to control the drip rate of take-off and landing. Drip rate of
the keyboard can be used to set the keyboard for stand-alone system, key systems,
infrared detection of the tube is to provide the pulse rate of droplets. Change
settings from drip to play the basic stability of the speed of adjustment of the
process time of less than 3 minutes. At the same time to reach the warning level in
the water can be issued when the following warning signals.
This system of a node, we also established a master control station 16 of the cable
from the monitoring system. Each slave and master can be communication. Master
station can be fixed and roving in the detection of two ways, we can show that
transmission from station to station and from the drip rate, can be set to the number
of inquiries from the station from the station number, the speed bit by bit from the
station.
Keyword: little speed, infrared to control, stepper motor, 51 single-chip
目录
1 总体方案设计与论证 (3)
1.1 方案论证与比较 (3)
1.1.1 速度检测部分 (3)
1.1.2 速度控制部分 (3)
1.1.3 键盘部分 (3)
1.1.4 储存检测部分 (3)
1.1.5 主从机通信部分 (4)
1.2 系统最终确定方案 (4)
2 系统的硬件设计与实现 (4)
2.1系统硬件的基本组成部分 (4)
2.2主要单元电路设计 (4)
2.2.1.点滴速度测量电路设计 (5)
2.2. 2 键盘控制及显示电路 (6)
2.2.3越限报警电路 (6)
2.2. 4电机控制电路 (6)
2.2. 5主从机电路 (8)
3系统的软件设计 (8)
4系统测试 (11)
5总结 (12)
6 参考文献 (12)
附录程序清单 (12)
1.总体方案设计与论证
1.1 方案论证与比较
由于题目所要求的系统比较复杂,涉及速度检测、速度控制、电机控
制、数码显示、自动报警、主从机通信等各个方面。

所以我们考虑利用89C52
单片机作为核心控制部分来构成题目所要求的系统。

1.1.1速度检测部分:为了检测液滴下落的速度并且将其转换为电信号,需要利用合适
的检测工具来完成这项工作。

可以考虑的方式有:
方案一: 采用电感式传感器测量点滴速度。

在输液器的漏斗外围绕线圈作为敏感元件。

当液滴滴下是电感量发生变化,通过LC振荡电路后输出变化的频率值,经过F/V变
换电路及电压比较后输出TTL电平信号来检测点滴速度。

此方案测量精度比较
高,但是外围电路比较复杂。

方案二: 采用红外对管发射接收。

采用断续式的工作方式,在点滴落下时阻挡了接收管接收红外线,产生高电平的脉冲信号。

为了提高抗干扰能力,可以采用两对红外传感器
一发一收,而不是只用一只传感器以反射式状态工作。

红外传感器有以下优点:尺
寸小,质量轻,安装在滴斗上较简单;对辅助电路要求少,在近距可以用直流发射,电路简单,性能稳定。

此方案简单,较容易实现。

1.1.2速度控制部分:由题目可知,控制液滴下落速度主要有两种方法:
方案一:通过步进电机和滑轮系统控制储液瓶的高度,来达到控制液滴流速的目的;
方案二: 通过控制滴速夹的松紧程度来控制液滴流速。

第一项方案实现较为简便,通过步进电机可方便地实现对储液瓶高度的调节,从而达到控制液滴流速的目的。

第二
项方案控制滴速夹移动的距离很小,但是滴速夹的松紧调节过程中,移动距离,
移动阻力等参数难于计算,用机电系统实现起来较为困难。

经过综合比较,我们
决定选择第一项的方案。

1.1.3.键盘部分:根据题目条件,滴速的大小要由人工设定的。

滴速的设定值与调整值
都可以在键盘上显示。

对于其显示有以下的两种方案:
方案一:采用液晶显示屏和通用矩阵键盘。

液晶显示屏(LCD)具有功耗小、轻薄短小无辐射危险,平面直角显示以及影像稳定不闪烁,可视面积大,画面效果好,抗干扰
能力强等特点。

但由于只需六位显示,信息量比较少,且由于液晶是以点阵的模
式显示各种符号,编程工作量大,控制器资源占用较多,其成本也偏高。

方案二:采用六位LED七段数码管显示点滴数目。

按键为四个独立按键。

数码管具有:低能耗、低损耗、低压、寿命长、耐老化,对外界环境要求较低。

同时数码管采用BCD
编码显示数字,程序编译容易,资源占用较少。

1.1.4. 储液检测电路:题目要求是在储液瓶中的液位低于2~3cm时发出报警信号。


此是关键如何检测到液位的高度,报警较易实现。

检测液位有多
种方法。

方案一:同点滴速度测量模块,仍然采用红外对管发射接收。

根据该接收管收到的光强的大小来判断液位是否达到警戒水位。

此方案简单,容易实现。

方案三:用测定电容的方法来检测。

在瓶壁上用两块薄金属箔包裹构造出一个电容。

根据电容中的介质不同,可以确定是否达到警戒水位。

此数据可以由实验中得出。

1.1.5主从机通信部分:我们考虑了以下几种方案:
方案一:单片机之间并行通信:此种方案实现较为简单。

由于题目要求有16 个从机,所以通过地址译码可以方便地实现从机辨识,巡回检测等功能。

但是线路利用率较低,电路连线较为复杂;
方案二:单片机之间利用RS232 协议进行串口通信:此种方法利用串口通信,解决了线路复杂性和利用率的问题,而且RS232 也是较为成熟的串口通信协议;
方案三:单片机之间利用RS485 协议进行串口通信:此方法也是利用单片机串口进行主从机之间通信,但协议采用RS485。

综合考虑各种因素,并结合题目中“尽量减
少信号传输线的数量”的要求,我们选用了串口通信协议。

但是考虑到本系统的
实用性,由于在实际使用中,主从机之间的距离可能比较远(例如从机分布在16 个
病房),而RS232采用负逻辑,并且传输距离短,一般用于20m 以内的通信。


此,RS232接口不能满足系统的要求。

RS485总线作为一种允许多点、差分数据传
输的通讯电气规范,定义了一个坚固可靠的通信链路,具有长传输距离、宽共模
范围、信号冲突保护和良好的抑制高噪声等特性,并且支持最多128 个单机在总
线上相连。

RS485 是在RS422 的基础上,为了扩展应用范围和通讯能力,增加了
多点、双向通信能力,也就是说,允许多个发送器连接到同一条总线上,同时,
增加了送器的驱动能力和通讯冲突的保护特性,通过差分传输扩展总线的共模范
围。

因此,RS485 协议适合于本系统的应用要求。

所以,我们选用RS485 作为主
从机之间的通信协议。

1.2系统最终方案确定
根据以上方案的论证分析,结合器件与设备等因素,系统各模块方案确定如下:
(1)点滴速度测量采用红外对管发射接收方式。

(2)储液检测电路仍然采纳红外对管发射接收装置。

(3)点滴速度控制是利用电动机正反转来调节储液瓶的高度来实现的。

(4)键盘显示用的是数码来显示的。

2.系统的硬件设计与实现
2.1系统硬件的基本组成部分
本题目中运用了检测技术、自动控制技术和电子技术。

系统可以分为传感器检测部分和控制部分。

传感器检测部分:系统利用红外对管发射接收即光点传感器将检测到的信号转化为控制器可以辨别的电信号。

传感器检测电路包括2个单元电路:点滴速度测量电路、储液检测电路。

智能控制部分:系统中控制器件根据有传感器变换输出的电信号进行逻辑判断,控制点滴的速度及数码管的显示,完成了点滴装置的自动检测、自动调速、数码显示及报警功能等各项任务。

开控制部分主要包括3个电路:单片机控制电路、电动机的驱动电路、数码管的动态显示电路。

2.2主要单元电路设计
2.2.1.点滴速度测量电路设计
液滴下落时,由于对红外线具有吸收和折射衰减作用,会使红外接收管接收到的红外线能量降低。

直接由红外对管接收到的信号非常微弱而且干扰很大,所以必须经过处
理才能送入单片机处理。

在这部分我们从两个方面入手:
a.发射和接收电路:采用红外对管发射接收测量点滴速度,发射和接收电路原理图如图2.2.1.所示
图2.2.1
由电路图可以看到,接收管与发射管正相对,无液滴滴下时,接收管收到信号,输出低电平;有液滴滴下时,下落的水滴对红外光有较强的漫反射、吸收及一定的发散作用,导致接收光强的较大改变,接收管不能收到较强的信号,产生一个较长的脉动。

b.放大滤波和整形电路:由于红外管接收到的信号很微弱而且有很多的噪声和干扰,如不去除会对测试产生很大的影响,因此在接收电路后面加上放大滤波和整形电路。

电路图如2.1.2
图2.2.2
放大和滤波电路是由两个二阶低通滤波电路级联而成的四阶低通巴特沃斯滤波电路构成,
R5=R6=R7=R8=4.7k,C1=C2=C3=C4=100nF 放大倍数为3.35倍。

由于本系统中接收到的信号频率为20 次/分~150 次/分,即产生的信号处在低频段,而噪声干扰一般频率较高,所以通过低通滤波器即可将其去除,滤波电路的截至频率为70HZ。

经过滤波、放大之后,信号已经具有较为良好的特性。

为了实现单片机对液滴流速的检测,必须将所得信号与一门限信号相比较,以判定有无液滴落下,并尽量避免误动作,我们采用比较器对信号进行整形,门限电压为2.67V。

2.2.2 键盘控制及显示电路
键盘控制和显示电路我们采用数码管显示和独立按键。

电路总共有六个七段数码管,前三位显示单片机检测到的速度值,后三位在没有进行调速时显示点滴的滴数,每滴一滴显示
越限报警电路仍采用红外对管进行检测,由于越限报警电路只需要在液面下降到红外发射接收通路高度以下时发出警报,因此传感器部分接收到的信号不需要经过滤波。

经检测没水的时候接收管两边的电压值为2.13V,有水的时候电压值大概为3.4~3.5V,因此只需加一个比较器即可,门限电压在2.5~3V之间。

电路原理图如图2.2.3
图2.2.3
2.2.4 电机控制电路
系统将点滴速度采集信号进行处理后在相应的单片机的I/O控制口输出步进电机的控制信号,为了更方便稳定的控制步进电机,系统使用的是L298N和L297的组合电路控制步进电机。

,L297 的enable,cw/ccw,clock,,half/full分别控制步进电机的输使能、方向控制端、时钟输入端、半步、全步方式选择端。

L298是放大信号,L298 N 的OUT1 –OUT4分别与步进电机的四相输入相连接。

图1 L297引脚图
驱动电路:
要使步进电机控制更精确,在步进电机所接负载较大时,可以采用四相八拍脉冲信号,波形图如下图:
四相八拍脉冲信号波形
2.2.5主从机通信
从机部分电路设计:从机负责接收滴速检测和超限报警部分电路传送来的信号并处理,然后产生相应的控制信号发送至控制部分。

主机部分电路设计:主机部分负责与各个从机通信,定点检测从机状态,检测从机的速度。

3.软件设计
图3.1为主函数流程图,图3.2为测速流程图,图3.3为按键程序流程图,图3.4为调速程序流程图。

液滴流速的检测我们采用滴三滴钟刷新一次数据,同时建立以个数组把前面四次所测的滴三滴所用的时间与这次所测时间加起来,每次测完三滴所用的时间后数组右移,高位丢弃新测的时间放入最低位,从而得到15滴所用的时间t(时间的单位用毫秒),
进而可求得速度:V=15*60*1000/t。

每刷新一次把新测的时间加进来并把最开始测的时间丢掉。

调速过程中步进机的速度是可变的。

当检测速度与速度的设定值相差大于30滴时,步进机以0.1秒一步的速度转动;当检测速度与速度的设定值相差小于30而大于10滴时步进机走一步的时间为:t=(80-|检测速度-设定速度|)*5 (单位:毫秒);当检测速度与速度的设定值小于10滴时步进机走一步的时间为:t=(100-|检测速度-设定速度|)*5 (单位:毫秒)。

步进机每步都为7.5度。

图3.1主程序流程图 图3.2测速程序流程图
图3.3按键程序流程图
图3.4按键程序
4.系统测试
4.1系统测试数据
4.2报警功能测试:
将夹头放松,使瓶中的水快速流出至警戒线附近,稍稍夹紧夹头,可以看到当水位降至警戒水位时,从机蜂鸣器发出报警信号。

此功能正常。

4. 3主机从机功能测试:
将主机和从机连接上,从机将点滴的速度送入主机,并在主机中显示从机的速度和机号,此功能正常。

4.4测试结果分析
从以上测试结果可以看出,本系统已基本完成题目中的各项要求并在此基础上有所发挥,其中点滴速度的测量比较精确,在全量程内其误差小于3(滴/分)。

设置点滴速度功能中,控制精度在全量程范围内优于4(滴/分),但是还是有一定的误差,经分析主要是由以下原因造成的:
1 由于瓶中的水不断减少,造成水滴的下落速度不均匀。

2 在测量水滴的实际滴速时,是通过控制秒表计时来获得时间数据,从数码管的后三位读出点滴的滴数,由于人在控制秒表时有误差,这也是引入测量误差的一个原因。

2 中断处理的进入和中断处理程序都会有一定时间的延时,这也是造成测量误差的一个因素。

3 在动态控制时,由于瓶处于运动状态,其上升、下降运动不可避免的会产生加速度,导致水滴下落时速度不稳定。

4 算法本身不可能是完全精确的,必然存在舍入误差等,这些误差会影响测量结果。

5.结论
本系统完成了在滴斗处检测点滴速度,并制作了一个数码管显示装置,能动态显示点滴速度(滴/分)。

通过改变高度控制点滴速度,点滴速度可用键盘设定并显示,设定范围为20~150(滴/分),误差在要求范围内。

当高度降到警戒值是能发出报警信号。

每个从站都可以和主站通信。

主站可以工作在定点和巡回检测两种方式下,可以显示从站传输来的从站号和点滴速度。

6参考文献
【1】康华光.电子技术基础(模拟部分);高等教育出版社.2006.1月出版.
【2】杨路明.C语言程序设计教程;北京邮电大学出版社.2005年12月出版.
7.附录
程序清单
/*******主机********/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define count 10
#define node_data 0x40
uchar buffer[count];
uchar sudu;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int point;
void delay( uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void display(uchar num1) //显示速度
{
uint ge,shi,bai;
bai=num1/100;
shi=num1%100/10;
ge=num1%10;
P2=5;
P0=tab[bai];
delay(1);
P2=4;
P0=tab[shi];
delay(1);
P2=3;
P0=tab[ge];
delay(1);
}
main()
{
PCON=0X00;//SMOD=1
SCON=0xf0; //模式3,RENt=1,SM1=1 TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
ET1=0;
ES=1;
EA=1;
TR1=1;
while(1)
{
display(sudu);
}
}
void recevie() interrupt 4 using 3 {
if(RB8==1)
{
if(SBUF==node_data)
SM2=0;
while(!RI) ;
RI=0;
return;
}
sudu=SBUF;
while(!RI) ;
RI=0;
SM2=1;
}
/*******从机*********/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define count 10
#define node_data 0x40
uchar point=0;
sbit s3=P1^0;
sbit s4=P1^1;
sbit s5=P1^2;
sbit s6=P1^3;
sbit cw=P1^4;
sbit clock=P1^5;
sbit led=P3^0;
sbit led1=P3^1;
unsigned char flag=0,a=0,num=0,sudu_shed=80;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar sudu,sudu_shed,tiao=0,t=0,n=0,i;
uint age=0,cnt=0,cout=0;
uint tab_sudu[5];
uint time,j=0,temp=0;
uchar tt,hz,hz1,hz2;
//函数说明
void anjian();
void tiaosd();
void display1(uchar num);
void display2(uchar num1);
void send();
void Delay_anjian(unsigned char i)
{
unsigned char j ;
for(;i>0;i--)
for(j=0;j<125;j++);
}
void Delay(uint i)
{
uint j;
for(;i>0;i--)
for(j=0;j<110;j++);
}
void main()
{
TMOD=0x21;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;
ET0=1;
EX0=1;
IT0=1;
PCON=0X00;//SMOD=1
SCON=0xc0; //模式3,RENt=1,SM1=1 TH1=0XFD;
TL1=0XFD;
ET1=1;
ES=1;
TR1=1;
while(1)
{
display2(sudu);
if(a==1)
{anjian();display1(sudu_shed);} else
display1(age);
if(tiao==1)
tiaosd();
if(s3==0)
{
Delay_anjian(2);
if(s3==0)
{
while(!s3)
{display1(sudu_shed);display2(sudu);} a++;
if(a==2)
{a=0;tiao=1;}
}
}
send();
}
}
void send()
{
TB8=1;
SBUF=0X40;// ADD
while(!TI);
TI=0;
TB8=0;
SBUF=sudu;
while(!TI) ;
TI=0;
Delay(1);
}
void display1(uchar num) //
{
uint ge,shi,bai;
bai=num/100;
shi=num%100/10;
ge=num%10;
P2=2;
P0=tab[bai];
Delay(1);
P2=1;
P0=tab[shi];
Delay(1);
P2=0;
P0=tab[ge];
Delay(1);
}
void display2(uchar num1) //显示速度{
uint ge,shi,bai;
bai=num1/100;
shi=num1%100/10;
ge=num1%10;
P2=5;
P0=tab[bai];
Delay(1);
P2=4;
P0=tab[shi];
Delay(1);
P2=3;
P0=tab[ge];
Delay(1);
}
void anjian()
{
/*************按键****************/
if(s4==0)
{
Delay_anjian(2);
if(s4==0)
{
while(!s4)
{display1(sudu_shed);display2(sudu);}
flag++;
if(flag==2)
flag=0;
}
}
if(flag==0)
{
if(s5==0)
{
Delay_anjian(2);
if(s5==0)
{
while(!s5)
{display1(sudu_shed);display2(sudu);} sudu_shed++;
if(sudu_shed>=151)
sudu_shed=20;
}
}
}
if(flag==0)
{
if(s6==0)
{
Delay_anjian(2);
if(s6==0)
{
while(!s6)
{display1(sudu_shed);display2(sudu);} sudu_shed--;
if(sudu_shed<20)
sudu_shed=150;
}
}
}
if(flag==1)
{
if(s5==0)
{
Delay_anjian(2);
if(s5==0)
{
while(!s5)
{display1(sudu_shed);display2(sudu);}
sudu_shed+=10;
if(sudu_shed>=151)
sudu_shed=20;
}
}
}
if(flag==1)
{
if(s6==0)
{
Delay_anjian(2);
if(s6==0)
{
while(!s6)
{display1(sudu_shed);display2(sudu);} sudu_shed-=10;
if(sudu_shed<20)
sudu_shed=150;
}
}
}
}
/*****************调节速度******************/
void tiaosd()
{
if(sudu<sudu_shed)
{
if((sudu_shed-sudu)<30)
{
if((sudu_shed-sudu)>10)
hz=80-(sudu_shed-sudu);
else
hz=100-(sudu_shed-sudu);
}
else
hz=20;
TR0=1;
cw=0;
}
if(sudu>sudu_shed)
{
if((sudu-sudu_shed)<30)
{
if((sudu-sudu_shed)>10)
hz=80-(sudu-sudu_shed);
else
hz=100-(sudu-sudu_shed);
}
else
hz=20;
cw=1;
}
}
//******************测速度*************************/ void int0_int(void)interrupt 0
{
age++;
if(age==999)
age=0;
t++;
if(t==3)
{
TR1=1;
}
if(t==6)
{
TR1=0;
j++;
time=cout*3;
sudu=180000/time;
for(i=4;i>0;i--)
tab_sudu[i]=tab_sudu[i-1];
tab_sudu[0]=time;
for(i=0;i<5;i++)
temp+=tab_sudu[i];
if(j>=5)
sudu=60*15*1000/temp;
temp=0;
j=5;
t=3;
cout=0;
cnt=0;
TR1=1;
}
}
void time0_int(void) interrupt 1 //产生调速脉冲{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
tt++;
if(tt==hz)
{
tt=0;
clock=~clock;
led=~led;
}
if(sudu==sudu_shed)
{
TR0=0;
tiao=0;
}
}
void timer1_int(void) interrupt 3//
{
cnt++;
if(cnt==1000) {
cout++; cnt=0;
}
}。

相关文档
最新文档