☰
AMC1306与Sigma-Delta ADC电流采样:从硬件电路到DSP解调实战
2026/9/27 20:49:17 网站建设 项目流程

做电机驱动或者数字电源的朋友,应该都体会过“采样难”这件事:相电流波形上全是毛刺,关断瞬间尖峰串进来,控制器算出来的电流环反馈跟实际差一大截。我之前用“隔离运放+运放调理+SAR ADC”的方案折腾了很久,PCB改版三次,噪声还是压不下去。后来整个链路换成Sigma-Delta ADC + AMC1306,DSP侧用Sinc滤波器解调位流,从根源上把“模拟调理易受干扰”和“过采样量化噪声”两件事一并解决。这篇就把我从选型、电路设计到DSP配置、实际调试的完整过程整理出来,给准备上手Sigma-Delta ADC采样方案的朋友一条能直接照做的路径。

先明确一下这里的角色分配:AMC1306并不是一颗“完整ADC”,它是一颗隔离式Sigma-Delta调制器,输入模拟电压,输出一串1-bit位流。真正把位流变成有意义的数值,要靠DSP内部的高性能数字滤波(也就是解调)。标题里说的“从AMC1306电流采样到DSP解调”,实际是一条“模拟量→1-bit位流→数字滤波→电流反馈值”的完整链路。文章会覆盖硬件电路、滤波器原理、寄存器配置、标定方法和调试踩坑,适合正在做FOC矢量控制、三相逆变器、伺服驱动器或者数字电源电流环的工程师。

1. 为什么电流采样要绕过传统ADC,改用Sigma-Delta

1.1 传统SAR ADC在高共模、高开关噪声下的局限

在电机驱动场景里,传统做法是先用电阻分压或隔离运放把母线电压域的电流信号降到ADC可测量范围,再经过一级运放调理电路送进MCU内置SAR ADC。问题在于:逆变器桥臂中点电压以极快的dv/dt在母线和地之间跳变,任何一点寄生电容都会把开关噪声耦合进采样回路。调理电路里的运放带宽越高,反而越容易把高频噪声送进ADC;带宽太低,又会产生相位延迟,影响电流环带宽。

还有一个呼之欲出的痛点:SAR ADC分辨率一般12位到16位,采样率越高,有效位数越低。对于1kHz甚至更快的电流环,想在一个PWM周期内取得足够采样点,同时还要保证足够分辨率,往往只能折中。我实际测量过,12位SAR ADC在IGBT开关瞬间,低两位几乎全是跳动的噪声,真实可用有效位数有时只有9位到10位。

1.2 Sigma-Delta ADC的本质:用速度换分辨率

Sigma-Delta ADC的思路和SAR完全相反。它用极高的采样速率(例如20MHz)对输入信号进行1-bit量化,然后通过负反馈环路把量化噪声推到高频段,这个过程叫“噪声整形”。输出的不是一串并行数值,而是1-bit位流:一串看起来像随机脉冲的数字方波。

后面DSP要做的事,就是用一个低通特性的数字滤波器把高频噪声滤掉,同时对位流进行抽取(downsampling),把高速单比特数据转换成低速多比特数据。这个数字滤波器在Sigma-Delta世界里通常叫Sinc滤波器,也叫CIC滤波器。它本质上是一个移动平均的级联:一阶就是滑动平均,三阶就是把三个滑动平均串起来。

用生活类比:SAR ADC像一个人每隔固定时间看一眼仪表盘,读数快但容易受瞬间波动影响;Sigma-Delta ADC像一个人拿着摄像机以极快帧率录视频,再把所有帧叠加平均,单帧有噪声没关系,平均后信息反而更干净。

1.3 AMC1306在整条链路中的位置

AMC1306是TI推出的增强型隔离式Sigma-Delta调制器,输入电压范围通常为±250mV或±50mV版本,内部带一个开关电容输入采样前端,输出跟输入隔离的数字位流。它内部没有数字抽取滤波器,所以必须配合DSP或FPGA使用。

它在链路中的位置很清晰:电流经过采样电阻产生小电压信号,这个电压直接进AMC1306输入脚,内部Sigma-Delta调制器以外部时钟CLK的频率对输入电压进行采样(通常20MHz),通过隔离栅把位流输出到DSP的SDFM模块。DSP端不需要再做任何模拟调理,因为模拟信号到调制器之后就已经数字化,剩下的处理全部在数字域完成。

