自动产泡皂膜流量计电路设计与代码剖析
2019-04-10张奕琛孔吉海李丞侃朱金琪
张 辉,张奕琛,孔吉海,李丞侃,朱金琪,王 靖
(1.北京科技大学能源与环境工程学院,北京 100083;2.北京科技大学东凌经济管理学院,北京 100083)
0 引言
皂膜流量计是一种采用“皂膜”动态密封待测气体的体积式流量计,与同种类型的湿式流量计、腰轮流量计、椭圆齿轮流量计和刮板流量计相比,所测气源压力很低(0~1 kPa),气量很小(0~60 L/min),在流量测量、色谱检测、气体成分分析、环境监测等方面应用广泛。电子皂膜流量计[1]虽然减少了人眼读数和手动计时的缺点,但在甄别连泡、灭泡和自动计量方面仍无法满足用户要求。自动产泡皂膜流量计[2](以下简称流量计)弥补了这一缺陷,利用RS232串口的输入与输出针脚实现了光电传感信号的监测与驱动开关的控制,完成了测量数据的自动记录与保存,为用户提供了廉价可靠的测量方法。为了使用户充分掌握并灵活应用该项技术,对使用技巧、电路设计和程序代码进行详尽的解析与探讨。
1 自动产泡原理
如图1所示,流量计采用“山”形连通结构。左侧为一竖直玻璃管,通过该管向皂管中添加皂液,称为加液管,由于加液管与皂管底部相通,上部为大气压,在皂液重力作用下两管液面保持水平。从左侧添加皂液,一方面由于加液管内径较小,可以精确控制皂管内液位的上升高度;另一方面加液过程中产生大量的液泡不会进入到皂管内,避免了测量开始时的连泡现象。如果加液管在底部通过软管与皂管相连,则可以通过调节加液管的高度对皂管进行润湿。中间为皂管,用户可根据JJG 586—2006标准进行选择,皂管右边为进气口,通过软管与待测气源相连。右侧是控制皂管内液位上升和下降的液位管,在液位管的上方安装有推拉式电磁铁,电磁铁的中央芯棒与重锤相连。当电磁铁断电时,芯棒由于弹簧的作用位于上升位,重锤浮于皂液上方,如图1(a)所示,液位低于皂管进气口下沿,待测气体直接进入皂管,从出口排出;当电磁铁加电时,芯棒带动重锤下沉,浸入皂液中,液位上升,淹没皂管进气口,气体被堵塞在入口处,如图1(b)所示;待液位稳定后,电磁铁断电,重锤提升,液位下降,此时产生皂膜。可以通过图1中①~⑩清晰了解皂膜的产生过程。皂液在上升过程中,逐渐堵住气体的去路,由于气体的压力作用,在皂液中产生鼓泡,如图1中③所示,随着液位的上升,鼓泡受到水的静压力增大,鼓泡变小;当液位下降时,水的静压力越来越小,鼓泡又重新长大,当液位刚低于进气口上沿时,如图1中⑥所示,气体仅受到皂液表面张力的作用,开始产生皂泡,液位进一步降低,皂泡从液面“剥离”,形成平行于液面的皂膜,如图1中⑩所示,这种由“泡”变“膜”的过程是在液位下降过程中形成的,因此,必须保证重锤有足够的体积浸入皂液中,使液位升至高于皂管进气口上沿位置,否则无法形成对气体的密封。
图1 自动产泡过程示意图
此外,专利[3]中采用圆柱形重锤挤压液体会造成皂液大量“飞溅”,由于圆柱形底面为平面,推拉式电磁铁上电后急速推动重锤击打液面,飞溅的液体一方面滴落在电磁铁上,容易烧损和腐蚀线圈,另一方面造成皂管内液体减少,液位降低,需要定期调整液位管的高度,不利于产泡的自动化,因此,此处将“圆柱”形重锤改为“水滴”形重锤,减少了瞬间击打液面时的阻力,解决了上述问题。
2 电路设计
图2为流量计整体结构示意图,加液管仅在最初添加皂液时使用,故在本图中省略。液位管通过升降台自由上升与下降,用于调整皂管内液位高度。
图2中右下角为PC机,可直接通过RS232接口或USB转RS232接口[4]与电路板相连;右上角为实验用电路板,其左侧连接了降压模块与继电器,下方连接了可调开关电源与手动按钮。
图2 自动产泡皂膜流量计整体结构示意图
2.1 供电电源
可调开关电源将220 V交流电转换为4~24 V直流电,用户根据所选推拉式电磁铁的电压需求(本文为6 V)调整开关电源的输出,电压值通过数码管显示读出;6 V直流电经过电路板输出给降压模块,达到5 V后再输入给电路板,此时的电压为光电传感器和继电器控制端工作电压。
2.2 皂膜信号传感
皂膜信号传感分为上光电传感器和下光电传感器,如图3所示。每个传感器包括发送端和接收端,分别置于皂管的两侧,沿直径方向布置。
图3 自动产泡皂膜流量计电路板原理设计图
以下光电传感器PE_DOWN为例,发送端为红外发射器,分别连接DOWN_IN和GND端子,供电电压为+5 V,通过调整电位器R_DOWN_EMITER_1K的阻值限制输入电路的电流强度,从而调节发射器的光强,由于皂管壁的材质、厚薄以及皂液的种类不同,导致匹配的发射光强也发生变化,需要根据实际情况调协;接收端连接5V+、GND和DSR端子,5V+与DSR间并联了2路分支,一路为R_DOWN_1K电位器,另一路为R_BLUE_1K电位器和LED_DOWN_BLUE兰色发光二极管,当皂膜挡住发射端的红外光时,DSR电平拉低,此时LED_DOWN_BLUE发出兰光。从图3可以看出,兰色二极管对应激发电压高,应减少R_BLUE_1K分压电阻值,而红色二极管激发电压低,需降低R_RED_1K分压电阻值,从而改变发光二极管的亮度;通过改变R_DOWN_1K电阻的大小可调节接收端对光的灵敏度。DSR与RS232的第6根引脚相连[5],通过上位机读取串口引脚状态信号。同理,PE_UP上光电传感器由RS232的第8根引脚CTS传至上位机,采用红色发光二极管进行状态显示,皂膜挡住光路,CTS电平拉低,红色发光二极管亮;皂膜离开光路,CTS恢复5 V高电平,红色发光二极管灭。
2.3 重锤自动与手动控制
重锤采用自动与手动2种方式控制。图3中,6 V电压一路经过BUTTON连接外部按钮,当人工按下按钮时,BUTTON短路,6 V电压经过粗实线“-”为电磁铁供电;另一路经过图中虚线“--”连至外部继电器模块的COM(Common)公共端和NO(Normally Open)常开触点,由继电器控制端决定COM和NO端子是否短路,继电器控制端由上位机通过RS232的第7引脚RTS状态决定。当RTS高电平时,经过R_DZ分压电阻分压后,在D_ZENER稳压管两侧形成稳定输出电压,在R_DZ和D_ZENER之间取出电压,输入到RELAY_IN的IN端点,继电位控制端处于高电平,COM和NO端点短路闭合,为推拉式电磁铁供电;反之,当RTS低电平时,IN电平降低为GND,继电器控制端电平被拉低,COM和NO端点开路断开,电磁铁断电。PCB印刷电路板实物如图4所示,为了便于丝印,图4中符号较图3进行了简化。
图4 自动产泡皂膜流量计印刷电路板实物图
3 代码剖析
图5为流量计软件设计主体流程对应的N-S图,(A)为变量初始化,包括变量的定义与赋初值;C大为循环检测下、上光电传感信号的程序;C中下和C中上段程序分别对应下、上光电传感器下降沿、平台和上升沿的检测;C小↑和C小↓分别检测脉冲信号的上升沿和下降沿。程序中变量如图6所示。
图5 软件设计主体流程N-S图
图6 软件界面各控件命名示意图
程序核心代码如下:
While bRun ′循环标志为True,进入循环
DoEvents ′可以接受其它响应事件,如鼠标点
bTimeOutFlag=False ′赋初值,表示皂膜没有超时
nTimeOut=Val(comboTimeOut.Text)* 1000
If bSwitch And bRun Then′如果是下限光电传感器,
bHighToLow=False′没有高电平到低电平的跳变
bLowToHigh=False′没有低电平到高电平的跳变
While(bHighToLow=False Or bLowToHigh=False)And bRun ′没有高到低和低到高跳变,无皂膜通过,一直循环检测
DoEvents ′可以接受其它响应事件
bDSRStatus=MSComm232.DSRHolding ′ 检测DSR电平
If optionAuto.Value=True Then ′选择了自动产膜功能
nFoamFilmProduceTickBegin=GetTickCount()
End If ′自动产膜记时开始
Do While(bDSRStatus And bHighToLow=False)And bRun ′当DSR电平为高电平,没有经过由高到低的跳变
DoEvents ′可以接受其它响应事件
If optionAuto.Value=True Then ′如果是自动产膜
If(GetTickCount()-nFoamFilmProduceTickBegin)>5000 Then ′检测产膜时间,如果超过了5 s
MSComm232.RTSEnable=True ′ 7引脚输出高电平
shapeAutoValve.BackColor=&H8000& ′指示灯绿色
TimeDelay(3000)′延时2 s,给机械装置一个动作时间
MSComm232.RTSEnable=False ′7引脚输出低电平
shapeAutoValve.BackColor=&HFF& ′灯红色,阀门关
nFoamFilmProduceTickBegin=GetTickCount()′重计时
End If
End If
If MSComm232.DSRHolding=False And bRun Then
bDSRStatus=False ′6引脚为FALSE,低电平
bHighToLow=True ′经过了高电平到低电平的跳变
shapeDownLight.BackColor=&H8000&′灯绿色,膜挡住路
Exit Do ′退出do循环,皂膜进入下限光电传感器光路区域
End If
Loop ′完成下限光电传感器上升沿的检测
Do While(bDSRStatus=False And bLowToHigh=False)And bRun ′检测电平由低到高的跳变,上升沿信号
DoEvents ′可以接受其它响应事件
If MSComm232.DSRHolding=True And bRun Then
bDSRStatus=True ′第6引脚状态赋值为TRUE
bLowToHigh=True ′经过低电平到高电平的跳变
shapeDownLight.BackColor=&HFF& ′指示灯为红色
Exit Do ′退出当前do循环,皂膜离开下限光路区域
End If
Loop
Wend
If(bHighToLow And bLowToHigh)Then
bSwitch=False ′将处理过程转向上限光电传感器
nTickBegin=GetTickCount()′开始计录皂膜的行进过程
nFoamBeginCounter=nFoamBeginCounter + 1 ′皂膜记数加1
txtCountBegin.Text=CStr(nFoamBeginCounter)′皂膜个数
txtDataList.Text=txtDataList.Text +
Format(CStr(nFoamBeginCounter),“0000”)+ Space(2)
+Format(Time(),“HH:MM:SS”)′对应皂膜个数及开始时间
End If
End If ′完成下限传感器DSR第6引脚探测皂膜
If bSwitch=False And bRun Then ′如果是上限光电传感器
bHighToLow=False ′没有发生过从高电平到低电平的跳变
bLowToHigh=False ′没有发生过从低电平到高电平的跳变
While(bHighToLow=False Or bLowToHigh=False)And bRun And((GetTickCount()-nTickBegin)< nTimeOut)
DoEvents ′可以接受其它响应事件
bCTSStatus=MSComm232.CTSHolding ′检测CTS第8引脚
Do While(bCTSStatus And bHighToLow=False)And bRun And((GetTickCount()-nTickBegin)< nTimeOut)
DoEvents ′可以接受其它响应事件
If MSComm232.CTSHolding=False And bRun Then
bCTSStatus=False ′CTS状态置为False,为低电平
bHighToLow=True ′皂膜到达了上限光电传感区域
dbTimeElapse =(GetTickCount()-nTickBegin)/ 1000
tEndTime=Time()′记录皂膜进入上限光电区域时刻
shapeUpLight.BackColor=&H8000& ′指示灯显示为绿色
Exit Do ′完成下降沿检测,退出当前循环
End If
Loop
Do While(bCTSStatus=False And bLowToHigh=False)
DoEvents ′可以接受其它响应事件
If MSComm232.CTSHolding=True And bRun Then
bCTSStatus=True ′CTS状态置为True,电平为高电平
bLowToHigh=True ′皂膜离开了上限光电传感区域
shapeUpLight.BackColor=&HFF& ′指示灯显示为红色
Exit Do ′完成上升沿检测,退出当前循环
End If
Loop
Wend ′完成了下限光电检测
If(bHighToLow And bLowToHigh)Then
bSwitch=True ′换向开关置为True,控制权交给下限光电
nFoamEndCounter=nFoamEndCounter + 1 ′成功皂膜数加1
txtCountEnd.Text=CStr(nFoamEndCounter)′成功皂膜个数
Dim tempData As Double
tempData=Val(txtHeight.Text)* 60 / dbTimeElapse
ReDim Preserve dbFlowData(nFoamEndCounter)
dbFlowData(nFoamEndCounter-1)= tempData
txtFlow.Text=Format(CStr(tempData),“##.00”)
txtAccumulateVolumn.Text=Format(CStr(Val(txtHeight.Text)* nFoamEndCounter),“#0.00”)+ “-” + Format(CStr(Val(txtHeight.Text)* nFoamBeginCounter),“##.00”)′显示累积体积值
txtDataList.Text=txtDataList.Text + Space(2)+ Format(tEndTime,″HH:MM:SS″)+ Space(2)+ Format(CStr(dbTimeElapse),″0.000″)+ Space(6)+ txtFlow.Text + Space(11)+ txtAccumulateVolumn.Text + vbCrLf ′记录膜灭时间、瞬时流量及累积体积
Else ′膜在中间破裂,或者速度太慢,超过了时间设定值
bSwitch=True ′换向开关为True,控制权交给下限光电
txtAccumulateVolumn.Text=Format(CStr(Val(txtHeight.Text)* nFoamEndCounter),″#0.00″)+ ″-″ + Format(CStr(Val(txtHeight.Text)* nFoamBeginCounter),″##.00″)
txtDataList.Text=txtDataList.Text + Space(2)+ Format(″--:--:--″)+ Space(2)+ Format(″----″)+ Space(6)+ Format(″------″)+ Space(12)+ txtAccumulateVolumn.Text + vbCrLf ′记录中间结果
End If
End If ′完成一个循环的检测
Wend ′进行下一个循环
4 流量测定
图7为采用上述电路和程序得到的气体流量曲线图,将上、下光电传感器置于皂管不同位置,使两传感器之间的有效体积分别为10、25、40 mL。
图7 不同皂管长度气体流量测定结果对比面
从图7可以看出,10 mL曲线中断点较少,说明连续测量过程中皂膜能够正常通过下、上光电传感器,所受阻力较小,测得的值基本保持不变;25 mL时,“○”曲线断点开始增加,此时由于皂膜经过的距离较长,膜逐渐变薄,经过上光电传感器时间更短,难以捕捉,并且延长距离使皂膜阻力增大,测得流量值有减小趋势;40 mL时,这一现象更为显著,流量值断点增多,从图7中“★”曲线可以清晰看出,流量值下降更为明显。通过连续测量可以获得3种曲线的变化规律,体现了自动产泡皂膜流量计的优势。
5 结束语
通过分析皂膜的产生过程,开发了自动产泡皂膜流量计,在避免连泡和皂液飞溅方面进行了改进,主要创新点如下:
(1)给出了自动产泡皂膜流量计的详细结构与电路,分析了其灵活的调节特性;
(2)通过程序实现了皂膜的自动检测和自动产泡,以检测电平上升沿和下降沿为核心优化了代码;
(3)对不同检测区间进行了气体流量的测量,皂管越长,流量测量值下降越明显,上光电传感器越难以捕捉皂膜。
后续将采用自动产泡皂膜流量计对不同种类皂液、不同浓度皂液、是否持续润湿等展开系列研究,将在后续论文中进行论述。