4、生物阻抗测量:从基础到实战

大家好,我是你们的老朋友。今天我们来聊聊生物阻抗测量。说实话,这个技术在我刚入行那会儿,还觉得挺神秘的。后来做多了才发现,它其实就是用电流“摸”一下人体组织,然后通过电压的变化来推算内部信息。嗯,听起来简单,但坑不少。

这一章,我会从最基础的生物阻抗分析(BIA)讲起,然后带你搞定四电极法、激励信号生成,最后落到解调和阻抗计算上。每个环节我都会穿插一些我踩过的坑,希望能帮你少走弯路。

4.1 生物阻抗基础(BIA)

生物阻抗分析,说白了就是测量生物组织对电流的阻碍能力。你想想看,人体不同组织——肌肉、脂肪、骨骼、血液——它们的导电性是不一样的。肌肉含水多,电阻小;脂肪含水少,电阻大。通过测量阻抗,我们就能反推出身体成分。

我个人习惯把生物阻抗模型简化成一个电阻和一个电容的并联。为什么?因为细胞膜有电容效应,而细胞内外液是电阻。这个RC模型虽然简单,但在实际项目中已经够用了。

核心公式:

Z = |Z| ∠ θ

其中 |Z| 是阻抗幅值,θ 是相位角。

实部 R = |Z| cos θ,虚部 X = |Z| sin θ

我在项目中遇到过一个问题:直接用直流电测人体,结果电极极化严重,数据根本没法看。后来才明白,生物阻抗测量必须用交流激励,频率通常在 1kHz 到 1MHz 之间。低频穿透深,高频分辨率高,具体选哪个看你测什么。

频率范围 典型应用 我的经验
1kHz - 10kHz 细胞外液测量 适合体脂秤,但信号容易受运动伪影干扰
10kHz - 100kHz 全身成分分析 最常用的频段,我一般选 50kHz
100kHz - 1MHz 细胞内液、组织监测 高频段要注意寄生电容,PCB 布局要小心

小技巧: 如果你刚开始做 BIA,建议先用 50kHz 正弦波试水。这个频率下,人体阻抗大约在 300Ω 到 1kΩ 之间,电路设计相对容易。

4.2 四电极法:为什么不用两电极?

两电极法简单,但问题很大。电流和电压共用同一对电极,电极与皮肤之间的接触阻抗会直接串入测量结果。你想想看,皮肤干湿程度、电极压力大小,都会让接触阻抗变化,测出来的数据根本不准。

四电极法就聪明多了。它用一对电极注入电流,另一对电极测量电压。测量电极上几乎没有电流流过,所以接触阻抗的影响被大大削弱。说白了,就是把“激励”和“检测”分开了。

四电极法接线示意:

电流注入电极:I+ ──── 人体 ──── I-
电压测量电极:V+ ──── 人体 ──── V-

注意:V+ 和 V- 要放在 I+ 和 I- 之间

我曾经犯过一个低级错误:把电压电极放在了电流电极的外侧。结果测出来的阻抗值完全不对,还以为是芯片坏了。后来查资料才发现,电极顺序很重要。V+ 和 V- 必须位于 I+ 和 I- 之间,这样才能保证电压测量区域内的电流密度是均匀的。

避坑指南: 我曾经遇到过电极间距太近导致信号饱和的问题。建议电流电极间距至少 5cm,电压电极间距 2-3cm。具体数值要根据你的应用场景调整。

4.3 激励信号生成:正弦波 vs 方波

激励信号的选择,直接决定了你的测量精度和电路复杂度。我两种都用过,各有千秋。

4.3.1 正弦波激励

正弦波是理想选择。为什么?因为单一频率,谐波分量少,解调起来干净利落。但生成高质量正弦波不容易。我早期用 DDS(直接数字频率合成)芯片,比如 AD9833,效果不错,就是成本稍高。

// 使用 AD9833 生成 50kHz 正弦波(伪代码)
void init_AD9833() {
    // 设置时钟频率 25MHz
    // 计算频率寄存器值:FREQ = (50kHz * 2^28) / 25MHz = 536870
    write_register(0x2100);  // 复位
    write_register(0x50B8);  // 写入频率低14位
    write_register(0x4008);  // 写入频率高14位
    write_register(0x2000);  // 退出复位,输出正弦波
}

我个人习惯用方波加滤波来生成正弦波。方波容易生成,后面加一个低通滤波器,把高次谐波滤掉,就能得到近似正弦波。这个方法成本低,但要注意滤波器的截止频率和阶数。

4.3.2 方波激励

方波的好处是生成简单,用 GPIO 翻转就能搞定。但方波含有大量奇次谐波,这些谐波会干扰测量结果。你想想看,如果你用方波激励,测到的阻抗其实是多个频率下的混合值,解调起来很麻烦。

不过,方波也有它的用武之地。在一些快速筛查应用中,比如判断组织是否水肿,我们只关心阻抗的相对变化,不要求绝对精度。这时候方波就够用了,而且电路简单、功耗低。

