1. 引言
液体位置变化与电容量变化具有近似线性关系,根据这一原理,出现了一系列电容液位传感器。随着应用普及,特别是汽车、农机具等移动应用,电容液位传感器暴露的问题日益增多和严重:稳定性差,测量精度低;介质的变化或者轻微变化,测量精度严重下降;温度/湿度变化,特别是在低冷或高温下,测量精度严重下降;检测液体深度范围不大。研制简易实用、高精度、不受介质变化-温度变化-湿度变化影响、较大测量范围、低成本的电容液位传感器,势在必行。以下就此话题展开全面阐述。
2. 实现原理及其应用[1] [2]
电容液位传感器测量原理主要基于以下两点:
2.1. 电容量–液位关系
常见电容液位传感器的简单结构框图如图1所示,电极板正对面积S与间距l固定不变;板间介质,下面为液体介质
,上面为气体–空气介质
;电极板宽
,高H。
简单的平板式结构,构成电容器的电容量可如下推导:

应用中更多的圆柱套筒式电容器,设其内外半径分别为r和R,则电容器的电容量为:
(1)
由此可以看出:在传感器结构尺寸固定、介质稳定情况下,电容量跟“液位高度”构成线性关系。对于圆柱套筒式电容器,除了高度,决定电容量的是内外径比,而不再直接是相对面积。
实事上,介质并不稳定,受温度与湿度的变化会有影响,不同液体位置高度也会有影响,这就是常见液位传感器测量不准的根本原因所在。
2.2. 阻容充放电运算
电容量直接测量,涉及因素众多、而且漂浮严重,通常采用电阻R (Resistance)–电容C (Capacitance)组成的一阶积分充放电电路间接进行如图2所示。

Figure 1. Simple structure block diagram about capacitor-sensor for liquid-position
图1. 电容液位传感器的简单结构框图

Figure 2. Schematic diagram about RC charging/discharging circuit and it’s time relationship
图2. RC充放电电路及其时间关系示意图
RC电路时间常数:
,充电、放电时间:
。
电容量的大小,体现在充电时间能力和充放电次数上,可以通过多次测量充电时间和测量一定时间内的充放电次数间接得到电容量,于是有两种原理类型的电容传感器:充电时间能力CTC (Charge-Timing Capacitance)和张驰振荡器RO (Relaxation Oscillator)。显而易见,测量充放电的次数更容易实现和得到较高的测量精度,更多的电容传感器件采用这种原理,电容量越大,充放电时间越长,标准充放电的次数跟电容量的变化构成线性关系,一定时间内RC电路充放电的次数跟液体位置的变化构成了线性关系;可以看出:这种传感器制作形成的电容不易过大,否则测量精度就会大大折扣,通常在pf级,电容变化在几十pf (只有电容制造得小,才能在一定时间内,迅速形成很大的充放电记数,间接提高测量精度)。
定义没有加入液体前的空气介质电容量为“基础电容”,加入液体到充满液体的电容量为“变化电容”;“基础电容”之上的“变化电容”,对电容传感器的制作和测量至关重要。如果制造电容量稍大,可以对测量电路增加瓷片电容,构成“基础电容”,从而更有效地进行测量“变化电容”的测量。
3. 结构造型设计制作[3] [4]
3.1. 基本结构形式选择
1) 采用圆柱套筒式电极
相对平板式电容电极,圆柱套筒式电容电极,无电场边缘效应,径向抑制外部电磁干扰能力强。
2) 多段均长组合式构造
既可极大提高测量精度,组合起来又能得到足够的测量范围,每段长度取5~30 mm,段数取5~30。
3.2. 关键约束参数运算
3.2.1. 电极内外径比确定
从没有液体即只有空气到全部充满液体,就是电容变化量
,于是有:
(2)
这里之所以用绝对值等号,是因为介电常数,有些液体比空气大,如水;有些比空气小,如油。
针对某种液体,只要知道电极高度H和所设计电路的电容测量范围,就可以计算内外径比,如汽油,
取H = 20 mm,根据其介电常数,则可计算得到内外径比:
。
3.2.2. 最小半径差的确定
内外径间隙不能太小,否则由于毛细虹吸效应的存在,液体会于期间停滞不前。浸润液体在毛细管中升高形成凹面,非浸润液体在毛细管中降低形成凸面,由于分子间作用引力产生表面张力,至到等于相应部分液体的重力而平衡。常见浸润液体,如水、油,其毛细虹吸现象示意如图3所示。
毛细虹吸现象引起的液面变化:
(3)
这里
为液体表面张力系数,
为接触角,d为毛细管直径,
为液体密度,g为重力加速度。
假设液体为汽油,
,由于毛细现象引起液位测量误差为2%,即
,于是可以计算得到:

