news 2026/10/6 1:23:17

14位ADC的8 LSB台阶与正余弦采样时序对齐实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
14位ADC的8 LSB台阶与正余弦采样时序对齐实战

1. 从一次正余弦采样异常说起

做电机控制或者旋变解码的朋友,大概率都碰过这么一类问题:板子跑得好好的,角度解算突然开始抖,示波器上看波形也没明显异常,代码逻辑翻来覆去查了好几遍,最后定位到的却是 ADC 采样时序上那"多一拍"的差别。我最近在一个旋变软解码项目上就踩了这么个坑,现象是低速段角度噪声偏大,高速段偶尔跳变,折腾了两天才把根因锁定在 14 位 ADC 的 8 LSB 台阶和正余弦两路采样的节拍错位上。

这篇手记就把整个过程拆开讲清楚:为什么 14 位 ADC 会出现 8 LSB 的台阶、这个台阶和正余弦采样"多看一拍"之间是什么关系、INL 和 MDAC 在其中扮演什么角色,以及最后我是怎么改采样时序把问题压下去的。内容偏工程实操,适合正在做旋变解码、伺服电流环采样、或者任何需要正余弦双路同步采样的嵌入式工程师参考。哪怕你用的是 STM32 片内 ADC、外挂 SAR 芯片还是 FPGA 挂高速 ADC,只要涉及双通道相位敏感采样,这里面的坑大概率你也会遇到。

先把结论摆前面:14 位 ADC 出现 8 LSB 的台阶,本质是有效位数和 INL 共同作用的结果,而正余弦采样"多看一拍"是为了让两路采样点落在同一个相位基准上,避免因采样时刻错位引入的角度误差。这两件事单独看都不复杂,叠在一起就容易让人误判成"ADC 坏了"或者"算法有问题"。

2. 14 位 ADC 的 8 LSB 台阶到底是怎么来的

2.1 先搞清楚 LSB 在 14 位系统里的实际权重

很多人一上来就盯着"14 位"这个数字,觉得分辨率够高,8 LSB 应该小到可以忽略。我们先把账算清楚。假设 ADC 满量程参考电压是 3.3V,14 位输出,那么:

1 LSB = 3.3V / 2^14 = 3.3V / 16384 ≈ 201.4 μV 8 LSB = 8 × 201.4 μV ≈ 1.61 mV

单看电压,1.61mV 好像不大。但旋变正余弦信号的幅值通常在 1V~3V 之间,如果按 2V 幅值算,8 LSB 对应的角度误差是多少?正余弦包络的斜率在过零点附近最大,粗略估算:

角度误差 ≈ 8 LSB / 幅值(以LSB计) 幅值 2V 对应 2V / 201.4μV ≈ 9930 LSB 角度误差 ≈ 8 / 9930 rad ≈ 0.0008 rad ≈ 0.046°

单次采样看只有 0.046°,好像也能接受。但问题在于这个台阶是系统性的,不是随机噪声。系统性误差在角度解算里会通过 atan2 放大,尤其是在正余弦两路台阶位置不对齐的时候,误差会成倍累积。这就是为什么低速段角度噪声会明显变大——低速时有用信号变化慢,台阶造成的量化跳变相对更突出。

2.2 8 LSB 台阶和 INL 的关系

这里必须引入 INL(积分非线性)的概念。理想 ADC 的传输曲线是一条直线,实际 ADC 会偏离这条直线,INL 就是描述这种偏离程度的指标,单位通常也是 LSB。一颗标称 14 位的 ADC,如果 INL 是 ±4 LSB,那么在整个输入范围内,实际输出和理想输出的偏差最大能到 4 个 LSB。

那 8 LSB 的台阶是怎么冒出来的?两种典型情况:

第一种是INL 在某个码段出现局部突变。SAR ADC 内部是电容阵列(CDAC),如果某一位电容的权重有偏差,或者比较器在某个码段附近有迟滞,就会在特定码值附近出现一个"台阶"——输出在这个区间内几乎不变,跨过去之后突然跳变。这种台阶宽度往往就是几个 LSB 到十几个 LSB。

第二种是MDAC(乘法数模转换器)级间增益误差。流水线 ADC 里,第一级 MDAC 的增益如果不准,会把误差传递到后级,表现为传输曲线在某些区间斜率异常,累积起来就形成台阶。14 位流水线 ADC 通常有 2~3 级 MDAC,每级增益误差哪怕只有 0.1%,折算到输出端也可能超过 8 LSB。

