我没有按固定模板去套,而是直接把当时做这个项目时的真实思考过程、选型经过和踩坑记录整理出来。如果你正准备做电容传感器、阻抗测量或者手边缺少一台靠谱的微电容测量设备,这篇内容应该能帮你少走不少弯路。
1. 为什么普通电容表在关键应用里总是差那口气
1.1 这个项目的真实需求
做传感器变送器的时候,我手里有一批微电容传感器要标定,量程大概在 0.1pF 到 100nF 之间,核心要求是能稳定分辨 0.1pF 级别的变化。市面上常见的口袋电容表、万用表电容档,标称分辨率能做到 1pF 已经算不错,实际测量时数值还跳来跳去,探头夹上去手指一抖读数就变了。
真正让我下决心自己做的,是一次标定土壤湿度传感器的经历。传感器本身的电容变化只有 2pF 左右,用手头的 LCR 表和电容表反复测,每次读数差异比真实信号还大,数据贴在 Excel 里根本没法拟合曲线。那一刻我意识到,我需要一台专门针对微小电容、能在固定频率下稳定读数、还能量化掉夹具和线缆杂散的系统。
这个项目的目标很明确:做一台基于 MCU 的自制高精度电容测量系统,量程覆盖亚皮法到百纳法,激励频率可切换,读数必须可重复,误差尽量控制在 0.5% 加 0.1pF 的水平。它不追求实验室儀器那样的绝对精度,但要能稳定、可靠地用于传感器开发和小批量标定。
1.2 性能指标的拆解
在设计开始前,我先把指标拆解成下面这张表,方便后续所有选型都对着它看:
| 参数 | 目标值 | 说明 |
|---|---|---|
| 测量范围 | 0.1pF ~ 100nF | 分段覆盖,自动量程 |
| 分辨率 | 0.01pF(低量程) | 通过过采样和数字滤波实现 |
| 基本精度 | ±0.5% + 0.1pF | 各量程校准后达到 |
| 重复性 | 优于 0.05pF | 同一条件下多次测量 |
| 激励频率 | 1kHz / 10kHz / 100kHz | 适应不同电容介质 |
| 测量参数 | 电容值、损耗角/ESR | 不仅测幅值,还要看相位 |
| 接口 | 串口、OLED | 方便接入上位机和现场读数 |
看到这个表你就明白,它本质上是一台简化的数字电桥,而不是普通电容表。普通电容表把电容当作一个纯电容来测,给一个读数就完了;但微小电容测量里,引线电感、介质损耗、泄漏电阻都会严重干扰读数,所以我必须把测量对象看成一个复数阻抗,同时测出实部和虚部,再从里面提取电容值。
2. 测量原理选型:充放电法、谐振法与复数阻抗法的取舍
2.1 充放电法确实便宜,但做不到高精度
网上很多自制电容表用的都是充放电法:恒流源给未知电容充电,电容电压线性上升,当电压超过某个阈值时停止计时,时间 T 和电容值 C 的关系是:
T = C × Vth / I
只要测出充电时间,就能反推电容。这个方法的好处是电路简单,MCU 定时器加比较器就能做,零件成本几块钱。但坏处也很致命:恒流源的稳定度直接决定精度,比较器有温漂和失调,阈值电压本身也有误差,整套系统的非线性来源太多。
我算过一笔账:如果我希望在 10pF 量程做到 0.1% 精度,充电时间大约 10 微秒量级,这意味着时间测量分辨率要做到 10 纳秒以下。对普通 MCU 的定时器不是不可能,但恒流源温漂和比较器抖动造成的误差早就盖过了这个分辨率。
还有一个本质问题,充放电法测的是电容储存电荷的能力,它把所有能量损耗都打包进结果里,无法区分“容性”和“阻性”。当被测电容存在明显 ESR 或者介质吸收时,读数会偏离真实电容值,而且没有任何办法修正。这对高精度测量来说是根本性的缺陷。
2.2 谐振法灵敏度高,但量程和收敛性不好搞
谐振法思路也很有吸引力:用已知电感 L 和未知电容 C 组成 LC 谐振回路,通过扫频找出谐振频率 f0,再根据 f0 = 1/(2π√(LC)) 计算电容。
这种方法的灵敏度确实高,尤其是在高 Q 值回路里,谐振点附近的幅值变化非常陡峭,理论上可以检测极小电容变化。但它的问题同样突出:需要稳定的已知电感,电感的温度系数和寄生电容很难控制;被测电容变化范围一大,谐振频率就跑没影了,量程非常窄;扫频还需要 VCO 或者 DDS,硬件复杂度上升。
我一度想过用这个方法做高分辨率变化检测,但后面发现,一旦换上不同容量的传感器,整套回路参数就要重新标定。对一台要给多种传感器做标定的仪器来说,这太不实用了。
2.3 为什么最终选择正弦激励加相敏检波
最后我采用的是目前数字 LCR 表和阻抗分析仪最常用的方案:给被测件施加一个单一频率的正弦激励,同步采集流过被测件的电流和两端的电压,然后通过相敏检波解算出复数阻抗。
对于电容,阻抗的模值 |Z| = 1/(ωC),相位接近 -90°。测到完整的复数阻抗后,电容值可以直接提取:
C = 1 / (ω × |Z|)
相位分量则可以换算出 ESR 和损耗角正切 tanδ。这样做的好处是,测量不依赖恒流源的稳定性,不依赖电感精度,主要误差源变成了激励幅值精度、采样通道的相位一致性和 ADC 的有效位数,而这几个指标在现代器件里可以做得非常高。
从实现角度看,关键是“同步”。只要激励信号和采样参考都由同一个时钟源派生,相位误差就可以控制得极小,噪声通过相干平均被压下去。这个方法在原理上最干净,后续的所有软硬件工作都围绕它展开。
3. 硬件链路搭建:从激励源到 ADC 的前端细节
3.1 整机信号链与关键器件选型
我的信号链路是这样设计的:
MCU(STM32F303) → DAC/正弦表 → 激励缓冲运放 → 被测电容DUT → 跨阻放大器TIA → 可编程增益PGA → 24bit Σ-Δ ADC → MCU激励源我用 STM32F303 的 DAC 加 DMA 循环输出正弦波。F303 主频 72MHz,DAC 更新速率可以跑到 1MSPS 以上,配一个低通滤波器就能得到还不错的正弦波。当然你也可以用独立的 DDS 芯片比如 AD9833,频率准确度和相位噪声更好,但对我来说 MCU 内置 DAC 加外部滤波足够,还能省一颗芯片。
关键在于激励缓冲器。DAC 输出阻抗不低,直接驱动电容会导致信号源阻抗和被测电容形成分压,而且阻抗随频率跑偏。我选择一级单位增益缓冲器,用低输出阻抗运放把正弦波隔离出来,这样被测电容看到的激励源几乎是理想电压源。缓冲器输出再经过一个 100Ω 左右的串联匹配电阻,用于抑制反射。
跨阻放大器 TIA 是这个系统的核心。被测电容一端接激励,另一端接运算放大器的反相输入端,反馈网络把流过电容的电流转换成电压。反相端是虚地,所以被测电容的低端被固定在 0V,这能有效消除低端杂散电容的影响。反馈电阻 Rf 决定跨阻增益,反馈电容 Cf 用于相位补偿,防止自激。
运放选型上,我推荐低偏置电流、低噪声、带宽够用的精密运放,比如 OPA2277、AD8628 这类器件。偏置电流必须小,因为皮法级电容在 1kHz 下的阻抗高达上百兆欧,哪怕 1nA 的偏置电流都会在反馈电阻上产生明显误差电压。
ADC 我用的是 ADS1256,24 位,带可编程增益放大器,内部有多阶数字滤波。它支持差分输入,刚好可以测 TIA 输出和激励参考。实际用下来,这个 ADC 的噪声性能对 0.1pF 分辨率来说是绰绰有余的,反而是模拟前端容易被 PCB 寄生拖后腿。
3.2 模拟前端最容易翻车的几个点
第一个坑是带宽和增益的关系。TIA 的反馈电容 Cf 和运算放大器输入电容一起组成一个极点,如果反馈电容太大,带宽被压得很低,高频激励时增益就开始下降,读数随频率明显偏移。解决办法是每个量程单独设置反馈电阻和反馈电容,而不是用一个固定网络硬扛全频段。
第二个坑是运放的共模输入电压。被测电容接在激励和虚地之间,运放反相端电压被虚地稳定在 0V 附近,但如果运放不是轨到轨输入,靠近负轨时线性度会变差。实测发现用普通运放在小信号时会出现可测量的非线性,换轨到轨精密运放后读数立即稳定了。
第三个坑是 PGA 和 ADC 之间的接口。ADS1256 输入阻抗不够高时,PGA 输出经过分压会损失精度,必须确保 PGA 输出阻抗远小于 ADC 输入阻抗,或者干脆在中间加一级跟随器。我最初少量测试时漏了这个,100kHz 频率下读数明显偏低,后来才发现是阻抗匹配问题。
3.3 屏蔽、保护环与被测件夹具有多重要
高精度微电容测量的成败,一半在夹具。这不是夸张,而是亲身教训。裸露的杜邦线两根并排走 1cm,分布电容就有零点几皮法,这对 0.1pF 的测量目标来说是不可接受的。
我采用的做法是给被测电容做一个小型屏蔽盒,中心信号极用聚四氟乙烯绝缘子支撑,外围是一圈接地屏蔽。屏蔽盒上盖可开合,被测件夹在两片黄铜触点之间,接触面镀金。这样固定住测量环境,避免人手直接触碰夹具。
更关键的是驱动屏蔽技术。屏蔽层如果直接接地,它和中心信号线之间会形成一个固定电容,虽然数值确定,但这个电容并联在被测件两端,难以完全校准掉。我改用缓冲器驱动屏蔽层,让屏蔽层的电位始终跟随中心信号电位。电位相等意味着两者之间没有电场,分布电容的影响被大幅削减,剩下的只是缓冲器失调和驱动能力导致的微小残余。
此外,连接被测件时我采用开尔文式接法,也就是把激励线和采样线分开走。虽然只是单端测量,但把 TIA 虚地端的取样线独立引出,可以避免大电流走线上的压降被计入测量信号。这种细节在测量微小电阻和低 ESR 电容时特别有用。
4. 固件算法:怎样把 0.1pF 的真值从噪声里抠出来
4.1 数字相敏检波的实现细节
我一开始用模拟乘法器做相敏检波,就是用 AD630 那类器件把信号和参考相乘,再用低通滤波器取平均值。试了一段时间发现两个问题:模拟乘法器的失调漂移难以消除;低通滤波器响应慢,量程切换后要等很久才能稳定。
后来干脆改成数字解调:ADC 直接采样 TIA 输出电压和激励参考信号,在 MCU 里做相关运算。核心思路是,如果采样序列是 x[n],参考余弦序列是 i[n],参考正弦序列是 q[n],那么信号的同相分量和正交分量为:
I = (2/N) × Σ x[n] × i[n] Q = (2/N) × Σ x[n] × q[n]只要采样序列 xn 和参考序列长度 N 正好覆盖整数个激励周期,这个运算就是离散傅里叶变换(DFT)的简化形式。幅值 mag = sqrt(I² + Q²),相位 phase = atan2(Q, I)。下面是核心循环的简化代码:
// samples[] 是 ADC 采集的一帧数据,N 是采样点数 // ref_i[] 和 ref_q[] 是与激励同频的余弦、正弦参考序列 int64_t acc_i = 0, acc_q = 0; for (uint16_t idx = 0; idx < N; idx++) { acc_i += (int64_t)samples[idx] * ref_i[idx]; acc_q += (int64_t)samples[idx] * ref_q[idx]; } float I = (float)acc_i * 2.0f / N; float Q = (float)acc_q * 2.0f / N; float mag = sqrtf(I * I + Q * Q); float phase = atan2f(Q, I);这个方法相当于数字锁相放大器。它只对指定频率感兴趣,其他频率的噪声分量在长平均中会相互抵消,等效带宽很窄。激励频率为 10kHz 时,采样 1000 个点相当于只看了 0.1 秒窗口里的信号,白噪声被压到很低,0.1pF 的变化就能清晰露出来。
实际使用时要特别注意:采样时钟和激励信号时钟必须同源。我从同一个定时器产生 DAC 触发和 ADC 触发,保证 ADC 采样点和正弦波形的相位关系固定。如果两者各自独立运行,频率稍有偏差,I/Q 运算就会出现栅栏效应,读数周期性抖动。
4.2 自动量程和切换后的稳定策略
自动量程分为“预判”和“精测”两步。先让系统给被测电容施加一个较小的激励电压,通过 TIA 的输出幅度粗判电容大小,选择合适的反馈电阻和 PGA 增益,然后才开始正式采样计算。
量程切换不能无缝进行。切换反馈网络之后,运放需要时间建立,大电容还会在切换瞬间产生电流尖峰,所以我程序里必须留足稳定时间。实测下来,10pF 以下量程切换后稳定 2ms 足够,100nF 量程则要等 20ms 以上。稳定期内 ADC 数据直接丢弃,不参与计算。
PGA 增益切换也类似,而且增益网络的校准系数是独立的。切换增益后如果读数跳变,不一定是被测件变化,而是两个增益档之间存在增益误差。我靠量程校准把每个档位的增益系数存进 Flash,切换后乘上对应系数,读数才能平滑衔接。
4.3 校准矩阵的工程落地
仪器做出来之后,校准是躲不掉的一环。我采用的校准流程是每个量程内做三步:
- 开路校准:断开被测件,记录残余信号,包括夹具杂散电容和运放失调。
- 短路校准:把夹具短路,记录寄生阻抗,用于修正 ESR 和相位误差。
- 标准电容校准:接入已知容量的标准电容,计算实际增益和系统相位延迟。
实际处理时,我把测量结果先做“开路扣除”,再做“增益修正”。对于线性度要求高的场合,还可以在每档多测一个标准电容做两点直线校正,甚至做多项式拟合。下面这个公式是我在固件里实际用的修正逻辑:
Z_correct = (Z_meas - Z_open) × (C_std / (Z_meas_std - Z_open))其中 Z_meas_std 是接入标准电容时的原始读数。这样处理后,系统对夹具杂散电容和信号链增益误差的敏感度明显下降。
5. 标定、误差源与几段反复折腾的踩坑记录
5.1 PCB 杂散电容:不是玄学,是物理
第一次打样回来,开路读数直接是 5.3pF,按照设计预期应该是 0.1pF 级别。排查了很久,发现问题是反馈电阻旁边的走线太靠近输入端,两条平行走线有 8mm 长,距离 0.4mm,分布电容大概增加了 1.2pF。再加上顶层覆盖的铺铜和 vias 形成的寄生,整体就冲到 5pF 以上了。
解决办法是把 TIA 输入端周围做成空心保护区,也就是所有靠近反相端的走线全部避开,在关键节点底下不放地铜,因为地铜和信号线之间的电容也会贡献杂散。输入端的走线尽可能短,直接从被测件到运放反相端,中间不要过孔。改版后开路读数降到了 0.4pF,配合算法里的开路校准,最终残余可以压到 0.1pF 以下。
5.2 介质吸收:为何测完大电容后机器会“记仇”
有一次测完一个 47µF 电解电容后,马上切到皮法量程测标准电容,读数反复回不到正常值。起初以为是继电器没断开,排查了一圈,最后发现是介质吸收在作怪。
介质吸收是大电容内部材料的一种“记忆效应”:电容被充电后,即使外电路已经放电,内部介质还会缓慢释放残余电荷,导致电容相当于一个带微小电荷源的存储元件。这种效应在高精度测量里非常讨厌,它会表现为基线偏移,而且需要很长时间才能恢复。
从那以后,我在固件里加了一个“放电等待工序”:每次切换量程或者换被测件之前,先让 DUT 两端短路 1 秒,再开始正式测量。另外在程序里检测到当前测量值明显偏离上一档位时,会多等一下再重新采样。这个小改动帮我省了很多无效数据。
5.3 温漂问题与运放、PGA 的选型教训
设备在实验室 25°C 环境里校准得很完美,拿到现场测试时,读数整体偏了 0.8%,而且随温度变化。复盘发现,问题出在两处:一是反馈网络里的电阻使用了普通贴片电阻,温漂系数正负几十 ppm 甚至上百 ppm;二是 PGA 的增益漂移没做补偿。
解决方法是把反馈电阻换成低温度系数的金属箔电阻,或者使用 0.1% 精度、25ppm 温漂的薄膜电阻。关键位置必须用 C0G/NPO 电容做反馈电容,绝不能用 X7R 电容,后者在 1kHz 下的容值随温度和电压变化明显,用在反馈网络里会直接写入误差。
同时我在固件里做了一维温度补偿:板上加了一个温度传感器,每个量程的校准系数按温度区间分段存下来,用线性插值修正。这样在 10°C 到 40°C 的范围内,系统精度的恶化控制在 0.15% 以内,基本满足了现场使用的需求。
6. 实测结果与性能对比
6.1 测试工装与参考设备
测试时我用了一组标称容量经过第三方计量过的标准电容,以及一块实验室使用的数字电桥作为参考。被测件夹持在屏蔽盒内,确保测量环境一致。每组读数重复测量六次,取平均值和极差。
对比时我特别关注低量程的表现,因为那里最考验系统下限。标准电容的容量标称值在小数值上有一定误差,所以我更看重的是重复性而不是绝对偏差。
6.2 典型量程的实测数据
下面这张表是 10kHz 激励频率下的一组代表性数据:
| 标称容量 | 系统读数 | 重复性(极差) | 相对偏差 |
|---|---|---|---|
| 0.82pF | 0.83pF | ±0.01pF | +1.2% |
| 10.0pF | 10.04pF | ±0.02pF | +0.4% |
| 100.0pF | 100.2pF | ±0.05pF | +0.2% |
| 1.00nF | 0.998nF | ±0.01nF | -0.2% |
| 100nF | 99.6nF | ±0.2nF | -0.4% |
0.82pF 那个数据相对偏差有 1.2%,看着比 1% 精度目标差,但考虑到绝对值只有 0.01pF 的误差,实际上这已经达到 0.1pF 级别的绝对精度目标。系统在 10pF 到 100nF 区间内表现很好,基本落在 ±0.2% 到 ±0.4% 的范围内,10pF 以下主要被夹具残余和噪声拖累。
对比普通万用表在同一批电容上的表现,普通表在 10pF 档的读数几乎只有一位有效数字,而且每次测量的跳动范围超过 1pF,根本无法完成传感器标定。这套系统的重复性至少高了一个数量级。
6.3 还留在桌面上的问题与可扩展方向
目前系统主要有两个不足。第一是激励频率只有三个固定点,对于研究电容介质频率响应来说不够用,后续可以改成扫频模式,在 1kHz 到 100kHz 之间连续扫描;第二是校准过程还是半手动的,需要人工更换标准电容,将来可以设计一个内置多档标准电容阵列,通过继电器自动接入,把校准流程做成完全自动。
器件层面,如果不想自己搭模拟前端,也可以考虑 AD5941 这类集成阻抗测量芯片,它们内置了激励发生器和阻抗测量前端,BOM 能简化不少。但用通用运放和 ADC 的好处是每个环节都可调、可查,方便深入理解测量链路的误差来源。
7. 如果再做一版,我会把时间花在这几件事上
整套项目做下来,我最大的体会是:高精度电容测量难的不是“测准”,而是“把环境固定住”。夹具屏蔽、杂散电容、介质吸收、温漂这四个问题,每一个都比 ADC 位数更影响最终结果。数据不好看的时候,先别怀疑算法和芯片,先去看你的测件环境是不是一直在变化。
如果让我再设计一版,我会优先做三件事:一是把被测件夹具做成带温度监测的密封结构,让环境因素可量化;二是增加自动校准序列,把开路、短路、标准电容的切换做成按键触发的一键流程;三是预留外部触发接口,方便传感器动态测试时同步采集其它信号源。
最后分享一个小技巧:在固件里,我会周期性地对同一电容重复测量,把最近 20 次读数的标准差算出来,直接当作“健康指标”显示在屏幕上。当标准差突然变大,说明外部干扰或者夹具接触出了问题,这时候做多少次理论分析都不如直接看一下这个数字来得快。这套系统的真正价值,也正在于它逼着我把这些细节老老实实处理干净了。