可见汽油表面张力系数很小,如果电极板间距
,由于“毛细虹吸”产生的“挂臂”对电容变化带来的影响是可以完全忽略不计的。
3.2.3. 最大半径差的确定
内外径间隙也不能取得太大,它取决于由于液体具有移动速度ν而产生的“粘滞阻力”,也称为“直管阻力”。根据范宁公式的单位重量能耗的距离表示,由“粘滞阻力”引起的液体位置变化滞后量h,
满足
,于是有:
。
这里
为管臂对液体的摩擦阻力系数,
为液体运动速度,d为管道直径,
为液体密度。

Figure 3. Schematic diagram about capillary siphon
图3. 毛细虹吸现象示意图
假设液体为汽油,v = 2.8 mm/s,
,由于“粘滞阻力”引起液位测量误差为2%,即
,于是可以计算得到:
。
电极板间距设计很容易做到
,可见测量管道“粘滞阻力”可以完全忽略不计。
3.3. 机械结构造型设计
这里以大、中型客、货、载重汽车燃油箱用传感器为例加以构思,按照上述选择原则和设计约束,采用5段组合、套筒式结构,内筒电极分段,外筒电极一体公用,关键结构尺寸确定如下:
· 组成段长度H = 10 mm,段间隔1 mm,总体长度约510 mm;
· 电极直径,内电极筒外圈半径r = 4 mm,外电极筒内圈半径R = 7.5 mm;
· 电极厚度,内电极厚0.5 mm,外电极厚1.5 mm。
传感器外部造型设计如图4所示,顶部设置固定法兰和测量电路模块盒,底部设置螺钉固定小法兰,RS485或CAN总线输出测量信号数据,杆身顶部和低部预留进出气孔和油孔,孔径2 mm。
传感器杆身结构设计如图5所示。关键结构设计说明如下:
· 采用碳纤维套管连接相邻内电极,中间为隔离台阶,宽1 mm,直径8 mm,两侧直径7 mm,一侧长10 mm,另一侧长30 mm,较长一侧端部再形成一个直径6 mm台阶用于装配连接电极。
· 用8 mm × 15 mm × 0.5 mm的薄纯铜板作连接电极,内平面接连接导线,外平面弧形装配、反弹后紧贴内电容套筒,自然构成测量电容的一个引出极。
· 顶部和底部采用内部塑料法兰连接内外电容套筒,顶部法固定测量电路模块,底部法兰靠螺钉拉紧固定传感器杆身,去除振动等带来的不良影响。
· 密封顺滑处理:内部空间走线装配完成后注入“电子灌封树脂”密封,电极段间及其两端法兰连接处用AB胶密封,内电容套筒外套装薄尼龙套管或者喷涂聚四氟乙烯以使测量液体能够在内外套筒之间升降移动流畅。
· 电容套筒材料:内套筒选择冷拔薄紫铜管,外套筒使用铝合金,外套筒内部进行特殊光滑处理。
4. 电子测量电路设计[1] [5]
4.1. 设计方案及其选择
电容传感器电子电路主要由RC充放电电路、计数分析处理电路和数据通信传输电路组成。RC充放电电路主要由RC电路、比较电路和开关电路组成,构成电容传感模块,已经成为独立器件或者单片机内电容触摸传感测量的常规片内外设。计数分析处理电路通常可由单片机及其内部计数器模块完成。数据通信传输电路常常是局部串行通信总线,如RS485、CAN、以太网总线等,近代单片机通常含有这些通信模块片内外设。因此电子电路设计方案主要有三种:
· 具有通信功能单片机 + 分立电容测量电路;
· 具有通信与电容传感功能的单片机;
· 具有通信功能单片机 + 电容传感器件。
比较这三种方案:第一种方案,影响与可控因素多,稳定性差、测量精度不易提高,可以不予考虑。第二种方案,单片机机集成的电容传感模块,基础电容量和变化电容量大,易于使用,测量精度有限。第三种方案,电容传感独立为器件,常常内含多种调整手段,称为“电容传感器件”,测量精度高,但往往基础电容不大,搭配低成本单片机才有突出优势。因此后两种方案经常被采用,尤其是第三种。目前后两种方案多应用于触摸感应方面,如触摸板、触摸屏、触摸按键、滑动条等。表1给出了后两种方案的常用可选核心器件及其电容测量性能。

Figure 4. Exterior modeling about sleeve-multipart capacitor-sensor
图4. 套筒式多段电容传感器外部造型图

Figure 5. Structure schematic diagram about sleeve-multipart capacitor-sensor
图5. 套筒式多段电容传感器杆身结构示意图

