做生物阻抗测量这块的工程师,多半绕不开ADI的AD5940。它是一颗高集成度电化学前端,芯片里同时塞进了激励DAC、24位ADC、可编程低噪声放大器和一套叫Sequencer的片内状态机,特别适合做阻抗谱(EIS)、体脂秤、汗液检测这类信号弱、噪声敏感、还要控制功耗和BOM成本的产品。AD5941则是去掉了部分通道的简化版,对两线制生物阻抗测量来说,性价比更直观。
我第一次用这颗料,是从一台两线制体脂秤方案开始的。当时最让我头疼的不是原理图,恰恰是“两线”这两个字。四线制很好理解——两根电流线、两根电压线,开尔文接法把接触电阻排除在测量路径外。但两线制是在同一对电极上既要注入激励电流,又要从同一对电极上读出电压响应,电极夹持界面的接触阻抗、人体极化电压、共模干扰全都会混进信号里。这就需要从激励幅度、频率策略、测量通道的差分结构,再到固件里的校准流程,一整套配合起来才能压住误差。
这篇文章会从生物阻抗与两线制的基础,讲到AD5940/AD5941的选型思路,再展开硬件电路里激励和测量的具体接法、寄存器配置与官方例程移植的关键步骤,最后把我实际调板时踩过的坑做一轮排查总结。不管你是刚拿到EVAL-AD5940评估板的新手,还是打算把体脂秤、身体成分模块快速落地的老手,都能找到可以直接抄作业的步骤和避坑清单。
1. 方案选型与两线制设计的核心思路
1.1 生物阻抗测量到底在测什么
生物阻抗测量的物理基础其实很直白。活组织里的细胞膜是一层绝缘性非常好的脂质双分子层,低频下电流几乎穿不过细胞膜,只能绕行细胞外液;频率升高以后,细胞膜的容抗下降,电流开始穿膜进入细胞内液。于是在不同频率下测量同一段组织,看到的总阻抗完全不同,频率越低总阻抗越高,频率越高总阻抗越低,并且绘制成复数平面图还会呈现出典型的Cole-Cole半圆弧特征。
所以生物阻抗测量本质上要做两件事:第一,对被测对象施加一个精准可控的交流激励,通常是恒流正弦激励;第二,同步采集通过对象后的电压与电流的幅值和相位关系,计算复阻抗的模|Z|和相位角θ。拿到多个频点下的复阻抗后,才能反推细胞外液电阻R0、细胞内外液并联电阻Rinf、特征频率fc这些参数,再结合身高、体重等基本信息,估算体脂率、内脏脂肪等级这些用户关心的指标。
在消费级产品里,最常见的单频体脂秤通常只取一个50kHz频点,用经验公式估算体脂占比。更专业的身体成分分析仪则用多频扫描,拟合完整阻抗谱。AD5940/AD5941这种前端能很好的覆盖这两种需求,单频测量时只需要配置一个激励频率,多频BIS时只需要让序列发生器把多个频点依次跑完。
1.2 AD5940/AD5941在AFE芯片里是什么定位
市面上可以用于生物阻抗测量的方案大概有三条路线。
第一条线路是全分立器件方案:一颗DDS或DAC生成激励波,一颗仪表放大器放大电极信号,再用一颗24位ADC采样,从激励、模拟前端到数字处理全部自己搭。好处是自由度高,坏处也相当明显——噪声、增益、相位延迟很难做一致,尤其到了量产阶段,每一片都要重新校准,调试工程师会非常痛苦。
第二条线路是专用阻抗转换芯片,比如AD5933/AD5934。这类芯片把DDS、ADC和离散傅里叶变换都做在内部,直接输出阻抗实部虚部,用起来非常简单。但它的激励频率范围、增益设置和系统灵活性都比较受限,做高端多频身体成分分析时力不从心;再加上内部没有完整的可编程序列机制,复杂的测量流程还是得靠外部MCU频繁干预。
第三条线路就是AD5940/AD5941这类电化学AFE。芯片内部集成了高精度DAC作为激励源,有高压、低噪声的交流激励环路,有可编程增益的测量通道,还有温度传感器和能够执行预置测量序列的Sequencer状态机。做阻抗测量时,你只需要配置好激励波形、测量通道和序列,芯片会自动把激励、稳定、采样、平均、存储FIFO这一整套流程执行完,MCU的负载非常低。
AD5940与AD5941的寄存器级兼容度很高,例程基本可以共用。区别主要在通道资源和芯片封装上,AD5940更全,可以支持复杂的电化学测量组合;AD5941面向精简场景,适合可穿戴、体脂秤这类固定功能的批量产品。如果项目后续有升级需求,从AD5941换到AD5940属于小工程,NC脚对齐,软件只需要改很小一部分。
1.3 两线制为什么在便携设备里绕不开
从测量精度上说,四线制是最好的。电流线和电压线分开,电压测量回路几乎不流过电流,电极接触电阻和引线电阻上的压降不会进到测量结果里。但消费品讲究的是用户体验和物料成本。体脂秤、智能手环要是多布一对电极,结构设计、防水、用户操作都会变得复杂,BOM成本也会明显上升。
两线制只需要一对电极,“金属电极踩上去”或者“手表背面两个触点贴皮肤”都能直接完成测量,这样带来的结构和成本优势非常突出,这是市面上大量消费级阻抗产品最终选择两线制的根本原因。
两线制付出的代价是测量路径里多出几个“拖油瓶”:电极与皮肤之间的接触阻抗、金属电极表面与汗液形成的双层电容、电极本身产生的极化电压。这些寄生参数会与人体阻抗串在一起。如果不加处理,低频下测出的阻抗会显著偏高,相位角也会被双层电容带偏。但好消息是,对于一个固定电极结构,这些寄生量在短时间内大致稳定。工程上完全可以通过“开路校准、短路校准、已知电阻校准”三步把系统误差压到一个可接受范围,这是后面会重点展开的内容。
2. 激励与测量链路:两线制方案的关键参数
2.1 两线制在AD5940上的典型拓扑
在AD5940上做两线制阻抗测量,我推荐的典型接法是:主DAC从SE0引脚输出正弦激励信号,经过一颗外置限流电阻Rload,加到一对测量电极上;电极上的电压响应通过内部MUX切到低噪声测量通道,也就是AIN2/AIN3差分输入端,由PGA和24位ADC完成放大与采样。
这里有两个细节需要特别留意。第一,激励电流一般不直接靠芯片内部跨阻放大器反推,而是在激励回路里串联一颗精密参考电阻Rcal,用它来既限制电流又充当校准的已知阻抗基准。第二,两线制下的电压测量点必须覆盖电极两端的完整压降,所以应该使用差分输入而不是单端对地测量。如果只测单端,电极接触阻抗上产生的压差会被直接混入被测阻抗,结果会偏差很大。
AD5940的片内MUX允许我们把两个测量通道灵活配置成待测电极两端,再配合偏置DAC为整个信号链路提供直流工作点。这里建议把偏置电压设置在ADC输入量程的中部,给电极极化电位留出余量,避免交流信号被推到非线性区。
2.2 激励频率、电流幅度与采样率怎么定
激励频率的选择,核心取决于你要提取哪一层的组织信息。推荐的做法是配置多频扫描,从1kHz到250kHz甚至1MHz逐步走一遍。低频段主要反映细胞外液电阻R0,高频段才能把细胞内液通路纳入进来,这样才有足够多频点去做Cole-Cole方程拟合。
如果产品只需要一个频点,工程上最常用的就是50kHz。这个频点下细胞内外液的分流比相对稳定,与人体总水量、去脂体重相关性比较好,这也是很多体脂秤选择单频50kHz的原因。
激励幅度要同时考虑安全约束和AFE线性度。在大面积人体接触的场景下,恒流激励一般控制在100μA到1mA RMS以内,这个范围对脚掌、手背这类局部接触完全够用。实际工程中,激励电流由DAC输出电压与串联电阻Rload共同决定:
I_peak约等于DAC峰值电压除以Rload加上被测阻抗的模值。
所以选Rload之前,要先估算被测人体的典型阻抗范围。比如体脂秤两只脚之间的阻抗大概是300Ω到700Ω,DAC峰值电压取0.5V,如果希望峰值电流不超过1mA,选一个330Ω到510Ω的Rload就比较合适。阻抗更小的场景需要把电阻加大,防止电流上限被突破。
采样率方面不用太激进,AD5940内部的ADC采样率和数字滤波器都会由官方例程自动配置。如果你用的是EIS例程,FFT计算也是片内完成的,MCU只要从FIFO里取幅值相位数据即可。
2.3 硬件电路上容易忽略的几件事
- 电源去耦:测量输入是小信号,激励端又有一定的电流变化,模拟电源和数字电源建议分开走线,芯片每个电源引脚就近放0.1μF加1μF去耦电容。
- ESD与钳位:电极是直接接触人体的,静电测试很容易击穿AFE输入,需要有ESD防护。但钳位二极管务必选低漏电型号,高漏电会给测量输入注入额外偏置电流,直接影响精度。
- 共模偏置:生物电极会产生几十到上百毫伏的极化电压,如果不在前端把共模电平抬到ADC量程中部,微弱交流信号很可能被推到PGA共模范围之外,出现削波。AD5940内部的偏置DAC就是干这个的,合理设置偏置电压能解决大半的波形失真问题。
- 电阻选型:Rload与Rcal都要选温度系数低、初始精度高的电阻。普通5%贴片电阻做校准基准会导致批量一致性差,建议用0.1%精度、25ppm/°C以内的电阻。
3. 移植与固件开发:把官方例程跑成两线制
3.1 开发环境与工程准备
ADI官方在GitHub上维护了ad5940-examples仓库,里面能找到EIS、Impedance、Amperometric等多种用例。第一次接触可以先用官方EVAL-AD5940评估板和ADICUP3029开发板,把例程烧进去,通过串口观察输出曲线,对芯片行为建立直观认知。
真正落地到自己的产品时,通常移植到STM32或者国产ARM平台。AD5940对外是一个SPI从设备,所有复杂配置都在芯片内部,所以只要你的MCU有SPI主接口和几个GPIO,移植工作量其实不大。关键是理解官方例程里的“配置结构体”,把里面的参数翻译成自己项目的需求。
3.2 核心配置流程与寄存器
两线制阻抗测量的固件流程可以归纳成四步。
第一步是初始化:调用AD5940_Initialize,完成复位、时钟、AFE寄存器基础配置。
第二步是配置激励源:设置DAC输出频率、幅度、直流偏置点。这里主要配置DAC的输出波形、频率和相位,官方例程通常用AppIMPCfg_Type结构体承载这些参数。
第三步是配置测量通路:将内部MUX切到两线制测量模式,选择PGA增益和采样率,设定FIFO阈值和中断模式。
第四步是启动序列:调用AD5940_ExecuteSeq让片内Sequencer开始执行预置的测量流程,完成后读取FIFO数据,按校准公式换算成复阻抗。
官方例程里,核心结构体的赋值大致是这样的(代码以官方头文件为准,不同版本字段名略有差异):
static AppIMPCfg_Type g_Impcfg; /* 设置激励频率,1kHz到250kHz多频扫描时循环修改该字段 */ g_Impcfg.ImpCfg.SeqPolarity = 1; /* 正极性 */ g_Impcfg.ImpCfg.FreqStart = 1000; g_Impcfg.ImpCfg.FreqStep = 0; g_Impcfg.ImpCfg.FreqPoints = 1; /* 单频;多频时改为频点数量 */ g_Impcfg.ImpCfg.AmpSweepEnable = 0; g_Impcfg.ImpCfg.AmpStart = 100; /* 激励幅度,单位mV */ g_Impcfg.SeqCfg.PDATCCfg = ...; /* PGA增益等 */ g_Impcfg.SeqCfg.RcalVal = 1000; /* Rcal标称值,单位Ω */需要注意,AD5940内部对PGA增益和SINC滤波器的配置会影响相位测量精度。增益越高,幅值分辨率越好,但可测电压上限越低;增益太低,小信号会被量化噪声淹没。实际先用固定电阻测试,观察不同增益下的信噪比,再确认最终设置。
3.3 两线制的三步校准法
官方例程默认更偏向四线制EIS,直接拿来测两线制产品,低频段读数偏大、相位异常的情况很常见。原因前面已经解释过了,电极接触阻抗进入了信号路径。工程上最有效的解决办法是增加三步校准:
- 开路校准:电极不接触任何被测物,记录系统残余失调,包括偏置电压、ADC偏移。
- 短路校准:用低阻直连电极,记录系统在零阻抗时的幅值相位基准,把电极引线和走线的寄生阻抗测出来。
- 已知电阻校准:把一颗1kΩ或10kΩ精密电阻接到电极两端,记录真实已知阻抗下的幅值相位。
校准完成之后,测量未知阻抗时,先用未知测量结果减去开路基准,再按短路与已知电阻之间的线性插值换算,就能在很大程度上把电极接触阻抗带来的偏置修正掉。
我个人的建议是,把这三步校准做成产品出厂自检流程的一部分,在每次上电后自动执行一遍。特别是可穿戴设备,电极材质和佩戴松紧都会影响接触阻抗,有了出厂自检校准,批产品的一致性会好很多。
4. 调试实战:两线制测量踩过的坑
4.1 读数漂移和跳动的排查
两线制测量最常遇到的第一个问题就是读数漂移。用手捏住电极,屏幕上阻抗值上下跳动,很难稳定。这种情况我的排查顺序是:
- 先看供电:模拟电源是否干净,DC-DC开关噪声是否串进测量链路;
- 再看人体状态:手是不是在轻微抖动,电极是不是没有压紧贴合;
- 然后用示波器观察电极两端波形,确认是否存在低频噪声被周期采样混叠;
- 最后看FIFO数据是否对齐,有没有发生序列配置错误导致数据错位。
人体阻抗本身有呼吸、心率引起的生理性波动,通常在几十毫欧到几百毫欧量级。如果跳动幅度达到几十欧姆,基本可以断定是接触不良或电源噪声,而不是生理信号。解决办法是确保电极接触稳定,测量时要求用户保持静止,同时在固件里对多次测量结果做滑动平均。
4.2 激励幅度匹配不当导致的波形失真
另一个高频问题是PGA削波。正弦激励信号经过电极后,如果PGA增益设置过高,信号会超出ADC输入范围,波形顶部被削平;ADC计算出的幅值会偏小,相位也会异常。反过来,增益设低了,小信号淹没在噪声里,测量结果同样不可信。
处理办法是先用示波器或ADC内部监测通道看一版实际波形幅度,再逐个提高增益档位,观察测量值是否稳定。如果确认削波,就把增益降一档,或者适当降低激励电压。批量生产时不要迷信固定的增益配置,同一批电极接触状态不同,信号幅度会有差异;比较稳妥的做法是在序列里加一个幅度检测步骤,动态调整增益。
4.3 相位异常与电极双层电容
两线制在低频段相位角比四线制明显偏大,这是电极接触面和汗液形成的双层电容造成的。双层电容在高频下是低阻抗,低频下是高阻抗,和人体电阻串联后,会让阻抗轨迹向右上方偏移。
单纯从软件上很难完全消除这个效应。最实用的办法是:尽量使用Ag/AgCl这种低极化电极,或者使用表面处理良好的不锈钢电极;同时在算法上把电极寄生电容等效为一个并联模型,通过校准数据修正。如果产品主要工作频率在10kHz以上,双层电容的影响会小很多,这也是很多体脂秤避开超低频的原因。
4.4 常见问题速查表
我在调试过程中整理了一张速查表,遇到问题可以先对照看一下。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 读数漂移、跳动 | 电极接触不良、电源噪声、运动伪迹 | 检查电极压紧程度;去耦电容;静置测试 |
| 高频幅值偏小 | PGA削波、激励电流不足 | 降低增益;提高DAC幅度;检查Rload |
| 低频相位偏大 | 电极双层电容、接触阻抗 | 换电极;低频做校准修正 |
| FIFO数据错位 | 序列配置错误、FIFO深度不足 | 核对序列结束标记;调整FIFO阈值 |
| 批次一致性差 | Rcal/Rload精度不足、校准流程缺失 | 换0.1%电阻;补上电自校准 |
| 功耗过高 | 序列采样点数太多、MCU唤醒频率过高 | 缩短测量窗口;降低重复测量次数 |
4.5 如何验证两线制测量结果是否可信
调试到最后,一定要做一次客观的验证,而不是只看读数自洽。我的做法是把人体替换成精密电阻网络,比如1kΩ电阻并联一颗几十nF电容,模拟组织的容性特征,然后用AD5940测量结果和同频点下的LCR表读数做对比。幅值和相位都应该在可接受误差范围内,通常幅值误差小于1%,相位误差小于1度,这个系统就算合格。
多频扫频时,可以画一张阻抗模值随频率变化的曲线,理想情况下应该是平滑下降,不能出现跳变或明显毛刺。最后再拿真实人体重复测试多次,计算变异系数CV。如果CV小于3%,说明系统稳定性已经足够进入产品化阶段。
最后再说一点个人体会。AD5940这颗芯片能力很强,但官方例程面对的是普适场景,两线制产品想要拿到好的测量结果,一定要把校准流程放在和硬件设计一样重要的位置。先固定电阻调通链路,再上人体实测,最后加上三步校准,这条路走下来说实话并不轻松,但走通之后,后面做多频BIS、身体成分算法这些功能就都是水到渠成的事了。