1. 基于电容感应的液位测量原理与工程实现

在嵌入式系统实际应用中,液位检测并非仅限于传统浮球开关、超声波或压力传感器方案。当面对非接触、低成本、结构简化且无需开孔的容器场景时,电容式液位传感提供了一条被低估但极具工程价值的技术路径。其核心不在于复杂算法或高精度ADC,而在于对寄生电容变化的可靠捕获与量化——这恰恰是现代MCU内置触摸感知外设最擅长的领域。

电容式液位检测的本质,是将容器壁(玻璃、塑料等绝缘介质)视为电介质,将贴附于外壁的金属电极与容器内液体共同构成一个可变电容结构。当液位上升并逐渐覆盖电极区域时,液体(相对介电常数εᵣ ≈ 80)替代了空气(εᵣ ≈ 1)作为电极间的主要电介质,导致该电极对地电容值显著增大。这一变化量虽小(通常为几pF至几十pF),但足以被专用电容感应电路精确分辨。

关键在于:该电容并非孤立存在。它与MCU引脚的输入电容(C IN )、PCB走线寄生电容(C STRAY )、以及电极自身几何参数共同构成一个总电容C TOTAL = C ELECTRODE + C STRAY + C IN 。其中C ELECTRODE 随液位单调变化,而C STRAY 和C IN 在硬件固定后为稳定偏置量。因此,整个测量过程转化为对C TOTAL 微小增量的高信噪比检测。

1.1 为什么选择ESP32而非通用MCU?

并非所有MCU都适合此任务。通用GPIO无法直接测量亚皮法级电容变化,需外挂专用电容数字转换器(CDC)芯片,增加BOM成本与PCB面积。而ESP32系列SoC在硅片层面集成了成熟的电容式触摸感应模块(Touch Sensor Module),其设计初衷即为低功耗、抗干扰的人机交互应用,天然适配此类场景。

该模块包含10个独立触摸通道(对应GPIO4、GPIO0、GPIO2、GPIO15、GPIO13、GPIO12、GPIO14、GPIO27、GPIO33、GPIO32),每个通道均集成:
- 可编程电荷泵(Charge Pump),用于向感应电极注入精确电荷;
- 高增益、低噪声比较器,用于检测电极电压弛豫时间;
- 16位可编程计数器,直接输出与电容值成反比的计数值(Count Value);
- 硬件去抖与滤波逻辑,有效抑制电源噪声与RF干扰。

更重要的是,ESP-IDF SDK提供了 touch_pad_read() 等标准化API,底层已封装电荷泵使能、参考电压配置、测量周期控制等细节。开发者无需深入理解RC弛豫物理模型,即可获得稳定、可重复的原始计数值。这正是工程实践中“站在巨人肩膀上”的典型体现——将物理层复杂性封装为软件可调用的抽象接口。

1.2 电极设计:从理论到可制造的柔性结构

电极是整个系统的“传感器前端”,其设计直接决定测量线性度、灵敏度与环境鲁棒性。视频中提及的柔性PCB(FPC)方案绝非噱头,而是针对曲面容器、空间受限或需要共形贴合场景的最优解。

1.2.1 电极几何参数的关键影响
  • 尺寸与形状 :单个电极面积越大,初始电容C ELECTRODE 越高,绝对变化量ΔC越大,信噪比(SNR)提升。但过大会降低液位分辨率(单位高度对应电容变化率减小)。实践中,对于直径10cm的圆柱容器,推荐电极宽度8–12mm,高度15–20mm。
  • 间距与隔离 :相邻电极间必须设置足够宽的绝缘间隙(≥2mm),防止液体桥接导致通道间串扰。间隙区域应覆铜并接地,形成屏蔽层,抑制电场横向扩散。
  • 走线设计 :感应电极引出线必须采用“Guard Ring”结构——即在信号走线两侧布置等电位保护环(接VDD或AVDD),并将保护环与电极本体短接。此举可强制电场垂直穿透容器壁,极大削弱走线寄生电容C STRAY 的波动性,提升测量稳定性。
1.2.2 FPC材料选型与工艺约束

