液体点滴速度监控装置资料.docx
《液体点滴速度监控装置资料.docx》由会员分享,可在线阅读,更多相关《液体点滴速度监控装置资料.docx(35页珍藏版)》请在冰豆网上搜索。
液体点滴速度监控装置资料
液体点滴速度监控装置
[摘要]该装置实时地监测液体点滴速度,通过单片机对信息的分析和处理,由主机发出相应的指令,调整系统的工作平稳,构成了一个高性能的闭环控制系统。
实现了对点滴输液速度的直观监测,同时对一些异常情况的出现可实施报警。
利用该装置还能通过主控平台对各个分立系统信息实施自动化、智能化的集中处理。
能方便、简易的操作和使用,对医疗具有很强的实用性。
[关键词]实时监控红外传感闭环控制步进电机
一、方案设计与论证
根据题目要求和原输液装置的特点,提出以下三种方案:
1、方案一
直接在滴斗处用两电极棒的方法。
图1
此方案的传感器采用简单的液体导电原理,在滴斗处安装两个电极。
当水滴落下时,电极导通,从而使待测量的变化转化为高低电平电信号。
采用伺服电机改变系统装置中液瓶与受液瓶的高度,达到改变点滴速度,从而进行控制。
2、方案二
把通过电机改变系统装置高度的方法,改为控制步进电机对输液管进行压缩或缓松,从而实现对点滴速度的改变。
采用交流电动机控制H2的高度。
即采用红外传感器测量滴斗滴液,送至单片机接口计数,通过数字模拟转换,将其转换为4—20MA标准电流值,同时通过键盘输入给定每分钟的滴数,再将此滴数将其转换为4—20MA标准电流值,将此两个信息同时进入数字PID调节器。
通过偏差计算再输出一组4—20MA标准电流值,通过变频调速器控制电动机调节H2的高度,来控制滴斗滴数。
此方案的优点是,完全按目前电气工程标准化运作,可以在很短时间完成。
2、方案三
根据点滴装置的特点,通过对装置的某一位置进行监测和控制,达到对整个系统液体点滴速度的监控。
(如图1)。
通过控制输液软管夹头的松紧来控制点滴速度,采用红外传感器测量滴斗滴数,送至单片机接口计数并显示,首先标定两个脉冲(两滴间)间的时间间隔(以10MS为时基单位)。
然后计算给定滴斗滴数(通过键盘)的时间间隔(以10MS为时基单位)。
将此两个时间间隔进行比较,以决定步进电机运行的方向。
该步进电机通过丝杠控制输液软管夹头的松紧,来控制滴斗滴数
4、方案比较
方案一的特点是:
实现比较简单容易,原理上也是可行的,但由于本装置用于医疗,电弧的产生,可能对不同的药物有影响,同时传感器(电极)不能重复使用,以防止传染。
方案二通过改用红外传感器,弥补了方案一的不足。
但是还存在问题,利用改变高度的方法虽然容易实现,但可控性不好。
由此,我们采用了第三种方案,通过挤压输液管的办法来实现对点滴速度的控制。
二、系统原理框图如图2所示。
图2
本系统最主要的是充分利用单片机编程的灵活性和其强大的功能,使一些小的系统实现自动化和智能化成为了现实。
其中的器件都比较简单,尽大可能的利用各集成芯片的功能,如系统的键盘和显示原理电路。
通过红外传感器对水滴滴落的动态信息的感应,单片机对数据的采集分析和处理,同时使用小功率的步进电机进行机械调整,使装置能机智、即时的响应操作者的使用。
三、主要电路原理与设计
1、AT89C51单片机基本系统控制与数值信号处理的核心采用AT89C51单片机,采用串口工作方式。
电路如图3。
图3
2、显示与键盘如图4
利用74LS164进行串行动态9位数码管显示,74LS164的主要功能是8bits的串入并出数据处理。
电路结构简单,功能强大。
采用中断和查询的方法,设计的4键键盘的形式,利用单片机的灵活编程,扩展其键入功能。
图4
3、红外传感和信号处理采用红外线的发射和接收装置,它可用来检测包括液体在内的各种透明体、半透明体、不透明体,从而可以灵敏地反应水滴滴下。
利用光电耦合器对电信号进行处理,减少干扰。
4、步进电机驱动和控制如图5
图5
5、声光报警当检测到液面低于3cm时由单片机采集到报警信号,由报警芯片发出声光报警。
5、主控制平台可以组建一个小型的网络系统,由主机控制和监视各个从机的工作状态和各个装置的信息。
如图6
图6
四、系统软件工作流程如图7到图12
1、软件设计:
软件部分参考流程图,这里主要讲述一下软件编写过程中的几个细节部分。
如前所述,我们计算滴水速度的原理是通过求出2个水滴之间的时间差,通过分析,我们通过定时器建立一个基准时钟,该基准时钟有2个字节单元,分别秒单位和10毫秒单位的数值。
在每次传感器送来中断的时候调用“传感测量”子程序,在该子程序中,我们在取当前触发时间时,先把上一个脉冲发生的时间保存在“历史寄存器”中,然后再更新“当前寄存器”的值,即取当前脉冲的发生时间。
这样我们就记录下了2个时间(连续)值。
历史寄存器当前寄存器基准时钟
中断前:
中断时:
注:
箭头方向为中断时的赋值方向图7
由于基准时钟是以10毫秒为最小单位的,而对于频率范围在20Hz~150Hz的脉冲而言,因为我们在后边的求滴速中要用到10毫秒单位值,而水滴的下落并不能保证绝对的规则,经测试发现,每一次求差后的值总有几个单位毫秒的变动,这个变动就导致了最终运算出来的滴速值的大幅度变化,后来惊观察发现这种误差可以归为周期性误差,所以为了消除这个误差,我们不是简单地只取一个差值,相反,我们是取了10个差值,然后再求平均值,这样处理的最大一个好处是可以使周期性误差的正、负偏差互相抵消,在很大程度上消除上述误差。
前面的处理虽然可以提供一个比较接近真值,对于最终显示出来的影响不大,但当要用这个值去控制滴速夹时,很明显这样处理的结果降低了控制的响应度;而另一方面,对于滴速夹的控制,因为我们采用的是步进电机,而且我们对步进电机的转轴又进行了改造,加了一个螺纹栓,可以保持滴速夹控制端的位置,所以我们在每采集一个脉冲间隔时就进行滴速的更改控制,这样可以提高控制设备的响应速度。
所以在本系统中对于建立一个科学合理的系统模型是很有必要的。
在对滴速进行控制时,我们借鉴了PID算法,建立了一个闭环控制状态,利用类似于锁相环的模型:
即把设定的滴速和当前的滴速进行比较,输出一个差值,利用这个差值的极性来决定电机的正反转,并拉小这个差值直至最小。
因为每检测到一个传感信号,我们就把设定值和当前值进行比较,这样不仅提高了设备的响应速度,而且由于我们这个系统的基准时钟是以10毫秒为单位了,因为我们能分辨到10毫秒的数量级,可以使当前值非常接近我们所设定的设定值。
这一点可以参照电机控制的流程图。
(图12)
1、运算过程:
因为我们系统的基准时钟是以10毫秒为单位了,虽然加大了系统的精度,但是却给系统的数值运算带来了麻烦,直接用四则运算(特别是乘除的运算)很容易带来无法避免的运算误差,即在运算是因为运算位数的限制而带来的数据尾数的丢失。
前面说过这种误差将对我们对信号的处理和显示产生很大了影响,甚至会得到一个误差很大的最终输出,为避免这种情况,我们在保证精度的基础上采用了查表法,并且在建立表格时对数据进行一定的折中处理,使得最终得到了结果的误差能尽量小,实践证明我们这种方法还是有一定的实用性的。
而且查表法的结果便于以后系统误差的自我校正,因为它保存了一个恒值。
2、对数据表格的处理:
前面说过我们这个系统的基准时钟有两个字节单元,而即使采用题目要求的滴速(20~150分/滴)也将需要260个字节,这已经超过了8位单片机的查表范围,所以怎样建立一个合理的查表算法是很有必要的。
通过对数据的观察,我们发现虽然每个时间量有两个字节,但是在秒字节的单元里,总共只能出现4种取值,即1、2和3以及0,所以我们可以以这4个值为标量对表格的数据进行划分,由于有了秒字节单元来做区分,我们只要在表格中写入10毫秒字节单元的值就行了,通过综合处理,在保证精度的基础上,我们所建立的表格的字节数为100多个,这样不仅满足了8位单片机的查表范围,而且大大了节省了内存,有利于系统资源的优化分配。
3、通信的建立:
在选择方案时,考虑到通信线的多少,我们采用了串行通信,直接利用单片机本身的串行通信口,在软件上我们考虑用串行通信的方式0来进行通信。
通信协议如下:
先发送握手信号,然后发送被呼叫的从机号,每个从机在接收到地址时跟自身的地址进行比较,如果不是被呼叫机,则关闭通信链路;如果是则发送响应信号。
当确定了通信的链路后,就按照预定的数据包格式进行通信。
数据包格式如下:
2、程序流程图
图8
传感测量:
时钟:
图9图10
键盘:
步进电机控制:
图11图12
3、源程序:
时间基准缓冲区:
秒55h0.01秒56h
键盘设置缓冲区:
秒57h0.01秒58h
传感测量缓冲区:
前次—秒51h0.01秒52h当前—秒53h0.01秒54h差值—秒4fh0.01秒50h
最终显示缓冲区:
选择值:
54h测定值5ah5bh5ch设置值5dh5eh5fh
R4用于步进电机的步进记忆
org0000h
ajmpmain
org0003h
ajmpjpint;int0
org000bh
ajmptimes;t0
org0013h
ajmpcgint;int1
org0040h
main:
movsp,#60h;设置堆栈
mov41h,#00h
mov42h,#00h
mov43h,#00h
mov44h,#00h
mov45h,#00h
mov46h,#00h
mov47h,#00h
mov48h,#00h
mov4fh,#00h
mov50h,#00h
mov51h,#00h
mov52h,#00h
mov53h,#00h
mov54h,#00h;初值设置
mov55h,#00h
mov56h,#00h;以上为时间初值
mov54h,#00h
mov57h,#00h;初值显示为00
mov58h,#00h
mov59h,#00h
mov5ah,#00h
mov5bh,#00h
mov5ch,#00h
mov5dh,#00h
mov5eh,#00h
mov5fh,#00h
movr7,#00h
setbf0
clrp2.1
movtmod,#01h;T0为工作方式0
movtl0,#0f0h;计数器初值
movth0,#0d8h
movie,#87h;中断设置,除T1,ES外全开中断
movip,#02h;中断优先级
setbit0
setbit1;脉冲触发方式
setbtr0;启动定时
setbp1.4
disp:
acalldisp0;调用显示子程序
ajmpdisp
disp0:
pushacc
movdptr,#table
jnbf0,disp1
mova,54h;选择值显示
cjnea,#01h,zzz1
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#0ffh
movsbuf,a
jnbti,$
clrti
acalldealy
ajmpdisp1
zzz1:
cjnea,#02h,zzz2
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#0ffh
movsbuf,a
jnbti,$
clrti
acalldealy
ajmpdisp1
zzz2:
cjnea,#03h,zzz3
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#0ffh
movsbuf,a
jnbti,$
clrti
acalldealy
ajmpdisp1
zzz3:
mov54h,#00h
disp1:
mova,5ah;测定值显示
cjnea,#00h,disp2
ajmpdisp3
disp2:
cjnea,#01h,disp4
disp3:
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#0feh
movsbuf,a
jnbti,$
clrti
acalldealy
disp4:
mova,5bh
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#0fdh
movsbuf,a
jnbti,$
clrti
acalldealy
mova,5ch
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#0fbh
movsbuf,a
jnbti,$
clrti
acalldealy
mova,5dh;设置值显示
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#0dfh
movsbuf,a
jnbti,$
clrti
acalldealy
mova,5eh
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#0bfh
movsbuf,a
jnbti,$
clrti
acalldealy
mova,5fh
movca,@a+dptr
movsbuf,a
jnbti,$
clrti
mova,#7fh
movsbuf,a
jnbti,$
clrti
acalldealy
popacc
ret
dealy:
movr0,#0fah
lll:
nop
nop
djnzr0,lll
ret
table:
db03h
db9fh
db25h
db0dh
db99h
db49h
db41h
db1fh
db01h
db09h
jpint:
;键盘控制子程序
pushacc
push07h
movr2,#0ah
zzz:
acalldealy
djnzr2,zzz
jbp1.0,x2;选择键子程序
inc54h
clrex1
setbf0
mova,54h
cjnea,#04h,x1
mov54h,#01h
x1:
ajmpret0
x2:
jbp1.1,x3;加1键子程序
mova,54h
cjnea,#00h,lll1
ajmpret0
lll1:
cjnea,#01h,lll2
inc5fh
mova,5fh
cjnea,#0ah,zhongju
mov5fh,#00h
ajmpret0
lll2:
cjnea,#02h,lll3
inc5eh
mova,5eh
cjnea,#0ah,ret0
mov5eh,#00h
ajmpret0
lll3:
inc5dh
mova,5dh
cjnea,#0ah,ret0
mov5dh,#00h
ajmpret0
x3:
jbp1.2,x4;减1键子程序
mova,54h
cjnea,#00h,llll1
ajmpret0
llll1:
cjnea,#01h,llll2
dec5fh
mova,5fh
cjnea,#0ffh,ret0
mov5fh,#09h
ajmpret0
zhongju:
ajmpret0
llll2:
cjnea,#02h,llll3
dec5eh
mova,5eh
cjnea,#0ffh,ret0
mov5eh,#09h
ajmpret0
llll3:
dec5dh
mova,5dh
cjnea,#0ffh,ret0
mov5dh,#09h
ajmpret0
x4:
jbp1.3,x5;确定键子程序
clrf0
acallenter;因指令而修改
ret01:
;对整数进行修正
mova,r7
cjnea,#14,ccc1
mov57h,#03h;为20置3
setbex1
ajmpret0
ccc1:
cjnea,#1eh,ccc2
mov57h,#02h;为30置2
setbex1
ajmpret0
ccc2:
cjnea,#3ch,ret02
mov57h,#01h;为60置1
setbex1
ajmpret0
x5:
jbp2.0,ret0;报警监测
setbp2.1;送报警声音
ajmpret0
ret02:
setbex1
ret0:
popacc
pop07h
reti
enter:
mov54h,#00h
clrc
mova,5dh;求时间段程序
movb,#64h;百位数
mulab
movr7,a
mova,5eh
movb,#0ah;十位数
mulab
adda,r7
movr7,a
mova,5fh
adda,r7
movr7,a;此时r7中为设定值
clrc
subba,#14h;查表前减20
movdptr,#table1;由数值查时间段表
movca,@a+dptr
mov58h,a
ret
times:
;时间设置
pushacc
movtl0,#0f0h
movth0,#0d8h
setbtr0
inc56h
mova,56h
cjnea,#64h,quit0
mov56h,#00h
inc55h
quit0:
popacc
reti
cgint:
;传感测量
movr2,#0ah
zzzz:
acalldealy
djnzr2,zzzz
jnbp3.3,cgint1
reti
cgint1:
pushacc
push03h
push04h
push05h
push06h
incr7
cjner7,#0ah,zhongju1
movr7,#00h
mova,53h;数值转移
mov51h,a
mova,54h
mov52h,a
mova,55h;读取当前时间
mov53h,a
mova,56h
mov54h,a
clrc;求10个脉冲差值子程序
mov47h,#00h;10差值寄存区
mov48h,#00h
mova,53h
subba,51h
mov47h,a
clrc
mova,54h
subba,52h
jnczero;如果当前值大就跳转
dec47h
clrc
mova,#00h
mova,54h
adda,#64h
subba,52h
zero:
mov48h,a
mova,47h;平均差值
movb,#0ah
divab
mov4fh,a
mova,b
movr3,a;秒余数暂存
mova,48h
movb,#0ah
divab
mov50h,a
mova,b
movr4,a;0.01秒暂存
mova,r3
movb,#0ah
mulab
adda,50h
mov50h,a
zhongju1:
mova,44h
mov42h,a
mova,43h
mov41h,a
mova,55h
mov43h,a
mova,56h
mov44h,a
clrc;求差值子程序,供电机使用
mov45h,#00h
mov46h,#00h
mova,43h
subba,41h
mov45h,a
clrc
mova,44h
subba,42h
jnczero1;如果当前值大就跳转
dec45h
clrc
mova,#00h
mova,44h
adda,#64h
subba,42h
zero1:
mov46h,a
mova,45h
mova,4fh
cjnea,#03,ddd1;送动态显示缓冲区
mov5ah,#00h;整值判断
mov5bh,#02h
mov5ch,#00h
ajmpexit
ddd1:
cjnea,#02h,ddd2
mova,50h
jnzddd01
mov5ah,#00h
mov5bh,#03h
mov5ch,#00h
ajmpexit
ddd01:
movb,#0ah
divab
movdptr,#table2;秒值为2的表
movca,@a+dptr
movr5,a
anla,#0fh
mov5ch,a
mov5bh,#02h
mov5ah,#00h
ajmpexit
ddd2:
cjnea,#01h,ddd3
mova,50h
jnzddd02
mov5ah,#00h
mov5bh,#06h
mov5ch,#00h
ajmpexit
ddd02:
movb,#0ah
divab
movdptr,#table3;秒值为1的表
movca,@a+dptr
movr5,a
anla,#0fh
mov5ch,a
mova,r5
swapa
anla,#0fh
mov5bh,a
mov5ah,#00h
ajmpexit
ddd3:
mova,50h
cjnea,#3ch,ddd03
mov5ah,#01h
mov5bh,#00h
mov5ch,#00h
ajmpexit
ddd03:
clrc
subba,#3ch
jclar100;大于100跳转
mov5ah,#00h;小于100
movdptr,#table4;60到99的表
movca,@a+dptr
movr5,a
anla,#0fh
mov5ch,a
mova,r5
swapa
anla,#0fh
mov5bh,a
ajmpexit
lar100:
mov5ah,#01h
clrc
movr5,50h
mova,#3ch
subba,r5
movdptr,#table5;100到150的表
movca,@a+dptr
movr5,a
anla,#0fh
mov5ch,a
mova,r5
swapa
anla,#0fh
mov5bh,a
exit:
jbf0,exit1;F0为1时电机不工作
acalldianjic;送步进电机子程序
exit1:
pop05h
pop03h
pop04h
popacc
pop06h
reti
dianjic:
;电机控制子程序.zhengzh为前进,fanzh为后退
pushacc
clrc
mova,57h
subba,45h
jzlowdc;如果高位相等则进行低位比较
jcjcc1;当前滴速小于设定滴速,须反转放松
acallzhengzh;当前滴速大于设定滴速,须正转挤压
a