我这次遇到的属于第一种。用高精度源逐码扫描,画出来的传输曲线在中间某段明显有个"平台",宽度大约 8 个码,跨过去之后又恢复正常斜率。这就解释了为什么角度解算在特定区间会抖——正余弦信号扫过这个码段时,采样值被"卡"住了。

2.3 为什么偏偏是 8 LSB 而不是别的数

这个问题我当时也纠结了很久。后来把 ADC 的内部结构图和电容阵列权重对了一遍才明白:8 LSB 对应的是第 4 位(从低位算起,2^3 = 8)的权重。也就是说,这个台阶很可能是第 4 位电容的匹配误差导致的。在 SAR 转换过程中,第 4 位切换时如果电容实际值与理想值有偏差,就会在对应的码段产生一个固定宽度的台阶。

提示:遇到固定宽度的台阶,先别急着换芯片,用高精度源做一次全码扫描,把台阶位置和宽度记下来,再对照 ADC 数据手册里的电容阵列结构,往往能反推出是哪一位出了问题。

这个发现对后续处理很关键:既然是固定码段的系统性偏差,那就可以在软件层面做补偿,而不一定非要换硬件。当然,如果 INL 整体超标,那还是得从硬件选型和 PCB 布局上找原因。

3. 正余弦采样为什么要"多看一拍"

3.1 正余弦采样的相位基准问题

旋变输出的正弦和余弦是两路正交信号,角度信息藏在两路的比值里。理想情况下,两路应该在同一时刻采样,这样 atan2(sin, cos) 才能还原出正确的角度。但实际系统里,两路信号往往接到 ADC 的不同通道,而 ADC 多通道采样是分时复用的——同一时刻只能采一路。

这就带来一个根本矛盾:物理上无法同时采样两路,但算法上又要求两路对应同一时刻。解决思路无非两种:一是用两路独立的 ADC 同时采,二是用一路 ADC 快速轮流采,把时间差压到足够小。前者成本高,后者是主流做法,但后者就引出了"多看一拍"的问题。

假设 ADC 采样一轮正弦和余弦需要的时间是 T_sample,那么余弦采样时刻比正弦晚了 T_sample。如果电机在转动,这 T_sample 时间内角度已经变了,两路信号对应的其实不是同一个角度。转速越高,这个偏差越大。

3.2 "多看一拍"的本质是相位对齐

所谓"多看一拍",并不是真的多采一次数据,而是在时序上让两路采样点对齐到同一个相位基准。具体做法有几种,我这次用的是最常见的一种:在正弦采样完成后,不立即采余弦,而是等一个固定的延时,让余弦采样时刻正好落在正弦采样时刻的"等效相位"上。

听起来有点绕,用个生活类比:你用两台相机拍一个转动的风扇,一台先拍,一台后拍,两张照片里扇叶角度不一样。要还原扇叶的真实角度,你得知道两台相机的时间差,然后把后拍的那张"倒推"回先拍的时刻。ADC 采样也是同理,只不过倒推是在时序设计阶段完成的,不是事后算的。

具体到实现,我这次的做法是:

  1. 配置 ADC 为规则组扫描模式,正弦通道在前,余弦通道在后。
  2. 采样时间设置为固定的 N 个 ADC 时钟周期。
  3. 在两次转换之间插入一个可调的延时,延时长度根据电机最高转速和 ADC 转换时间计算。
  4. 用定时器触发整个扫描序列,保证采样节拍和 PWM 载波同步。

这个延时就是"多看一拍"的物理体现。它不是随便加的,而是根据转速范围算出来的。

3.3 延时长度怎么算

假设电机最高转速对应电角度变化率为 ω_max(rad/s),ADC 一轮扫描时间为 T_scan,那么两路采样之间的最大角度偏差为:

Δθ_max = ω_max × T_scan

要让这个偏差小于允许的角度误差 Δθ_allow,就需要:

T_scan ≤ Δθ_allow / ω_max

如果 T_scan 本身已经满足要求,那"多看一拍"其实是为了让采样点落在信号平稳区,而不是为了补偿时间差。这一点很多人会混淆。我这次的情况是:ADC 转换时间本身够快,但正余弦信号在 PWM 开关瞬间有振铃,如果采样点正好落在振铃区,两路都会采到畸变值。多看一拍,是把采样点往后挪,避开振铃,等信号稳定了再采。

所以"多看一拍"有两个作用:一是相位对齐,二是避开开关噪声。具体偏重哪个,取决于你的系统。我这次主要是第二个原因,但第一个也不能忽略。

4. 实操:从现象到定位的完整过程

4.1 现象记录与初步排查

