尧图精选

AMC1306与Sigma-Delta ADC高精度隔离电流采样方案详解

🕒 发布时间:2026/9/27 1:06:06 📁 来源:尧图网络
搞电机控制或者电源硬件的人十有八九都被电流采样折磨过。用隔离运放带宽和共模抑制总有一个拖后腿用霍尔传感器温漂和体积又让人头疼想把采样做得又准、又稳、又带隔离Sigma-Delta ADC是绕不开的一条路而AMC1306就是这条路上最常用的一颗芯片。配合DSP内部的SDFM模块做数字解调正好能发挥它“高分辨率、内部隔离、抗干扰强”的优势这也是目前伺服驱动、PMSM控制器、PFC和储能变流器里很主流的高端电流采样方案。这篇文章我就按自己做过的项目来聊从为什么选AMC1306到硬件电路怎么搭再到DSP端怎么用Sinc3滤波器把1-bit数据流解调成16位电流值最后把调试现场踩过的坑也一并晒出来。适合正在做电机驱动、开关电源或者逆变器的朋友参考尤其是那些准备把模拟电流环替换成数字隔离采样的团队。内容不藏私看完基本可以直接抄作业。1. 为什么选用Sigma-Delta AMC1306从方案对比说起1.1 传统方案的三个痛点先说说我为什么弃用传统方案。早些年做电机控制器最常见的是隔离运放配SAR ADC。隔离运放比如AMC1200、ACPL-C79B这类带宽通常只能到100kHz左右用来采50Hz到几kHz的电流波形没问题但如果IGBT开关频率到了20kHz以上采样点稍微没对齐波形上就全是一根根毛刺。更麻烦的是很多隔离运放的非线性误差和失调电压不算小批量出货时你得逐台校准占用产线工时。第二种常用方案是霍尔电流传感器。霍尔传感器不用隔离运放那么复杂直接穿过铜排就行但它的温度漂移确实劝退了好多人尤其是-40℃到85℃这个区间零点漂移能把小电流段准度吃掉好几个百分点。另外霍尔传感器的带宽高的一般都贵体积也大三相电流下来三个LEM模块直接把板子面积撑大了。第三种就是直接电阻分流配普通ADC这在小功率板上最多见。但问题同样明显高侧采样需要独立的隔离电源和电平搬移电路低侧采样又免不了共模干扰尤其在IGBT开关瞬间地弹能把ADC的参考电压直接打穿。就算你把PCB走线精心调过抗干扰效果也远不如一颗原生带隔离的调制器来得省心。1.2 AMC1306的核心定位AMC1306是TI推出的隔离式Sigma-Delta调制器输入测量范围是±250mV输出是1-bit的高频数据流内部隔离耐压可以做到5kVrms左右。它最关键的用法是把采样电阻上的微小电压直接调制变成一串数字位流然后交给DSP或者FPGA去解调。这个位流本身已经从模拟域跨到了数字域过隔离带的是一条数字信号所以抗干扰能力天然比模拟隔离运放强得多。这颗芯片还有一个很实用的特性就是支持外部输入时钟。这样DSP可以主动控制调制器的采样时刻把解调过程放在自己眼皮底下不像AMC1305那样内部自带时钟你只能被动接收。这个特性在做多相同步采样时尤其重要几个通道用同一个时钟源驱动采样点天然对齐。1.3 和SAR ADC的边界在哪里有人会问既然SAR ADC的采样率动不动就是几MSPS为什么还要绕一圈玩Sigma-Delta关键在量化精度和噪声整形。普通SAR ADC虽然采样率高但分辨率做到16位、18位时成本会明显升高而且它只能做单次快照没办法把一个高频噪声环境里的信号平均出来。Sigma-Delta走的是过采样加噪声整形路线用极高速的1-bit量化换取低频段极高的有效位数也就是用速度换精度而且这个精度是实打实得到的不是靠软件平均硬凑出来的。当然延迟是绕不开的代价。Sigma-Delta输出位流本身不是结果必须经过数字滤波器抽取并加权平均后才是有效数据这个过程会引入一个群延迟。SAR ADC你这边触发那边就出结果Sigma-Delta却要等一个滤波窗后面的控制环必须把这个延迟算进去。所以如果应用对动态响应极其敏感比如要做毫秒级堵转保护那你不能只靠Sigma-Delta的软件结果还是要单独设计硬件比较器通道兜底。2. 解调原理1-bit流如何变成16位电流值2.1 AMC1306的位流输出长什么样AMC1306的输出是非常密集的脉冲流典型时钟频率可以到10MHz甚至20MHz。每一秒钟吐出上千万个0/1脉冲单个脉冲几乎不携带信息但一段时间内的占空比就精确反映了输入电压大小。输入为正满量程时数据流中1的密度接近上限输入为零时1的密度接近50%这就是所谓的“脉冲密度调制”。这个位流你要是想用单片机GPIO直接读出来算平均值那基本不现实。一两微秒的窗口里也就十几个脉冲统计意义太弱所以必须交给DSP里的SDFM模块或者FPGA里自己写的数字滤波器来做解调。这也是为什么很多人一开始用普通MCU尝试外部Sigma-Delta芯片最后都铩羽而归的原因。好在TI的C2000系列从F28379D到F28004x内部都集成了SDFM外设专门干这个活。2.2 为什么大家都用Sinc3滤波器SDFM模块里最常用的是Sinc滤波器也叫CIC滤波器本质上是“累加、抽取、差分”三个动作的组合。一阶Sinc相当于连续做分段平均二阶和三阶则是多次平均的级联。阶数越高对带外噪声的抑制越强但代价是延迟更大、带内下降也更明显所以要根据实际需要选。工程上我基本只用Sinc3。原因很简单Sinc3对第一次旁瓣的衰减比Sinc2多了大约13dB处理电机驱动这种开关噪声密集的环境时带外混叠会小很多。Sinc1虽然延迟最小但滤波性能太弱属于能用但不好用。实际项目中你用示波器看Sinc3解调出来的电流波形比Sinc2明显更干净肉眼可见地少了很多白噪声毛刺。2.3 OSR、带宽与延迟的计算SDFM里有个参数叫OSR也就是过采样率它决定了对多少位原始位流做一次抽取。数据更新率等于位流时钟除以OSR比如时钟是10MHz、OSR128那么最终输出的电流数据更新频率就是10MHz / 128 78.125kHz这对一般20kHz以下的电流环控制频率来说绰绰有余。延迟可以按一个经验公式估算tdelay ≈ N × OSR / (2 × f_CLK)其中N是Sinc滤波器的阶数Sinc3就是3。(f_CLK是位流时钟。)同样以10MHz时钟、OSR128为例延迟大约是 3×128/(2×10MHz) 19.2μs。这19.2微秒对电流环来说意味着什么呢如果控制频率是10kHz一个周期是100微秒延迟占了接近五分之一如果控制频率升到20kHz那就接近半个周期了这时候不补偿或者不降OSR电流环相位裕度会被吃得很严重。不同OSR的实际表现我整理过一个对照表方便大家快速选型OSR数据更新率Sinc3延迟典型适用场景32312.5kHz4.8μs高速电机、需要快速过流响应的场合64156.25kHz9.6μsFOC电流环 10kHz~20kHz 控制的折中12878.125kHz19.2μs伺服、PMSM控制最常用的档位25639.06kHz38.4μs发热大或低速高精度应用动态响应差这些延迟还只是数字滤波器本身带来的还没算AMC1306内部延迟和DSP读取后的软件执行时间。所以实际项目里除非对静态精度有变态要求我一般不推荐一上来就上OSR256宁可把OSR降下来再把模拟滤波加厚一点也不等延迟拖垮系统。2.4 数据格式与符号处理SDFM解调出来的结果是一串二进制码正负满量程对应最大和最小码值零点是中间值。用的时候要特别注意符号扩展尤其是寄存器里的原始值看起来像“一个很大的无符号数”如果不转成有符号数计算出来的电流会正负颠倒或者出现跳变。实际写代码时我的习惯是第一时间把原始码转成int16或int32后续所有运算统一用浮点或者Q格式避免中途换类型踩坑。除了这种“定位为数据”的常规理解SDFM还有一个快速比较器通道它可以在不解调成完整数据的前提下直接比较位流密度产生一个硬过流信号。这个对IGBT短路保护来说特别靠谱延迟极低比等软件中断判断快几个数量级。下面硬件章节我会专门提到怎么用。3. 硬件电路设计采样电阻、滤波器和隔离电源不能含糊3.1 先算采样电阻满量程不是拍脑袋定的AMC1306的输入范围固定是±250mV所以采样电阻的大小直接决定了你能采多大的电流。选型公式非常简单R_shunt 250mV / Imax比如你设计额定电流20A、峰值电流50A的驱动器那么采样电阻最好选5mΩ或2mΩ。5mΩ对应满量程50A2mΩ对应满量程125A留了充足的过载余量。我平时会做这样一张对照表采样电阻满量程电流备注0.5mΩ500A大功率驱动器常用需配合四线采样1mΩ250A通用工业驱动器2mΩ125A中小型PMSM驱动器5mΩ50A伺服和家电级别的驱动器10mΩ25A小功率板卡精度比较高采样电阻的功率余量一定不能省。额定20A电流在5mΩ电阻上的发热功率是PI²×R400×0.0052W也就是说至少要选3W以上的电阻否则温度一上来阻值就会漂而阻值漂了你的电流读数就直接跟着漂。如果板子空间允许建议直接用带开尔文端子的采样电阻把采样点直接接到电阻本体两端不要经过PCB走线这样才能把走线压降误差降到最低。3.2 输入RC滤波别把调制器喂太饱AMC1306作为Sigma-Delta调制器输入端其实不需要像SAR ADC那样做严格的抗混叠滤波因为噪声整形本身会让高频噪声往高频段推最终被数字滤波器吸收。但这不意味着你可以在输入端裸奔IGBT开关瞬间的高压尖峰和共模电流非常容易被采样电阻感应进来所以输入端还是要加一个差分RC低通。我常用的经验值是R100Ω到1kΩC100pF到1nF具体根据调制器时钟和系统噪声谱来调。曾经有一次调试10MHz时钟下我一开始用R510Ω、C1nF波形是干净了但阶跃响应变慢FOC里的电流环在加速段有明显跟随滞后。后来把电容降到330pF电阻也降到200Ω输出那点噪声增加完全在接受范围但动态响应立刻好了很多。最终结论是RC时间常数控制在0.1到0.5微秒之间比较合适既不影响正常频带又能把开关尖峰削掉一大半。3.3 隔离电源和地策略AMC1306有高压侧和低压侧两个独立的电源域虽然两边都只要3.3V或5V但绝对不能共用同一个电源轨。高压侧是跟着母线电位浮动的如果你直接拿隔离输出电压之外的电源去给高压侧供电就破坏了隔离屏障等于把差分采样变成了共模短路。实际做法是让高压侧的3.3V由专门的隔离DC-DC模块产生比如UCC12050这类或者用很小的隔离电源模块反正要保证高压侧的地和你IGBT母线的参考地一致低压侧的地和DSP的模拟地一致。这里要单独提醒高压侧电源的噪声会直接进到采样链路里所以尽量在高压侧电源输出端加一个LDO或者至少加一颗高频低阻的磁珠再给AMC1306供电。否则你会看到解调出来的电流波形上蒙着一层周期性噪声频率刚好等于隔离电源的开关频率排查起来相当费时间。3.4 布局布线和硬件过流保护PCB布局上采样电阻和AMC1306之间的距离要尽量短建议小于1厘米。采样电阻的两根差分走线要并行靠近走中间不要走数字线周围铺上保护地。AMC1306的时钟和数据引脚属于数字接口但要尽量远离功率管的驱动走线避免耦合进去的高频噪声在调制器输出端形成干扰。另外强烈建议把SDFM的比较器功能用起来。在DSP内部配置一个阈值让比较器直接监控位流密度一旦超过设定值立刻输出一个硬件过流信号这个信号可以接EPWM的DIGITAL COMPARE或者直接拉到Trip Zone引脚把PWM锁死。整个过程不经过软件中断延迟在微秒级别。很多设备在IGBT炸管前能靠这一道硬保护捡回一条命千万别省。4. DSP端实现寄存器配置、EPWM同步与代码框架4.1 硬件连接与SDFM模块框架我以TMS320F28379D为例来说明它内部有SDFM外设一个SDFM模块可以接4路外部Sigma-Delta调制器。AMC1306的CLKIN接DSP的SDFM时钟输出引脚DATA接SDFM数据输入引脚。要注意的是AMC1306的输出电平是3.3V而F28379D的GPIO供电也是3.3V两者可以直接连。如果你用的DSP是1.8V或2.5V IO电平中间必须加电平转换不能硬接。SDFM模块内部大致分两条路径一条是快速比较器路径一条是高精度滤波器路径。快速比较器直接看位流密度适合做保护高精度滤波器就是我们前面说的Sinc滤波器OSR和阶数都在这条路径上配置。两条路径可以同时工作互不影响所以你完全可以在同一个通道上既做软件FOC电流采样又做硬件过流保护。4.2 初始化SDFM的关键步骤初始化代码本质上就是四件事配置GPIO引脚为SDFM功能配置外部时钟引脚和输入引脚选择Sinc滤波器的阶数配置OSR并启动滤波器。下面是核心片段的示意写法// F28379D SDFM1 通道0初始化示例基于官方驱动库风格 GPIO_setPinConfig(GPIO_6_GPIO6); // 根据实际引脚对照表设置 GPIO_setPinConfig(GPIO_7_GPIO7); // 配置SDFM1通道0外部时钟模式 SDFM_setClockSource(SDFM_BASE, 0, SDFM_EXTERNAL_CLOCK); SDFM_setFilterConfig(SDFM_BASE, 0, SDFM_FILTER_SINC3); SDFM_setFilterOSR(SDFM_BASE, 0, SDFM_FILTER_128); // 使能滤波器数据寄存器自动清零 SDFM_setDataAveragingControl(SDFM_BASE, 0, SDFM_AVERAGING_ENABLE); // 使能SDFM通道和中断 SDFM_enableFilter(SDFM_BASE, 0); SDFM_enableInterrupt(SDFM_BASE, 0, SDFM_INTERRUPT_READ);不同版本的官方库API名称会略有差异如果你用的SDK比较新建议直接参考controlSUITE或C2000Ware里的Example_2837xD_SDFM工程把sdfm_1ch_sinc3那个例程跑通再移植到自己的项目里。上电顺序方面最好的做法是先配置SDFM时钟输出再让AMC1306开始工作这样调制器一开始吐出位流时DSP这边滤波器已经就绪了避免第一个数据点出现异常。4.3 EPWM触发采样让数据对齐PWM中心这一点非常关键。Sigma-Delta解调器本身是连续在跑的每时每刻都在更新数据所以你“什么时候去读”决定了你拿到的是当前哪个时刻的电流值。如果随便在中断里读采样点可能落在IGBT开通瞬间或死区切换附近这时候开关噪声最大电流波形上会出现大量周期性毛刺。我的做法是使用EPWM模块产生ADC SOC触发再把触发点设置在PWM载波的中央。两电平三相逆变器在PWM中点处三相上下管都处于确定的开关组合状态此时相电流等于母线电流的一半左右而且dv/dt开关噪声已经衰减完了是完美的采样窗口。配置EPWM的比较寄存器让它在PWM周期一半时触发ADCADC中断里什么杂事都不干第一时间把SDFM的最新数据读回来这样就保证了每次参与FOC计算的电流值都是同一时刻的物理电流。同步还有个隐藏好处多路电流采样值天然对齐。比如你同时采A相和B相电流如果用两个SDFM通道只要共用一个时钟源它们解调出的数据在相位上是一致的不会出现因为采样时刻不同导致的坐标变换误差。4.4 数据读取与标定流程读取数据时建议直接封装一个小函数把寄存器值转成带符号的物理电流值。下面是一个可参考的示意// 读取SDFM通道0的原始数据并转成int16 int16_t raw (int16_t)SDFM_getFilterResult(SDFM_BASE, 0); // 减去零点码再乘增益系数得到实际电流 float i_phase (float)(raw - zero_code) * current_per_lsb;标定是整个链路里最繁琐但也最必须的部分。我常用的标定流程是控制器上电后不使能驱动器输出此时电流为0连续采集SDFM数据几百次取平均值把结果存成zero_code。然后需要一台电流源或者电子负载给驱动器注入一个已知幅值的直流电流一般在20%、50%、100%额定点各取一个数据用最小二乘拟合出current_per_lsb。标定系数建议保存到片内Flash这样下次上电直接加载不用每次重新标定。零点漂移是个老问题AMC1306的失调电压随温度会变尤其环境温度变化超过几十度时零点码可能漂几个LSB。如果产品工作温度范围很宽除了出厂标定还建议在每次电机停机时做一次快速零点校验把最新的零点码覆盖到运行值里。这个操作看起来不起眼但能把低温段的电流精度救回来很多。5. 调试实录零漂、毛刺、延迟问题怎么破5.1 常见问题速查表调试过程中我遇到最多的问题主要集中在这几个地方整理成表格方便排查现象可能原因处理办法数据一直是零SDFM未收到时钟或数据极性错误检查CLKIN/DQ引脚配置用示波器确认位流是否存在数据满量程毛刺输入共模电压超标或RC参数异常检查采样电阻压降是否超过250mV确认RC时间常数合理数据有周期性尖峰采样点没有对齐PWM中心调整EPWM触发相位让读取时刻避开开关边沿零点漂移大AMC1306高压侧电源噪声大或温度变化优化高压侧LDO增加停机零点校准电流环动态响应差Sinc滤波器OSR太高导致延迟过大降低OSR并在控制环里加入延迟补偿5.2 案例一毛刺大被PWM开关噪声折磨我曾经做过一台双电机驱动器第一版PCB打样回来上电后发现电流波形上布满了高频毛刺幅值最大能到几百毫安的等效误差转速越高毛刺越密。一开始怀疑是软件滤波参数问题把OSR从128调到256毛刺确实小了但电流环开始明显发闷堵转响应变得软绵绵。最后用近场探头扫了一下 PCB发现是AMC1306的数据线从IGBT驱动电阻旁边穿过去了每次IGBT开关时强电场直接耦合到数字线路上。解决办法是调整走线把数据线和时钟线改了路径离驱动电阻远了5毫米并且增加了包地。同时把输入RC滤波改成R200Ω、C330pF毛刺直接降到了一个可以忽略的量级。这个案例说明硬件布局比任何数字滤波都管用滤波只是治标走线才是治本。5.3 案例二温度一变零点就飘另一个设备做完高低温实验后老化出来一批板子的零点码差异很大。排查后确认AMC1306本身失调是正常的问题出在高压侧3.3V供电上。那批板子为了省成本用了一颗隔离电源模块而没有加LDO它的输出电压在不同温度下波动了大约50mV而这个电压直接作为AMC1306的参考电压源导致整个采样链路的零点跟着电源一起漂。解决方案是把高压侧电源改成LDO稳压后再供电并在软件里增加了STO停机状态下的零点刷新。此后一整轮高低温测试零点码的波动减小了一个数量级。以后我再做类似设计就要求必须在AMC1306高压侧电源加LDO这也是我至今不妥协的一个底线。5.4 案例三Sinc3延迟让电流环抖动还有一次做高速PMSM项目开关频率开到了20kHz控制频率也是20kHz按理论分析电流环带宽可以做到3kHz以上但实际调试时发现转速一上去电流波形开始抖动还伴随高频啸叫。后来把SDFM的OSR从128降到了64延迟从19.2μs降到9.6μs抖动立刻减轻了再把电流环的PI参数重新标定一遍整个系统就稳定了。这件事给我的教训是高速控制时不能只看数据更新率还必须看Sinc滤波器的群延迟。如果应用确实需要低延迟建议在OSR64和Sinc3之间取平衡必要时也可以试试Sinc2快速通道牺牲一点清晰度换动态性能。另外如果控制周期是50μs延迟19.2μs理论上可以在电流环里做一个“当前值速度×延迟时间”的线性外推把软件预测和时间戳补偿都用起来但这个做法对噪声敏感需要配合低通否则反而会把毛刺放大。这里我再单独讲一个小技巧调试时不要只盯着最终解调出来的电流值先看AMC1306输出的原始位流。用示波器探头挂在DATA引脚上看看有没有稳定的脉冲密度变化。很多时候软件层的各种奇怪问题根源其实都在这一串位流上。位流干净了后面的解调才谈得上准确。回到配置上通用性比较强的启动参数组合是AMC1306 DSP的SDFM、Sinc3、OSR128触发方式用EPWM中点同步。这套组合在大部分PMSM低速和中等转速工况下噪声和延迟的平衡性都很好。如果你做的是高速电机或者对堵转响应要求极其苛刻的设备再降到OSR64同时在软件里做好延迟补偿基本就能覆盖绝大多数工程场景。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →