1. 为什么逐波限流值得单独拿出来讲
做数字电源或者电机驱动的朋友,对逐波限流(Cycle-By-Cycle Limiting)这个概念应该不陌生。它的核心诉求很朴素:每一个PWM开关周期内,只要电流超过设定阈值,立刻把这一拍的驱动脉冲掐掉,下一个周期重新开始。这种保护方式响应快、不会像硬件锁死那样一停到底,非常适合LLC、移相全桥、Buck/Boost这类需要"限流但不停机"的场合。
在TI的TMS320F2802x系列上,实现逐波限流最经典的路径就是走CMPSS(Comparator Subsystem)加TZ.CBC(Trip Zone Cycle-By-Cycle)这条链路。为什么不用ADC采样加软件判断?因为ADC采样到中断响应再到改PWM寄存器,这条路径的延迟通常在几百纳秒到微秒级,而CMPSS是纯硬件比较器,从信号输入到TZ触发,延迟可以压到几十纳秒。对于开关频率上百kHz的场合,这个差距直接决定了你的功率管是活着还是炸了。
但问题在于,CMPSS的配置细节相当琐碎。DAC的参考电压怎么给、DHR寄存器怎么算、比较器输入是走内部DAC还是外部引脚、CBC和OST两种Trip模式到底选哪个、EPWM的TZ子模块怎么联动——这些环节任何一个配错,限流要么不动作,要么乱动作。我在实际项目里就遇到过DAC值算错导致限流点偏高30%的情况,台架上跑得好好的,一上负载就炸管。
这篇内容就是把这套链路从头到尾拆一遍。从CMPSS内部结构讲起,到DAC的DHR寄存器计算,再到TZ.CBC的配置和EPWM联动,最后给出可直接复现的代码和踩坑记录。适合正在用F2802x做电源或电机控制、需要加逐波限流保护的工程师,也适合想搞清楚CMPSS这套硬件比较器到底怎么用的人。下面所有配置基于F2802x的寄存器手册和我在实际项目中的验证,参数计算过程会写清楚,方便你按自己的硬件改。
2. CMPSS内部结构与信号链路拆解
2.1 CMPSS到底由哪些模块组成
CMPSS不是一个简单的比较器,它是一个子系统。F2802x里每个CMPSS包含两路比较器:COMPA(高比较器)和COMPB(低比较器),外加两路12位DAC分别给这两个比较器提供参考电压。这个结构决定了它能同时做"过流"和"欠流"或者"正向过流"和"反向过流"两种判断。
信号流向是这样的:外部模拟信号从CMPSS的输入引脚进来,先经过一个多路选择器,可以选择正端接外部引脚还是接内部DAC,负端同理。选好之后进入比较器,比较结果经过数字滤波器(可选)后,输出到CTRIP信号线上。CTRIP再连到EPWM的TZ子模块,触发CBC或OST动作。
这里有个容易搞混的点:DAC的输出既可以作为比较器的参考,也可以单独输出到引脚上。在逐波限流场景里,我们通常是把DAC输出作为比较器的负端参考,外部电流采样信号接正端。当电流信号超过DAC设定的电压时,比较器翻转,CTRIP拉高,TZ触发。
2.2 为什么选CMPSS而不是ADC加软件
很多人第一反应是"我用ADC采样,在中断里判断不就行了"。理论上可以,但实际有几个硬伤。
第一是延迟。ADC采样本身有转换时间,F2802x的12位ADC在60MHz ADCCLK下最快也要几百纳秒,加上中断响应、中断服务程序执行、写EPWM比较寄存器,整条链路轻松超过1微秒。而CMPSS从输入到CTRIP输出,典型延迟是30到50纳秒,差了二十倍。
第二是确定性。软件判断受中断优先级、其他中断嵌套影响,最坏情况下的响应时间不可预测。硬件比较器是固定延迟,每个周期都一样,这对保护逻辑至关重要。
第三是CPU负担。逐波限流如果靠软件做,每个PWM周期都要进一次中断,CPU基本被占满。用CMPSS硬件做,CPU完全不用管,只在故障计数器溢出时才需要处理。
所以结论很明确:逐波限流这种要求"每拍都查、查了立刻动"的场景,必须走硬件比较器路径。ADC可以用来做慢速的过流保护和电流环控制,但逐波限流交给CMPSS。
2.3 DAC在CMPSS里的角色和配置要点
CMPSS里的DAC是12位电压型DAC,参考电压可以选VDDA或者VDAC。F2802x上通常用VDDA作为参考,典型值是3.3V。DAC的输出电压由DACVAL寄存器决定,但实际写入的是DHR(DAC Hold Register)寄存器,DACVAL是从DHR加载的。
这里有个关键细节:DHR是16位的,但只有高12位有效,低4位是保留位。也就是说你写DHR的时候,要把12位的DAC值左移4位再写进去。很多人直接写12位的值,结果DAC输出只有设定值的1/16,限流点严重偏低。
DAC的输出电压计算公式是:
V_DAC = (DHR >> 4) / 4096 × V_REF
其中V_REF是DAC参考电压,通常等于VDDA即3.3V。反过来,如果你知道想要的限流阈值对应的电压V_TH,那DHR值就是:
DHR = (V_TH / V_REF) × 4096 × 16
举个例子,假设电流采样电路是1V对应10A,你想限流在15A,那V_TH就是1.5V。DHR = (1.5 / 3.3) × 4096 × 16 = 0.4545 × 4096 × 16 = 29789。写成十六进制就是0x745D。这个值直接写进DHR寄存器就行。
DAC还有几种工作模式:静态模式下DACVAL固定不变,斜坡模式下DAC值可以按一定速率上升或下降。逐波限流通常用静态模式,设定好阈值就不动了。但如果做峰值电流模式控制,可能需要斜坡补偿,那就用斜坡模式。
3. 从DAC到TZ.CBC的完整配置流程
3.1 第一步:确定限流阈值和DAC代码
配置的第一步不是写代码,而是算清楚你要限多少安培。这个值来自你的功率级设计:MOSFET的额定电流、电感的饱和电流、采样电路的增益,三者取最小值再留20%裕量。
假设你的采样电路是霍尔传感器加运放,输出1.65V对应0A,灵敏度是66mV/A,双向采样。那正向15A时输出电压是1.65 + 0.066 × 15 = 2.64V。这个电压就是你要设的DAC阈值。
但注意,CMPSS的比较器输入范围是0到VDDA,2.64V在范围内没问题。DHR = (2.64 / 3.3) × 4096 × 16 = 0.8 × 4096 × 16 = 52429,十六进制0xCCCD。
这里有个实操技巧:算出来的DHR值最好用示波器实测验证一下。把DAC输出引脚配出来,万用表量一下实际电压,跟理论值对一下。我遇到过VDDA实际是3.28V而不是3.3V的情况,虽然差得不多,但如果你限流点卡得很紧,这点偏差也可能有影响。
3.2 第二步:配置CMPSS的输入选择和比较器
CMPSS的输入选择通过COMPCTL寄存器配置。关键位是COMPHSOURCE和COMPHINV。COMPHSOURCE选正端输入源,0是外部引脚,1是内部DAC。逐波限流场景下,正端接外部电流采样信号,所以COMPHSOURCE = 0。负端固定接DAC,不需要选。
COMPHINV决定是否反相输出。默认0,不反相,即正端大于负端时输出高。这正好符合过流逻辑:电流信号超过DAC阈值,比较器输出高,触发Trip。
还有一个COMPDACCTL寄存器里的DACSOURCE位,选DAC的参考源。0是VDDA,1是VDAC。F2802x上VDAC通常接外部基准,如果没有外部基准就选VDDA。
比较器还有迟滞(Hysteresis)配置,通过COMPHYSCTL寄存器设置。迟滞可以防止输入信号在阈值附近抖动导致输出反复翻转。对于电流采样信号,如果开关噪声比较大,建议开一点迟滞,典型值设到20到30mV。但迟滞太大会导致限流点不准,需要权衡。
3.3 第三步:数字滤波器的取舍
CMPSS每个比较器后面都有一个数字滤波器,通过CTRIPHFILCTL寄存器配置。滤波器本质是一个采样窗口:在连续的N个采样点里,如果所有点都满足条件,才输出有效。N由CTRIPHFILTHRES决定,采样时钟由CTRIPHFILCLKCTL分频。
滤波器的好处是抗噪声。电流采样信号上通常叠加了开关噪声,如果不滤波,比较器可能在每个开关沿都误触发。但滤波器会引入延迟,N越大延迟越大。假设采样时钟是SYSCLK/1即60MHz,N=5,那滤波延迟就是5个时钟周期约83ns。加上比较器本身的延迟,总共约130ns。对于100kHz开关频率(周期10微秒),这个延迟占1.3%,可以接受。
但如果你的开关频率是500kHz,周期2微秒,130ns就占6.5%了,可能影响限流精度。所以滤波器参数要根据开关频率和噪声情况折中。我的经验是:开关频率100kHz以下,N可以设到5到8;100到300kHz,N设3到5;300kHz以上,N设1到3,或者干脆旁路滤波器。
旁路滤波器通过COMPCTL里的CTRIPHSEL位设置,选0就是直接输出,不滤波。
3.4 第四步:TZ.CBC的配置和EPWM联动
CMPSS的输出CTRIP连到EPWM的TZ子模块。TZ有几种触发模式:OST(One-Shot Trip)触发后PWM一直关断,需要软件清除;CBC(Cycle-By-Cycle Trip)触发后只关断当前周期,下个周期自动恢复。逐波限流要的就是CBC。
配置CBC通过TZSEL寄存器。每个EPWM有TZ1到TZ6六个外部触发源,还有DCAEVT和DCBEVT两个来自CMPSS的数字比较事件。在F2802x上,CMPSS1的COMPA输出通常连到EPWM1的TZ1,CMPSS2连到EPWM2的TZ2,以此类推。具体对应关系要看芯片的引脚复用表。
TZSEL里对应的位写1就使能该触发源为CBC模式。比如要使能TZ1为CBC,就写TZSEL.bit.CBC1 = 1。注意TZSEL里OST和CBC是分开的位,同一个触发源可以同时使能OST和CBC,但通常我们只用CBC。
TZ动作配置在TZCTL寄存器。CBC触发时PWM输出可以选高阻、强制高、强制低、或者不动作。对于驱动MOSFET的场合,通常选强制低,让驱动信号拉低,管子关断。TZCTL里每个EPWM输出A和B分别配置,比如TZCTL.bit.TZA = 2表示强制低,TZCTL.bit.TZB = 2同理。
还有一个TZEINT寄存器,用来使能TZ中断。CBC触发时可以产生中断,在中断里做故障计数或者保护逻辑。如果只是纯硬件限流不需要软件干预,可以不使能中断。
3.5 第五步:EPWM的CBC恢复机制
CBC触发后,当前周期的PWM被强制到设定状态,但下一个周期怎么恢复?这由EPWM的TZCLR寄存器和CBC的自动清除机制决定。
CBC模式的特点是:触发事件在下一个PWM周期的CTR=0(计数器归零)时自动清除。也就是说,你不需要软件写TZCLR,硬件会在每个周期开始时自动清除CBC标志,PWM恢复正常输出。如果下一个周期电流仍然过流,CMPSS再次触发,再次关断。这就是"逐波"的含义:每个周期独立判断,独立动作。
但有个细节要注意:CBC的自动清除发生在CTR=0时,而CMPSS的触发可能发生在周期中间。如果电流在周期开始后很快就过流,PWM被关断,那这个周期剩下的时间PWM都是关断的。下一个周期CTR=0时CBC清除,PWM重新输出。如果过流是持续性的,那每个周期PWM都只输出一小段就被关断,等效占空比很小,电流被限制住。
这个机制天然实现了"限流但不停机"的效果。只要过流消失,PWM立刻恢复正常占空比。
4. 完整代码实现与参数计算实录
4.1 寄存器级配置代码
下面是我在实际项目中用的CMPSS加TZ.CBC配置代码,基于F2802x的寄存器定义。先配CMPSS1的COMPA做正向过流保护。
// 使能CMPSS1时钟 EALLOW; SysCtrlRegs.PCLKCR1.bit.CMPSS1ENCLK = 1; EDIS; // 配置CMPSS1的DAC EALLOW; Cmpss1Regs.COMPDACCTL.bit.DACSOURCE = 0; // DAC参考选VDDA Cmpss1Regs.COMPDACCTL.bit.SEL = 0; // DAC输出到比较器负端 Cmpss1Regs.DACHVALS.bit.DACVAL = 0xCCD; // 12位DAC值,对应2.64V EDIS; // 配置比较器 EALLOW; Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = 0; // 正端接外部引脚 Cmpss1Regs.COMPCTL.bit.COMPHINV = 0; // 不反相 Cmpss1Regs.COMPCTL.bit.CTRIPHSEL = 1; // 使能滤波器 Cmpss1Regs.COMPCTL.bit.COMPDACE = 1; // 使能DAC EDIS; // 配置数字滤波器 EALLOW; Cmpss1Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE = 0; // 采样时钟=SYSCLK Cmpss1Regs.CTRIPHFILCTL.bit.SAMPWIN = 5; // 采样窗口5个点 Cmpss1Regs.CTRIPHFILCTL.bit.THRESH = 5; // 阈值5,即5个点全满足才输出 EDIS;注意DACVAL写的是0xCCD,这是12位的值。前面算出来DHR应该是0xCCCD,但DACHVALS寄存器里DACVAL只有12位,所以写0xCCD。DHR是16位寄存器,低4位保留,实际有效的高12位就是0xCCD。如果你直接操作DHR寄存器,要写0xCCCD;如果操作DACHVALS,写0xCCD。
4.2 EPWM的TZ配置代码
接着配EPWM1的TZ,让CMPSS1的CTRIP触发CBC。
// 配置EPWM1的TZ EALLOW; EPwm1Regs.TZSEL.bit.CBC1 = 1; // 使能TZ1为CBC触发源 EPwm1Regs.TZCTL.bit.TZA = 2; // CBC触发时EPWMA强制低 EPwm1Regs.TZCTL.bit.TZB = 2; // CBC触发时EPWMB强制低 EPwm1Regs.TZEINT.bit.CBC = 0; // 不使能CBC中断 EDIS;这里TZSEL的CBC1对应TZ1,而TZ1在F2802x上默认连到CMPSS1的COMPA输出。具体连接关系要查芯片的数据手册引脚复用表。有些封装上TZ1和CMPSS1的对应关系是固定的,有些可以通过TZ1SEL寄存器选择源。F2802x上通常是通过EPWMxTZSELECT或者TZ1SEL来选,具体看手册。
如果需要CBC触发时产生中断做故障计数,把TZEINT.bit.CBC设为1,然后在PIE里使能对应的EPWM1_TZINT。中断服务程序里读TZFLG寄存器判断是哪个触发源,然后写TZCLR清除标志。注意CBC标志虽然硬件会自动清除,但中断标志需要手动清。
4.3 参数计算的实际验证
代码写完之后,一定要验证DAC输出和限流点是否一致。我的做法是:先把DAC输出配到一个空闲引脚上,用万用表量实际电压。然后在电流采样输入端加一个可调直流电压,慢慢升高,同时用示波器看EPWM输出。当电压超过DAC阈值时,EPWM输出应该被强制拉低。
实测中我发现几个偏差来源。一是VDDA实际值可能不是3.3V,比如3.28V,导致DAC输出偏低0.6%。二是比较器有输入失调电压,典型值几个毫伏,对应到电流可能零点几安培。三是采样电路的增益误差,电阻精度1%的话,增益误差也有1%。这些加起来,限流点的实际误差可能在2%到5%。如果要求高,可以在软件里做校准:实测触发点,反推DHR值修正。
还有一个坑:DAC的建立时间。DAC从写入DHR到输出稳定需要一定时间,手册上典型值是1微秒。如果在运行中动态改DHR值,要等建立时间过了再使能比较器,否则可能误触发。静态配置没这个问题。
4.4 多路CMPSS的同步问题
如果你的系统有多路CMPSS,比如三相电机驱动用三个CMPSS分别保护三相,那要注意同步。每个CMPSS的DAC是独立的,但比较器的响应时间有微小差异。如果三相电流应该同时过流,但实际因为比较器差异导致触发时间差了几十纳秒,问题不大。但如果做精确的电流平衡控制,可能需要校准每个CMPSS的失调。
另外,多个CMPSS的CTRIP可以连到同一个EPWM的TZ,实现"任一相过流就关断"的逻辑。这通过TZSEL里使能多个CBC位实现,比如CBC1和CBC2同时使能,TZ1或TZ2任一触发都动作。
5. 常见问题与排查技巧实录
5.1 限流不动作或动作点偏差大
这是最常见的问题。排查顺序如下:
先查DAC输出。用万用表量DAC引脚电压,跟理论值对比。如果偏差大,检查DHR写入值是否正确,特别是左移4位的操作有没有漏。我见过有人直接写12位值到DHR,结果DAC输出只有设定值的1/16,限流点高了16倍,等于没保护。
再查比较器输入。确认电流采样信号确实接到了CMPSS的正端引脚,而且信号幅度在0到VDDA范围内。如果信号超过VDDA,比较器输入可能被钳位,导致误判。
然后查CTRIP信号。CTRIP是内部信号,不能直接量,但可以通过配置COMPSTS寄存器读比较器输出状态。在过流条件下读COMPSTS.bit.COMPHSTS,应该是1。如果不是,说明比较器没翻转,检查输入和DAC。
最后查TZ配置。确认TZSEL的CBC位使能了,TZCTL的动作设对了。可以手动写TZFRC寄存器强制触发CBC,看EPWM输出是否按预期动作。如果手动触发有效但CMPSS触发无效,说明CTRIP到TZ的连接有问题,查芯片的TZ源选择寄存器。
5.2 CBC触发后PWM不恢复
CBC应该在每个周期CTR=0时自动清除。如果PWM一直不恢复,可能的原因:
一是TZCLR没有正确配置。虽然CBC自动清除,但有些情况下需要软件写TZCLR。检查TZCLR寄存器的CBC位是否在中断里被清除。如果使能了CBC中断但没清标志,中断会反复进入,但PWM应该还是能恢复。
二是过流是持续性的。如果电流一直超过阈值,每个周期CMPSS都触发,PWM每个周期都被关断,看起来就像没恢复。这时候要查为什么电流降不下来,可能是负载太重或者限流点设得太低。
三是CBC和OST同时使能了。如果TZSEL里同一个触发源的OST和CBC位都写了1,OST优先,触发后PWM一直关断。检查TZSEL,确保只使能了CBC。
5.3 开关噪声导致误触发
电流采样信号上的开关噪声是逐波限流的头号敌人。噪声尖峰可能超过DAC阈值,导致CMPSS误触发,PWM在不该关断的时候关断。
解决办法有几个层次。硬件上,在比较器输入加RC滤波,截止频率设在开关频率的1/10到1/5。比如100kHz开关频率,RC截止设10到20kHz。软件上,使能CMPSS的数字滤波器,设合适的采样窗口和阈值。布局上,电流采样信号走线远离开关节点,用地平面屏蔽。
我的经验是:硬件RC滤波加数字滤波器双管齐下,基本能解决90%的误触发。如果还有,就要查采样电路本身的设计,比如运放的带宽是否足够,霍尔传感器的响应是否跟得上。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| 限流不动作 | DHR写入错误 | 量DAC输出电压 | 确认左移4位,重算DHR |
| 限流点偏高 | DAC参考电压偏差 | 量VDDA实际值 | 按实际VDDA重算DHR |
| 限流点偏低 | 比较器失调 | 读COMPSTS状态 | 软件校准或换芯片 |
| CBC不恢复 | OST同时使能 | 查TZSEL寄存器 | 关闭OST位 |
| 误触发 | 开关噪声 | 示波器看采样信号 | 加RC滤波和数字滤波 |
| 触发延迟大 | 滤波器窗口太大 | 算滤波延迟 | 减小SAMPWIN或旁路 |
| 多相不同步 | 比较器失调差异 | 分别测各相触发点 | 单独校准每相DHR |
5.5 几个容易被忽略的细节
第一个是CMPSS的使能顺序。要先配DAC和比较器,再使能CMPSS模块,最后使能EPWM的TZ。如果顺序反了,可能在配置过程中产生误触发。我习惯在初始化最后统一使能TZ,之前先把TZFLG清一遍。
第二个是TZ引脚的复用。F2802x的TZ1到TZ6有些是复用在GPIO上的,如果GPIO被配成其他功能,TZ就用不了。检查GPAMUX和GPBMUX寄存器,确保TZ引脚配成了TZ功能。但CMPSS到TZ的内部连接不受GPIO复用影响,只走内部信号。
第三个是DAC的负载效应。如果DAC输出还驱动了其他电路,负载电流会影响DAC精度。CMPSS的DAC输出阻抗典型值是几kΩ,如果外接负载小于100kΩ,可能有偏差。逐波限流场景下DAC只内部用,不驱动外部负载,没这个问题。
第四个是温度漂移。比较器的失调电压和DAC的输出都会随温度变化。如果工作温度范围宽,比如-40到85度,限流点可能有几个百分点的漂移。高可靠性场合要做温度补偿,或者留足够的裕量。
6. 调试工具与实测方法
6.1 用CCS的寄存器视图实时监控
Code Composer Studio的寄存器视图是调试CMPSS的利器。在Expressions窗口里添加Cmpss1Regs和EPwm1Regs,可以实时看DACVAL、COMPSTS、TZFLG这些寄存器的值。过流发生时,COMPSTS.bit.COMPHSTS应该从0变1,TZFLG.bit.CBC也应该置位。
我习惯在调试时把TZFLG.bit.CBC配成GPIO输出,用示波器看触发时刻。这样能直观看到CMPSS触发和PWM关断之间的延迟。实测下来,从电流信号超过阈值到PWM输出拉低,总延迟在100到150纳秒之间,其中比较器延迟约50纳秒,滤波器延迟约80纳秒,TZ响应约20纳秒。
6.2 用DAC输出做自检
调试阶段可以把DAC输出配到引脚上,用信号发生器给比较器正端加一个三角波,示波器同时看DAC输出和EPWM输出。三角波从0升到VDDA,当超过DAC阈值时,EPWM应该关断。这样能精确测出实际触发阈值,跟理论值对比。
这个方法还能测迟滞。三角波上升时触发点是一个值,下降时触发点是另一个值,两个值的差就是迟滞。如果迟滞设得太大,限流点会不准,需要调小。
6.3 实际带载测试的注意事项
台架带载测试时,不要一上来就加满载。先从10%负载开始,慢慢加,同时用示波器看电流波形和PWM波形。当负载加到限流点附近时,应该能看到PWM占空比被限制住,电流不再上升。
如果一加负载就炸管,说明限流根本没起作用。这时候要立刻停机,回到空载用前面说的自检方法查CMPSS和TZ配置。不要抱着"再试一次可能就好了"的心态,功率管炸一次的成本比调试时间高得多。
带载测试还要注意散热。逐波限流工作时,MOSFET处于频繁开关状态,开关损耗比正常工作时大。如果限流持续时间长,管子温度会上升。实测中可以用热像仪看管子温度,超过100度就要考虑加强散热或者降低限流持续时间。
6.4 示波器抓取触发瞬间的技巧
用示波器抓CBC触发瞬间,建议用单次触发模式,触发源选EPWM输出下降沿。这样能抓到触发前后的波形。通道1接电流采样信号,通道2接EPWM输出,通道3接DAC输出(如果引出来了)。触发后看电流信号超过DAC输出的时刻,和EPWM下降沿的时刻,两者的时间差就是总延迟。
如果示波器有深存储,可以抓多个周期,看CBC是否每个周期都正确动作。正常情况下,过流期间每个周期PWM都只输出一小段,电流波形是锯齿状的,峰值被限制在阈值附近。
7. 性能优化与扩展思路
7.1 降低触发延迟的几种手段
如果应用对限流响应速度要求极高,比如GaN或SiC器件的高频场合,可以优化几个环节。
比较器延迟是固定的,没法改。滤波器延迟可以减小,把SAMPWIN从5降到3甚至1,延迟从80纳秒降到16纳秒。但抗噪声能力下降,需要硬件滤波补上。TZ响应延迟也可以优化,确保TZCTL直接配成强制低,不要走额外的逻辑。
还有一个技巧是用DCAEVT代替TZ。F2802x的EPWM有数字比较子模块,CMPSS的输出可以直接连到DCAEVT,然后配置DCAEVT触发CBC。这条路径可能比走TZ短一点,具体要看芯片的内部走线。实测差异不大,但值得一试。
7.2 从逐波限流扩展到峰值电流控制
CMPSS加DAC这套硬件,除了做保护,还能做峰值电流模式控制。原理是:DAC设定峰值电流阈值,CMPSS检测电流达到阈值时触发,通过DCAEVT直接关断PWM。下一个周期开始时PWM重新开通,电流上升,达到阈值再关断。这样每个周期的峰值电流都被精确控制。
这种控制方式比传统的ADC采样加软件比较快得多,适合高频开关电源。但要注意,峰值电流模式需要斜坡补偿来防止次谐波振荡。斜坡补偿可以通过DAC的斜坡模式实现,让DAC值在每个周期内按一定斜率变化。
7.3 多路CMPSS的级联保护
对于复杂系统,可以用多路CMPSS做分级保护。比如第一级CMPSS设一个较高的阈值,触发CBC做逐波限流;第二级CMPSS设一个更高的阈值,触发OST做永久关断。这样正常过载时逐波限流起作用,严重短路时直接停机。
两级保护的阈值要拉开距离,比如第一级15A,第二级25A。第一级用CBC,第二级用OST。TZSEL里分别使能CBC和OST位,TZCTL里CBC动作设强制低,OST动作也设强制低。OST触发后需要软件写TZCLR才能恢复,可以在中断里做故障记录和延时重启。
7.4 与ADC采样的配合使用
CMPSS做快速保护,ADC做慢速监控和电流环控制,两者配合使用效果最好。ADC可以在每个PWM周期采样电流平均值,用于电流环计算和过流计数。如果CBC触发次数超过一定值,比如连续100个周期都触发,说明负载异常,可以主动停机。
ADC的采样时刻要跟PWM同步,通常在CTR=0或者CTR=PRD时触发。F2802x的ADC支持EPWM触发,配置SOC的触发源为EPWM1的SOCA或SOCB。采样窗口要避开开关沿,等电流信号稳定后再采。
8. 我踩过的坑和最后分享几个技巧
第一个坑是DHR的左移。我一开始直接写12位值到DHR,DAC输出只有设定值的1/16,限流点高了16倍。台架上小负载跑没事,一加满载就炸管。后来用万用表量DAC输出才发现问题。这个错误很低级,但很容易犯,因为DHR寄存器的低4位在手册里写的是"reserved",很多人以为写0就行,实际上有效数据在高12位。
第二个坑是滤波器窗口设太大。我一开始为了抗噪声,把SAMPWIN设到15,结果滤波延迟240纳秒,限流响应变慢,电流峰值比阈值高了20%。后来降到5,配合硬件RC滤波,效果就好多了。滤波器参数不是越大越好,要算延迟。
第三个坑是TZ引脚复用。我用TZ1做CBC触发,但GPIO配置里TZ1被配成了普通IO,导致TZ功能失效。查了半天才发现是GPIO复用的问题。虽然CMPSS到TZ是内部连接,但TZ模块本身需要引脚使能。后来在GPAMUX里把对应引脚配成TZ1功能就好了。
最后分享一个调试技巧:在CCS里建一个Watch Expression,把Cmpss1Regs.COMPSTS.bit.COMPHSTS、EPwm1Regs.TZFLG.bit.CBC、EPwm1Regs.TZCTL.bit.TZA这几个关键位放进去,实时看状态变化。过流发生时,COMPHSTS先变1,然后TZFLG的CBC位置1,最后TZA变成2。这个顺序能帮你确认信号链路是否正常。
还有一个技巧是给CBC触发加一个计数器。在CBC中断里对一个变量累加,过流结束后读这个变量,就知道触发了多少次。如果每次过流都触发几百次,说明限流点在负载电流附近,需要调高阈值或者检查负载是否正常。如果触发次数很少,说明是偶发噪声,可以加强滤波。
这套CMPSS加TZ.CBC的方案我在好几个项目里用过,从几百瓦的DC-DC到几十千瓦的电机驱动,稳定性都很好。关键是把DAC值算准、滤波器调好、TZ配置对,剩下的就是硬件设计的事了。如果你在调试中遇到奇怪的现象,先回到寄存器层面查,用示波器和万用表验证每个环节,基本都能定位到问题。