去年做新一代伺服驱动器时我把电流采样从传统隔离运放换成了 AMC1306 加 Sigma-Delta ADC 的方案再用 DSP 内置的 SDFM 模块做解调。当初就是奔着“少一级模拟链路、隔离度高、噪声整形抗干扰”这几个字去的改完以后实测电流波形干净了不少。这篇文章就把从分流电阻选型、AMC1306外围电路、到 C2000 系列 DSP 里用 Sinc 滤波器把位流还原成电流值的完整流程从头到尾写一遍。这篇文章适合正在做电机驱动、数字电源、并网逆变器或者对隔离电流采样有需求的朋友。无论你是刚接触 Sigma-Delta ADC 的新手还是已经在用但被相位延迟和同步问题折腾过的老手应该都能从中找到一些可以直接抄作业的细节。1. 从分流电阻到电流环先把信号链看透1.1 为什么电机控制要盯住电流采样这个环节电机驱动里电流环是转矩控制的内环。表贴式永磁同步电机的电磁转矩近似正比于 q 轴电流因此相电流采得准不准、快不快、稳不稳直接决定了转矩纹波、噪音和整个系统的动态响应。很多项目最后性能上不去不是算法不行而是电流采样这一层就把天花板定死了。传统方案大多用隔离运放加 SAR ADC。隔离运放解决了高压侧的隔离问题但也带来了三个麻烦一是运放的失调电压和温度漂移需要额外校准二是模拟信号在 PCB 走线过程中容易被功率级的 dv/dt 干扰三是模拟链路的带宽和建立时间很难同时满足高频开关场景。我上一版产品没少在这上面折腾低温漂运放、屏蔽地、二阶滤波都用上了批量一致性还是让我心里没底。换成 Sigma-Delta ADC 之后思路完全反过来。Delta-Sigma 调制器用极低的成本做粗量化但通过噪声整形把量化噪声推往高频段之后用数字 Sinc 滤波器在抽取过程中把带外噪声滤掉。关键点是原来模拟域里的滤波、隔离、放大难题有一部分被搬到了数字域解决。AMC1306 输出的就是 1bit 位流模拟信号经过调制后变成一串数字脉冲抗干扰能力比模拟信号强太多。1.2 完整信号链长什么样整个电流采样信号链可以画成下面这条路线相电流 → 分流电阻 → 差分 RC 滤波 → AMC1306隔离式 Delta-Sigma 调制器→ 1bit 数字位流 → DSP 内置 SDFM → Sinc3 抽取滤波 → 16 位电流数字量 → Clarke/Park 坐标变换 → 电流环 PI。每个环节都有它的活。分流电阻把电流变成毫伏级电压信号RC 滤波器负责滤掉调制器开关采样引入的高频噪声AMC1306 把模拟电压调制成一串位流并通过隔离栅传到低压侧DSP 的 SDFM 模块接收位流后经过 Sinc 滤波器抽取还原成高分辨率的电流数字量最后进入矢量控制算法。这一步和传统方案最大的区别体现在“信号形态”上。模拟链路从头到尾都是连续电压任何一个节点被干扰都会直接叠加到电流值上。而 Sigma-Delta 方案在 AMC1306 之后信号变成了数字位流只要电平还能被识别成 0 或 1干扰就不太容易进入有效数据。电机驱动里最怕的功率管开关噪声在这种方案下会被大幅度削减。1.3 AMC1306 为什么适合站在这个位置AMC1306 是 TI 的隔离式 Delta-Sigma 调制器输入满量程约 ±250mV内部有二氧化硅隔离栅增强型隔离耐压可以到几千伏。它不需要外部基准或编程只需要一个外部时钟提供调制频率然后持续输出 1bit 位流。配套的 DSP 侧解调可以在 C2000 系列内置的 SDFM 模块里完成。当年我也对比过 TI 的 AMC1300那是隔离放大器输出仍然是模拟电压后级还得再接一个 SAR ADC 或者再进运放。AMC1306 的输出是数字位流等于把“隔离”和“模数转换”两件事在信号链里一次做完省掉了模拟输出再次经过 PCB 走线受干扰的环节。下面是两者在工程层面的直接对比项目AMC1300 隔离运放AMC1306 隔离调制器输出形态模拟电压1bit 数字位流后级处理需要 SAR ADC 或运放DSP SDFM 直接接收抗干扰能力中模拟走线怕噪声高位流抗噪声能力强失调校准需要额外校准配合 Sinc 滤波器后误差主要靠增益校准系统复杂度中高中低从我实际项目体验看AMC1306 更适合高频开关场合尤其是 PWM 频率在 10kHz 以上、电流环带宽要求较高的永磁同步电机驱动。它的代价是 DSP 侧必须要有 SDFM 这类专用外设如果 MCU 没有硬件解调模块、靠 GPIO 翻转去读位流那会很痛苦。2. 硬件侧如何做AMC1306 外围电路与电源选型2.1 分流电阻选型先算功率和温漂分流电阻是电流采样的第一步它的精度和温漂直接影响整个采样链路的最终精度。选型时我习惯先定电阻值再算功率最后看温漂和封装。以一台额定相电流 50A、峰值 70A 的伺服驱动器为例。AMC1306 输入范围 ±250mV信号幅度不能顶满建议留 30% 到 40% 裕量以免过流时调制器饱和导致位流失真。取峰值电流 70A如果选 1mΩ 电阻信号幅度是 70mV只占满量程的 28%信号偏小如果选 2mΩ峰值信号 140mV占比 56%空间更好但功耗会上去。额定 50A 下 2mΩ 电阻的功耗是 50×50×0.002 5W这个热耗对 PCB 布局来说很不友好。折中下来 1mΩ 是很多三相电机驱动的常见选择。确定阻值后必须核算功率。仍然以 1mΩ、额定 50A 为例功耗 50² × 0.001 2.5W。分流电阻的封装功率至少要留 2 倍余量也就是额定至少 5W 甚至 7W 的采样电阻还要考虑长期温升对阻值的影响。锰铜合金或康铜材料的电阻温漂系数低是电流采样的首选。硬件上一个容易翻车的细节是开尔文连接。分流电阻两端必须单独引出两条采样线到 RC 滤波网络和 AMC1306 的输入引脚不要把采样线直接接在电流主回路上。因为主回路的大电流会在铜皮上产生压降直接纳入采样会引入不可控误差。另外采样焊盘下方的铜皮不要大面积掏空否则电流路径会绕过焊盘导致测量值偏低。2.2 输入 RC 滤波不是随便挂个电容就行AMC1306 的输入端本质是个开关电容网络它会从信号源抽取电荷因此在前端加 RC 滤波不仅是滤波还负责为调制器提供稳定的电荷源。RC 参数选得太小滤不掉调制噪声选得太大信号建立时间拉长在高频采样时会出现动态误差。我常用的一组参考值是差分电阻 33Ω、差分电容 2.2nF截止频率大约在几十千赫兹到几兆赫兹量级。对 10MHz 的调制时钟来说这个 RC 组合既能压制带外噪声又不会明显拖慢建立时间。注意电阻不要选太大超过 100Ω 后 AMC1306 的输入电流会在电阻上形成明显压降导致增益偏差。差分电容放在电阻和芯片输入引脚之间位置尽量靠近芯片。如果实际测试时发现某个 PWM 占空比点附近电流波形有毛刺可以先调整 RC 参数试试不必急着改 PCB。但如果是批量一致性问题就要回头检查差分电容的介质类型和容差C0G/NP0 介质比 X7R 更稳定适合用于采样前端。2.3 时钟与数据与 DSP 的接口怎么接AMC1306 需要外部为它提供一个调制时钟常见速度是 10MHz 到 20MHz。时钟越高单个采样周期越短但 DSP 侧的布线压力也越大。我习惯用 10MHz 起步结构简单时序也宽松。这个时钟可以由 DSP 的 EPWM 模块或者其他引脚产生。如果 C2000 系列的 SDFM 模块支持外部时钟直接接入就把时钟从控制器引出经过缓冲器后同时送到 AMC1306 的 CLKIN 引脚数据位流 DOUT 回到 SDFM 的数据输入。时钟线尽量短走线阻抗匹配必要时串联 22Ω 到 33Ω 的端接电阻减少反射。AMC1306 的 DOUT 位流是在时钟边沿附近变化的SDFM 在对应沿采样数据。所以说保证时钟质量比保证数据质量更重要。时钟抖动大采样点位置就会漂移最终电流值的噪声会增加。实测中如果电流波形出现高频周期性抖动先检查时钟是不是足够干净再用示波器看 CLKIN 的上升沿有没有振铃。2.4 隔离电源与地平面处理AMC1306 的两个供电域必须隔离高压侧也就是电机相线附近需要独立的 3.3V 电源低压侧由控制板 3.3V 供电。隔离电源的常见做法有几种用成品隔离 DC-DC 模块或用推挽变压器方案或者从高压侧的辅助电源经过 LDO 稳压后供电。做小批量或者快速原型时隔离 DC-DC 模块最省事但体积和成本偏高量产时用 SN6505 这一类的推挽驱动器加小型变压器更划算。电源纹波对 Sigma-Delta 调制器的精度影响比普通放大器更明显因为噪声会直接调制进位流。我给 AMC1306 高压侧供电的习惯是隔离电源输出后加一级 LC 滤波再用一个低噪声 LDO 稳压到 3.3V电容靠近 VDD 引脚放置配合 1uF 和 0.1uF 的组合。地平面处理是整个硬件设计里最容易埋雷的地方。高压侧地比如母线负端和低压侧地必须严格分开PCB 上在隔离栅正下方要留出净空区域不要铺铜。如果隔离带附近有功率走线高速翻转会产生共模噪声穿过隔离电容耦合到低压侧。我的经验是AMC1306 布局要尽量靠近分流电阻高压侧走线短粗低压侧信号线CLKIN、DOUT不要和功率线平行长距离走线。3. DSP 侧如何解调SDFM、Sinc 滤波器与 EPWM 同步3.1 SDFM 是什么给 DSP 配的“位流解码器”C2000 系列 DSP 里有一个专门的 Sigma-Delta 滤波器模块也就是 SDFM。它不是普通 GPIO 读取位流而是内置了一套完整的数字滤波器链。SDFM 每个通道接收一路位流输入内部可以配置 Sinc1、Sinc2 或 Sinc3 滤波器可以设定抽取率 OSR最大能到 128 甚至 256。输出端可以生成 16 位或 32 位有符号数据也可以配置成无符号格式。SDFM 最让我满意的一点是它还带“快速滤波器”和“慢速滤波器”双通道。慢速滤波器给电流环提供高分辨率数据快速滤波器则用于过流保护比较器。这样保护动作可以不依赖 CPU 中断硬件上直接响应非常省心。3.2 配置实战OSR 选择与 Sinc 阶数怎么定在 C2000 的 SysConfig 图形化工具里配置 SDFM 很直观。以一个三相永磁同步电机驱动项目为例SDFM 每个通道按这样的思路设置。// 伪代码量级的配置示例具体以 SysConfig 生成的代码为准 SDFM_1.filter[0].type SDFM_SINC3; // 选用三阶 Sinc 滤波器 SDFM_1.filter[0].osr 32; // 抽取率设为 32 SDFM_1.filter[0].dataFormat SDFM_16BIT_SIGNED; SDFM_1.filter[0].syncEnable true; // 与 EPWM 同步为什么选 Sinc3 而不用 Sinc1Sinc1 的带外抑制能力弱输出噪声较高对电流环来说不够干净。Sinc3 在相同 OSR 下对高频噪声的衰减更陡而且实现复杂度在 DSP 里并不高是电机控制中的主流选择。OSR 的选择本质是“分辨率”和“延迟”的平衡。OSR 越大每个输出样本对应的输入窗口越长滤波器输出越平滑但数据更新率下降延迟也随之增加。OSR16 和 OSR32 在实际使用中是常见折中。我一般先按 OSR32 起步跑起来后用示波器看相电流波形再决定是否需要往下降。SDFM 模块还支持设置数据输出格式。Sinc 滤波器输出的原始累加值直接映射到 16 位有符号数满量程对应的就是 AMC1306 的 ±250mV 输入范围。这个映射关系后面换算电流时要用到不要搞错。3.3 用 EPWM 触发采样采样时刻为什么必须严格同步电流环采样不是随时采都行的。PWM 开关动作会引起母线电压的瞬态突变如果采样时刻落在开关沿附近采样值会被噪声污染。永磁同步电机控制里通常把采样点放在 PWM 周期的中点也就是载波峰值或谷值位置这时候开关管状态相对稳定电流纹波也处于平均值附近。C2000 里通过 EPWM 模块产生同步信号SDFM 收到同步信号后锁存当前滤波器输出并触发 ADC 或 CPU 中断。这样电流环的调节周期就和 PWM 周期完全对齐不会出现电流环跑在 PWM 抖动上的问题。实际项目中如果采样点和 PWM 开关沿没有对齐我在示波器上看到的电流波形会有一层明显的“毛绒”感这是噪声叠加的结果。这里要特别提醒SDFM 的同步信号不是可选的而应该是电机控制代码里的默认项。不开启同步的话滤波器输出和 PWM 载波之间的相位关系是漂移的电流环 PI 参数整定起来非常难受而且不同批次、不同温度下表现可能不一致。3.4 从原始数字量到实际安培数SDFM 输出的是原始数字量必须经过标度变换才能得到真实电流。以 16 位有符号输出为例数字量 -32768 到 32767 映射到 -250mV 到 250mV。换算公式很简单float vIn ((float)rawData / 32768.0f) * 0.250f; // 电压单位 V float iPhase vIn / shuntResistor; // 电流单位 A如果你用的分流电阻是 1mΩ那么 32768 数字量对应 250mV也就是 250A5000 数字量对应约 38mV也就是 38A。这里有一个容易踩的坑AMC1306 的增益误差不是零数据手册里会给出典型增益误差和失调误差。批量生产时最好做一次两点校准。校准的办法也不复杂给驱动器灌入一个已知的直流电流记录 SDFM 输出至少做两个电流点算出实际增益和失调在软件里写死或者存到 EEPROM。现场没有高精度电流源的话用万用表测相电压和功率电阻也算一个替代方案但精度有限。4. 延迟与相位补偿决定电流环带宽的两个数字4.1 Sinc3 滤波器到底带来了多少延迟Sigma-Delta ADC 的精度不是白来的它的代价就是延迟。Sinc3 滤波器本质上是一个滑动窗口平均加积分结构输出代表的是窗口内一段时间信号的加权平均。窗口越长延迟越大采样越平滑。延迟的近似计算公式是群延迟 ≈ k × OSR / 2 / f_modk 是 Sinc 滤波器的阶数OSR 是抽取率f_mod 是调制时钟频率。以 f_mod 10MHz、OSR 32、Sinc3 为例延迟 ≈ 3 × 32 / 2 / 10MHz 4.8us。这还只是滤波器本身的近似群延迟实际还有 Sinc 滤波器的平均效应大约在 (OSR-1)/2 个时钟周期约 1.55us所以总延迟大概在 6.3us 到 7us 之间。如果电流环带宽设计在 10kHz周期是 100us这个延迟占整个控制周期的 6% 到 7%等于给电流环加了一个纯滞后环节。滞后会降低相位裕度PI 参数稍微激进一点就容易振荡。设计电流环带宽时必须把这个延迟算进相位预算里。4.2 相位补偿怎么做既然延迟已经存在与其硬扛不如通过软件做相位补偿。一种简单的补偿方法是在电流环输出角度上叠加一个超前项补偿角度 ≈ 2π × f_cross × T_delay其中 f_cross 是电流环期望穿越频率T_delay 是信号链总延迟。举个例子如果期望穿越频率 5kHz总延迟 7us那么补偿角度大约是 2 × 3.14 × 5000 × 0.000007 0.22 rad也就是约 12.6 度。这个角度可以在电流环输出进入坐标变换之前通过旋转矩阵叠加进去也可以做一个一阶超前补偿器。不过要说明一点相位补偿并不能完全消除延迟带来的影响它只是把稳态相位误差推平。真正压不下来的高频振荡还是要靠降低环路增益或减小 OSR 来解决。我见过有人把相位补偿角度设置得过大结果原本稳的系统反而振荡后来查了半天就是过度补偿把相位裕度“吃”没了。4.3 OSR 取舍给不同带宽目标的选择建议OSR 的选择在工程上是多项指标的权衡。低 OSR 意味着更快的更新率和更小的延迟但滤波器对带外噪声的抑制变弱SNR 下降。高 OSR 则相反分辨率高但延迟大。以下是几种典型目标下的参考配置。应用目标调制时钟OSR输出数据率参考延迟电流环带宽 20kHz追求动态10MHz16625kHz约 3.4us通用伺服平衡性能和噪声10MHz32312.5kHz约 6.5us高精度测控对带宽要求低10MHz64156.25kHz约 12us我个人的习惯是先按目标电流环带宽反推可用延迟预算再定 OSR。如果电流环要走 20kHz 带宽OSR16 或更低如果只要求 5kHz 带宽OSR64 会带来更好的电流波形。建议大家下手前先画一张控制周期时序图把 ADC 延迟、坐标变换时间、PI 执行时间、PWM 更新延迟都标出来心里有数再配参数。5. 实调踩坑速查从全 0 位流到波形毛刺排查5.1 位流全 0 或全 1先把电源和时钟查一遍第一次上电调试时如果 SDFM 读到的数据一直是 0 或者一直是满量程先别急着怀疑 DSP 配置优先查三个点AMC1306 的高压侧有没有正常供电、外部时钟有没有进来、输入电压有没有超范围。我遇到过的第一颗 AMC1306 就是电源接反烧掉的。隔离电源模块的输出极性错了板子一上电整个采样通道输出 0查了半天才发现是电源方向反了。另一个常见原因是输入电流过大把调制器打到饱和此时位流会表现为长时间连续 0 或连续 1。这种工况如果持续时间长AMC1306 可能会因过流损坏。排查时先用示波器量 CLKIN 引脚有没有 10MHz 时钟再量 DOE 引脚能否翻转到 3.3V 左右的高电平最后用万用表确认高压侧和低压侧电源对地电压。顺序从前往后基本能定位。5.2 电流波形毛刺多先看采样点离 PWM 沿有多远如果你看到 SDFM 输出的电流波形总体趋势正常但波形表面有一簇一簇的高频毛刺优先级最高的一定是“采样点相对 PWM 开关沿的位置”。只要采样点没落在开关瞬态附近很多毛刺就不治而愈。排查办法是直接把 EPWM 的同步信号触发时刻移动到载波中心然后在示波器上观察相电流波形是否变干净。如果改善了说明问题就是采样时刻没对齐。如果还是很脏再看 RC 滤波参数和时钟质量。尤其是多个驱动器共用一个时钟源的时候时钟线上的串扰也可能被放大必要时给每路加单独缓冲器。还有一个低频毛刺来源是地平面切割不够好。AMC1306 的高压侧地如果和功率地串入了大电流采样信号的地参考会跟着功率电流波动。虽然隔离栅的存在能阻断一部分共模噪声但 PCB 布局不给力的话隔离效果也会打折扣。5.3 电流环振荡先别急着调 PI遇到电流环振荡第一反应往往是去调 PI 参数但如果是采样链路延迟导致的问题PI 怎么调都压不住。我的一次真实经历是电流环在 8kHz 附近出现持续振荡后来发现是 SDFM 的 OSR 设到了 64总延迟接近 12us和电流环期望带宽严重不匹配。把 OSR 降到 32、同时加上相位补偿后振荡自然消失。振荡的排查思路应该这样先用示波器看相电流波形区分是采样噪声还是环路不稳定。如果波形边缘抖动但平均值稳定多半是采样干扰如果波形整体发散或出现周期性等幅振荡就要计算一下环路延迟是否超出预期再回头审查 SDFM 配置和相位补偿参数。5.4 常见问题速查表现象可能原因排查与处理SDFM 输出恒为 0 或满量程隔离电源异常、时钟缺失、输入过载先量电源和时钟再量输入电压确认没有持续过流电流波形表面高频毛刺采样点落在 PWM 沿附近、RC 参数不合适将采样点移到载波中心检查 RC 截止频率是否匹配电流值整体偏差大分流电阻温漂、增益误差未校准做两点校准改用低温漂采样电阻电流环固定频率振荡信号链总延迟过大、相位补偿不足计算总延迟降低 OSR 或增加超前补偿批量板卡一致性差分流电阻封装/布局差异、开尔文连接不规范检查开尔文连接确认采样电阻品牌批次一致大电流下波形畸变分流电阻功耗导致温度升高、阻值漂移核算功耗适当加大电阻封装重新做热测试5.5 还有一个容易被忽视的细节DSP 启动阶段的同步系统上电瞬间PWM 可能还没有开始输出EPWM 同步信号也没有产生。此时 SDFM 虽然配置完成但没有同步信号滤波器输出可能会停留在某个随机值。如果这个值被当成真实电流参与控制上电瞬间就可能出现失控电流冲击。我的习惯是在软件启动流程里做一个“SDFM 数据有效”标志位只有收到第一个 EPWM 同步中断并且连续多次采样值都在合理范围内后才允许电流环切入闭环模式。这个准备阶段的电流值全部清零处理。保护逻辑和电流环使能必须分开避免因初值问题导致过流保护误动作。如果时间重来我会在一开始就把分流电阻的封装选大一号。调试阶段频繁换采样电阻焊盘被我焊秃过好几回。另外强烈建议在板子上预留 SDFM 滤波器的软件旁路开关方便在实验室里快速对比不同 OSR 对电流波形的影响省去反复烧固件的麻烦。Sigma-Delta ADC 这条路线硬件调试的坑确实比传统方案少一些但每一处设计决策都要和 DSP 这边的配置一起考虑两条腿走路才能走得稳。