
电容阵列的 mismatch 像牛皮癣一样困扰着高精度 SAR ADC 设计。今天咱们聊点硬核的—
—用 Split ADC 架构配合 LMS 算法实现 16bit 精度的数字校正。先别急着关页面,虽然原
理来自国外论文,但代码实现咱们自己从头撸。
Split ADC 的核心是双通道交替采样,这相当于给 ADC 装了个实时自检系统。想象下两个
ADC 模块互为标尺,每次转换后交换角色校准对方。代码里用 interleave_pattern 处理采
样时序:
```matlab
adc1_samples = raw_data(1:2:end);
adc2_samples = raw_data(2:2:end);
cross_cal_enable = mod(frame_cnt,256)==0; % 每 256 帧交换校准角色
```
这种乒乓操作让校准误差不会随时间累积。但真正解决 mismatch 问题还得靠 LMS 算法,
它的权重更新逻辑藏在下面这个看似简单的循环里:
```matlab
for k = 1:num_cycles
err = desired(k) - adc_out(k);
weights = weights + mu * err * cap_vector(k,:)'; % 关键在此!
% 注意 mu 值需要根据电容权重动态调整
if mod(k,1000)==0
mu = max(mu/1.2, 1e-7); % 动态学习率衰减
end
end
```
这里的 cap_vector 可不是普通数组,每个元素对应电容权重系数。实测发现当 LSB 电容
误差超过 0.05%时,传统校准直接崩盘,但 LMS 还能保持 2LSB 以内的残差。
建模时特意给电容加了随机失配:
```matlab
cap_mismatch = 1 + (randn(16,1)*0.001); % 0.1%随机误差
ideal_caps = 2.^(0:15)';
real_caps = ideal_caps .* cap_mismatch;
```
跑完校准流程后对比 INL 变化,肉眼可见的改善:
```matlab
subplot(211);
plot(INL_raw,'r'); title('校准前');
subplot(212);
plot(INL_calibrated,'b'); ylim([-15 15]);