ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

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.3V14 位输出那么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 采样也是同理只不过倒推是在时序设计阶段完成的不是事后算的。具体到实现我这次的做法是配置 ADC 为规则组扫描模式正弦通道在前余弦通道在后。采样时间设置为固定的 N 个 ADC 时钟周期。在两次转换之间插入一个可调的延时延时长度根据电机最高转速和 ADC 转换时间计算。用定时器触发整个扫描序列保证采样节拍和 PWM 载波同步。这个延时就是多看一拍的物理体现。它不是随便加的而是根据转速范围算出来的。3.3 延时长度怎么算假设电机最高转速对应电角度变化率为 ω_maxrad/sADC 一轮扫描时间为 T_scan那么两路采样之间的最大角度偏差为Δθ_max ω_max × T_scan要让这个偏差小于允许的角度误差 Δθ_allow就需要T_scan ≤ Δθ_allow / ω_max如果 T_scan 本身已经满足要求那多看一拍其实是为了让采样点落在信号平稳区而不是为了补偿时间差。这一点很多人会混淆。我这次的情况是ADC 转换时间本身够快但正余弦信号在 PWM 开关瞬间有振铃如果采样点正好落在振铃区两路都会采到畸变值。多看一拍是把采样点往后挪避开振铃等信号稳定了再采。所以多看一拍有两个作用一是相位对齐二是避开开关噪声。具体偏重哪个取决于你的系统。我这次主要是第二个原因但第一个也不能忽略。4. 实操从现象到定位的完整过程4.1 现象记录与初步排查问题最初的表现是电机低速运行时角度反馈噪声明显用示波器看 DAC 输出的角度波形能看到周期性的小抖动。高速时偶尔出现角度跳变导致电流环瞬间失稳。排查顺序是这样的先确认不是算法问题——把 atan2 换成查表法现象依旧排除算法。再确认不是信号调理问题——用示波器直接看旋变输出信号干净排除调理电路。然后怀疑 ADC——用高精度源替代旋变信号输入标准正弦看采样结果。最后定位到 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 时我一般按这个优先级看ENOB比标称位数更重要直接决定实际能分辨的最小信号。INL正余弦采样对 INL 敏感因为角度解算依赖两路的相对精度。通道间匹配多通道 ADC 的通道间增益和偏移匹配很关键不匹配会直接引入角度误差。采样保持建立时间建立时间不够采样值会受前一个通道影响。触发灵活性能不能和 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 本身或者信号链前端查。这个二分法我用了很多次屡试不爽。
返回列表