深入解析SDFM模块与Sinc滤波器:高精度实时控制系统的信号采集与保护

📅 2026/7/21 21:11:02 👁️ 阅读次数 📝 编程学习
深入解析SDFM模块与Sinc滤波器:高精度实时控制系统的信号采集与保护

1. SDFM模块配置与Sinc滤波器在实时控制系统中的应用

在电机驱动、数字电源或者高精度传感器测量这些实时控制领域里,我们工程师常常面临一个经典难题:如何既快又准地获取关键的模拟量信号,比如相电流、母线电压或者温度。传统的逐次逼近型ADC虽然速度不慢,但在高精度、高抗噪的场合下,其成本和布线复杂度会急剧上升。这时,Σ-Δ调制技术配合片上集成的Sinc滤波器,就成了一种非常优雅的解决方案。它把高精度的模拟信号调理和模数转换部分“外包”给了外置的Σ-Δ调制器芯片,而微控制器(比如TI的TMS320F28004x)则专注于用数字滤波器处理高速的1-bit数据流,最终得到我们需要的多比特数字结果。

这种架构的优势很明显:抗干扰能力强(差分信号传输)、精度高(轻松做到16位以上有效位数)、隔离性能好,而且节省了MCU的模拟引脚资源。但要把这套系统用稳、用准,核心就在于对MCU内部那个Sigma-Delta滤波器模块的透彻理解和精细配置。这不仅仅是调用几个库函数那么简单,从引脚配置、时钟模式选择,到Sinc滤波器类型、过采样比的权衡,再到数据同步与保护逻辑的实现,每一步都藏着细节。搞懂了这些,你才能真正发挥出SDFM在实时控制系统中的威力,实现高精度采样与快速硬件保护的无缝结合。接下来,我就结合手册内容和实际调试经验,带你深入SDFM的世界。

2. 硬件接口配置与“第一公里”稳定性保障

任何外设的稳定运行都始于可靠的硬件连接,对于SDFM这种直接处理高速时钟与数据流的模块更是如此。配置不当,轻则数据跳动,重则系统误触发保护,因此我们必须重视这“第一公里”。

2.1 GPIO多路复用与输入限定配置

SDFM的输入信号(SDx_Cy时钟和SDx_Dy数据)需要通过GPIO引脚接入。TMS320F28004x的GPIO模块功能强大,但配置有严格的顺序要求,旨在消除引脚上的毛刺。

配置顺序至关重要:手册明确指出了配置顺序——先配置GPyGMUX寄存器(同时保持对应的GPyMUX寄存器为默认值0),然后再将GPyMUX寄存器写入目标值。这个顺序是为了在切换引脚功能时,避免出现短暂的中间状态导致引脚输出不可控的电平毛刺。在实际编程中,TI的驱动库GPIO_setPinConfig函数通常已经封装了这个顺序,但如果你是在直接操作寄存器,务必遵守此规则。

输入限定模式的选择:这是SDFM稳定性的第一道屏障。GPIO输入限定器可以对输入信号进行消抖或同步处理。

  • SYNC(同步)模式:这是TI官方推荐的选项。在此模式下,输入信号会与系统时钟(SYSCLK)同步。这相当于一个简单的硬件滤波器,可以滤除那些偶尔出现的、宽度小于一个SYSCLK周期的随机噪声毛刺。这对于SDx_Cy时钟引脚尤其重要,因为任何时钟线上的毛刺都可能直接导致SDFM内部采样错乱,产生错误数据甚至引发错误的比较器跳变。选择SYNC模式,就是为时钟信号增加了一层保护。
  • ASYNC(异步)模式:此模式下,输入信号直接进入,无同步延迟。虽然延迟最小,但它对输入信号上的噪声毫无抵抗能力,任何毛刺都可能被采集进来。除非你的硬件电路非常“干净”,信号完整性极佳,并且系统对延迟极其敏感(通常SDFM本身的滤波延迟远大于此同步延迟),否则不建议使用ASYNC模式。

重要提示:无论选择SYNC还是ASYNC,都必须确保你的信号满足数据手册中“SDFM Electrical Data and Timing”章节对应的时序要求。这包括SDx_Dy数据相对于SDx_Cy时钟的建立和保持时间。使用SYNC模式时,需要额外考虑同步器带来的延迟。

2.2 时钟极性处理与硬件设计要点

时钟极性反转:这是一个非常实用且容易忽略的细节。SDFM模块默认期望数据(SD-Dx)在时钟(SD-Cx)的下降沿变化,并在时钟的上升沿对数据进行锁存。然而,市面上有些Σ-Δ调制器芯片的输出时序恰恰相反:数据在时钟上升沿变化,期望接收端在下降沿采样。如果时钟和数据边沿关系不匹配,采到的全是错位的数据。

解决这个问题无需修改硬件电路,只需利用GPIO模块的输入反转功能。通过设置对应SD-Cx时钟引脚的GPxINV寄存器位,可以将输入的时钟信号极性反转。这样一来,原本是上升沿的变成了下降沿,从而与SDFM模块的预期采样边沿对齐,完美兼容不同厂商的调制器。

硬件布局与信号完整性: 手册中的“CAUTION”部分用加粗强调,必须认真对待。SDx_Cy时钟信号直接驱动SDFM模块内部逻辑,其质量是生命线。

  1. 串行端接:如果时钟驱动源(调制器芯片)的输出阻抗与PCB走线的特征阻抗不匹配,会在接收端(MCU引脚)产生信号反射和振铃(Ringing)。这种振铃在时钟边沿附近可能产生多次穿越逻辑门限的情况,被SDFM误判为多个时钟脉冲。在时钟线上串联一个小电阻(如22Ω-100Ω,具体值需根据仿真或调试确定)进行源端端接,是抑制振铃的常用有效方法。
  2. 布线隔离:SDx_Cy和SDx_Dy走线应远离其他噪声源,例如PWM输出线、电源开关节点、晶振电路等。建议采用差分走线(即使信号是单端的,也最好有紧邻的地线伴随),并增加与噪声源的间距,以减少耦合干扰。
  3. 电源去耦:为调制器和MCU的电源引脚提供充足、就近的退耦电容,确保电源干净,也是保证信号质量的基础。

3. 输入控制单元与调制器时钟模式解析

SDFM的输入控制单元是数据流的“海关”,它负责接收来自调制器的比特流和时钟,并根据配置的模式进行解码,将串行的比特流转换为可供后续滤波器处理的并行数据。理解其工作模式是正确配置的前提。

3.1 四种调制器时钟模式详解

输入控制单元通过SDCTLPARMx.MOD位域支持四种工作模式,以适应不同调制器的输出格式。

模式0 (MOD=0):标准模式

  • 描述:调制器时钟(SD-Cx)频率与调制器数据率(MDR)相同。输入控制单元在每个调制器时钟的上升沿对数据(SD-Dx)进行采样。
  • 应用场景:这是最常见、最标准的工作模式。绝大多数Σ-Δ调制器(如TI的AMC130x系列)都采用这种模式,输出独立的时钟和数据信号。
  • 时序要点:确保SD-Dx在SD-Cx上升沿之前和之后满足足够的建立和保持时间。

模式1 (MOD=1):半时钟模式

  • 描述:调制器时钟频率是数据率的一半。输入控制单元在时钟的每个边沿(上升沿和下降沿)都采样数据。这意味着每个时钟周期传输两个数据位。
  • 应用场景:用于某些为了节省引脚而将时钟速率减半的调制器。在此模式下,数据速率是时钟频率的两倍。
  • 硬件连接:时钟线连接不变,但需要理解此时时钟的实际含义是“位时钟”的一半速率。

模式2 (MOD=2):曼彻斯特编码模式

  • 描述:调制器时钟关闭(SD-Cx引脚可悬空),数据和时钟信息被编码在单一的SD-Dx信号中,采用曼彻斯特编码。输入控制单元内部会自动进行连续校准,以实现最佳解码性能。
  • 应用场景:用于输出曼彻斯特编码的调制器,进一步节省了一个引脚。这对于通道数多、引脚紧张的应用有吸引力。但需要注意,曼彻斯特编码本身有50%的固定开销,且解码电路会引入额外的延迟和复杂度。
  • 实操注意:选择此模式后,无需为SD-Cx引脚配置时钟功能。SDFM内部会从数据流中恢复时钟。