Table 1. Frequent used capacitor and its measurement performance
表1. 常用核心电容测量器件及其测量性能表
4.2. 电路及其PCB设计
选择主流的Cortex-M内核单片机和半双工实用的RS485通信设计电子测量电路,3.3 V工作电源。
4.2.1. 电路原理设计
图6给出了使用Silicon Labs-Energy的EFM32TG222进行的电路设计,EFM32TG222是低功耗、Cortex-M3内核、电容传感片内外设LESENSE单片机。传感器直流5 V供电,降压3.3 V调整处理,便于系统稳定可靠工作。RS485接口采用TVS管做静电释放ESD (Electro-Static discharge)保护处理。J3接口1~5引脚各接测量电容电极一端,电容电极另一端公共接回引脚6。J2为系统仿真调试接口。RS485接口与电源供给共用接口J1。
图7给出了的“单片机 + 电容传感器件”电路设计方案,单片机采用Nuvoton高性价比的Cortex-M0内核的NUC100,电容传感器件采用AD高精度的AD7148,IIC接口连接。J2接口每对管脚连接一个测

Figure 6. Measurement circuit for capacitor-sensor LESENSE MCU EMF32TG222
图6. 电容传感LESENSE单片机EFM32TG222测量电路

Figure 7. Measurement circuit for capacitor-sensor AD7148 and MCU NUC100
图7. NUC100单片机与电容传感器件AD7148测量电路
量电容,可构成8段以内的多段电容传感器,形成备用冗余通道。传感器杆外壳以“电路板固定孔”J3、J4形式构成公共测量电容电极。RS485接口以电阻、电容、稳压管形式采用了严密的滤波、稳压、限流措施,EMC (Electro Magnetic Compatibility)/EMI (Electro Magnetic Interference)/ESD措施更为严密。
4.2.2. PCB板图设计
PCB板图设计主要是测量电容电极的布局及其连接,这里以图7电路为例加以说明。采用上边缘环形段开槽形式的圆形PCB结构。正面中心放置单片机与电容传感器件,反面中心放置RS485接口驱动器件。RS485总线要在同一平面,差分形式走线,并尽可能短。
测量电容电极成对均匀径向分布在环形槽口的对称侧,公共电极在外,一个“电路板固定孔”紧靠测量电容公共端。旋转调整电容传感器件位置,尽可能靠近测量电容电极和等长并加粗电气连线,以使各个测量电容在同等条件下具有最大一致性即测量电容量相等。最大测量一致性设计有助于电容量测量精度的保持和进一步提高。
电容电极连线,尽可能采用直径0.5 mm以上的多股纯铜、耐高温、高强度柔软护套导线。
可以在反面“固定孔”与“铺铜地”之间加装最大150 pf的瓷片电容构成“基础电容”,以调整改善制造工艺的差别降低的测量精度下降。
电容电极连线,不直接从反面连接,而从环形槽口引出,再正面焊接,以方便安装维护。
图8给出了图7电路对应的PCB板正反面设计状况,电路板半径17.5 mm。
5. 测量处理软件实现
5.1. 软件实现指导思想
· 正常状态下,以无液体即空气时的测量值和充满液体时的测量值——建立比较运算基础;
· 根据各段测量值与其空气基础值与充满液体基础值的关系,确定液–气混合段——粗略判断;
· 根据“混合段液位比例”与其“前段充满液体值的变化量”修正各段“液–气基础值”——温度、湿度与介质变化补偿;
· 根据测量值与液体位置的线性对应关系计算混合段的准确液体位置——精确计算。
5.2. 测量控制算法建模
设正常状态下各段空气值为s[i]、满程值为f[i];各段长度均为H,实测值为m[i]。电容测量段从0开始、由下向上编号。
各段电容变化量:
(4)
空气、液体、液–气混合段:
(5)