激励类型 优点 缺点 我的推荐
正弦波 精度高、谐波少 电路复杂、成本高 科研、医疗设备
方波 电路简单、功耗低 谐波多、精度低 消费电子、快速筛查

我的建议: 如果你刚开始做原型验证,先用方波试试。等算法稳定了,再换成正弦波提升精度。这样开发周期短,踩坑成本低。

4.4 解调与阻抗计算

激励信号送出去了,也测到了电压响应,接下来就是解调。解调的目的,就是从电压信号中提取出阻抗的幅值和相位。

常用的方法有两种:同步解调(也叫相敏检波)和 I/Q 解调。我重点讲 I/Q 解调,因为它在嵌入式系统里实现起来最方便。

4.4.1 I/Q 解调原理

I/Q 解调的核心思想是:把测量信号分别与同相参考信号(I)和正交参考信号(Q)相乘,然后低通滤波,得到 I 和 Q 两个分量。然后阻抗幅值就是 sqrt(I² + Q²),相位就是 atan2(Q, I)。

数学表达:

V_meas = A * sin(ωt + θ)

I = V_meas * sin(ωt) → 低通滤波 → (A/2) * cos(θ)

Q = V_meas * cos(ωt) → 低通滤波 → (A/2) * sin(θ)

|Z| = sqrt(I² + Q²) * 系数

θ = atan2(Q, I)

我在项目中遇到过一个问题:参考信号和测量信号之间有相位延迟,导致解调结果偏差。后来我加了一个相位校准步骤——先用一个已知电阻代替人体,测量并记录相位偏移,然后在实际测量中补偿回去。

4.4.2 嵌入式实现要点

在 MCU 里实现 I/Q 解调,我一般用 ADC 采样 + 软件乘法。采样率至少要达到激励频率的 4 倍以上,我习惯用 8 倍。比如 50kHz 激励,采样率设到 400kHz。

// I/Q 解调伪代码(基于 STM32)
#define Fs 400000  // 采样率 400kHz
#define F0 50000   // 激励频率 50kHz
#define N  64      // 采样点数

float I_sum = 0, Q_sum = 0;
for (int i = 0; i < N; i++) {
    float t = (float)i / Fs;
    float ref_I = sin(2 * PI * F0 * t);
    float ref_Q = cos(2 * PI * F0 * t);
    I_sum += adc_value[i] * ref_I;
    Q_sum += adc_value[i] * ref_Q;
}
// 平均后得到 I 和 Q
float I = I_sum / N * 2;
float Q = Q_sum / N * 2;
float magnitude = sqrt(I*I + Q*Q);
float phase = atan2(Q, I);

注意: 上面的代码里,我用了浮点运算。如果你的 MCU 没有 FPU,建议改用定点数,否则计算速度会慢到让你怀疑人生。我曾经在 Cortex-M0 上跑浮点解调,结果一秒钟只能算 10 次,根本没法用。

4.4.3 校准与误差补偿

阻抗测量不是测完就完事了。你想想看,电路里总有寄生电容、放大器偏置、ADC 偏移。这些都会引入误差。我的做法是:先测一个已知电阻(比如 510Ω 精密电阻),记录测量值,然后计算校准系数。

校准流程:

  1. 接上标准电阻 R_cal(比如 510Ω)
  2. 测量得到幅值 M_cal 和相位 P_cal
  3. 计算增益系数:Gain = R_cal / M_cal
  4. 计算相位偏移:Offset = 0 - P_cal
  5. 实际测量时:R_actual = M_meas * Gain,θ_actual = P_meas + Offset

嗯,这里要注意一点:校准电阻的精度要够高,至少 0.1%。我吃过一次亏,用了 1% 的电阻做校准,结果测出来的数据偏差很大,后来排查了半天才发现是校准电阻的问题。

4.5 实战经验总结

说了这么多,我最后给你几个实用建议:

  • 先仿真再动手: 用 SPICE 把模拟前端仿真一遍,看看信号幅度、噪声、带宽是否满足要求。我每次改电路都会先仿真,省了不少烧芯片的钱。
  • 注意共模电压: 人体是浮地的,共模电压可能很高。我建议用仪表放大器做前端,共模抑制比至少要 80dB。
  • 屏蔽和接地: 激励线和测量线要分开走,最好用屏蔽线。我曾经因为线缆耦合,测出来的 50Hz 工频干扰比信号还大。
  • 软件滤波不能省: 即使硬件滤波做得再好,软件上也要加一个移动平均或卡尔曼滤波。我习惯用 10 点移动平均,效果不错。

最后一句: 生物阻抗测量,说白了就是跟噪声和误差做斗争。别指望一次成功,多试几次,多记录数据,慢慢你就会找到感觉。我在这个领域摸爬滚打了七八年,到现在每次做新项目还是会遇到新问题。但正是这些坑,让我越来越喜欢这个方向。

好了,这一章就到这里。下一章我们会讲生物阻抗芯片的选型与驱动,到时候我会拿几款主流芯片出来对比,看看它们各自的脾气秉性。咱们下章见。