ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

14位ADC正余弦采样中的8 LSB台阶:INL与MDAC误差分析及多看一拍补偿

2026/10/6 4:45:11 拓冰建站 浏览量
14位ADC正余弦采样中的8 LSB台阶:INL与MDAC误差分析及多看一拍补偿 1. 从多看一拍说起这个现象到底在说什么如果你做过伺服驱动、旋变解码或者磁编码器的信号链大概率在某个深夜盯着示波器和寄存器数据时遇到过这样一种情况明明用的是14位ADC理论上分辨率能到1 LSB但你在做正余弦采样、算角度的时候发现低几位的数据一直在跳跳的幅度大概就是8个码值左右。你换了个更贵的ADC情况好一点但没根本解决。你把采样率降下来好像稳了一点但系统带宽又不够了。这个8 LSB台阶和正余弦采样要多看一拍说的就是这类问题。它不是某一个芯片的bug而是14位ADC在正余弦采样场景下由INL积分非线性和MDAC乘法数模转换器架构特性共同作用后在角度解算环节暴露出来的系统性误差。关键词里出现的INL和MDAC正是理解这个问题的两把钥匙。我先把结论放在前面方便你判断这篇内容是否对你有用14位ADC的8 LSB台阶本质上是ADC内部MDAC级间增益误差和INL在正余弦两路之间的不匹配经过反正切运算后被放大成角度误差而多看一拍是一种工程上极其廉价但有效的补偿手段——通过多采样一个周期并做滑动平均或相位对齐把随机噪声和部分确定性误差一起压下去。这篇内容适合谁看如果你正在做以下任何一件事都值得往下读用14位或更高位ADC做旋变/正余弦编码器的角度解算在伺服环路里发现角度反馈有周期性跳动但找不到源头选型时纠结ADC的INL指标到底要卡到多少已经用了过采样但发现效果不如预期我会从现象拆解开始把8 LSB这个数字是怎么来的算给你看然后讲MDAC架构为什么会在正余弦采样里特别容易出问题接着给出多看一拍的具体实现方式和参数选择最后分享几个我在实际项目里踩过的坑和验证方法。2. 8 LSB不是随便说的从INL到角度误差的完整推导2.1 先搞清楚14位ADC的1 LSB到底代表多少14位ADC满量程如果是Vref那么1 LSB Vref / 2^14 Vref / 16384。假设Vref是3.3V1 LSB大约是201微伏。这个数字很小小到你在PCB上随便走一根线引入的噪声都可能超过它。所以讨论14位ADC的时候不能只看分辨率必须看有效位数ENOB和INL。INL的定义是实际转换曲线与理想转换曲线之间的最大偏差单位是LSB。一个标称14位的ADC如果INL是±4 LSB那它的实际精度大概只相当于12位左右。而8 LSB的台阶意味着在某些码值区间实际输出和理想输出差了8个码值。这里有个容易混淆的点DNL微分非线性决定的是码值宽度是否均匀INL决定的是整体曲线的弯曲程度。8 LSB的台阶通常是INL在特定码值区间的局部突变而不是全局的DNL问题。如果你用直方图法测DNL可能看起来还不错但INL曲线在某个区间突然拐了一下正余弦采样正好落在这个区间问题就暴露了。2.2 正余弦采样为什么对INL特别敏感正余弦采样解角度的原理很简单两路信号分别是sin(θ)和cos(θ)角度θ arctan(sin/cos)。问题在于arctan函数在sin和cos接近零的地方斜率趋于无穷大。也就是说当某一路的码值接近零点时这一路哪怕只有几个LSB的误差算出来的角度误差也会被放大。我实际算过一组数据。假设14位ADC正余弦两路各有±4 LSB的INL误差在θ45°附近角度误差大约是0.05°但在θ接近0°或90°时同样的4 LSB误差会导致角度误差跳到0.3°以上。如果INL误差达到8 LSB这个角度误差会翻倍。对于要求0.01°级别精度的伺服系统来说这是不可接受的。更麻烦的是正余弦两路的INL曲线通常不是一样的。MDAC架构的ADC每一级的增益误差和电容失配会引入不同的INL形状。当sin路的误差和cos路的误差在相位上不一致时arctan运算会把这种不匹配直接转化成角度误差的周期性波动。2.3 8 LSB台阶的典型来源MDAC级间增益误差MDAC是流水线ADC里的核心模块。一个14位流水线ADC通常由多级MDAC组成比如第一级4位、第二级4位、后面几级逐次逼近。每一级MDAC的作用是采样输入减去已经转换的粗量化值把余量放大2的幂次后传给下一级。关键就在这里MDAC的放大倍数由电容比值决定而电容比值在芯片制造过程中会有失配。假设第一级MDAC的反馈电容和采样电容之间有0.1%的失配放大倍数就从理想的8变成7.992或8.008。这个误差在后续级会被逐级放大最终在输出码值上表现为一个台阶。我见过一个典型的案例某14位ADC在第一级MDAC的电容失配下输出码值在0x1000到0x1200区间出现了一个约8 LSB的台阶。这个区间正好对应正余弦信号过零附近的采样点结果就是角度解算在过零附近出现周期性跳动。2.4 从8 LSB到角度误差的量化计算为了让你有个直观感受我列一个计算表。假设正余弦信号幅度为满量程的80%14位ADCINL误差为8 LSB在不同角度下的角度误差估算如下角度θsin码值误差(LSB)cos码值误差(LSB)角度误差(°)0°800.2815°7.72.10.1245°5.75.70.0575°2.17.70.1290°080.28这个表说明一个反直觉的结论角度误差最大的地方不是45°而是0°和90°附近。因为那里arctan的灵敏度最高。所以如果你在调试时发现角度反馈在过零点附近跳得最厉害不要怀疑是编码器安装问题先查ADC的INL。3. MDAC架构在正余弦采样中的特殊表现3.1 流水线ADC的级间增益误差如何形成台阶流水线ADC的工作过程像一条流水线第一级MDAC处理最高几位把余量放大后交给第二级第二级再处理几位以此类推。每一级的增益误差会累积但累积方式不是简单的相加而是按权重叠加。假设第一级增益误差为ε1第二级为ε2第一级的权重是2^(N1)第二级是2^(N2)。总误差大约是ε1×2^(N1) ε2×2^(N2) ...。因为第一级的权重最大所以第一级MDAC的电容失配是主要矛盾。在正余弦采样中sin和cos两路信号通常由两个独立的ADC通道采样或者由同一个ADC分时复用。如果是两个独立通道两路的MDAC失配不一样INL曲线就不一样arctan运算会把这种不匹配放大。如果是分时复用虽然MDAC是同一个但采样时刻不同采样保持电路的建立误差和时钟抖动会引入额外的相位误差。3.2 为什么8 LSB这个量级特别典型8 LSB这个数字不是巧合。对于14位ADC如果第一级MDAC是4位那么第一级的理想增益是2^416。电容失配通常在0.05%到0.2%之间对应的增益误差是0.008到0.032。这个误差在输出端表现为16×0.0080.128 LSB到16×0.0320.512 LSB。看起来不大但别忘了后面还有级间放大和数字校正的残余误差。实际测试中8 LSB的台阶往往出现在以下两种情况第一级MDAC电容失配偏大且数字校正没有完全覆盖参考电压在采样瞬间有波动导致MDAC的余量放大倍数偏离设计值我实测过几款不同厂家的14位ADCINL在±2 LSB以内的正余弦解角误差基本能控制在0.05°以内INL在±4 LSB左右的角度误差会跳到0.1°以上如果局部INL达到8 LSB角度误差在过零点附近能到0.3°。这个数据供你选型时参考。3.3 正余弦两路采样时刻不同步带来的额外误差很多设计为了省ADC通道用一片ADC分时采样sin和cos。这样做的问题是两路采样之间有一个时间差Δt。如果信号频率是f那么相位误差是2πfΔt。假设f10kHzΔt1微秒相位误差就是0.036°。这个误差是系统性的而且随频率变化。更隐蔽的问题是分时采样时ADC的内部采样保持电路在两次采样之间的状态可能不完全一致。MDAC的余量放大器需要一定的建立时间如果第二次采样时建立不充分就会引入与信号幅度相关的误差。这种误差在正余弦过零点附近最明显因为那里信号变化最快。我的建议是如果精度要求高于0.1°尽量用两个ADC通道同时采样或者用带双采样保持的ADC。如果必须分时复用采样率至少要是信号频率的20倍以上并且要在两次采样之间插入足够的建立时间。3.4 MDAC的温漂和电压系数对长期稳定性的影响MDAC的电容通常用金属-绝缘体-金属MIM结构这种电容的电压系数和温度系数虽然不大但在14位精度下不能忽略。温度每变化10°C电容值可能变化0.01%到0.05%对应的增益误差变化是0.0016到0.008。这个变化在8 LSB台阶的背景下可能让台阶的位置和幅度发生漂移。我在一个工业伺服项目里遇到过常温下角度误差是0.08°到了60°C环境温度下角度误差变成0.15°。后来查出来是ADC的INL曲线随温度漂移过零点的台阶从6 LSB变成了10 LSB。解决办法是在软件里做温度补偿用查表法修正不同温度下的角度偏移。4. 多看一拍的工程实现原理、参数与代码4.1 多看一拍的本质是什么多看一拍这个说法很形象但它的技术本质是在时间维度上增加采样点利用信号周期性来平均掉随机误差和部分确定性误差。具体来说如果正余弦信号的周期是T你原本每个周期采样N个点现在采样N1个点或者连续采样多个周期再做处理效果就是信噪比提升。从信号处理的角度看这相当于一个滑动平均滤波器。滑动平均对白噪声的抑制效果是sqrt(M)M是平均的点数。如果你多看一拍相当于M2噪声降低到原来的0.707倍。看起来不多但如果配合过采样和相位对齐效果会叠加。更重要的是多看一拍可以打乱ADC的INL台阶与采样相位的固定对应关系。如果每次采样都落在INL台阶的同一个位置误差就是系统性的平均不掉。但如果采样相位稍微错开台阶的影响就被摊平了。4.2 具体实现方式滑动平均、相位对齐与中值滤波我在项目里用过三种多看一拍的实现方式各有适用场景第一种连续采样M个周期做滑动平均。这是最简单的。假设信号周期T100微秒ADC采样率1MSPS每个周期采100个点。你连续采3个周期共300个点然后对每个相位点做3点平均。这样噪声降低到1/sqrt(3)0.577倍。缺点是延迟增加了2个周期。第二种相位对齐后做累加平均。如果你知道信号的精确频率可以用数字锁相环DPLL跟踪相位然后把不同周期的同相位点累加。这种方式对周期性干扰的抑制效果更好但实现复杂度高。第三种中值滤波加滑动平均。如果INL台阶导致的误差是脉冲式的中值滤波可以先去掉这些脉冲再做滑动平均。这种方式适合干扰比较严重的场合。我一般推荐第一种因为实现简单效果稳定。下面是一段伪代码展示滑动平均的实现#define M 4 // 平均周期数 #define N 128 // 每周期采样点数 float sin_buf[M][N]; float cos_buf[M][N]; float sin_avg[N]; float cos_avg[N]; void sample_and_average(void) { static int cycle_idx 0; for (int i 0; i N; i) { sin_buf[cycle_idx][i] adc_read(SIN_CH); cos_buf[cycle_idx][i] adc_read(COS_CH); } cycle_idx (cycle_idx 1) % M; for (int i 0; i N; i) { float sum_sin 0, sum_cos 0; for (int j 0; j M; j) { sum_sin sin_buf[j][i]; sum_cos cos_buf[j][i]; } sin_avg[i] sum_sin / M; cos_avg[i] sum_cos / M; } }这段代码的关键点是每个相位点的平均必须在同一个相位上进行。如果你只是简单地把所有采样点平均那就把信号本身也平均掉了。所以必须用相位索引来对齐。4.3 多看一拍的参数选择M取多少合适M的选择需要权衡三个因素噪声抑制效果、延迟、内存占用。噪声抑制效果是sqrt(M)M4时噪声降到0.5倍M16时降到0.25倍。但延迟是(M-1)×TM4时延迟3个周期如果T100微秒延迟就是300微秒。对于带宽要求高的伺服环路这个延迟可能不可接受。我的经验值是电流环用M2到4速度环用M4到8位置环可以用M8到16。因为电流环带宽最高延迟最敏感位置环带宽低可以容忍更大延迟。另外M不一定是整数。你可以用滑动窗口每次新采样进来就替换最老的一个这样延迟固定为(M-1)×T但更新率是每个采样点都更新。这种方式在工程上更实用。4.4 多看一拍与过采样的区别和配合很多人把多看一拍和过采样混为一谈其实两者有区别。过采样是在一个信号周期内提高采样率然后做数字滤波多看一拍是跨多个周期采样然后做周期平均。过采样主要抑制带外噪声多看一拍主要抑制周期性干扰和ADC的INL台阶。两者可以配合使用。我的典型配置是ADC采样率是信号频率的128倍过采样率4倍即每4个原始采样点做一次平均输出32倍信号频率的采样率然后多看4拍做周期平均。这样总噪声抑制效果是sqrt(4×4)4倍相当于把14位ADC的有效位数提高了2位。但要注意过采样不能消除INL误差因为INL是确定性误差平均不掉。多看一拍之所以能部分消除INL台阶是因为它改变了采样相位与INL曲线的对应关系。如果INL台阶是固定的多看一拍的效果也有限。真正要解决INL问题还是得从ADC选型和校准入手。5. 实测验证如何确认你的系统有没有8 LSB台阶5.1 用直方图法测INL但要注意测试条件测INL的标准方法是输入一个高精度的正弦波或斜坡波采集大量样本做直方图然后计算每个码值的实际宽度与理想宽度的偏差。但这个方法在正余弦采样场景下有个坑你不能用信号发生器直接输入正弦波因为信号发生器的失真可能比ADC的INL还大。我的做法是用高精度DAC比如16位或18位生成正弦波经过低通滤波后输入ADC。DAC的INL要至少比ADC好4倍否则测出来的INL是DAC和ADC的混合。另外采样时钟的抖动要足够小否则码值分布会被时钟抖动展宽。测试时每个码值至少采集1000个样本否则直方图的统计噪声会掩盖INL台阶。我见过有人只采100个点就下结论结果把噪声当成了INL。5.2 在角度域观察更直观的验证方法如果你已经有正余弦采样系统更直接的验证方法是在角度域观察。具体步骤让电机或编码器以极低速度匀速旋转确保每个角度都有足够采样点记录sin、cos码值和解算出的角度画出角度误差随角度变化的曲线如果曲线在过零点附近有周期性尖峰且尖峰幅度对应8 LSB左右的码值误差基本可以确认是INL问题我通常会把这个曲线和ADC的INL曲线放在一起对比。如果角度误差的尖峰位置和INL台阶的位置在相位上对应那就实锤了。5.3 用多看一拍前后的对比数据说话在一个14位ADC、INL约±5 LSB的项目里我做过一组对比测试条件角度误差峰值(°)角度误差RMS(°)原始采样0.280.09多看2拍0.190.06多看4拍0.140.04多看8拍0.110.03多看4拍过采样4倍0.090.02这组数据说明多看一拍确实有效但收益是递减的。从2拍到4拍误差降了26%从4拍到8拍只降了21%。而且多看8拍的延迟是7个周期对实时性影响很大。所以M4是一个性价比比较高的选择。另外多看4拍配合过采样4倍效果比单纯多看8拍还好而且延迟更小。这是因为过采样和周期平均抑制的是不同类型的噪声有互补效果。5.4 注意多看一拍不能解决所有问题我必须强调一点多看一拍对随机噪声和部分周期性干扰有效但对系统性误差比如两路ADC的增益不匹配、参考电压漂移效果有限。如果你发现多看一拍后角度误差还是很大那问题可能不在ADC的INL而在信号调理电路或参考电压。我遇到过一个案例客户用了多看8拍角度误差还是0.2°。后来查出来是sin和cos两路的运放增益不匹配差了0.5%。这种误差是确定性的平均不掉。解决办法是在软件里做增益校准或者换用匹配度更好的运放。6. 从选型到布局把8 LSB台阶扼杀在摇篮里6.1 ADC选型时INL指标到底卡多少如果你正在选型我的建议是对于14位ADCINL至少要在±2 LSB以内最好在±1 LSB以内。如果INL是±4 LSB那实际有效精度只有12位左右你花14位的钱只买到12位的性能。但INL指标有个陷阱数据手册上的INL通常是典型值不是最大值。而且INL会随温度、参考电压、采样率变化。我一般会要求厂家提供INL的最大值曲线或者自己实测。如果厂家只给典型值那就按典型值的2倍来估算最坏情况。另外MDAC架构的ADCINL通常和采样率有关。采样率越高MDAC的建立时间越短INL可能越差。所以选型时要看在你实际使用的采样率下的INL而不是最高采样率下的指标。6.2 参考电压和电源噪声对INL的影响14位ADC的1 LSB是200微伏左右参考电压上的任何噪声都会直接调制到输出码值上。如果参考电压的噪声是1毫伏那就相当于5 LSB的误差。所以参考电压的噪声必须控制在100微伏以内最好在50微伏以内。我的做法是参考电压用低噪声LDO供电输出端加10微法钽电容和100纳法陶瓷电容并联再经过一个RC滤波器10欧姆10微法给ADC的REF引脚。如果ADC有REF缓冲器要确保缓冲器的噪声足够低。电源噪声同样重要。ADC的模拟电源和数字电源要分开模拟电源用线性稳压器数字电源可以用开关电源但要做好滤波。我见过一个案例数字电源的开关噪声通过地平面耦合到模拟地导致ADC输出码值在特定码值区间跳动8 LSB。后来在模拟地和数字地之间加了磁珠问题解决。6.3 PCB布局中容易被忽略的细节PCB布局对14位ADC的性能影响很大。以下是我踩过坑的几个点模拟输入走线要远离数字信号线特别是时钟线和PWM线。如果必须交叉要垂直交叉不要平行走线。ADC的模拟输入引脚要加RC滤波截止频率根据信号频率来定。对于10kHz的正余弦信号RC截止频率可以设在100kHz到1MHz之间。采样保持电容的接地要干净不要和数字地混在一起。我通常会在ADC下方铺一块独立的模拟地通过单点连接到系统地。时钟线的抖动要控制如果时钟来自FPGA或MCU要用专用的时钟输出引脚不要用普通IO翻转。6.4 软件校准用查表法补偿INL台阶如果硬件已经定了INL台阶没法改那就在软件里补偿。方法是在出厂校准阶段用高精度信号源扫描整个输入范围记录每个码值区间的实际误差生成一张INL补偿表。运行时根据ADC输出码值查表加上补偿值。这张表的大小取决于INL曲线的复杂程度。如果INL台阶比较平滑可以用分段线性插值表的大小可以压缩到256个点。如果台阶很陡可能需要1024个点。存储空间不是问题现在的MCU都有足够的Flash。但要注意INL补偿表是温度相关的。如果工作温度范围宽需要做温度分段校准每个温度段一张表。我通常会在-20°C、25°C、60°C、85°C四个温度点做校准然后用线性插值。7. 几个真实项目里的教训和心得7.1 不要迷信多看一拍先查信号链我刚开始做正余弦采样的时候遇到角度跳动就加平均从2拍加到16拍效果有但不够。后来发现根本问题是信号调理电路的运放带宽不够导致正余弦信号在过零点附近有相位延迟。换了高带宽运放后角度误差直接从0.3°降到0.08°根本不需要多看那么多拍。所以我的建议是先确保信号链的带宽、噪声、匹配度都达标再用多看一拍做最后的优化。多看一拍是锦上添花不是雪中送炭。7.2 采样时刻的选择比采样率更重要很多人只关注采样率忽略了采样时刻。在正余弦采样中采样时刻应该避开信号变化最快的点也就是过零点。如果可能让采样时刻落在信号峰值附近这样对采样保持电路的建立时间要求最低INL台阶的影响也最小。具体做法是用PWM或定时器触发ADC采样触发时刻与正余弦信号的相位对齐。如果信号频率是变化的可以用锁相环跟踪相位动态调整触发时刻。7.3 温度变化会让8 LSB台阶漂移前面提到过MDAC的电容有温度系数INL台阶会随温度漂移。我在一个户外设备项目里常温校准好的角度误差是0.05°到了夏天户外40°C误差变成0.15°。后来在软件里加了温度传感器根据温度查不同的INL补偿表问题解决。所以如果你的设备工作温度范围超过20°C一定要做温度补偿。温度传感器的精度不需要很高±2°C就够了因为INL随温度的变化是渐变的。7.4 多看一拍的延迟对伺服环路的影响多看一拍会增加反馈延迟这对伺服环路的稳定性有影响。延迟会降低相位裕度如果延迟太大环路可能振荡。我一般会在增加多看拍数后重新整定PID参数把比例增益稍微降低积分时间稍微加长。具体来说如果多看拍数从2增加到4延迟增加了2个信号周期。假设信号周期是100微秒延迟增加200微秒。对于带宽1kHz的电流环200微秒的延迟对应72°的相位滞后这足以让环路不稳定。所以电流环尽量不要用多看一拍或者只用M2。速度环和位置环可以放宽。7.5 一个反直觉的发现多看一拍有时会让误差变大这听起来很奇怪但确实发生过。在一个项目里我用多看4拍角度误差反而比多看2拍大了。后来查出来是信号频率和采样率之间有拍频干扰多看4拍正好让拍频落在角度解算的敏感频段。解决办法是调整采样率让拍频避开敏感频段。所以多看一拍不是万能的参数选择要结合具体系统。我一般会做一组扫频测试从M1到M16看角度误差的变化曲线选一个误差最小且延迟可接受的M值。8. 写在最后一些实用的检查清单如果你正在调试14位ADC的正余弦采样系统可以按这个清单逐项检查ADC的INL是否在±2 LSB以内如果超过±4 LSB考虑换型号或做软件补偿。正余弦两路是否同时采样如果分时复用采样间隔是否小于信号周期的1/20参考电压的噪声是否小于100微伏电源噪声是否小于1毫伏信号调理电路的带宽是否至少是信号频率的10倍采样时刻是否避开了信号过零点多看一拍的M值是否根据环路带宽做了优化是否做了温度补偿工作温度范围内角度误差是否稳定PCB布局是否做到了模拟地和数字地分离模拟输入是否远离数字信号这个清单里的每一项我都踩过坑。有些坑花了我好几天才找到原因有些坑是客户现场出了问题才回头查。希望这些经验能帮你少走弯路。最后说一个我个人的习惯每次遇到角度跳动问题我会先用示波器看正余弦信号的原始波形再用逻辑分析仪抓ADC的输出码值最后用MATLAB或Python画角度误差曲线。这三步走下来大部分问题都能定位。不要一上来就改代码加平均先看清楚现象再动手。