模式3 (MOD=3):双时钟模式

  • 描述:调制器时钟频率是数据率的两倍。输入控制单元每隔一个时钟上升沿(即每两个时钟周期)采样一次数据。
  • 应用场景:相对少见,可能用于某些特定架构的调制器或需要更高时钟频率进行同步的场景。

模式选择的核心逻辑:选择哪种模式,完全取决于你选用的Σ-Δ调制器芯片的数据手册。务必仔细阅读调制器手册中的“接口时序”或“数字输出”部分,确定其输出的是标准时钟数据对、半速时钟、还是曼彻斯特编码。配置错误会导致数据完全无法正确解码。

3.2 调制器满量程与输入范围注意

手册中的“Note”提醒了一点:为了达到理论上的最大输出值,调制器需要工作在绝对的正或负满量程。但绝大多数调制器的推荐工作范围是其满量程的80%(例如±250mV满量程的调制器,推荐输入电压为±200mV)。这意味着,在设计前端模拟电路(如采样电阻、运放增益)时,应该让被测信号的最大值落在调制器推荐输入范围的80%左右,为信号留出一定的余量,避免饱和失真,同时也能充分利用调制器的动态范围。

4. Sinc滤波器:核心原理、参数计算与选型指南

Sinc滤波器是SDFM模块的灵魂,它负责将高速的1-bit Σ-Δ数据流“还原”成我们需要的低速、高分辨率的数字样本。它的配置直接决定了系统的精度、速度和延迟。

4.1 Sinc滤波器的工作原理与频率响应

Sinc滤波器本质上是一个低通滤波器加抽取器。其Z域传递函数为:H(Z) = [(1 - Z^-OSR) / (1 - Z^-1)]^N。你可以把它想象成一个“平均值计算器”。N是滤波器阶数,OSR是过采样比。

  • 积分器(1/(1 - Z^-1)):对输入的比特流进行累加。阶数N越高,累加的“深度”越大。
  • 抽取器(Z^-OSR):每积累OSR个输入比特,才输出一个结果,从而将数据速率从调制器的高频(如10MHz)降低到可处理的中低频(如几十KHz)。
  • 微分器(1 - Z^-1):抵消积分器带来的直流增益,并形成Sinc函数的频率响应。

不同阶数滤波器的特性

  • Sinc1 (N=1):阻带衰减最慢,滚降特性最平缓。延迟最小,但抗混叠和抑制带外噪声的能力最弱。
  • Sinc2 (N=2):常见的二阶滤波器,在延迟和抑制能力之间取得较好平衡。
  • Sinc3 (N=3):阻带衰减更快,对带外噪声(特别是调制器噪声整形后的高频噪声)抑制能力更强。但延迟比Sinc2大50%。
  • SincFast (N=3但结构优化):同为三阶,但通过结构优化,在保持与Sinc3相近的阻带抑制能力的同时,拥有更低的群延迟。这对于需要快速保护的电流环应用是极佳选择。

频率响应选择:参考手册中的频率响应图(Figure 17-7)。当OSR=32,调制器频率为10MHz时,Sinc3和SincFast在低频段(我们关心的信号带宽内)响应几乎一致,但SincFast的过渡带更陡。如果你的信号带宽是1kHz,那么选择OSR=256的Sinc3或SincFast,其通带衰减都可以忽略不计。但如果你关心的是滤波器的阶跃响应速度(即延迟),SincFast则是更优解。

4.2 关键参数计算:数据速率、延迟与有效位数

这是工程配置中的数学核心,必须掌握。

  1. 数据速率:即滤波器输出结果的更新频率。数据速率 = 调制器数据率 / OSR

    • 举例:调制器数据率 = 10 MHz, OSR = 256。
    • 计算:数据速率 = 10,000,000 / 256 = 39,062.5 Hz ≈ 39.1 kSPS(每秒千样本)。
  2. 滤波器延迟:从滤波器使能或复位后,到输出第一个稳定、正确结果所需的时间。延迟 = 滤波器阶数 / 数据速率

    • 举例(接上)
      • 对于Sinc3滤波器(阶数=3):延迟 = 3 / 39,062.5 Hz = 76.8 µs。
      • 对于Sinc2滤波器(阶数=2):延迟 = 2 / 39,062.5 Hz = 51.2 µs。
      • 对于SincFast滤波器(阶数=3,但有效延迟通常介于Sinc2和Sinc3之间,具体需查表或实测):手册示例中按3阶计算为76.8µs,但实际因其结构优化,初始错误样本数更少(见后文表17-6),有效建立时间可能更短。

    延迟的工程意义:这个延迟直接影响了系统的响应时间。在电流环控制中,从采样到PWM更新,这个延迟是总环路延迟的一部分。在过流保护中,从故障发生到比较器触发,这个延迟决定了保护的速度。SincFast在这里的优势就体现出来了

  3. 有效位数:ENOB是一个结果性指标,它由调制器性能、滤波器类型和OSR共同决定。它并非直接配置,而是我们设计的目标。通常,OSR越高,ENOB越高,但数据速率越低,延迟越大。需要在分辨率、速度和延迟之间做权衡。最准确的方法是查阅你所使用的Σ-Δ调制器数据手册,其中通常会提供不同滤波器类型和OSR下的ENOB典型值曲线。

4.3 滤波器类型选型实战建议

如何为你的应用选择合适的Sinc滤波器?

  • 追求极致速度的保护回路(如逐周期限流):首选SincFast。它能在三阶滤波器的噪声抑制水平下,提供接近二阶滤波器的延迟,是实现快速硬件保护(Comparator Filter)的理想选择。数据手册表17-6指出,SincFast仅前两个样本不正确,而Sinc3也是前两个,但SincFast的稳定速度更快。
  • 高精度数据采集回路(如相电流反馈用于控制算法):可以选择Sinc3。它提供最高的阻带抑制,能更干净地滤除高频量化噪声,在相同的OSR下,理论上能得到略好于SincFast的SNR和ENOB。如果系统对这几十微秒的额外延迟不敏感,Sinc3是稳妥之选。
  • 对延迟和精度要求均衡的通用场景Sinc2是一个折中的选择,延迟比Sinc3小三分之一。
  • 对延迟极度敏感,且噪声环境较好的场景:可以考虑Sinc1,但需谨慎评估其较弱的噪声抑制能力是否满足要求。

一个常见的配置策略:在电机控制中,我们经常为同一个电流信号配置两个滤波器通道:

  • 数据滤波器:配置为Sinc3,OSR=256,用于高精度电流环计算。数据速率约39kSPS,延迟约77µs,对于通常1-10kHz的电流环带宽,这个延迟在可接受范围内。
  • 比较器滤波器:配置为SincFast,OSR=32,用于快速过流保护。数据速率高达312.5kSPS,延迟仅约9.6µs(SincFast按~3阶算,3/(10MHz/32)),能实现微秒级的硬件保护响应。

5. 数据滤波器单元的深度配置与数据管理

数据滤波器(Primary Filter)是我们获取高精度测量值的主要通道,其配置灵活性很高,也涉及一些容易出错的细节。

5.1 输出格式:32位与16位的抉择与移位配置

数据滤波器的原生输出是26位有符号整数(二进制补码格式)。但我们可以选择以32位或16位格式来读取它。

  • 32位格式:设置SDDPARMx.DR = 1。这是最直接的方式,CPU/CLA/DMA直接读取完整的26位数据(存储在32位寄存器的低26位,高6位为符号扩展)。��需担心数据溢出或精度损失,编程简单。
  • 16位格式:默认或设置SDDPARMx.DR = 0。这是为了节省存储空间和总线带宽,尤其是在使用CLA或需要存储大量样本时。但这里有一个巨大的坑:16位有符号整数的范围是[-32768, 32767],而26位数据的范围远大于此(例如Sinc3+OSR128时,范围为[-2097152, 2097152])。直接截取低16位会导致数据完全错误。

解决方案是右移:必须通过配置SDDPARMx.SH(移位控制位)来将26位数据右移,使其最大值落在16位有符号范围内。移位操作相当于除以2^SH。

  • 如何确定SHIFT值?手册表17-4是关键。它根据滤波器类型和OSR,给出了推荐的移位值。
    • 举例:Sinc3滤波器,OSR=128。查表可知,OSR范围128-161对应Sinc3的SHIFT=7。
    • 计算验证:Sinc3在OSR=128时,峰值输出为±2,097,152。右移7位(除以128)后,范围变为±16384,完全落在16位有符号范围内。如果配置为SHIFT=6(除以64),范围变为±32768,此时正值32768(0x8000)在16位有符号表示中恰好是负数最小值-32768的补码,会导致正满量程被误表示为负满量程,引发严重错误。

核心要点:使用16位输出格式时,必须严格参照表17-4配置SHIFT位。错误的移位配置是导致数据滤波器输出值异常的最常见原因之一。一个调试技巧:可以先配置为32位输出,观察正常值的大小,然后根据其动态范围手动计算并验证所需的移位位数。

5.2 数据FIFO:高效中断管理与同步采集

每个数据滤波器通道都有一个32位宽、16级深的FIFO。它的存在不是为了缓存数据,而是为了降低CPU中断频率,实现批处理。

为什么要用FIFO?假设数据速率为39kSPS,如果每个新数据都产生一个中断,CPU将每秒被中断39000次,开销巨大。通过FIFO,我们可以让滤波器积累多个样本(例如16个)后再产生一次中断,CPU在一次中断服务程序中批量读取16个数据,将中断频率降低到原来的1/16(约2.4kHz),大大减轻了CPU负担。

FIFO关键配置步骤

  1. 使能FIFO:SDFIFOCTLx.FFEN = 1
  2. 使能FIFO中断:SDFIFOCTLx.FFIEN = 1
  3. 设置中断水位线:SDFIFOCTLx.SDFFIL = N(N=0~16)。当FIFO中数据个数(SDFFST) >= N时,触发中断。注意:N=0是一个特殊值,表示FIFO非空即中断(每有一个数据就中断),失去了批处理意义。通常N设置为1到16之间的值,例如8。
  4. 选择数据就绪中断源为FIFO中断:SDFIFOCTLx.DRINTSEL = 1

“等待同步”功能:这是实现与PWM开关事件精确同步采样的关键功能。在电机控制中,我们希望在PWM开关事件的特定时刻(例如PWM周期中心点)进行电流采样,以避开开关噪声。

  1. 使能等待同步:SDSYNCx.WTSYNCEN = 1
  2. 配置同步源:通过SDSYNCx.SYNCSEL选择来自哪个PWM模块的SOCA或SOCB事件作为同步信号。
  3. 工作原理:使能后,FIFO会忽略所有数据就绪事件,直到收到一个SDSYNC脉冲。收到脉冲后(WTSYNFLG置1),FIFO才开始收集数据。当收集的数据量达到设定的水位线N时,触发中断。之后,可以通过自动(WTSCLREN=1)或手动(WTSYNCLR=1)方式清除WTSYNFLG,FIFO再次进入等待状态,等待下一个同步脉冲。
  4. FIFO同步清除:还可以设置FFSYNCCLREN=1,使得在每次收到SDSYNC事件时自动清空FIFO。这确保了每次同步采集周期都是从全新的FIFO开始,避免了新旧数据混合。

同步功能的应用场景:在采用双采样(例如PWM周期开始和中间各采样一次)的电机控制中,可以为两个采样点配置不同的SDSYNC源(如SOCA和SOCB),并让FIFO等待对应的同步信号,从而实现严格时间对齐的采样序列。

5.3 初始无效样本问题