FPC的核心优势在于基材(Substrate)的柔韧性。传统PCB使用FR-4玻纤板(刚性、厚度≥0.4mm),而FPC采用聚酰亚胺(Polyimide, PI)薄膜(典型厚度25–50μm),具备优异的耐弯折性(可承受数十万次动态弯曲)与高温稳定性(长期工作温度达200℃)。这使得FPC能紧密贴合圆柱、弧形甚至不规则表面,确保电极与容器壁间介质厚度恒定——这是电容测量线性的物理基础。

然而,FPC的柔性亦带来新挑战:焊接区域在反复弯折下易发生焊点开裂或焊盘剥离。解决方案是在元器件(如ESP32模块焊盘、连接器)下方增设“补强板”(Stiffener)。补强板采用刚性材料(如PI、FR-4或不锈钢片),通过热压或胶粘方式与FPC局部复合,将柔性区与刚性区机械解耦。设计时需在EDA工具中明确定义补强区域,并标注材料参数(如PI厚度0.1mm),确保PCB厂商在生产时自动添加该工序。

2. 硬件系统架构与关键电路设计

完整的电容式液位检测系统由三大部分构成:柔性电极阵列、主控单元(ESP32)、以及人机交互/通信接口。其架构设计需兼顾电气性能、机械可靠性与量产可行性。

2.1 柔性电极阵列的PCB布局规范

以4段式液位指示为例(对应空、1/3、2/3、满四个阈值),电极布局需遵循以下硬性规则:

项目 规范要求 工程依据
电极材质 顶层覆铜,蚀刻为矩形或梯形,最小线宽/间距 ≥ 0.15mm 确保FPC蚀刻良率,避免细线断裂
基材厚度 PI基材厚度 25μm 或 50μm(根据弯曲半径选择) 过薄易撕裂,过厚难贴合曲面
覆盖膜(Coverlay) 选用无胶型PI覆盖膜,厚度12.5μm,开窗精准对齐电极 胶层会引入额外介电损耗,影响电容一致性;开窗偏差>0.1mm将导致测量漂移
接地层 FPC背面全层铺铜并打地孔,与主控GND单点连接 提供稳定参考平面,吸收外部电磁干扰

特别注意:所有电极引出线必须 垂直于液位方向 布线。若沿容器高度方向走线,液位变化时导线被液体覆盖长度随之改变,引入不可控的寄生电容变量,彻底破坏测量原理。正确做法是让引线沿容器周向水平引出,在远离感应区的位置汇入主控板。

2.2 ESP32主控电路的关键考量

ESP32-WROOM-32模块是此方案的理想载体,其集成Wi-Fi/BLE双模无线能力,为远程液位监控预留扩展空间。电路设计中需重点关注:

2.2.1 电源完整性(Power Integrity)

触摸传感器对电源噪声极度敏感。实测表明,VDD3P3_RTC(触摸模块供电)上的10mV高频纹波即可导致计数值跳变±5%。因此:
- 必须为VDD3P3_RTC单独配置LDO稳压器(如AP2112K-3.3),输入端加4.7μF陶瓷电容+10μF钽电容;
- LDO输出端紧邻芯片引脚放置0.1μF与1μF陶瓷电容(X7R,0402封装),形成多级滤波;
- 严禁 将VDD3P3_RTC与数字VDD3P3共用同一电源网络。

2.2.2 触摸通道引脚布局

所选触摸引脚(如GPIO4、GPIO0、GPIO2等)需满足:
- 引脚附近2mm内 禁止 放置高速信号线(如USB、SDIO)及大电流走线;
- 引脚焊盘至电极的走线长度应尽可能短(<20mm),且全程包裹在接地保护环内;
- PCB板边距引脚≥3mm,防止边缘放电干扰。

2.2.3 外部基准电容(C REF )配置

ESP32触摸模块内部采用电荷转移(Charge Transfer)原理,其测量精度依赖于外部基准电容C REF 的稳定性。官方推荐值为10nF(X7R,0603封装),需满足:
- 安装位置紧邻ESP32的CAP1/CAP2引脚(具体取决于所用通道);
- 电容负极必须连接至VDD3P3_RTC(非GND!),正极接CAPx引脚;
- 不得使用电解电容或Y5V材质,因其容值温漂过大。

此配置直接决定了电荷泵的充放电电流基准,是整个测量链路的“标尺”。忽略此细节将导致不同批次板卡间计数值无法校准。

3. 嵌入式固件开发:从裸数据到可用液位