选用AMC1306这类隔离式调制器,最大的收益是“把模拟信号最短化”。采样电阻到AMC1306输入脚的走线可以控制在毫米级,之后就是隔离数字信号,不存在模拟信号长距离传输带来的共模干扰问题。这比“采样电阻→隔离运放→长走线→调理电路→ADC”的方案干净得多。

2. AMC1306硬件电路:照着搭就能稳

2.1 电源与基准:隔离电源纹波直接影响位流质量

AMC1306供电需要VDD1(输入侧)和VDD2(输出侧)两组电源,两者之间必须满足隔离要求。我一开始偷懒,VDD1直接从母线侧的辅助电源取电,纹波比较大,结果零电流时位流解调出来的数值波动明显偏大。后来分析发现,调制器输入侧模拟电路对电源噪声非常敏感,输入满量程才250mV,电源上的几十毫伏纹波串进去就是几个百分点的误差。

建议VDD1和VDD2都使用低噪声LDO,并在靠近电源引脚处放置1μF和100nF去耦电容。特别要注意:VDD1和VDD2的地之间是隔离的,PCB上必须保持安全距离,不能因为布局紧张就跨分割或者让两层地平面重叠过多。隔离电源模块选择输出纹波尽量低,如果开关电源模块纹波大,后面再串一个LC滤波。

AMC1306内部有一个参考源,不需要外部基准芯片,但它的性能受VDD影响。所以干净电源不是可选项,是必须项。

2.2 输入滤波计算:R-C网络怎么取

AMC1306输入级是开关电容结构,会瞬间从信号源抽取电荷,所以输入源不能是高阻抗,否则会产生增益误差和失真。数据手册通常推荐在输入端加一个RC滤波,同时起抗混叠和缓冲作用。

典型接法:采样电阻输出经过一个串联电阻R1、R2(各10Ω到20Ω),然后分别接到AMC1306的INP和INN,再在两个引脚对地各接一个对地电容Cs(1nF到2.2nF)。串联电阻和输入电容形成一个低通滤波器,截止频率用1/(2πRC)估算。比如R=20Ω,Cs=1nF,单个RC的截止频率约8MHz,相对于20MHz的采样率是合适的。如果R取太大,比如100Ω,会影响调制器内部采样电容的充电建立时间,导致线性度变差。

两个输入引脚之间要不要接电容?AMC1306的数据手册里有的参考设计会在INP和INN之间接一个小容值的差分电容,比如10pF到100pF,用来抑制差分噪声。但容值不能大,否则输入信号建立时间不足。我自己做的是在差分电容处先不贴,测试后再决定。

还有一点容易漏:采样电阻到AMC1306输入端的走线要等长、靠近,而且采样电阻要使用低感电阻,比如开尔文连接或四端子电阻。PCB布局时把采样电阻和AMC1306放在同一侧,尽量减少走线环路面积。

2.3 时钟与数据线:曼彻斯特编码的连接方式

AMC1306有多个型号后缀,通常AMC1306M是曼彻斯特编码输出,AMC1306B是位流输出(非归零编码)。曼彻斯特编码把数据和时钟编码在同一个信号里,DSP可以通过跳变沿恢复同步,抗干扰能力更强;位流输出则需要单独的时钟线。

如果DSP有SDFM模块,往往两种模式都支持。我的板子上用的AMC1306M,输出只有一个DATA引脚,连接到DSP的SDFM数据输入。曼彻斯特编码的好处是即便时钟线上有抖动,接收端可以利用数据跳变沿做同步,误码率更低。缺点是一半带宽被编码开销占掉,最高有效调制频率降为CLK/2。

CLK引脚如果由DSP的SDFM模块提供,注意时钟线的驱动能力和阻抗匹配。20MHz时钟不算特别高,但走线尽量短,避免走线过长引起反射。如果使用外部晶振或时钟源,确保时钟精度在允许范围内,我遇到过因为时钟频率偏移导致Sinc滤波器输出数据速率偏差的问题,电流环带宽测试出来的频率点总是不对。

3. DSP里的解调核心:Sinc3滤波器与抽取率

3.1 为什么解调非用Sinc不可

