LHA7668 是经典 AD7124 的国产替代:

性能最强的就是 B 型号,基本上是全面提升,而且最大的输出速率也来到了 38.4kHz,这意味着可以在时域上获得更加精细的数据;我拿到相关的评估板也有很长的时间了,最近使用它做了一些应变片的测试,感觉美滋滋;那也拿手里面有限的测试仪器对其做一些评估。
其实最大的问题还是信号源,信号源的质量要比 DUT 好至少 3 倍才行,很明显我没有这个条件,而且这些 ADC 基本上都要求是差分信号源。
然后发现 M1K 居然可以做这个事情!我先使用 ADAQ7768-1,一个集成的产品:
远远高于我的信号源做一次标定,根据实测:
有效带内 SNR:约 60–63 dB
THD:约 −68 至 −71 dB,即约 0.03%–0.04%
SINAD:约 60–62 dB
等效有效位数:
适合:验证 ADC 接线、增益、极性和采样是否正常;测试滤波器、频率响应和大致线性,观察 10 位左右的有效动态性;但是主要限制不是输出幅度,而是 M1K 的 100 kSPS 波形更新率;测试频谱中能看到约 99.995 kHz 的更新时钟泄漏,以及约 98.995/100.995 kHz 的镜像和大量高次分量。
这样 CHA+CHB+GND 构成差分信号源而且官方的评估板使用的是 GD32,顺手这次就也来把玩一下国产 MCU:

测试的完整链路如下:
Python 自动测试程序 │ ├── libsmu ──> ADALM1000 CHA/CHB 差分信号源 │ │ │ ├── 1 kΩ ──> LHA7668 AIN0 │ └── 1 kΩ ──> LHA7668 AIN1 │ ├── M1K PIO3 ──> GD32F330 PA11 同步输入 │ └── UART 1.5 Mbaud <──> GD32F330 <──SPI──> LHA7668
M1K 可以为 LHA7668 提供以 1.65 V 为共模的真实差分正弦信号;静态正、零、负差分均能被 LHA7668 正确识别,极性正确。
在最终 2 Hz 准确度测试中,约 100 mVpk、200 mVpk、500 mVpk、1 Vpk 的端到端误差分别为 0.145%、0.078%、0.0346%、0.0233%。
最终交流线性拟合为:
去除拟合增益和固定偏移后,0.862 mVpk~1.0004 Vpk 范围内最大残差为 9.81 µVpk。
SINC4 实测 −3 dB 带宽约为 ODR 的 0.215~0.227 倍;100~400 SPS 与数据手册的 接近。
SINC4、PGA=1、内部 AVSS−AVSS 本底噪声为:100/200/400/800 SPS 下 0.303/0.518/0.791/1.227 µV RMS。
由噪声换算得到的有效分辨率为 22.19/21.41/20.80/20.17 bit。该数值是噪声等效位数,不是包含失真和绝对精度的完整 ENOB。
模拟信号连接
| | | |
|---|
| | Demo板 IN0(经板载 R1=0 Ω 到 AIN0) | |
| | Demo板 IN1(经板载 R2=0 Ω 到 AIN1) | |
| | | |
不加电阻这里的电源会很大,因为 M1K 的电源系统设计的很好两只 1 kΩ 电阻用于限制误接、启动瞬态或引脚配置错误时的电流;而且测试程序还设置了 2 mA 软件电流限值,若 M1K 检测到超限,会立即终止输出并将两通道切回高阻。
没有外部电阻时,故障电流主要由 M1K 输出级、连线阻抗和 LHA 输入保护结构决定:
这些阻抗较小且保护结构是非线性的,每路加入 1 kΩ 后,如果某个输入意外被钳位到 0 V,而 M1K 输出 1.65 V:
最终最大信号时,单通道最高约 2.15 V:
该数值接近测试程序的 2 mA 软件限流阈值;软件检测到电流超限后会终止输出并切回高阻。
外部 1 kΩ 对频率响应的影响