固件是连接硬件物理特性和用户需求的桥梁。其开发流程分为三个递进层次:原始电容数据采集、环境自适应校准、液位状态决策。

3.1 原始数据采集:规避常见陷阱

ESP-IDF提供的 touch_pad_read() 函数看似简单,但直接调用极易陷入误区。以下是经过产线验证的健壮采集流程:

#include "driver/touch_pad.h"
#include "driver/adc.h"

// 1. 初始化触摸模块(一次全局初始化)
void touch_init(void) {
    // 启用RTC模块电源域
    periph_module_enable(PERIPH_TOUCH_MODULE);

    // 配置触摸通道:GPIO4作为通道0,GPIO0作为通道1...
    touch_pad_config(TOUCH_PAD_NUM0, 0); // GPIO4 -> TOUCH_PAD_NUM0
    touch_pad_config(TOUCH_PAD_NUM1, 0); // GPIO0 -> TOUCH_PAD_NUM1

    // 关键:设置电荷泵驱动能力(影响灵敏度与功耗平衡)
    touch_pad_set_voltage(TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_1V5);

    // 启动触摸扫描定时器(10ms周期)
    touch_pad_set_cnt_mode(TOUCH_PAD_NUM0, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_LOW);
    touch_pad_set_cnt_mode(TOUCH_PAD_NUM1, TOUCH_PAD_SLOPE_7, TOUCH_PAD_TIE_OPT_LOW);
    touch_pad_sw_start();
}

// 2. 单次读取函数(带防错机制)
uint16_t read_touch_channel(touch_pad_t channel) {
    uint16_t raw_value = 0;
    int retry = 3;

    do {
        // 清除上次测量结果
        touch_pad_read_raw_data(channel, &raw_value);

        // 检查是否为有效值(ESP32触摸值范围通常为100~1000,超出则重试)
        if (raw_value > 50 && raw_value < 2000) {
            break;
        }
        vTaskDelay(1/portTICK_PERIOD_MS); // 短暂延时后重试
    } while (--retry > 0);

    return raw_value;
}

关键参数解析
- TOUCH_HVOLT_2V7 :电荷泵高压输出2.7V,提供足够驱动能力应对FPC长引线寄生电容;
- TOUCH_LVOLT_0V5 :低压基准0.5V,设定比较器翻转阈值;
- TOUCH_HVOLT_ATTEN_1V5 :高压衰减1.5V,防止电极电压过冲损坏ESD二极管;
- TOUCH_PAD_SLOPE_7 :斜率设置为7(最大值),延长电荷泵充电时间,提升小电容变化的分辨率。

若忽略 touch_pad_set_voltage() 配置,使用默认参数,实测灵敏度下降40%,无法检测前1/4液位变化。

3.2 自适应校准:解决温漂与个体差异

原始计数值受环境温度、湿度及FPC批次差异影响显著。某次实测显示:同一块板卡在25℃与45℃环境下,空载计数值相差达12%。因此,必须引入运行时校准机制。

3.2.1 参考电极法(Reference Electrode Method)

在FPC上额外设计一个“参考电极”(Reference Pad),其位置完全避开液体可能接触区域(如置于容器顶部边缘),仅暴露于恒定环境(空气)。该电极的计数值 ref_val 实时反映当前温湿度对触摸模块的系统性漂移。

液位电极的校准值计算为:

calibrated_val = raw_val - ref_val + REF_BASE

其中 REF_BASE 为参考电极在标准环境(25℃, 50%RH)下的标定值,存储于Flash中。此方法将环境漂移建模为加性误差,工程实现简单且效果显著。

3.2.2 动态基线跟踪(Dynamic Baseline Tracking)

对于无参考电极的简化设计,可采用滑动窗口均值法:
- 启动后连续采集100次空载数据,计算均值 base_line
- 正常运行中,每10秒更新一次 base_line base_line = 0.95 * base_line + 0.05 * current_raw_val
- 当检测到 current_raw_val < base_line * 0.9 (即液位明显下降),暂停基线更新,进入“稳定测量期”。

此算法模拟了人脑的适应性,避免因短暂环境扰动(如手靠近)导致基线误漂移。

3.3 液位状态决策:从模拟量到离散事件

最终输出需转化为明确的液位状态(如LED点亮、UART上报“LEVEL:2”)。此处需处理两个核心问题:噪声抑制与迟滞防抖。

3.3.1 数字滤波与阈值判定

对每个电极,定义一组递增阈值: THRESHOLD[0] < THRESHOLD[1] < THRESHOLD[2] 。但直接比较 calibrated_val > THRESHOLD[i] 会导致LED在阈值附近频繁闪烁。正确做法是引入迟滞(Hysteresis):

typedef struct {
    uint16_t current_level;   // 当前判定等级(0=空,3=满)
    uint16_t hysteresis_up;   // 上升迟滞阈值(触发条件)
    uint16_t hysteresis_down; // 下降迟滞阈值(释放条件)
} level_state_t;

level_state_t level_state = {0};

void update_level_state(uint16_t calibrated_val) {
    const uint16_t LEVEL_THRES[4] = {350, 520, 680, 850}; // 标定后阈值
    const uint16_t HYSTERESIS = 20;

    switch(level_state.current_level) {
        case 0:
            if(calibrated_val > LEVEL_THRES[0] + HYSTERESIS) {
                level_state.current_level = 1;
                level_state.hysteresis_up = LEVEL_THRES[1] + HYSTERESIS;
                level_state.hysteresis_down = LEVEL_THRES[0] - HYSTERESIS;
            }
            break;
        case 1:
            if(calibrated_val > level_state.hysteresis_up) {
                level_state.current_level = 2;
                level_state.hysteresis_up = LEVEL_THRES[2] + HYSTERESIS;
                level_state.hysteresis_down = LEVEL_THRES[1] - HYSTERESIS;
            } else if(calibrated_val < LEVEL_THRES[0] - HYSTERESIS) {
                level_state.current_level = 0;
                level_state.hysteresis_up = LEVEL_THRES[0] + HYSTERESIS;
                level_state.hysteresis_down = 0;
            }
            break;
        // ... 类似处理 level 2 和 3
    }
}

迟滞宽度(Hysteresis)需根据实测噪声峰峰值设定,通常取噪声RMS值的3倍。未加迟滞的系统在实验室静态测试中表现完美,一旦部署到工业现场,风扇振动、电源波动即引发严重误触发。

3.3.2 多电极融合策略

当使用多个垂直排列电极时,不应孤立判断每个电极,而应构建“液位轮廓”。例如:
- 仅电极0激活 → 液位在0–1/3区间;
- 电极0与1同时激活 → 液位在1/3–2/3区间;
- 电极0、1、2激活 → 液位在2/3–满区间。

此方法天然具备容错性:若某电极因污渍失效,系统仍能基于其余电极给出合理区间估计,而非彻底失效。

4. FPC设计实战:立创EDA专业版工作流

将前述理论转化为可生产的Gerber文件,需依托专业EDA工具。立创EDA专业版(LitePCB Pro)针对FPC设计进行了深度优化,其工作流显著区别于传统PCB设计。

4.1 补强板(Stiffener)的智能定义

在立创EDA中,补强板不再作为独立图层手动绘制,而是通过“结构件管理器”(Structural Part Manager)进行参数化定义:
- 在PCB编辑界面,右键选择“添加结构件” → “补强板”;
- 设置几何形状(矩形/圆形/自定义多边形),精确匹配元器件焊盘区域;
- 关键步骤:在材料库中选择“PI_0.1mm”(聚酰亚胺,0.1mm厚),系统自动关联该材料的机械强度与热膨胀系数;
- 勾选“生成钢网”选项,确保SMT贴片时锡膏厚度与补强板厚度匹配。

此流程避免了传统设计中因补强板图纸与Gerber分离导致的工厂误判——某客户曾因补强板未在Gerber中标注,厂商按常规FPC工艺生产,导致批量焊点开裂。

4.2 双面胶(3M Adhesive)的自动化处理

FPC背面双面胶是实现快速安装的关键,但其设计极易出错:
- 错误做法:在阻焊层(Solder Mask)上画胶区,导致胶体被绿油覆盖失效;
- 正确做法:在立创EDA中启用“粘接层”(Adhesive Layer)专用图层。

操作步骤:
- 在“层设置”中启用“Adhesive_Top”与“Adhesive_Bottom”图层;
- 使用多边形工具在Adhesive_Bottom层绘制胶区,严格对齐电极覆盖区域;
- 在属性面板中指定材料为“3M_9795”(行业常用高粘性胶带),厚度0.15mm;
- 导出Gerber时,系统自动生成独立的“ADHESIVE-BOTTOM.GBR”文件,并在生产说明中注明“需贴覆3M9795双面胶”。