Sigma-Delta调制器输出的位流里,有用信号在低频段,量化噪声被推到高频段。要还原信号,只需要一个低通滤波器把高频噪声去掉。那为什么偏偏用Sinc滤波器,而不是普通FIR或IIR?

因为Sinc滤波器极其节省计算量。它的结构是积分器+梳状滤波器的级联,不需要乘累加,只需要加减法和有限寄存器。用于Sigma-Delta解调时,Sinc滤波器在特定频率点上有凹口,刚好可以把调制器量化噪声的主瓣打掉。Sinc3的意思是三阶级联,抑制带衰减更快,单位时间内能获得更高有效位数。

CIC滤波器频率响应表达式写出来是这样的:

[ H(f)=\left(\frac{\sin(\pi \times OSR \times f / f_{mod})}{OSR \times \sin(\pi \times f / f_{mod})}\right)^N ]

其中N是阶数,OSR是抽取率,f_mod是调制器频率。阶数越高,阻带衰减越陡,但群延迟也越大。实际电流采样常用Sinc3,因为性能和延迟折中。

3.2 Sinc3滤波器输出与抽取率的关系

Sinc滤波器的输出数据速率由调制器频率除以抽取率决定:

[ f_{data} = \frac{f_{mod}}{OSR} ]

假设调制频率20MHz,OSR取64,则输出数据速率312.5kHz;OSR取128,则156.25kHz。对于10kHz到20kHz电流环带宽,312.5kHz的数据率绰绰有余。

有效位数会随OSR升高而提升,但数据速率降低,延迟变大。OSR每增加一倍,有效位数大约提高约2.5位到3位,但输出速率减半。具体取舍要看系统对延迟的要求。电流环如果要求相位裕度充足,OSR不建议选太高,否则Sinc滤波器本身的群延迟会吃掉控制环路相位。我常用的折中是OSR=64,Sinc3,20MHz调制频率下数据率312.5kHz,有效位约10到11位,配合AMC1306的250mV输入范围,对于0.5mΩ采样电阻、额定几百安培的驱动场景足够。

3.3 用SDFM模块实现(以C2000为例)

如果DSP用TI C2000系列,例如TMS320F28379D,内部自带SDFM(Sigma-Delta Filter Module)。这个模块可以直接接收AMC1306输出的位流,省去外部滤波芯片,配置一次就能连续输出解调数值。

SDFM配置要点是:选择调制器模式(曼彻斯特或位流)、滤波器阶数(Sinc1/2/3)、抽取率、使能滤波器、配置数据输出格式。曼彻斯特模式下,SDFM会检测数据跳变来恢复时钟,寄存器里对应使能Manchester模式。配置完这些后,SDFM会在每个解调周期产生一个新的16位或32位数据。

我当时初始化代码大概像这样:

void SDFM_Init(void) { // 1. 使能SDFM1时钟和引脚 // 2. 配置SDFM1 filter 1 SDFM_setupFilter(SDFM1_BASE, SDFM_FILTER_1, SDFM_FILTER_ENABLE, SDFM_CTRLMOD_MANCHESTER, // AMC1306M SDFM_SINCFILTER_SINC3, SDFM_OSR_64, SDFM_DATACAP_16BIT, SDFM_FILTER_READSTROBE_ENABLE); }

寄存器级代码可能因库版本不同有差异,但关键是理解这五个参数的意义:通道选择、时钟模式、滤波器类型、抽取率、输出字长。要特别留意曼彻斯特模式下的数据捕获格式,有位流从高到低还是从低到高的区别,配反了输出来的是一个负增益。

3.4 如果DSP没有SDFM,用软件解调C代码

如果你的DSP平台没有SDFM外设,只能通过GPIO或定时器捕获位流,然后软件实现Sinc滤波器。对于单相电流采样,20MHz位流直接进GPIO中断对CPU压力很大,通常会在FPGA里先做滤波,或者用带有Sigma-Delta解调外设的芯片。但如果是低速采样场景,或者调制频率较低的调制器做测试,软件实现CIC滤波并非不可能。

下面是一个三阶CIC抽取滤波器的核心逻辑,适合在DSP中周期性执行:

// 三阶CIC滤波器,bitstream输入,OSR为抽取率 int32_t sinc3_demod(int16_t bit_in, uint16_t osr) { static int32_t int1 = 0, int2 = 0, int3 = 0; static int32_t comb1 = 0, comb2 = 0, comb3 = 0; static uint16_t cnt = 0; static int32_t last_comb1 = 0, last_comb2 = 0, last_comb3 = 0; // 积分器部分:每个调制时钟都运行 int1 += bit_in; int2 += int1; int3 += int2; if (++cnt >= osr) { cnt = 0; // 抽取点:先计算当前梳状滤波值 comb1 = int3 - last_comb1; last_comb1 = int3; comb2 = comb1 - last_comb2; last_comb2 = comb1; comb3 = comb2 - last_comb3; last_comb3 = comb2; // 积分器清零,准备下个抽取周期 int1 = int2 = int3 = 0; return comb3; } return 0; }

这段代码的思路是:积分器在每个调制时钟周期更新,到了抽取点做差分和清零。实际工程中还要考虑位流进的是-1和+1还是0和1,直接决定输出零点对应关系。软件实现的优点是灵活,缺点是CPU开销大,20MHz频率下每个时钟周期都要处理三个积分器,大多数通用MCU跑不动,所以有SDFM外设还是省心。

4. 从位流到真实电流:标定、同步与数据链路

4.1 PWM同步触发:不要让滤波器瞬态污染采样

电流环最核心的问题是“什么时候采回来的电流才是当前PWM周期的有效值”。Sigma-Delta调制器一直在采样,但Sinc滤波器存在群延迟和建立时间。当PWM开关动作导致电流波形突变时,滤波器输出需要若干个数据周期才能收敛到新值。

通常会把SDFM的采样转换事件用EPWM触发同步。在PWM载波顶点或底点,电机电流等于相电流平均值,在这个点触发采样能最大程度避开开关噪声。具体做法是把EPWM的时基周期寄存器设置好,产生同步信号给SDFM模块,让SDFM在指定的PWM事件到来时锁存当前滤波器输出,并启动下一次转换。

我调试时发现,如果不同步触发,解调数据会在PWM边沿附近出现明显毛刺,波形就像被“刮”了一下,用示波器看SDFM输出数值每个PWM周期都会跳变一次。加上同步触发后,数据稳定得多。

4.2 偏移与增益误差校准

AMC1306不是理想器件,有输入偏移、增益误差和非线性。出厂时有精度等级,比如±0.1%增益误差,具体看后缀。但在高精度应用里依然要做软件校准。

偏移校准最容易:让电机相电流为0,也就是不发波或下桥全开,此时采样电阻电压应为0,读SDFM输出,记下这个值,后续所有采样值都减去它。

增益校准需要通一个已知电流。比如用恒流源给电机某相通一个10A电流,读SDFM输出差值,再用另一个20A电流读差值,两点算出斜率和偏移。公式就是线性校正:

[ I_{real} = (Raw_{out} - Offset) \times Gain ]

实际标定步骤可以做成自动测试:控制器给定不同占空比,外部高精度电流钳记录真实电流,同时读内部采样值,最后在电脑上拟合出一条直线,把斜率和截距写进EEPROM。这个方法比只看手册参数更可靠,因为PCB布局和采样电阻误差都被一并校正了。

4.3 数据格式转换:位流滤波结果如何换算成电流

SDFM模块输出的是一个整数,范围取决于输出数据宽度和滤波器类型。AMC1306输入电压范围±250mV时,输出位流的占空比大约在10%到90%之间,对应线性区域。Sinc滤波器解调出来的数值,中间值通常代表零输入,满偏值对应正负满量程。

假设SDFM输出是16位补码,满量程输入±250mV对应输出范围约±32767。采样电阻为0.5mΩ,则满量程电流:

[ I_{FS} = \frac{250mV}{0.5mΩ} = 500A ]

因此一个LSB对应的电流:

[ I_{LSB} = \frac{500A}{32767} ≈ 15.26mA ]

大多数SDFM输出不会是整16位有效数字,因为Sinc滤波器输出会卷积出一个直流增益,实际上数据手册会有对应关系说明。稳妥的办法是:先用已知直流电流标定,得到“原始码值/安培”的比例常数,后续代码就用这个常数做转换。我在程序里会把Offset和Gain存成浮点,每次采样后做乘加,只在最后转换成带小数点的电流值用作控制。

5. 实测中的噪声、相位延迟和误码排查

5.1 高频噪声来源与时钟抖动

接好硬件后先看零电流噪声:电机不动,PWM不输出,用DSP读SDFM数值,用串口或JTAG把数据拉出来画波形。理想情况是一条直线,噪声峰峰值在几个LSB左右。如果噪声很大,优先检查VDD1电源纹波,然后是CLK时钟抖动。

时钟抖动对于Sigma-Delta位流影响很大,因为调制器是边沿采样,时钟抖动会直接变成采样时间误差,等效为输入噪声。用FPGA或DSP输出的时钟,要确保时钟源稳定,不要在时钟线上串联过大电阻,否则边沿变缓会加剧抖动。

有一次我发现零电流噪声达到几十mV等效输入,排查很久最后发现是隔离电源模块的开关频率落在采样频带内,产生了明显谐波。后来换了低纹波模块,并把VDD1到AMC1306之间加了LC滤波,噪声立刻降下来。

5.2 位流异常:曼彻斯特解码错误/无CLK

如果SDFM寄存器读出来始终是0或者满量程值,多半是位流没有正常解码。先用示波器同时抓DATA和CLK,确认AMC1306是否正常输出。正常工作时,DATA应该是一串频率约为CLK一半的脉冲串;如果没有输出,检查输入电压是否在共模范围内,AMC1306输入脚电压不能超出规格,否则内部保护电路可能锁死。

曼彻斯特解码错误时,SDFM输出会出现随机大数跳变。常见原因是数据极性配置反了,变换一下SDFM的输入极性寄存器位就好。如果只接一个通道悬空,也会导致解码器误判,所以不用的输入引脚要接地或接固定电平,不要浮空。

5.3 滤波器稳定时间与上电时序

Sinc滤波器是线性时不变系统,启动瞬间积分器清零,需要几个抽取周期才能建立稳定输出。Sinc3的建立时间大约是3×OSR个调制时钟周期。20MHz、OSR=64时,建立时间约9.6μs。PWM频率10kHz,周期100μs,每次触发采样后等待约10μs再读取数据是安全的。

上电时如果DSP和AMC1306供电时序不一致,可能导致调制器输出异常位流。建议AMC1306的VDD1和VDD2几乎同时上电,DSP侧SDFM使能也要等在位流有效后再做。最简单的方法是启动后延时几毫秒,先读一次SDFM输出,如果数值在合理范围内再使能电流环闭环。

5.4 一个典型波形案例

我调试的样机上,电机以1kHz频率旋转,PWM 10kHz,AMC1306采样20MHz,SDFM OSR=64。闭环之前先开环发波,把A相电流波形从SDFM读出来,用开发板的DAC或者串口发送到上位机绘图。得到的电流曲线非常干净,正弦波上没有明显开关毛刺,谐波很小。对比之前SAR ADC方案在同样条件下电流波形的“毛茸茸”边缘,差别肉眼可见。

后来我把OSR调到128,噪声进一步降低,但电流环相位裕度变小,动态响应出现了过冲。这让我意识到:Sigma-Delta ADC不是所有场景都追求最高分辨率,电流环带宽和滤波器群延迟之间的平衡才是核心。最终我还是回到OSR=64,并在控制环里额外补偿了约2.5μs的滤波器延迟。

6. 这个项目留给我的几个工程习惯

做这个Sigma-Delta ADC采样方案最深的体会是:模拟链路的“短”比“精”更重要。以前总想着把运放调理电路做得花哨,用高精密运放、多级滤波,但噪声问题一直没根治。换成AMC1306后,模拟信号只在采样电阻和芯片输入脚之间走了一小段,剩下的抗干扰全部交给隔离和数字滤波,反而简单可靠。

在软件端我也养成了一个习惯:所有SDFM相关的寄存器配置,在初始化完成后一定会读回校验一遍,并且把关键数据比如当前OSR、滤波器阶数、通道极性状态打包成调试变量,运行中随时能查看。这个习惯帮我排查过好多次问题,有时候板子上量测信号都不正常,读回寄存器发现是代码里某个配置被其他模块覆盖了。

如果你正准备移植到自己的板子上,建议先把硬件最小系统跑通:只留一路电流采样,不开闭环,用上位机看解调数值随外部直流电流变化的线性度。线性度没问题了再上闭环,不然闭环后出了问题,很难分辨是采样的问题还是控制器的问题。数据出来之后,再做一次全范围的电流标定,把偏移和增益固化下来,整套链路就算真正可用了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询