问题最初的表现是:电机低速运行时,角度反馈噪声明显,用示波器看 DAC 输出的角度波形,能看到周期性的小抖动。高速时偶尔出现角度跳变,导致电流环瞬间失稳。

排查顺序是这样的:

  1. 先确认不是算法问题——把 atan2 换成查表法,现象依旧,排除算法。
  2. 再确认不是信号调理问题——用示波器直接看旋变输出,信号干净,排除调理电路。
  3. 然后怀疑 ADC——用高精度源替代旋变信号,输入标准正弦,看采样结果。
  4. 最后定位到 ADC 传输曲线的台阶。

这一步很关键:用已知的干净信号替代真实信号,能把问题范围缩小到 ADC 本身。如果替代后现象消失,那问题在信号链前端;如果现象依旧,那问题在 ADC 或采样时序。

4.2 全码扫描与台阶定位

用高精度电压源给 ADC 输入从 0 到满量程缓慢扫描,同时记录 ADC 输出。把输出对输入作图,理想情况是一条直线,实际会看到台阶。我这次扫出来的曲线,在中间码段有一个明显的平台,宽度约 8 个码。

为了确认这个台阶是 ADC 本身的还是采样时序造成的,我又做了一次对比实验:把采样率降到很低,让每次转换都有充足的建立时间。结果台阶依然存在,说明是 ADC 本身的 INL 问题,不是采样时序。

注意:做全码扫描时,电压源的精度至少要比 ADC 的 LSB 高一个数量级,否则你测到的可能是源的问题而不是 ADC 的问题。我用的源精度是 1μV 级别,足够覆盖 201μV 的 LSB。

4.3 采样时序的调整

确认台阶是 ADC 本身的问题后,我做了两件事:

第一,在软件里对台阶码段做补偿。因为台阶位置固定,可以在采样值落入该区间时,根据历史数据做插值修正。这个方法治标不治本,但在不换硬件的前提下能明显改善。

第二,调整采样时序,把正余弦采样点往后挪,避开 PWM 振铃区。具体是把 ADC 触发时刻从 PWM 中心对齐改为中心后延时 D 个时钟。D 的取值通过实验确定:从 0 开始逐步增加,观察角度噪声,找到噪声最小的点。

实测下来,D 取 1.5μs 左右效果最好。这个值不是算出来的,是试出来的——因为振铃的衰减时间和 PCB 布局、驱动参数都有关,理论计算很难准。

4.4 补偿前后的对比

补偿前,低速段角度噪声峰峰值约 0.5°,高速段偶发 2° 以上跳变。补偿后,低速段噪声降到 0.1° 以内,高速段跳变基本消失。这个改善对电流环的平稳性提升很明显,电机运行时的音频噪声也小了一截。

指标补偿前补偿后
低速角度噪声峰峰值约 0.5°小于 0.1°
高速角度跳变偶发 2° 以上基本消失
电流环稳态误差偏大明显减小
运行音频噪声较明显明显降低

5. 常见问题与排查技巧实录

5.1 台阶和噪声怎么区分

很多人会把 INL 台阶和随机噪声混为一谈。区分方法很简单:台阶是确定性的,噪声是随机的。把同一输入电压反复采样多次,如果输出值稳定地偏向某一侧,那是台阶;如果输出值在几个码之间随机跳,那是噪声。

另一个区分方法是看台阶是否随输入变化。固定输入下,台阶表现为输出不变;输入缓慢变化时,输出会在某个点突然跳变。噪声则是一直在跳。

5.2 采样时序调整的常见误区

调整采样时序时,最容易犯的错是只调延时不管触发源。ADC 触发源如果和 PWM 不同步,延时调得再准也没用,因为每次采样的相位基准都在变。正确做法是让 ADC 触发严格跟随 PWM 周期,延时只在触发之后调整。

第二个误区是延时加得太大。延时太大,采样点可能落到下一个 PWM 周期的振铃区,或者错过信号的有效区间。一般来说,延时不要超过 PWM 周期的 10%。

第三个误区是忽略 ADC 自身的转换时间。多通道扫描时,通道之间的切换需要建立时间,如果采样时间设得太短,前一个通道的残留电荷会影响后一个通道。这个在正余弦采样里特别明显,因为两路信号幅值可能差很多。

5.3 常见问题速查表

现象可能原因排查方法解决思路
角度低速噪声大ADC 台阶、采样点落在振铃区全码扫描、调整延时软件补偿、避开振铃
角度高速跳变两路采样时间差过大测量两路采样间隔缩短扫描时间、相位对齐
采样值周期性偏差PWM 干扰、触发不同步示波器看触发信号触发源同步 PWM
通道间串扰采样时间不足、建立不够增大采样时间对比增加采样周期
INL 整体超标芯片本身、PCB 布局全码扫描换芯片、改布局

