1. 项目缘起与核心需求拆解
1.1 为什么要在F2802x上做逐波限流
做数字电源或者电机驱动的朋友,对“逐波限流”这个词肯定不陌生。它的核心诉求很简单:每一个开关周期内,只要电流超过设定阈值,PWM输出立刻被硬件拉低,不等CPU反应过来,也不等下个周期再处理。这种保护机制对功率级的安全至关重要,尤其是在LLC谐振变换器、移相全桥或者三相逆变器里,一个周期内电流失控就可能炸管子。
TMS320F2802x这颗芯片在成本敏感的功率变换场合用得非常多,它内部集成的CMPSS(Comparator Subsystem)模块就是专门为这类硬件保护设计的。CMPSS配合ePWM的TZ(Trip Zone)子模块,可以实现纯硬件路径的逐波限流,响应时间在纳秒级别,完全不占用CPU中断资源。但实际配置起来,从DAC参考值的设定到CMPSS比较结果的映射,再到TZ.CBC的触发方式选择,每一步都有坑。我见过不少项目在这块调不通,最后退而求其次用软件限流,结果保护响应慢了几微秒,炸机风险陡增。
这篇文章就是把我自己在F2802x上反复调试CMPSS逐波限流的经验整理出来,从DAC的基准设定讲起,一直到TZ.CBC的寄存器配置,把每个环节的“为什么”和“怎么做”都说清楚。适合已经对F2802x有基本了解、正在做数字电源或电机控制、需要硬件级过流保护的嵌入式工程师。不管你是第一次接触CMPSS,还是之前调过但没调通,这里的内容应该都能帮你少走弯路。
1.2 CMPSS模块的内部结构速览
F2802x的CMPSS模块包含两个比较器:COMPA和COMPB,以及两个对应的12位DAC:DACA和DACB。每个比较器的正输入端可以选外部引脚或者DAC输出,负输入端也可以灵活配置。比较器的输出经过数字滤波器后,可以送到ePWM的TZ模块,也可以触发ADC或者产生中断。
这里的关键在于:DAC的输出电压是电流阈值的“代言人”。实际电流经过采样电阻或者霍尔传感器变成电压信号,送到比较器的输入端,和DAC设定的参考电压比较。一旦采样电压超过DAC参考值,比较器输出翻转,这个翻转信号经过滤波和极性配置后,直接送到TZ模块的CBC(Cycle-By-Cycle)通道,ePWM输出在当前周期内被强制拉低,下个周期自动恢复。
整个路径是纯硬件的,不经过CPU,所以响应速度只受比较器传播延迟和数字滤波器延迟的影响。F2802x的比较器传播延迟典型值在30ns左右,加上滤波器的几个采样周期,总响应时间可以控制在100ns以内。这个速度对于大多数功率变换应用来说绰绰有余。
1.3 逐波限流与单次限流的区别
TZ模块支持两种主要的触发模式:CBC(Cycle-By-Cycle)和OST(One-Shot)。CBC模式下,触发事件只影响当前PWM周期,下个周期自动清除,PWM恢复正常输出。OST模式下,触发后PWM输出被永久拉低,直到软件手动清除。
逐波限流必须用CBC模式。因为限流不是故障,是正常工作状态下的电流调节。比如在LLC启动或者负载突变时,电流可能连续多个周期超过阈值,每个周期都需要限流,但每个周期结束后都要给PWM恢复的机会。如果用OST,一次触发就锁死了,系统直接停机,这不是逐波限流想要的效果。
CBC模式还有一个好处:它可以和PWM的周期同步。每个周期开始时,TZ的CBC锁存器自动清除,比较器重新开始监测。这样每个周期的限流都是独立的,不会因为上个周期的触发影响下个周期的判断。
2. DAC参考值的设定与计算
2.1 DAC的基准电压选择
F2802x的CMPSS内部DAC有两种基准选择:VDDA和VDAC。VDDA就是芯片的模拟电源,通常是3.3V。VDAC是内部参考,典型值也是3.3V,但精度和温漂特性不同。实际项目中,我一般用VDDA作为基准,因为VDDA和ADC的基准是同一个来源,这样DAC设定的阈值和ADC采样的电流值在同一个坐标系里,换算起来简单,不会引入额外的基准误差。
DAC的输出电压公式是:V_DAC = (DACVAL / 4096) * V_REF。DACVAL是12位寄存器的值,范围0到4095。V_REF是基准电压,用VDDA的话就是3.3V。比如你要设定1.5V的阈值,DACVAL = (1.5 / 3.3) * 4096 ≈ 1862。
这里有个细节:DAC的输出不是直接等于V_REF * DACVAL / 4096,而是有一个内部缓冲器的偏移和增益误差。F2802x的DAC增益误差在数据手册里标的是±2%,偏移误差±10mV。对于逐波限流来说,这个精度通常够用,因为限流阈值本身就有一定的裕量。但如果你的应用对阈值精度要求很高,比如±1%以内,那就需要在生产时做校准,或者用外部基准。
2.2 DAC寄存器的配置细节
F2802x的CMPSS DAC配置涉及几个关键寄存器:DACVAL、DACCTL、DACLOCK。DACVAL就是12位的阈值,直接写进去就行。DACCTL里要配置DAC的基准选择、更新模式、以及是否使能DAC。
更新模式有两种:立即更新和同步更新。立即更新是写DACVAL后马上生效,同步更新是等下一个PWM周期开始时生效。逐波限流场景下,我建议用同步更新,这样阈值的变化和PWM周期对齐,不会在周期中间突然改变阈值导致误触发。
DACLOCK寄存器是用来锁定DAC配置的,防止误写。在初始化完成后,把DACLOCK写1,DACVAL和DACCTL就被锁定了,后续写操作无效。这个功能在安全关键的应用里很有用,但调试阶段可以先不锁,等调通了再锁。
还有一个容易忽略的点:DAC的建立时间。F2802x的DAC建立时间典型值是1μs,也就是说DACVAL改变后,DAC输出需要1μs才能稳定到新的电压。如果你的限流阈值需要动态调整,比如根据输入电压前馈改变阈值,那就要考虑这个建立时间,确保在比较器开始监测之前DAC已经稳定。
2.3 从电流阈值反推DAC值的完整计算
假设你用0.01Ω的采样电阻,电流阈值设定为10A。采样电阻上的电压是10A * 0.01Ω = 0.1V。如果采样信号直接送到比较器,那DAC阈值就是0.1V,DACVAL = (0.1 / 3.3) * 4096 ≈ 124。
但实际电路中,采样信号通常会经过放大。比如用运放做10倍放大,那送到比较器的电压就是1V,DACVAL = (1 / 3.3) * 4096 ≈ 1241。放大倍数越高,DACVAL越大,分辨率越高。但放大倍数太高会引入噪声和偏移,所以要在分辨率和信噪比之间折中。
我一般建议采样信号在额定电流时对应1V到2V之间的电压,这样DACVAL在1241到2482之间,分辨率足够,噪声裕量也够。如果采样信号太小,比如0.1V,DACVAL只有124,那DAC的1LSB对应的电流变化就很大,阈值精度会很差。
还有一个细节:比较器的输入共模范围。F2802x的比较器输入范围是0到VDDA,但接近0和VDDA时性能会下降。所以采样信号和DAC阈值最好都在0.2V到3.0V之间,避免靠近电源轨。
3. CMPSS比较器与数字滤波器的配置
3.1 比较器输入输出的极性配置
CMPSS的比较器有正输入端和负输入端。正输入端可以选外部引脚(COMPA_IN)或者DAC输出。负输入端也可以选外部引脚或者DAC输出。逐波限流场景下,通常是把采样信号送到正输入端,DAC输出送到负输入端。这样当采样电压超过DAC阈值时,比较器输出高电平。
但实际电路里,采样信号可能是负极性,或者经过反相放大。这时候就要灵活配置。CMPSS的COMPCTL寄存器里有CMPINV位,可以把比较器输出反相。还有COMPHSOURCE和COMPLSOURCE位,可以选择正负输入端的来源。
我遇到过一种情况:采样信号是负电压,经过反相放大器变成正电压后送到比较器。这时候比较器输出极性是对的,但反相放大器本身有偏移,导致阈值不准。后来改成用差分输入,把采样信号的正负端分别送到比较器的正负输入端,DAC阈值只设定差分电压的一半,这样共模干扰被抑制了,阈值也准了。
3.2 数字滤波器的采样窗口与阈值
CMPSS的数字滤波器是逐波限流里最容易被忽视但又最关键的部分。滤波器的作用是消除比较器输出的毛刺,防止噪声导致的误触发。F2802x的滤波器有三个参数:采样窗口大小(SAMPLWIN)、阈值(THRESH)、以及采样时钟预分频(CLKPRESCALE)。
采样窗口大小决定了滤波器一次采样多少个点,范围是1到32。阈值决定了这多少个点里有多少个点满足条件才认为有效,范围也是1到32。比如采样窗口设为8,阈值设为4,那就是8个点里有4个点满足条件,滤波器输出才翻转。
采样时钟预分频决定了采样频率。F2802x的CMPSS采样时钟是SYSCLK,预分频范围是1到256。假设SYSCLK是60MHz,预分频设为60,那采样频率就是1MHz,每个采样点间隔1μs。采样窗口8个点,就是8μs的窗口。
滤波器的延迟 = 采样窗口 * 采样周期。如果采样窗口8,采样周期1μs,那滤波器延迟就是8μs。这个延迟直接加到限流响应时间上。所以滤波器的参数要在抗噪和响应速度之间折中。噪声大的场合,窗口可以设大一点,比如16或者32;噪声小的场合,窗口设小一点,比如4或者8,保证响应速度。
我一般先用示波器看比较器输出的原始波形,如果毛刺很多,就把窗口设大;如果波形干净,就尽量设小。实测下来,大多数功率变换场合,采样窗口8、阈值4、预分频60(1MHz采样)是一个比较平衡的起点。
3.3 比较器输出到TZ的映射路径
CMPSS的比较器输出要送到ePWM的TZ模块,需要经过几个配置步骤。首先,CMPSS的COMPCTL寄存器里要配置比较器输出的去向,可以送到ePWM的TZ、ADC、或者GPIO。逐波限流场景下,要选送到TZ。
然后,ePWM的TZ模块里要配置TZ的来源。F2802x的TZ有多个输入源,包括TZ1到TZ6的外部引脚,以及CMPSS1到CMPSS3的内部输出。具体哪个CMPSS对应哪个TZ通道,要看芯片的引脚复用表。F2802x的CMPSS1对应TZ1和TZ2,CMPSS2对应TZ3和TZ4,CMPSS3对应TZ5和TZ6。
配置的时候,TZSEL寄存器里要选对应的TZ源,TZCTL寄存器里要配置触发后的动作。逐波限流用CBC模式,所以TZCTL里对应的CBC位要设为“强制拉低”或者“强制高阻”。通常PWM输出拉低就够了,高阻模式用于需要完全关断驱动的场合。
还有一个细节:TZ的CBC和OST是分开配置的。TZSEL寄存器里,CBC和OST各有独立的使能位。要确保CBC位使能,OST位不使能。如果OST也使能了,那触发后PWM会被永久拉低,逐波限流就变成单次限流了。
4. TZ.CBC的寄存器配置与实操步骤
4.1 ePWM TZ模块的关键寄存器
ePWM的TZ模块涉及几个关键寄存器:TZSEL、TZCTL、TZEINT、TZFLG、TZCLR。TZSEL选择TZ源和触发模式(CBC还是OST)。TZCTL配置触发后的动作。TZEINT使能TZ中断。TZFLG是状态标志,TZCLR是清除标志。
逐波限流的配置流程是这样的:先配置TZSEL,把对应的CBC位使能,OST位不使能。然后配置TZCTL,把CBC对应的动作设为拉低。TZEINT可以不用,因为逐波限流是硬件自动处理的,不需要CPU干预。TZFLG和TZCLR在调试阶段可以用来观察触发情况,生产代码里可以不用。
TZSEL的CBC位是每个TZ源独立的。比如TZ1的CBC使能是TZSEL的bit0,TZ2的CBC使能是bit1,以此类推。要确保你用的CMPSS对应的TZ通道的CBC位被置1。
TZCTL的配置稍微复杂一点。TZCTL有多个位域,每个TZ源对应两个位:一个控制CBC动作,一个控制OST动作。CBC动作的选项有:强制拉低、强制高阻、强制高、不动作。逐波限流一般选强制拉低。
4.2 完整配置代码与逐行解析
下面是我在实际项目中用的CMPSS逐波限流配置代码,基于F2802x的寄存器定义。代码用C语言写,可以直接在CCS里编译。
// 步骤1:使能CMPSS时钟 EALLOW; SysCtrlRegs.PCLKCR1.bit.CMPSS1ENCLK = 1; // 使能CMPSS1时钟 EDIS; // 步骤2:配置CMPSS1的DAC EALLOW; Cmpss1Regs.DACVAL.bit.DACVAL = 1241; // 1V阈值,对应10A电流 Cmpss1Regs.DACCTL.bit.DACREF = 0; // 基准选VDDA Cmpss1Regs.DACCTL.bit.DACLOAD = 1; // 同步更新模式 Cmpss1Regs.COMPCTL.bit.COMPDACE = 1; // 使能DAC Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = 0; // 正输入端选外部引脚 Cmpss1Regs.COMPCTL.bit.COMPLSOURCE = 1; // 负输入端选DAC Cmpss1Regs.COMPCTL.bit.CMPINV = 0; // 输出不反相 Cmpss1Regs.COMPCTL.bit.COMPOUTSEL = 1; // 输出送到TZ EDIS; // 步骤3:配置数字滤波器 EALLOW; Cmpss1Regs.CTRIPFILTER.bit.SAMPWIN = 8; // 采样窗口8个点 Cmpss1Regs.CTRIPFILTER.bit.THRESH = 4; // 阈值4个点 Cmpss1Regs.CTRIPFILTER.bit.CLKPRESCALE = 60; // 预分频60,1MHz采样 EDIS; // 步骤4:配置ePWM的TZ模块 EALLOW; EPwm1Regs.TZSEL.bit.CBC1 = 1; // 使能TZ1的CBC模式 EPwm1Regs.TZSEL.bit.OST1 = 0; // 不使能OST模式 EPwm1Regs.TZCTL.bit.TZA = 2; // CBC触发后PWM A拉低 EPwm1Regs.TZCTL.bit.TZB = 2; // CBC触发后PWM B拉低 EDIS;逐行解析一下。第一步使能CMPSS1的时钟,F2802x的外设时钟默认是关闭的,不使能的话寄存器写不进去。第二步配置DAC,DACVAL设为1241对应1V阈值,DACREF选VDDA,DACLOAD选同步更新。COMPCTL里,COMPDACE使能DAC,COMPHSOURCE选外部引脚作为正输入,COMPLSOURCE选DAC作为负输入,CMPINV不反相,COMPOUTSEL选送到TZ。
第三步配置滤波器,SAMPWIN=8,THRESH=4,CLKPRESCALE=60。这里CLKPRESCALE=60意味着采样时钟是SYSCLK/60。如果SYSCLK是60MHz,那采样频率就是1MHz,采样周期1μs。窗口8个点,滤波器延迟8μs。
第四步配置TZ,TZSEL的CBC1置1使能TZ1的CBC模式,OST1置0不使能OST。TZCTL的TZA和TZB都设为2,对应强制拉低。这里TZA和TZB是PWM A和PWM B的动作配置,2代表强制拉低。
4.3 调试阶段的验证方法
配置写完后,怎么验证逐波限流是否正常工作?我一般分三步走。
第一步,用示波器看比较器输出。把CMPSS的比较器输出映射到一个GPIO引脚,用示波器观察。给采样输入端加一个超过阈值的电压,看比较器输出是否翻转。如果没翻转,检查DACVAL和输入极性配置。
第二步,看PWM输出。给采样输入端加一个脉冲,宽度大于滤波器延迟,看PWM输出是否在脉冲期间被拉低。如果PWM没反应,检查TZSEL和TZCTL的配置。特别注意TZSEL的CBC位是否使能,以及TZCTL的动作是否设为拉低。
第三步,看恢复情况。脉冲结束后,看PWM是否在下一个周期自动恢复。如果没恢复,说明OST被误使能了,或者CBC的清除机制有问题。CBC模式下,每个周期开始时TZFLG的CBC标志会自动清除,PWM自动恢复。如果没恢复,检查TZCLR寄存器是否被意外写入。
调试的时候,我习惯用信号发生器产生一个窄脉冲来模拟过流事件,脉冲宽度从1μs开始逐渐增加,观察PWM从哪个宽度开始响应。这个宽度就是实际的最小响应时间,包括比较器延迟和滤波器延迟。实测下来,F2802x在滤波器窗口8、预分频60的配置下,最小响应时间在10μs左右。如果要把响应时间压到5μs以内,滤波器窗口要降到4,预分频降到30。
5. 常见问题与排查技巧实录
5.1 比较器输出抖动导致误触发
这是最常见的问题。比较器输出在阈值附近抖动,导致TZ频繁触发,PWM输出断断续续。根本原因是采样信号上的噪声,或者DAC阈值太接近采样信号的直流电平。
解决方法有三个。第一,加大数字滤波器的采样窗口和阈值。比如从窗口8阈值4改成窗口16阈值8,滤波效果明显增强,但响应时间也翻倍。第二,在采样信号上加RC低通滤波,截止频率设在开关频率的1/10左右。第三,调整DAC阈值,让它远离采样信号的直流电平。比如额定电流对应1V,阈值设1.5V而不是1.1V,留足够的裕量。
我遇到过一种特殊情况:采样信号本身很干净,但比较器输出还是抖动。后来发现是DAC的基准噪声。VDDA上如果有开关噪声,DAC输出也会跟着抖。解决方法是在VDDA引脚旁边加一个1μF的陶瓷电容,尽量靠近引脚。如果还不行,就改用VDAC内部基准,虽然精度差一点,但噪声小。
5.2 CBC触发后PWM不恢复
CBC模式下,PWM应该在下一个周期自动恢复。如果不恢复,通常是以下几个原因。
第一个原因:OST被误使能了。检查TZSEL寄存器,确保OST位是0。有时候初始化代码里把整个TZSEL写了一个值,不小心把OST位也置1了。
第二个原因:TZFLG的CBC标志没有自动清除。CBC标志在每个周期开始时由硬件自动清除,但如果PWM周期配置有问题,比如周期寄存器设成了0,那周期事件不产生,CBC标志就清不掉。检查TBPRD寄存器,确保周期值正确。
第三个原因:比较器输出一直为高。如果过流事件持续存在,比较器输出一直高,那每个周期都会触发CBC,PWM每个周期都被拉低,看起来就像没恢复。这种情况其实是正常的,说明限流在持续工作。要确认是不是真的过流,还是阈值设得太低。
第四个原因:TZCTL的动作配置错了。如果TZCTL设成了“强制高阻”,而你的驱动电路需要拉低才能关断,那PWM看起来就像没恢复。检查TZCTL的配置,确保CBC动作是拉低。
5.3 DAC阈值不准的校准方法
DAC阈值不准的原因有两个:DAC本身的增益和偏移误差,以及采样电路的误差。校准的时候要分开处理。
先校准DAC。用高精度万用表测量DAC输出引脚的电压,对比理论值。如果偏差在±2%以内,可以接受。如果偏差大,检查VDDA的实际电压,用实测的VDDA重新计算DACVAL。比如VDDA实测3.28V而不是3.3V,那DACVAL = (1.0 / 3.28) * 4096 ≈ 1249,而不是1241。
再校准采样电路。给采样电阻通一个已知的精确电流,测量送到比较器输入端的电压,对比理论值。如果偏差大,检查运放的增益电阻精度和偏移。运放的偏移可以用调零电路或者软件校准消除。
我一般建议在生产时做两点校准:零电流点和额定电流点。零电流时记录ADC读数,额定电流时记录ADC读数,然后计算增益和偏移,写入DACVAL。这样可以把DAC和采样电路的误差一起校准掉。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| 比较器输出抖动 | 采样噪声大 | 示波器看采样信号 | 加大滤波器窗口,加RC滤波 |
| 比较器输出不翻转 | DAC配置错误 | 测量DAC输出引脚 | 检查DACVAL和DACREF |
| PWM不响应 | TZ源选错 | 检查TZSEL寄存器 | 确认CMPSS对应的TZ通道 |
| PWM不恢复 | OST误使能 | 检查TZSEL的OST位 | 将OST位清零 |
| 阈值不准 | DAC基准偏差 | 测量VDDA实际电压 | 用实测VDDA重算DACVAL |
| 响应太慢 | 滤波器延迟大 | 计算窗口*采样周期 | 减小窗口和预分频 |
| 误触发频繁 | 阈值太接近信号 | 对比采样信号和阈值 | 调整阈值留裕量 |
5.5 几个容易踩的坑
第一个坑:忘记使能CMPSS时钟。F2802x的外设时钟默认关闭,不使能的话所有寄存器写操作都被忽略,但读回来是0,看起来像配置成功了,实际没生效。这个坑我踩过两次,后来养成了习惯,初始化第一步就是使能所有用到的外设时钟。
第二个坑:DACLOAD设成了立即更新。立即更新模式下,DACVAL写入后马上生效,如果此时比较器正在监测,可能会产生一个毛刺触发TZ。同步更新模式下,DACVAL在下一个周期开始时生效,和PWM周期对齐,不会产生毛刺。
第三个坑:TZCTL的CBC和OST动作搞混了。TZCTL里每个TZ源有两个位域,一个管CBC,一个管OST。如果只配了OST没配CBC,那CBC触发后PWM动作是默认的“不动作”,看起来就像没触发。配置的时候要仔细看寄存器定义,确保CBC对应的位域配对了。
第四个坑:滤波器预分频设得太小。预分频太小,采样频率太高,滤波器窗口内的采样点间隔太短,滤波效果不好。预分频太大,采样频率太低,响应时间太长。我一般从预分频60开始调,根据实际噪声情况增减。
第五个坑:比较器输入引脚配置冲突。F2802x的CMPSS输入引脚和ADC、GPIO是复用的。如果引脚被配置成了ADC输入,CMPSS就收不到信号。检查GPIO的复用配置寄存器,确保CMPSS输入引脚被正确复用。
6. 性能优化与进阶技巧
6.1 动态调整DAC阈值
有些应用需要在不同工作模式下用不同的限流阈值。比如启动时用低阈值保护,正常运行时用高阈值。这时候就需要动态调整DACVAL。
动态调整的关键是同步更新。把DACLOAD设为同步更新模式,然后在PWM周期的特定时刻写DACVAL。比如在周期中断里写,这样DACVAL在下一个周期开始时生效,和PWM周期对齐。
但要注意DAC的建立时间。F2802x的DAC建立时间1μs,如果PWM周期是10μs,那DACVAL改变后1μs内DAC输出还在变化,比较器可能会误触发。解决方法是在写DACVAL之前先屏蔽TZ,等DAC稳定后再使能TZ。或者把DACVAL的改变放在周期末尾,给DAC留足够的建立时间。
我一般用前馈的方式动态调整阈值。比如输入电压升高时,电流纹波变大,限流阈值也相应提高。前馈系数通过实验确定,写入DACVAL之前做限幅,防止阈值超出合理范围。
6.2 多路CMPSS的协同配置
F2802x有3个CMPSS模块,可以同时监测多路电流。比如三相逆变器需要监测三相电流,每相用一个CMPSS。这时候要注意几个问题。
第一,TZ通道的分配。CMPSS1对应TZ1和TZ2,CMPSS2对应TZ3和TZ4,CMPSS3对应TZ5和TZ6。每个CMPSS可以触发两个TZ通道,但通常一个CMPSS只用一个TZ通道就够了。三相应用里,CMPSS1触发TZ1,CMPSS2触发TZ3,CMPSS3触发TZ5,这样每个CMPSS独立触发对应的PWM通道。
第二,DAC基准的一致性。三个CMPSS的DAC都用VDDA作为基准,这样阈值的一致性由VDDA的精度保证。如果VDDA在不同CMPSS之间的走线阻抗不同,可能会引入微小偏差。PCB布局时,VDDA的走线要尽量短且等长。
第三,滤波器的同步。三个CMPSS的滤波器参数最好一致,这样三路的响应时间相同,不会出现某一路响应快某一路响应慢的情况。如果某一路噪声特别大,可以单独加大该路的滤波窗口,但要注意响应时间的差异。
6.3 与ADC采样的配合使用
CMPSS负责硬件保护,ADC负责软件监测。两者配合使用可以实现更完善的电流控制。比如CMPSS做逐波限流,ADC做电流环反馈。ADC的采样时刻要和PWM周期对齐,通常在周期中点或者周期末尾采样。
CMPSS的比较器输出也可以触发ADC采样。比如过流事件发生时,CMPSS触发ADC立即采样,记录过流瞬间的电流值。这个功能在故障录波里很有用。配置的时候,把CMPSS的COMPOUTSEL设为触发ADC,然后在ADC里配置对应的触发源。
但要注意,CMPSS触发ADC会占用ADC的触发资源。如果ADC已经被其他触发源占用,就要做优先级仲裁。F2802x的ADC支持多个触发源,但同一时刻只能响应一个。过流事件的优先级应该最高,确保故障录波不丢失。
6.4 响应时间的精确测量
响应时间是逐波限流的关键指标。测量方法是用信号发生器产生一个快速上升的脉冲,同时用示波器看脉冲和PWM输出。脉冲上升沿到PWM下降沿的时间就是响应时间。
实测的时候要注意探头延迟。两个探头要校准,确保延迟一致。我一般用同一个探头先测脉冲再测PWM,这样探头延迟被抵消了。
F2802x在典型配置下的响应时间分解:比较器传播延迟30ns,数字滤波器延迟8μs(窗口8,采样周期1μs),TZ触发到PWM输出的延迟20ns。总响应时间约8.05μs。如果把滤波器窗口降到4,预分频降到30,滤波器延迟变成2μs,总响应时间约2.05μs。
这个响应时间对于大多数功率变换应用足够了。开关频率100kHz时,周期10μs,2μs的响应时间意味着过流发生后20%的周期内PWM就被关断了,电流不会失控。
6.5 生产测试的注意事项
生产测试的时候,逐波限流功能要单独测试。测试方法是给采样输入端加一个超过阈值的电压,看PWM是否被拉低。测试电压要覆盖阈值附近的范围,比如阈值的90%、100%、110%,确认触发点的一致性。
测试的时候要注意DAC的建立时间。每次改变测试电压后,等1μs以上再观察PWM输出。如果测试设备切换速度快,可能会在DAC还没稳定的时候就判断结果,导致误判。
还有一个细节:生产测试的环境温度。DAC的阈值有温漂,常温下校准的阈值在高温下可能会偏移。如果产品的工作温度范围宽,要在高低温下分别测试阈值,确认偏移在可接受范围内。F2802x的DAC温漂典型值是50ppm/°C,温度变化50°C时阈值偏移0.25%,对于大多数应用可以接受。
7. 个人实操体会与建议
逐波限流这个功能,说起来简单,调起来琐碎。我前后在F2802x上做过五六个项目,每个项目都会遇到不同的坑。最大的体会是:硬件保护路径的每一个环节都要验证,不能想当然。
比如DAC的基准,我一开始以为VDDA就是3.3V,直接按3.3V算DACVAL,结果实测VDDA只有3.25V,阈值偏了1.5%。后来养成了习惯,每次都用万用表实测VDDA,按实测值算DACVAL。这个习惯让我避免了好几次阈值不准的问题。
滤波器的参数也是,数据手册上给的典型值不一定适合你的应用。我一般先用示波器看比较器输出的原始波形,根据毛刺的宽度和频率来定滤波窗口。毛刺窄且少,窗口就设小;毛刺宽且多,窗口就设大。实测下来,窗口8阈值4预分频60这个组合在大多数场合都能工作,但如果你有特殊需求,比如超低噪声或者超快响应,就要单独调。
TZ的配置有个小技巧:调试阶段把TZFLG的CBC标志映射到一个GPIO引脚,用示波器观察触发情况。这样能直观地看到每个周期是否触发,触发了几次。生产代码里再把这个映射去掉,节省引脚资源。
最后说一个容易被忽视的点:CMPSS的输入引脚保护。采样信号如果可能超过VDDA或者低于VSS,要在引脚上加钳位二极管,防止损坏比较器输入。我见过一个项目,采样信号在负载突变时冲到了5V,直接把CMPSS输入打坏了。后来加了钳位二极管,问题解决。这个细节在数据手册里没有强调,但实际项目中很重要。