ARTICLE DETAIL

资讯详情

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

AMC1306与Sigma-Delta ADC电流采样:从硬件电路到DSP解调实战

AMC1306与Sigma-Delta ADC电流采样:从硬件电路到DSP解调实战 做电机驱动或者数字电源的朋友应该都体会过“采样难”这件事相电流波形上全是毛刺关断瞬间尖峰串进来控制器算出来的电流环反馈跟实际差一大截。我之前用“隔离运放运放调理SAR ADC”的方案折腾了很久PCB改版三次噪声还是压不下去。后来整个链路换成Sigma-Delta ADC AMC1306DSP侧用Sinc滤波器解调位流从根源上把“模拟调理易受干扰”和“过采样量化噪声”两件事一并解决。这篇就把我从选型、电路设计到DSP配置、实际调试的完整过程整理出来给准备上手Sigma-Delta ADC采样方案的朋友一条能直接照做的路径。先明确一下这里的角色分配AMC1306并不是一颗“完整ADC”它是一颗隔离式Sigma-Delta调制器输入模拟电压输出一串1-bit位流。真正把位流变成有意义的数值要靠DSP内部的高性能数字滤波也就是解调。标题里说的“从AMC1306电流采样到DSP解调”实际是一条“模拟量→1-bit位流→数字滤波→电流反馈值”的完整链路。文章会覆盖硬件电路、滤波器原理、寄存器配置、标定方法和调试踩坑适合正在做FOC矢量控制、三相逆变器、伺服驱动器或者数字电源电流环的工程师。1. 为什么电流采样要绕过传统ADC改用Sigma-Delta1.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再在两个引脚对地各接一个对地电容Cs1nF到2.2nF。串联电阻和输入电容形成一个低通滤波器截止频率用1/(2πRC)估算。比如R20ΩCs1nF单个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} ]假设调制频率20MHzOSR取64则输出数据速率312.5kHzOSR取128则156.25kHz。对于10kHz到20kHz电流环带宽312.5kHz的数据率绰绰有余。有效位数会随OSR升高而提升但数据速率降低延迟变大。OSR每增加一倍有效位数大约提高约2.5位到3位但输出速率减半。具体取舍要看系统对延迟的要求。电流环如果要求相位裕度充足OSR不建议选太高否则Sinc滤波器本身的群延迟会吃掉控制环路相位。我常用的折中是OSR64Sinc320MHz调制频率下数据率312.5kHz有效位约10到11位配合AMC1306的250mV输入范围对于0.5mΩ采样电阻、额定几百安培的驱动场景足够。3.3 用SDFM模块实现以C2000为例如果DSP用TI C2000系列例如TMS320F28379D内部自带SDFMSigma-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、OSR64时建立时间约9.6μs。PWM频率10kHz周期100μs每次触发采样后等待约10μs再读取数据是安全的。上电时如果DSP和AMC1306供电时序不一致可能导致调制器输出异常位流。建议AMC1306的VDD1和VDD2几乎同时上电DSP侧SDFM使能也要等在位流有效后再做。最简单的方法是启动后延时几毫秒先读一次SDFM输出如果数值在合理范围内再使能电流环闭环。5.4 一个典型波形案例我调试的样机上电机以1kHz频率旋转PWM 10kHzAMC1306采样20MHzSDFM OSR64。闭环之前先开环发波把A相电流波形从SDFM读出来用开发板的DAC或者串口发送到上位机绘图。得到的电流曲线非常干净正弦波上没有明显开关毛刺谐波很小。对比之前SAR ADC方案在同样条件下电流波形的“毛茸茸”边缘差别肉眼可见。后来我把OSR调到128噪声进一步降低但电流环相位裕度变小动态响应出现了过冲。这让我意识到Sigma-Delta ADC不是所有场景都追求最高分辨率电流环带宽和滤波器群延迟之间的平衡才是核心。最终我还是回到OSR64并在控制环里额外补偿了约2.5μs的滤波器延迟。6. 这个项目留给我的几个工程习惯做这个Sigma-Delta ADC采样方案最深的体会是模拟链路的“短”比“精”更重要。以前总想着把运放调理电路做得花哨用高精密运放、多级滤波但噪声问题一直没根治。换成AMC1306后模拟信号只在采样电阻和芯片输入脚之间走了一小段剩下的抗干扰全部交给隔离和数字滤波反而简单可靠。在软件端我也养成了一个习惯所有SDFM相关的寄存器配置在初始化完成后一定会读回校验一遍并且把关键数据比如当前OSR、滤波器阶数、通道极性状态打包成调试变量运行中随时能查看。这个习惯帮我排查过好多次问题有时候板子上量测信号都不正常读回寄存器发现是代码里某个配置被其他模块覆盖了。如果你正准备移植到自己的板子上建议先把硬件最小系统跑通只留一路电流采样不开闭环用上位机看解调数值随外部直流电流变化的线性度。线性度没问题了再上闭环不然闭环后出了问题很难分辨是采样的问题还是控制器的问题。数据出来之后再做一次全范围的电流标定把偏移和增益固化下来整套链路就算真正可用了。
返回列表