手册表17-6揭示了一个重要现象:Sinc滤波器在使能、重新配置或收到SDSYNC事件后,输出的前几个样本是不正确的。

  • Sinc1:无错误样本。
  • Sinc2:第1个样本错误。
  • Sinc3/SincFast:前2个样本错误。

这对我们意味着什么?

  1. 数据滤波器:在启动或同步后,应该丢弃前几个样本(例如对于Sinc3,丢弃前2个),或者等待超过滤波器延迟时间后,再开始使用数据。在FIFO使能且与同步功能结合时,尤其要注意第一个同步周期采集的数据可能包含无效样本。
  2. 比较器滤波器更为关键!手册用“CAUTION”警告:必须在配置比较器滤波器后,等待足够长的建立时间,才能使能比较器中断(IELxIEHx。这个“足够长的建立时间” =比较器滤波器延迟 + 5个SD-Cx时钟周期。如果提前使能,滤波器初始的错误输出值可能会意外触发过压或欠压保护,导致系统误动作。这是一个非常实际的“坑”。在初始化代码中,配置完比较器滤波器后,必须插入一段延时(软件循环或利用定时器),然后再使能其中断。

6. 比较器滤波器:实现快速硬件保护

比较器滤波器(Comparator Filter)是SDFM的“哨兵”,它的目标不是高精度,而是快速检测输入信号是否越界,并立即触发保护动作(如PWM关断)。

6.1 比较器工作模式与配置

与数据滤波器不同,比较器滤波器输出为16位无符号格式(低电平为0,高电平为1,结果始终为正)。它的OSR(COSR)范围较小(1-32),意味着数据速率更高,延迟更低,专为速度优化。

比较器单元结构:如图17-9所示,比较器滤波器的输出(SDCDATAx)会同时送到三个数字比较器:

  1. 高阈值比较器:当SDCDATAx >= HLT时,触发COMPHx事件。
  2. 高阈值Z比较器:当SDCDATAx >= HLTZ时,触发COMPHZx事件。注意:此事件不能直接触发SDFM错误中断,但可连接至eCAP模块用于测量阈值穿越的频率或占空比。
  3. 低阈值比较器:当SDCDATAx <= LLT时,触发COMPLx事件。

阈值设置技巧:阈值寄存器HLTHLTZLLT的值是基于比较器滤波器输出范围的。例如,使用SincFast,COSR=32,从表17-7可知其输出范围为0~2048。如果你希望在实际电流达到50A时触发保护,而你的信号调理电路使得50A对应调制器满量程的80%,那么你需要计算50A对应的数字码值,并据此设置阈值。务必使用无符号数进行比较

6.2 保护逻辑的实现与中断配置

比较器事件的典型用途是触发PWM跳变(Trip),实现纳秒级的硬件保护。

  1. 配置比较器滤波器:选择快速滤波器类型(如SincFast),设置合适的COSR(如16或32),在延迟和分辨率间权衡。
  2. 设置阈值:根据保护点计算并设置HLT(过流点)和LLT(欠流点,可能用于检测开路)。
  3. 连接至PWM跳变模块:通过X-Bar(交叉开关)将COMPHxCOMPLx事件路由到对应PWM模块的Trip输入源。这一步通常在SysConfig图形化工具中配置更直观。
  4. 配置中断(可选):如果需要CPU记录保护事件或进行复杂处理,需使能主中断SDCTL.MIE=1和对应的比较器中断使能位SDCPARMx.IEHSDCPARMx.IEL再次强调:使能中断前必须等待“比较器滤波器延迟+5个SD-Cx周期”。
  5. 高阈值Z比较器的特殊用途COMPHZx事件专为连接eCAP而设计。例如,设置HLTZ=0x4000(对应中间值),使能HZEN,并将COMPHZx通过X-Bar输入到eCAP。这样,eCAP可以精确测量信号过零(或过某个阈值)的频率或占空比,常用于无传感器控制中的位置估算。

比较器滤波器无法同步:请注意,比较器滤波器不能像数据滤波器那样使用SDSYNC事件进行同步。它始终以最高速度连续运行,以确保保护的实时性。

7. 中断系统与实战配置解析

SDFM的中断分为两大类:错误中断和数据就绪中断。清晰地理解其结构,才能高效地处理各种事件。

7.1 SDFM错误中断

错误中断SDy_ERR是一个聚合中断源,任何通道发生以下四种错误之一都会触发它:

  1. 比较器低阈值事件COMPLx。需使能SDCPARMx.IEL=1
  2. 比较器高阈值事件COMPHx。需使能SDCPARMx.IEH=1
  3. 调制器时钟失效事件MFx。当SD-Cx时钟信号超过64个SYSCLK周期没有跳变时触发。需使能SDCPARMx.MFIE=1。此功能用于检测调制器是否掉线或信号断开,是重要的诊断功能。
  4. FIFO溢出事件SDFFOVFx。当CPU/CLA读取FIFO的速度跟不上数据产生的速度,导致16级FIFO被写满后仍有新数据到来时触发。需使能FIFO(FFEN=1)和溢出中断(OVFIEN=1)。

错误中断处理流程:进入SDy_ERR中断服务程序后,第一步是读取SDIFLG寄存器,检查是哪个标志位被置起,以确定错误类型和通道。处理完毕后,必须向SDIFLGCLR寄存器的对应位写1来清除标志位。注意:清除标志位的前提是中断源已消失(例如,过流条件已解除),否则标志位会再次立即置起。

7.2 数据就绪中断

数据就绪中断SDy_DRINTx是每个数据滤波器通道独立的中断(共4个),用于通知CPU/CLA有新数据可读。其触发源有两种选择,由SDFIFOCTLx.DRINTSEL控制:

  • DRINTSEL=0:中断源为AFx(Acknowledge Flag)。即每个新数据产生就触发一次中断。不推荐使用此模式,除非OSR极大、数据速率极低。
  • DRINTSEL=1:中断源为SDFFINTx(FIFO中断)。即当FIFO中数据量达到预设的水位线SDFFIL时才触发中断。这是推荐模式,能有效降低中断频率。

数据就绪中断配置流程

  1. 配置数据滤波器参数(类型、OSR等)并使能。
  2. 使能FIFO (FFEN=1)。
  3. 使能FIFO中断 (FFIEN=1)。
  4. 设置FIFO中断水位线 (SDFFIL=8)。
  5. 选择数据就绪中断源为FIFO中断 (DRINTSEL=1)。
  6. 使能该通道的数据滤波器中断 (SDDFPARMx.AE = 1)。注意,此位在FIFO中断模式下仍需要使能。

7.3 实战中的中断服务程序设计要点

  1. 效率:在SDy_DRINTx中断中,应使用循环或DMA方式快速读取FIFO中的所有数据(从SDDATFIFOx寄存器读取,读指针会自动递增)。避免在中断内进行复杂的数学运算。
  2. 同步:如果使用了“等待同步”功能,在中断中读取数据后,可能需要手动清除WTSYNFLG标志,以准备接收下一批同步数据。
  3. 错误处理:在SDy_ERR中断中,除了处理标志位,还应考虑实现恢复逻辑。例如,发生FIFO溢出,可能意味着主循环任务过载,需要检查系统负载;发生调制器失效,可能需要尝试重新初始化调制器或触发系统故障安全流程。
  4. 中断优先级SDy_ERR(保护相关)应设置为高优先级,确保能及时响应。SDy_DRINTx(数据采集)优先级可稍低。注意协调好与PWM、ADC等其他关键外设中断的优先级关系。

8. 理论输出计算与系统校准

手册第17.7节提供的公式,是连接模拟世界与数字世界的桥梁。理解这些公式,不仅能验证系统工作是否正常,更是进行系统校准(将数字码值转换为实际物理量,如安培、伏特)的基础。

8.1 从电压到数字码:一步步计算

我们以手册示例中的AMC1306x25调制器为例,复盘计算过程。假设:

  • 调制器型号:AMC1306x25(增益为x25,满量程差分电压Vclipping = ±320mV)。
  • 实际输入差分电压:V_in = AINP - AINN = 100mV
  • SDFM配置:数据滤波器为Sinc3,DOSR = 100;比较器滤波器为Sinc3,COSR = 32

步骤1:计算比特流中‘1’的密度公式(13):密度 = (输入电压 + Vclipping) / (2 * Vclipping)密度 = (100mV + 320mV) / (2 * 320mV) = 420mV / 640mV = 0.65625这个值表示,在调制器输出的高速比特流中,逻辑‘1’所占的比例约为65.625%。

步骤2:计算比较器滤波器输出(16位无符号)公式(14):比较器输出 = 密度 * 最大滤波器输出(滤波器类型, COSR)查表17-7,Sinc3在COSR=32时的最大输出值为32768。比较器输出 = 0.65625 * 32768 = 21504这个值会出现在SDCDATAx寄存器中。

步骤3:计算数据滤波器输出(32位有符号)公式(15)和(16)合并理解:首先计算一个中间值FilterOutputFilterOutput = (|输入电压| / Vclipping) * 最大滤波器输出(滤波器类型, DOSR)= (100mV / 320mV) * 最大输出查表17-3,Sinc3在DOSR=100时的最大输出值需要估算。DOSR=128时是2097152,DOSR=64时是262144。对于DOSR=100,可以通过插值或根据公式最大值 = (OSR)^3来估算:100^3 = 1,000,000。更准确的方法是使用公式:对于Sinc3,峰值输出 =(OSR)^3。所以最大值 = 100^3 = 1,000,000FilterOutput = (100/320) * 1,000,000 = 0.3125 * 1,000,000 = 312,500由于输入电压是正的(100mV),所以32位数据滤波器输出就是这个正值:312,500。 如果输入电压是-100mV,则32位输出应为312,500的二进制补码(即 -312,500 的补码表示)。

步骤4:计算数据滤波器输出(16位有符号)公式(17):16位输出 = 32位输出 >> SHIFT查表17-4,对于Sinc3,DOSR=100落在102-127区间,对应的SHIFT=616位输出 = 312,500 >> 6 = 312,500 / 64 ≈ 4882但手册示例给出的结果是9765,右移了5位。这里存在差异,可能是因为手册示例中的DOSR=100是近似描述,实际计算时采用了表17-4中128-161区间对应的SHIFT=7?或者是最大值计算方式不同?这正说明了查表17-4的重要性。在实际工程中,我们不应自己计算移位值,而应严格根据滤波器类型和OSR,直接查表17-4获取SHIFT值。假设对于此配置查表得SHIFT=5,则312,500 / 32 = 9765.625,取整为9765,与手册一致。

8.2 工程校准实践

在实际项目中,我们更常做的是“校准”:已知一个精确的输入物理量(如50A电流),读取对应的SDFM输出码值,从而建立码值与物理量之间的比例关系。

  1. 前端标定:在信号进入调制器之前,使用精密电源施加几个已知的差分电压(如-200mV, 0mV, +200mV),覆盖整个预期输入范围。
  2. 数据采集:对于每个输入电压,让系统稳定运行,然后通过调试器或串口读取大量SDFM的输出数据(32位格式),计算其平均值。
  3. 建立线性关系:以输入电压为X轴,SDFM输出码值为Y轴,进行线性拟合。得到斜率K(码值/伏特)和零点偏移Offset
  4. 换算到物理量:结合你前端传感器(如电流采样电阻、运放增益)的变换关系,将电压斜率K转换为最终的物理量斜率(如码值/安培)。电流(A) = (SDFM_Code - Offset) / K
  5. 验证:施加另一个已知的测试点,用上述公式反算,验证计算出的物理量是否与真实值吻合。

注意事项

  • 校准应在系统实际工作的温度下进行,以减小温漂影响。
  • 使用32位数据进行校准计算,以获得最高精度。最终在控制算法中,可以根据需要转换为16位或浮点数。
  • 对于比较器保护的阈值,也需要根据校准后的比例,将物理保护点(如75A)换算成对应的数字阈值HLT