Figure 8. Schematic diagram about PCB board for max. measurement consistency
图8. 最大测量一致性PCB板示例图
混合段液体相对全段的比例:
(6)
混合前段满程值的变化:
(7)
混合后段空气值的变化:
(8)
混合前段温度、湿度与介质变化量:
(9)
特别地,混合段为首段,计算后段空气温度、湿度与介质变化量:
(10)
基础值修正:
(11)
混合段的液体位置:
(12)
液体位置:
(13)
5.3. 电容传感模块配置
电容传感模块的配置是整个系统软件设计的关键,包括确定测量电容通道数、扫描周期的设置、转换结束中断的选用、工作参数的配置和内部补偿校验的确立,等。对于内部集成模块,还包括时钟的选择分配、IO端口的配置及其关联模拟比较模块等的选择。下面给出了AD7148的初始化代码,通过IIC接口一级驱动实现,属于二级驱动程序:
void AD7148_vInit(void) // 电容传感器模块初始化
{ IICBuf[0] = 0x00; IICBuf[1] = 0x07; // 所有转换完成中断
IICBuf[2] = 0x00; IICBuf[3] = 0x10;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x01; // 内部补偿修正使能
IICBuf[2] = 0x00; IICBuf[3] = 0x00;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x02; // 通道充放电比较电压
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x03;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x04;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x05;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x06;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x80; // 五通道电容均连接正极
IICBuf[2] = 0x3C; IICBuf[3] = 0x02;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x88;
IICBuf[2] = 0x3C; IICBuf[3] = 0x08;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x90;
IICBuf[2] = 0x3C; IICBuf[3] = 0x20;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x98;
IICBuf[2] = 0x3C; IICBuf[3] = 0x80;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0xA0;
IICBuf[2] = 0x3E; IICBuf[3] = 0x00;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x81; // 通道1~5
IICBuf[2] = 0x50; IICBuf[3] = 0x03;
IIC0_Write(4); DelayAD7148(1000);
......
IICBuf[0] = 0x00; IICBuf[1] = 0xA1;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x82; // 五通道AFE偏移
IICBuf[2] = 0x30; IICBuf[3] = 0x00;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x8A;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x92;
IICBuf[2] = 0x2E; IICBuf[3] = 0x00;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x9A;
IICBuf[2] = 0x2C; IICBuf[3] = 0x00;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0xA2;
IICBuf[2] = 0x2A; IICBuf[3] = 0x00;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x83; // 五通道灵敏度
IICBuf[2] = 0x5F; IICBuf[3] = 0x5F;
IIC0_Write(4); DelayAD7148(2000);
......
IICBuf[0] = 0x00; IICBuf[1] = 0xA3;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x84; // 五通道低偏移
IICBuf[2] = 0x00; IICBuf[3] = 0x00;
IIC0_Write(4); DelayAD7148(2000);
......
IICBuf[0] = 0x00; IICBuf[1] = 0xA4;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x85; // 五通道高偏移
IICBuf[2] = 0xFF; IICBuf[3] = 0xFF;
IIC0_Write(4); DelayAD7148(2000);
......
IICBuf[0] = 0x00; IICBuf[1] = 0xA5;
IIC0_Write(4); DelayAD7148(2000);
IICBuf[0] = 0x00; IICBuf[1] = 0x00; // 工作方式:正常,不休眠
IICBuf[2] = 0x00; IICBuf[3] = 0x50;
IIC0_Write(4); DelayAD7148(2000);
}
5.4. 程序流程及其设计[6] [7]
嵌入式软件应用系统,采用作者的“Cortex-M系列微处理器软件体系架构工具”快速自动产生,在此基础上迅速展开功能性应用程序设计:
循环周期采样每个测量电容段,每轮采样结束产生中断数据接收。
系统及其电容传感模块初始后,每次达到滤波要求数据数目时开始对采样数据做均值处理、混合段判断、实时温度–湿度与介质变化补偿、精确液体位置计算。
设置对应RS485通信的异步串行传输UART (Universal Asynchronous Receiver/Transmitter)接收中断,根据外部要求,完成传感器ID编号设置、滤波系数设置、基础运算值设置和运算液体位置数据外传。
基础运算值包括空气基础值和满程基础值,采用单片机内部集成的Flash闪存作非易失存储。
均值滤波,基本次数选择为5,对应滤波系数为0,其它滤波系数m对应实际滤波次数为5 m。显然,滤波系数越大,测量精度越高,但测量数据变化周期增大,测量表现迟钝了。
系统主程序流程如图9所示。
限于篇幅,就此略去各个中外处理程序与运算判断子程序流程及其相关核心代码。
5.5. 测试–调试–运行
在高低温–湿箱中,反复测试,调整并优化算法、程序。

Figure 9. Main program flow chart for embedded software system
图9. 嵌入式软件应用系统主程序流程图
在调试阶段完成基础运算值的测定和初始编程相关参数的设置。
实验结果:
· 测量位置精度0.01 mm;
· 工作温度范围−40℃~85℃;
· 适合介质:水、汽油、柴油、等。
试运行:客、货车油箱安装,接入行车记录系统,连续一年运行。
6. 结束语
经过测量原理、机制工艺、补偿修正的深入理论探讨和机械结构造型、电子测量电路、嵌入式应用软件的逐步设计开发,改进、完善和精确了电容液位传感器,达到了简易实用、高精度、温度–湿度–介质自适应、较大范围测量。随着应用普及,问题和缺陷还会逐渐现露,套筒式多段电容液位传感器的理论与实践探索也将随之更加深入和丰富。