5.4 几个我踩过的坑

第一个坑:以为 14 位就够用。实际上有效位数(ENOB)往往只有 11~12 位,剩下的位数被噪声和 INL 吃掉了。选型时不能只看标称位数,要看 ENOB 和 INL。

第二个坑:忽略 MDAC 级间增益误差。流水线 ADC 的 MDAC 增益误差是累积的,第一级的误差会被后级放大。如果发现台阶出现在特定码段且宽度和某一位权重吻合,优先怀疑 MDAC。

第三个坑:采样时序改了但没重新标定。时序一变,采样点的相位就变了,之前标定的角度偏移量可能就不准了。改时序后一定要重新做一次角度标定。

第四个坑:只看单次采样不看统计。单次采样看不出台阶,因为台阶是统计特性。要采足够多的点,做直方图或者传输曲线,才能看出来。

6. 关于 ADC 选型和布局的几点经验

6.1 选型时看什么指标

做正余弦采样,选 ADC 时我一般按这个优先级看:

  1. ENOB:比标称位数更重要,直接决定实际能分辨的最小信号。
  2. INL:正余弦采样对 INL 敏感,因为角度解算依赖两路的相对精度。
  3. 通道间匹配:多通道 ADC 的通道间增益和偏移匹配很关键,不匹配会直接引入角度误差。
  4. 采样保持建立时间:建立时间不够,采样值会受前一个通道影响。
  5. 触发灵活性:能不能和 PWM 同步触发,决定了采样时序能不能精细调整。

标称位数放在最后看,因为现在主流 ADC 标称位数都够,差别在有效位数和线性度上。

6.2 布局上注意什么

PCB 布局对 ADC 性能的影响,比很多人想象的大。几个要点:

  • 模拟输入走线尽量短,远离开关节点。
  • 参考电压要干净,去耦电容紧贴引脚。
  • 模拟地和数字地单点连接,避免地环路。
  • 正余弦两路走线等长,减少通道间时间差。

我这次的问题,有一部分就是正余弦走线不等长导致的。虽然差别只有几毫米,但在高速采样下,几毫米的走线差对应的时间差已经能影响角度精度了。后来把两路走线改成严格等长,配合时序调整,效果才稳定下来。

6.3 软件补偿的边界

软件补偿能解决一部分 INL 问题,但不是万能的。如果 INL 整体超标,或者台阶随温度漂移,软件补偿就很难跟。我的一般原则是:INL 在 ±2 LSB 以内,软件补偿;超过 ±4 LSB,考虑换芯片。中间地带看具体应用对精度的要求。

另外,软件补偿需要标定数据。标定一次只能覆盖一个温度点,如果工作温度范围宽,需要做温度补偿表。这个工作量不小,选型时就要考虑进去。

7. 写在最后的一点个人体会

这个项目折腾下来,最大的感受是:ADC 的问题,十有八九不是 ADC 本身的问题,而是采样时序和信号链的问题。14 位 ADC 的 8 LSB 台阶,听起来像个芯片缺陷,实际上更多是系统设计里各种因素叠加的结果。正余弦采样"多看一拍",也不是什么高深技巧,就是把采样点放到该放的位置上。

我现在做新项目,ADC 部分一定会预留两个调试手段:一是可调的采样延时,二是全码扫描的测试接口。这两个东西平时不用,但一旦出问题,能省下大量排查时间。另外,正余弦采样一定要用示波器确认两路采样时刻的实际间隔,不要只看代码里的配置,因为从触发到实际采样,中间还有 ADC 内部的状态机延迟。

最后分享一个小技巧:如果怀疑是采样时序问题,可以先把采样率降到最低,让每次转换都有充足的建立时间。如果问题消失,那基本可以确定是时序问题;如果问题依旧,那再往 ADC 本身或者信号链前端查。这个二分法我用了很多次,屡试不爽。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 1:22:56

半桥与全桥怎么选?无刷电机驱动拓扑解析及MOS管炸机实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:22:15

运放跟随器自激振荡的根源排查与稳定性补偿实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:21:35

DP4620IY国产替代LTM4620IY:PoL稳压器热设计与瞬态响应升级指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:21:02

RTL8211EG千兆降速真相:硬件设计决定PHY协商成败

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:20:38

Vivado中AXI Interconnect自动连接与优化配置完全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华