原理图显示 IN0/IN1 前端还存在:C3、C4:每路约 10 nF 到 AVSS;C5:AIN0 与 AIN1 之间约 100 nF。
对于纯差分信号,两只 10 nF 对地电容的差分等效电容为:
所以近似总差分电容为:
两路各串 1 kΩ,差分信号看到的总串联电阻约为:
由此形成一阶模拟低通:
其理论幅度衰减为:
因此:1~80 Hz 的测试基本不受影响,160~320 Hz 的最终扫频已经包含可见的外部模拟 RC 衰减,在800 SPS 下实测带宽偏低,部分原因是这个 758 Hz 模拟低通,而不只是 LHA7668 数字 SINC4。
同步连接
因为信号源和采集没有一个正确的起始信号,其实对于连续稳定正弦波,ADC异步采样是正常情况;主要受影响的是相位、启动瞬态、FFT频谱和高频拟合。
信号源的 PIO3 连了 PA11对幅值的理想影响
信号为:
ADC异步采样:
其中 (\tau) 是信号源与ADC开始时刻的未知偏差。它只改变相位:
理想情况下,幅值 (A) 不变。
所以只要:信号已经稳定;丢弃数字滤波器的建立过程;采样时间轴正确;使用正弦最小二乘拟合;那么异步采样仍然能准确测量幅值和频率响应。
但是我当前设计的PIO3→PA11只能标记“M1K准备开始输出”,没有让LHA7668转换时钟与M1K采样时钟锁定,流程是:PIO3拉高,调用M1K session.run(),USB传输和波形实际输出,LHA7668连续转换;PIO3边沿和第一个真实模拟波形样本之间存在USB及固件延迟;因此当前结果中的:
phase_relative_first_sample_deg
只能用于单次拟合,不能当作精确的M1K→LHA7668绝对相位,相位误差近似为:
如320 Hz时:
ADC采样率误差会造成幅值拟合错误
如果拟合时假定ADC为800 SPS,但实际为806.45 SPS,相对误差为:
经过时间 (T) 后,累计相位偏差约为:
320 Hz、采集2秒时:
相当于漂移超过5个周期。若仍按800 SPS等间隔拟合,就会把部分基波能量误判为残差,测得的幅值明显偏低。
在测试中出现过的SINC3约−3.8 dB异常点,就是时间轴和UART帧问题造成的伪影,并非滤波器突然衰减;后来使用DWT估计实际ODR后,复测恢复到约−0.01 dB。
启动瞬态不同步
M1K波形开始时,LHA7668可能正处于一次Σ-Δ转换的任意位置。数字滤波器会经历建立过程;普通SINC滤波器大约需要多个输出周期:
SINC4:通常至少约4个输出周期;SINC3:通常至少约3个输出周期;快速SINC+SINC1:约一个转换周期建立。
例如SINC4、200 SPS:
若立即采集,最初几个点的幅值、相位都不正确;当前程序在M1K就绪后等待约0.2秒才采集,因此即使100 SPS:
已经超过SINC4所需的建立时间,所以当前稳态幅值结果基本不受启动瞬态影响。
对FFT和THD的影响
如果采集窗口不是整数周期:
FFT会发生频谱泄漏,基波能量扩散到相邻频点,进而造成:幅值偏低;噪声底升高;THD偏高;陷波深度测不准。
当前主要使用正弦最小二乘拟合,比直接取FFT峰值更能容忍非整数周期;但THD仍比基波幅值更敏感,特别是1~10 mV小信号和高频点。
真同步得锁相时钟,在当前这种异步方式足以做稳态幅值和滤波器测试,但不能直接测精确绝对相位,同步结果:
高电平保持:SYNCIN count=1 level=1恢复低电平:SYNCIN count=1 level=0单脉冲: SYNCIN count=2 level=0最终状态: SYNCIN count=252 level=0
在每次正式差分正弦输出前,M1K PIO3 拉高;波形结束后拉低;GD32F330 的 PA11 使用 EXTI 上升沿记录 sync_count 和 sync_tick。
M1K 信号源官方参数
参数来自 Analog Devices,描述的是 M1K 硬件能力:
| | |
|---|
| | |
| | |
| | 软件保护限制为 ±2 mA;实测峰值不超过约 0.43 mA |
| | 差分正弦使用 20 kSPS;静态保持使用 100 kSPS |
| 16 bit、0.05% 基本测量精度、4 位显示分辨率 | |
| | SVMI:Source Voltage Measure Current |
| | |
| | |
| | |
| | |
| C、C++、Python、MATLAB;开源 libsmu | C++/libsmu 生成波形,Python 负责测试和分析 |
libsmu 支持的主要通道模式:
M1K 波形参数
差分正弦缓冲采用:
source sample rate = 20,000 samples/sminimum waveform buffer = 1,000 samplescommon-mode ramp = 1,000 samples = 50 mssoftware current limit = 2 mAM1K PIO3 = high during formal waveformM1K PIO3 = low after waveformCHA/CHB = high impedance after every run
静态电压保持采用:
source sample rate = 100,000 samples/scommon-mode/target ramp = 5,000 samples = 50 mshold duration = 0.8 ssoftware current limit = 2 mA
ADI给出的 M1K 函数发生器更新率是 100 kSPS,但这不等于能输出 100 kHz 正弦,离散时间理论的奈奎斯特上限为:
在 100 kSPS 下理论上限是 50 kHz;然而此时每周期只有 2 个样本,不能形成高质量正弦波;若要求每周期至少 (N) 个点,则建议的数字波形上限为:
例如:
本轮最高频率为 320 Hz,在 20 kSPS 下每周期约 62.5 点,因此波形离散化不是主要误差来源;在更高频率下还会受 M1K 模拟输出带宽、负载、USB 缓冲、输出级建立时间和幅值下降影响。
共模和最大差分幅值约束
由于 M1K 单端电压必须保持在 0~5 V,双通道对称差分输出需要满足:
所以电压范围给出的理论差分峰值上限是:
当 (V_{\mathrm{CM}}=1.65,\mathrm{V}) 时:
这是仅由 0~5 V 输出范围得到的数学上限,测试最大只使用 1 Vpk 差分,即 CHA/CHB 各自 1.65 V±0.5 V,保留了较大安全余量。
M1K 分辨率和小信号限制
若仅按 0~5 V、16 bit 做理想量化估算:
但 76.3 µV 只是理想码宽估算,不等于实际输出准确度,官方给出的 0.05% 是基本测量准确度描述,而本次的 1 mVpk 点已经显示出明显的固定偏移占比。
因此:100 mV~1 V 范围适合评估 LHA7668 的端到端幅值、滤波器和线性趋势;1~10 mV 范围可用于功能测试,但不适合作为 LHA7668 绝对精度测试
要测 LHA7668 的 µV 级绝对准确度,应使用校准过的精密源和高位 DMM 对 M1K 输出进行外部标定才行(这个我接下来研究)
差分信号定义
测试中的双通道反相信号定义为:
因此:
本次使用:
当设置 (V_{\mathrm{DIFF,PK}}=100,\mathrm{mV}) 时,每个 M1K 通道只摆动 ±50 mV:
CHA = 1.65 V ± 50 mVCHB = 1.65 V ∓ 50 mV差分峰值 = 100 mVpk差分峰峰值 = 200 mVpp差分 RMS = 100/sqrt(2) = 70.71 mVrms
我大幅度的重写了7668 的固件,主要测试配置:
| | |
|---|
| 0x8001 | |
| 0x09E0 | |
| 0x000060 | |
| 0x000030 | |
| 0x400060 | |
| 0x800005 | |
| 0xA00005 | |
先测静态,每个测试点输出 0.8 s,等待 0.10 s 后通过 UART 采集约 0.45 s;LHA7668 配置为 AIN0−AIN1。
误差计算:
证明LHA7668 能正确测出正差分和负差分,AIN0/AIN1 极性与软件定义一致,约 ±100 mV 输入没有饱和;三点均存在约 0.17~0.30 mV 的固定差异,后续交流测试中进一步分析。
零差分样本
正差分样本
负差分样本200 SPS SINC4 初始扫频
配置:SINC4、FS=96、约 200 SPS、差分峰值约 100 mV、共模 1.65 V。
增益计算:
早期理论计算使用:
得到 200 SPS SINC4 理论 −3 dB 频率约 45.43 Hz,后续最终实测插值得到 44.95 Hz。
初始频率响应
输入输出幅值
频率扫频 THD各频率原始波形拟合图
以下每张图都包含 UART 值和基波最小二乘拟合:
1 Hz 波形
2 Hz 波形
5 Hz 波形
10 Hz 波形
20 Hz 波形
40 Hz 波形
60 Hz 波形
80 Hz 波形10 Hz 幅值线性扫描
配置:10 Hz、SINC4、约 200 SPS、10~500 mVpk。
拟合结果:
该斜率包含 10 Hz 时 SINC4 的通带衰减,不能直接作为直流增益误差,最大拟合非线性残差为 14.57 µVpk。
10 Hz 幅值线性
10 Hz 非线性残差最终测试
最终性能测试分为四组:
- 2 Hz、400 SPS、1 mVpk~1 Vpk 交流准确度。
- SINC4 在 100/200/400/800 SPS 下的归一化频响。
- SINC4、SINC3、Fast SINC4+SINC1、Fast SINC3+SINC1 的滤波器比较。
- 内部 AVSS−AVSS 本底噪声及动态范围换算。
高数据率测试中曾捕获到不少坏字段,如果直接把这些帧当作数值,会产生数 dB 的假异常和 5 µV 级假噪声,最终程序采取:非整数 uv、seq、tick 字段直接丢弃,噪声数据使用中位数绝对偏差检查异常值,每组噪声独立采集三次并取 RMS 中位数,使用 DWT 相邻 tick 的中位数估算实际 ODR,使用序号差恢复中间丢失样本对应的时间间隔。
最早把 84 MHz DWT tick 当作精确 ADC 采样时间,但 tick 实际记录的是 MCU 读取 ADC 数据寄存器的时刻,会包含 UART 调度抖动。最终算法改成:
修正前出现的两个孤立异常点及最终三次复测如下:
| | | |
|---|
| | −0.01258/−0.01052/−0.01274 dB | |
| | +0.02860/+0.02882/+0.03280 dB | |
这说明数 dB 跳变属于后面信息流传输问题,不是 LHA7668 滤波器故障。
最终 2 Hz 交流准确度
配置:SINC4、FS=48、约 400 SPS、1.65 V 共模。
原始端到端误差:
线性回归:
去除拟合增益和偏移后的最大残差:
小信号误差百分比很高,主要因为约 0.13 mV 的固定差值在 1 mV 信号中占比很大;当前设备无法把 M1K 毫伏级源误差、M1K 自身测量误差、LHA7668 偏移和 2.5 V 参考误差完全分离,因此该结果是端到端准确度,也就是说我的信号源太烂了。
最终准确度传递曲线
最终原始幅值误差
最终线性残差
最终 THD 与幅值SINC4 多 ODR 扫频完整结果
正常 SINC4/SINC3 的输出数据率为:
每个 ODR 测试 (f/\mathrm{ODR}=0.025,0.05,0.1,0.2,0.3,0.4)。
100 SPS,FS=192
200 SPS,FS=96
400 SPS,FS=48
800 SPS,FS=24
SINC4 不同 ODR 的实际频率响应
SINC4 归一化响应SINC4 −3 dB 带宽
数据手册近似:
在相邻实测点之间按 dB 线性插值得到:
100~400 SPS 与手册关系很接近;800 SPS 时除长 UART DATA 文本流接近实际吞吐上限外,两路外加 1 kΩ 与板载约 105 nF 差分等效电容构成的约 758 Hz 模拟低通也会产生额外衰减。
因此,172.20 Hz 是当前完整测量链路的 −3 dB 插值
SINC4 带宽换算四种数字滤波器比较
快速滤波器 ODR 计算:
测试配置:
完整增益结果:
结论:SINC4 滚降最快,归一化带宽最窄,带外衰减最强;SINC3 比 SINC4 更宽;两种快速建立滤波器在 0.4·ODR 仍只有约 1.7~1.9 dB 衰减,更适合快速变化或多通道切换;快速滤波器的代价是本底噪声高于普通 SINC4/SINC3。
四种滤波器比较本底噪声测试
噪声测试把 LHA7668 通道内部配置为 AVSS−AVSS,PGA=1,不使用 M1K 的模拟输出;每项独立采集三次,给出 RMS 中位数:
SINC4 噪声随 ODR 变化
约 200 SPS 滤波器噪声比较动态范围和噪声等效分辨率
在 ±2.5 V 双极性输入范围中,满幅正弦的 RMS 值为:
动态范围:
噪声等效位数:
这些结果只由内部短路噪声换算,未包含:外部 2.5 V 基准噪声与误差;M1K 信号源失真,输入驱动电阻热噪声,ADC 谐波失真、积分非线性和长期漂移,PCB、电源和环境干扰。
因此应称为“噪声等效分辨率”
动态范围随 ODR 变化
噪声等效分辨率后记
我的信号源太差了,确实是喂不饱这颗ADC,另外我的信号源也没有做校准和溯源,确实是做不到就像数据手册上面的数值,但是就从大趋势来看,信号源和 ADC 之间是可以互相佐证的,而且极限还没有到,下一步计划是对信号源做有限的校准,做更多的测试。
如果有厂家有好信号源也可以让我体验一下~