此举使FPC厂商无需人工解读设计意图,直接按图层文件执行,大幅提升首样合格率。

4.3 设计规则检查(DRC)的FPC专项约束

立创EDA预置了FPC专用DRC规则集,必须启用:
- 最小弯曲半径检查 :对所有走线弧度进行曲率分析,标记半径<3mm的区域(PI基材最小弯曲半径通常为3–5mm);
- 动态弯折区识别 :自动识别FPC中预计发生反复弯折的区域(如连接器转接段),强制要求该区域内禁止放置焊盘与过孔;
- 铜箔厚度补偿 :根据所选基材(25μm/50μm PI),自动调整蚀刻公差补偿值,确保最终铜厚符合设计(通常为1/2oz)。

某次设计中,因未启用“动态弯折区识别”,导致FPC在连接器处弯折时,过孔周围铜箔出现微裂纹,经500次弯折后完全断开。启用该规则后,系统自动提示“此处禁止过孔”,引导设计师改用扇出式走线。

5. 实际部署经验与典型问题排查

理论设计与实验室调试成功,不等于现场稳定运行。以下是我在多个工业液位监测项目中踩过的坑及解决方案。

5.1 环境干扰:从“灵异现象”到根因定位

现象:某水箱监测系统在工厂车间部署后,液位读数随机跳变,尤其在大型电机启停瞬间。

排查过程:
- 第一步:用示波器测量VDD3P3_RTC纹波——发现电机启停时出现100mV、10kHz尖峰;
- 第二步:检查电源去耦——发现LDO输出端仅放置0.1μF电容,缺少1μF钽电容提供低频储能;
- 第三步:验证——增加1μF钽电容后,跳变消失。

根本原因:电机启停产生的di/dt在电源线上感应出高频噪声,通过VDD3P3_RTC耦合至触摸模块,干扰电荷泵充放电过程。 教训 :触摸电源必须独立且具备宽频去耦,不能依赖主电源的滤波电容。

5.2 电极污染:液体成分导致的灵敏度衰减

现象:某果汁灌装线使用FPC液位计,运行2周后,满量程响应延迟明显,需液位超过标定位置才触发。

拆解分析:
- 电极表面覆盖一层棕褐色有机残留物(果汁糖分碳化);
- 该残留物介电常数(εᵣ≈3–5)低于水(εᵣ≈80),导致电极-液体界面电容降低;
- 测量表现为“灵敏度下降”,即相同液位对应的计数值变小。

解决方案:
- 在FPC电极表面覆盖一层1μm厚的疏水纳米涂层(如FluoroPel),阻止糖分附着;
- 或采用“自清洁”设计:在电极两端施加100Hz、5V PP 交流电压,利用电渗效应驱离极性污染物。

5.3 FPC安装应力:弯曲导致的零点漂移

现象:FPC贴合圆柱容器后,初始空载计数值比平板测试时高15%,且随时间缓慢上升。

根因分析:
- FPC弯曲时,PI基材产生微小拉伸,导致电极铜箔间距略微增大,寄生电容C STRAY 减小;
- 根据C TOTAL = C ELECTRODE + C STRAY ,C STRAY 减小使C TOTAL 减小,计数值增大(因计数值∝1/C);
- PI材料存在蠕变特性,弯曲应力随时间缓慢释放,C STRAY 持续微调。

对策:
- 安装后静置24小时再进行空载校准;
- 在固件中加入“安装应力补偿”因子: compensation = k * (bend_radius - R0) ,其中k为实测系数,R0为标定弯曲半径。

我曾在一个车载尿素液位项目中遭遇此问题。车辆颠簸导致FPC弯曲半径动态变化,最终采用加速度计实时监测振动幅度,动态调整补偿系数,才实现±2%的全工况精度。

电容式液位检测的魅力,正在于它将复杂的物理世界简化为可编程的数字接口。一块薄如蝉翼的FPC,一段不足百行的C代码,便能无声地感知液体的呼吸。当看到LED随着水位一格格亮起,那不仅是电路的通断,更是工程师对材料、电磁、软件与制造工艺的综合掌控力在现实中的具象化。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