TI C2000 CMPSS寄存器配置详解:从比较器到斜坡发生器的闭环控制 1. CMPSS寄存器组概览与设计哲学在TI C2000系列微控制器MCU的实时控制生态中比较器子系统Comparator Subsystem, CMPSS是一个集成了模拟比较器、内部DAC数模转换器和数字斜坡发生器的强大外设。它绝非一个简单的“电压比较器”而是一个为复杂闭环控制如峰值电流模式PWM控制、功率因数校正、过流保护量身定制的信号链处理单元。理解其寄存器组就是理解如何将这片硅片上的模拟与数字资源转化为精准、可靠且响应迅速的控制逻辑。CMPSS_REGS寄存器组是软件与这片硬件交互的唯一窗口。它被精心划分为几个功能明确的模块比较器控制与状态、内部DAC管理、斜坡发生器控制以及数字滤波与保护。这种划分并非随意而是紧密对应着硬件数据流。例如一个典型的应用场景是斜坡发生器由RAMPMAXREFS等寄存器配置产生一个周期性递减的斜坡电压作为内部DACDACHVALA的参考值该DAC输出与外部采样的电流信号通过COMPHSOURCE选择在比较器中进行实时比较比较器的原始输出经过可配置的数字滤波器CTRIPHFILCTL等寄存器控制进行消抖最终生成一个干净、稳定的数字信号CTRIPH去触发PWM模块的动作实现精确的电流环控制。整个寄存器组的设计体现了“影子-活动”Shadow-Active寄存器架构的精髓。你会频繁看到VALSShadow影子和VALAActive活动这样的寄存器对例如DACHVALS/DACHVALA、RAMPMAXREFS/RAMPMAXREFA。这种设计是为了实现无毛刺、同步更新。软件可以在任何时间安全地修改影子寄存器而真正的硬件参数活动寄存器只会在特定的同步事件如EPWMSYNCPER发生时才从影子寄存器加载。这确保了在复杂的、时序要求严苛的PWM周期中关键参数如DAC值、斜坡最大值的变更不会在周期中间发生从而避免了控制输出的不稳定甚至灾难性的故障。理解这一点是高效、安全配置CMPSS的基石。2. 核心控制寄存器深度解析2.1 COMPCTL比较器功能的总开关COMPCTL寄存器是CMPSS模块的“大脑”它定义了比较器工作的基本模式。其每一位都对应着一个关键的选择。高/低比较器输入源选择COMPHSOURCE/COMPLSOURCE这是第一个关键决策点。你可以选择让比较器的反相输入端-连接至内部DAC的输出还是直接连接到一个外部GPIO引脚。在大多数电机控制或电源应用中内部DAC用于设定一个可编程的阈值而外部引脚则接入需要监控的模拟信号如电流采样。选择内部DAC设为0是构建一个可调阈值比较器的标准做法。输出极性控制COMPHINV/COMPLINV这个位简单但重要。它决定了比较器输出的逻辑极性。默认情况下当正相输入电压高于反相输入-电压时输出为高。但在某些保护逻辑中你可能需要低电平有效的触发信号。此时将该位置1即可反转输出无需在外部电路或软件逻辑中再做处理简化了系统设计。信号路径选择CTRIPHSEL/CTRIPLSEL与CTRIPOUTHSEL/CTRIPOUTLSEL这是CMPSS灵活性的核心体现。比较器的原始输出异步路径可能包含噪声和毛刺。CMPSS提供了两级滤波路径供你选择异步输出Asynchronous路径最短延迟最小但易受噪声影响。同步输出Synchronous经过一个系统时钟SYSCLK同步能消除亚稳态增加了一个时钟周期的延迟。数字滤波器输出Digital Filter Output经过可配置的多数表决滤波器能有效抑制高频噪声但引入更多延迟。锁存的数字滤波器输出Latched Filter Output滤波器输出被锁存直到被特定事件如EPWMSYNCPER或软件清除。CTRIPxSEL用于选择驱动到内部逻辑如作为PWM的Trip输入的信号源而CTRIPOUTxSEL用于选择输出到外部引脚如果映射了的信号源。通常对于关键的保护功能如过流关断我们会选择“锁存的数字滤波器输出”值3因为它最稳定且状态会保持直到被明确清除防止噪声引起的误复位。而对于需要快速响应的实时控制信号可能会选择“同步输出”值1以权衡延迟和稳定性。异步路径使能ASYNCHEN/ASYNCLEN这是一个高级功能。当上述SEL字段选择为“锁存的滤波器输出”值3时此位决定是否将原始的异步比较器输出与锁存的滤波器输出进行“或”OR操作。这用于实现一种“快速响应、慢速恢复”的保护机制异步路径能瞬间触发保护快速响应而锁存的滤波器路径则确保只有持续存在的故障才会保持保护状态慢速恢复防误触。实操心得在初次配置时我建议先将CTRIPxSEL和CTRIPOUTxSEL设置为相同的值比如都设为3锁存的滤波器输出以确保内外信号一致。在系统调试稳定后再根据实际需求考虑是否分离它们。ASYNCHEN功能非常强大但在启用前务必通过示波器确认你的输入信号噪声水平否则快速路径可能因噪声而频繁误触发。2.2 COMPDACCTLDAC与斜坡发生器的指挥中心如果说COMPCTL管“比较”那么COMPDACCTL就管“参考”。它协调着内部DAC和斜坡发生器这两个为比较器提供参考电压的核心部件。DAC参考源选择SELREF内部DAC的满量程基准电压源来自哪里有两个选择VDDA模拟电源通常更干净、更稳定或VDAC专用的DAC参考电压引脚可能由外部更精密的基准源提供。在精度要求高的场合务必使用一个稳定的外部基准连接到VDAC引脚并将此位置1。如果对精度要求一般使用VDDA置0则更简单。DAC值来源选择DACSOURCE这是连接DAC与斜坡发生器的关键。当此位为0时高侧DAC的活动值DACHVALA直接从其影子寄存器DACHVALS加载这意味着DAC输出一个由软件设定的静态值。当此位为1时DACHVALA的值由斜坡发生器实时提供这意味着DAC输出一个动态变化的斜坡电压。这是实现峰值电流控制等算法的核心斜坡电压在每个PWM周期开始时重置为最大值然后线性递减与采样的电流信号比较从而确定PWM关断点。斜坡同步源选择RAMPSOURCE斜坡发生器需要一个同步信号EPWMSYNCPER来启动其递减操作并决定何时从影子寄存器加载新参数。这个信号来自某个ePWM模块。此字段让你选择具体是哪一个ePWM模块例如EPWM1, EPWM2...来驱动CMPSS。这实现了CMPSS与特定PWM通道的严格同步是构建时间关键型控制环路的基础。软件加载触发选择SWLOADSEL此位决定了影子寄存器如DACHVALS的值何时被加载到活动寄存器DACHVALA。选项是在SYSCLK边沿或EPWMSYNCPER边沿。强烈建议选择EPWMSYNCPER置1。这确保了DAC值的更新与PWM周期严格同步避免了在PWM周期中间改变比较阈值可能导致的脉冲宽度异常或次谐波振荡。消隐功能BLANKEN BLANKSOURCE在电力电子中功率器件如MOSFET、IGBT开关瞬间会在电流采样信号上引入巨大的噪声尖峰称为“开关噪声”。如果此时比较器工作会产生错误的触发。消隐功能就是在每个PWM周期特定时间段通常由ePWM模块的EPWMBLANK信号定义内强制让比较器输出无效或忽略其输出。BLANKSOURCE让你选择由哪个ePWM模块产生这个消隐窗口。合理设置消隐时间是硬件设计可靠性的重要保障。注意事项FREESOFT位涉及仿真器挂起时的行为在大多数实际运行场景中保持默认值即可。RAMPLOADSEL位决定了当高比较器触发时斜坡状态寄存器RAMPSTS是从RAMPMAXREFA还是RAMPMAXREFS重新加载。在典型的峰值电流控制中我们通常希望每个PWM周期都从预设的最大值开始因此会配置为从影子寄存器RAMPMAXREFS加载置1这样软件可以在任何时候更新影子寄存器并在下一个周期生效。3. DAC与斜坡发生器寄存器详解3.1 DAC值寄存器静态阈值的设定CMPSS包含两个独立的内部DAC一个高侧DAC通常用于过流或上限保护和一个低侧DAC用于欠流或下限保护。每个DAC都有一套影子-活动寄存器对。DACHVALS/DACHVALA高侧DAC值寄存器。DACLVALS/DACLVALA低侧DAC值寄存器。影子寄存器*VALS可读写R/W。软件在此写入期望的DAC数字码值。该值只有在特定的加载事件由COMPDACCTL[SWLOADSEL]选择发生时才会传递到活动寄存器。活动寄存器*VALA只读R。它反映了当前DAC实际输出的数字码值。你可以读取它来确认当前有效的阈值。DAC的输出电压计算公式为Vout (DACVAL / 4096) * Vref其中DACVAL是寄存器中0-409512位的数值Vref是COMPDACCTL[SELREF]所选的参考电压VDDA或VDAC。配置示例假设VDDA 3.3VSELREF0我们需要设置一个1.65V的阈值。计算数字码DACVAL (1.65V / 3.3V) * 4096 2048(0x800)。将0x800写入DACHVALS。确保COMPDACCTL[SWLOADSEL] 1在EPWMSYNCPER同步加载。下一个EPWMSYNCPER事件到来时DACHVALA会自动更新为0x800DAC输出电压变为1.65V。3.2 斜坡发生器寄存器动态阈值的引擎斜坡发生器是CMPSS用于生成线性递减电压的核心。它包含几个关键寄存器RAMPMAXREFS/RAMPMAXREFA斜坡最大值寄存器。定义了每个周期开始时斜坡的初始值。RAMPDECVALS/RAMPDECVALA斜坡递减值寄存器。定义了每个SYSCLK周期斜坡值减少的量。RAMPSTS斜坡状态寄存器。只读反映了斜坡的当前值。RAMPDLYS/RAMPDLYA斜坡延迟寄存器。定义了在收到EPWMSYNCPER信号后延迟多少个SYSCLK周期才开始递减。工作流程在每个EPWMSYNCPER信号通常与PWM周期开始同步的边沿RAMPSTS从RAMPMAXREFA其值可能来自RAMPMAXREFS加载复位到最大值。等待RAMPDLYA个系统时钟周期。之后在每个SYSCLK周期RAMPSTS的值减去RAMPDECVALA。当RAMPSTS递减时如果COMPDACCTL[DACSOURCE]1则DACHVALA会跟随RAMPSTS变化从而产生一个线性下降的DAC输出电压。当高比较器检测到输入信号超过这个下降的DAC电压时产生CTRIPH信号可以用于关闭PWM峰值电流控制。同时根据COMPDACCTL[RAMPLOADSEL]的设置RAMPSTS可能被重新加载开始下一个斜坡周期。参数计算 假设系统时钟SYSCLK 100 MHzPWM开关频率Fsw 100 kHz周期Tsw 10 us我们希望斜坡在一个PWM周期内从最大值MAX线性下降到0。RAMPDECVALMAX / (Tsw * SYSCLK)MAX / (10e-6 * 100e6)MAX / 1000。 这意味着如果MAX设置为1000那么RAMPDECVAL设为1即可在10us内从1000递减到0。MAX的值即RAMPMAXREF决定了斜坡的“斜率”它与RAMPDECVAL共同决定了斜坡从开始到结束的时间。避坑指南斜坡发生器的位数是16位RAMPMAXREF,RAMPDECVAL,RAMPSTS而DAC是12位。当DACSOURCE1时RAMPSTS的高12位会被用作DACHVALA。因此在设置斜坡参数时要确保RAMPMAXREF的值左移4位乘以16来对应DAC的满量程。例如想让DAC输出满量程RAMPMAXREF应设为0xFFF065520而不是0x0FFF4095。4. 数字滤波与锁存控制4.1 滤波控制寄存器CTRIPxFILCTL CTRIPxFILCLKCTL比较器的直接输出容易受到噪声干扰。CMPSS集成了可编程的数字滤波器采用“多数表决”机制来滤除毛刺。SAMPWIN采样窗口定义了参与表决的连续样本数量实际样本数为SAMPWIN1。窗口越大滤波效果越强但延迟也越大。THRESH阈值定义了需要多少个相反状态的样本才能改变滤波器输出实际阈值为THRESH1。例如SAMPWIN67个样本THRESH3需要4个相反样本。这意味着在7个采样周期内必须有至少4个样本与当前输出状态相反滤波器输出才会翻转。这能有效滤除宽度小于4个采样周期的脉冲噪声。CLKPRESCALE时钟预分频定义了滤波器采样时钟实际分频系数为CLKPRESCALE1。采样频率 SYSCLK / (CLKPRESCALE 1)。降低采样频率可以滤除更高频率的噪声但同样增加延迟。配置策略滤波器的设计需要在噪声抑制和响应延迟之间取得平衡。对于过流保护延迟必须控制在安全范围内通常几百纳秒。你可以先估算需要抑制的噪声脉冲最大宽度T_noise然后设置CLKPRESCALE使采样周期Tsample T_noise。接着设置THRESH使得(THRESH1)*Tsample大于噪声宽度但小于你需要保护动作的最大允许延迟。4.2 状态与清除寄存器COMPSTS COMPSTSCLRCOMPSTS寄存器是只读的状态窗口反映了高/低比较器数字滤波器当前的输出COMPxSTS及其锁存值COMPxLATCH。锁存值一旦被置位将保持为1直到被明确清除。COMPSTSCLR寄存器用于清除上述锁存状态。它提供了两种清除方式软件清除HLATCHCLR/LLATCHCLR向这些位写1会立即产生一个脉冲清除对应的锁存器。这是最直接的方式。同步事件清除HSYNCCLREN/LSYNCCLREN将这些位置1可以使能通过EPWMSYNCPER信号自动清除锁存器。这在周期性的控制系统中非常有用例如在每个PWM周期开始时自动复位保护锁存为新的周期做准备。典型应用在故障保护中我们通常将CTRIPxSEL设置为“锁存的滤波器输出”。当故障发生时COMPxLATCH被置1并锁存触发保护动作如关闭PWM。此时即使故障消失保护状态依然维持。系统需要在确认安全后通过软件写COMPSTSCLR寄存器或等待使能的EPWMSYNCPER信号来清除锁存才能解除保护、恢复正常运行。这实现了“故障自保持”的安全逻辑。5. 寄存器锁定与Driverlib API映射5.1 COMPLOCK配置的安全锁COMPLOCK寄存器是一个重要的安全特性。它允许你将关键配置寄存器如COMPCTL,COMPHYSCTL,COMPDACCTL, 以及两个滤波控制寄存器组一次性锁定。向对应的位如COMPCTL位写入1后该寄存器组将变为只读只有系统复位才能解锁。使用场景在产品开的早期阶段你可能会频繁调整比较器极性、迟滞等参数。但在产品最终发布或功能安全要求高的应用中为了防止软件跑飞意外修改这些关键配置导致系统行为异常应该在初始化序列的最后阶段将这些配置锁定。这是一个低成本但高收益的防错Failsafe机制。5.2 从寄存器到Driverlib函数直接操作寄存器地址和位域是底层开发的基本功但TI也提供了更易用的Driverlib库函数来抽象这些操作。输入材料末尾的Table 16-25提供了清晰的映射。例如配置比较器功能不再需要直接拼写COMPCTL的值而是调用CMPSS_configHighComparator()和CMPSS_configLowComparator()。设置DAC值调用CMPSS_setDACValueHigh()它会自动处理影子寄存器的写入。配置斜坡发生器调用CMPSS_configRamp()一次性设置最大值、递减值、延迟和同步源。配置数字滤波器调用CMPSS_configFilterHigh()和CMPSS_configFilterLow()。开发建议对于初学者或快速原型开发强烈建议从Driverlib开始。它的函数名具有自解释性减少了直接查阅寄存器手册的负担并且代码可读性更高。当你需要更极致的性能优化或实现Driverlib未覆盖的特定功能时再深入寄存器级编程。理解寄存器是根本善用库函数是效率。在实际项目中我通常先用Driverlib快速搭建功能框架在性能调优阶段再针对关键路径进行寄存器级的精细调整。