1. 从寄存器手册到实战:C28x ePWM数字比较与事件触发深度解析
如果你正在用TI的C2000系列DSP做电机驱动、数字电源或者任何需要高精度PWM控制的嵌入式项目,那么ePWM模块的数字比较(Digital Compare, DC)和事件触发(Event-Trigger, ET)子模块,绝对是你绕不开的核心。手册里那几十页的寄存器描述,密密麻麻的位域定义,是不是看得头大?感觉每个字都认识,连起来却不知道该怎么用?别急,我当年也是这么过来的。今天,我就结合自己踩过的坑和项目经验,把这些寄存器掰开揉碎了讲清楚,让你不仅知道每个位是干嘛的,更明白为什么要这么配置,以及在实际项目中如何避开那些手册里没写的“暗礁”。
简单来说,数字比较模块是你的“系统保镖”。它的核心任务是把外部的故障信号(比如电流传感器的过流信号、电压比较器的过压信号)和内部的PWM波形进行快速、硬件的实时比较。一旦发现异常,它能绕过CPU,直接对PWM输出采取行动——比如拉低、拉高或者置为高阻态,实现纳秒级的硬件保护。而事件触发模块,则是你的“精准定时秘书”。它负责在PWM波形的特定时刻(比如计数器等于某个比较值、或者达到周期值时),自动产生ADC启动转换(SOC)信号或者CPU中断(INT),确保你的采样、计算和控制环路能严格同步在PWM周期内的某个精确点,这是实现高性能闭环控制(如FOC电机控制)的基石。
光看手册里的位域定义,你可能会觉得这只是一堆冰冷的配置选项。但当你把它们放到一个实际的伺服驱动器或者LLC谐振电源的上下文里,你就会发现,DCTRIPSEL决定了哪个IO口的故障信号能触发保护,DCACTL决定了这个保护信号是同步处理还是异步响应(这关系到抗噪能力和响应速度),而ETSEL和ETPS则共同决定了你的电流采样是在PWM波形的“峰”还是“谷”进行,以及每隔几个PWM周期才触发一次ADC。配置错了,轻则控制环路抖动、效率低下,重则炸管、烧电机。下面,我们就从设计思路开始,一步步拆解。
2. 核心设计思路:为何需要数字比较与事件触发?
在深入寄存器之前,我们必须先想明白:为什么C28x的ePWM要设计这么复杂的子模块?答案就藏在“确定性”和“安全性”这两个词里。
在传统的微控制器中,处理外部故障和定时触发ADC,通常依赖于GPIO中断和定时器中断。当故障信号到来,触发GPIO中断,CPU响应中断,在中断服务程序里软件关闭PWM输出。这个过程至少包含:中断响应延迟(几十到几百纳秒)、上下文保存、执行关闭PWM的指令。对于动辄几百kHz开关频率的现代电源,或者要求极高动态响应的伺服驱动器,这个延迟太长了,可能足以让功率器件过流损坏。数字比较模块的本质,是将“信号监测-决策-动作”这个链条硬件化。外部故障信号直接接入ePWM模块内部的比较器,与PWM的时基同步比较,一旦条件满足,硬件自动改变PWM输出状态,整个过程无需CPU干预,延迟极短(通常在几个系统时钟周期内),实现了真正的“硬件保护环”。
同理,事件触发模块解决了“精准定时”的痛点。在电机控制中,我们通常需要在PWM波形的中点(对于中心对称PWM)或者特定位置采样相电流,以避开开关噪声并获得准确的电流值。如果靠CPU定时器来触发ADC,很难保证与PWM计数器的严格同步,会引入“抖动”(Jitter)。事件触发模块将ADC启动信号(SOC)的产生与ePWM内部的时间基准计数器(TBCTR)硬件绑定。你可以配置为“当TBCTR等于CMPA时”产生SOC信号,那么这个触发时刻的精度就等同于PWM本身的时钟精度,消除了软件定时的不确定性,为高精度控制算法提供了稳定的时间基准。
所以,我们的配置核心思路就是:用数字比较构建坚不可摧的硬件安全屏障,用事件触发打造精准无误的同步采样时钟。所有的寄存器配置,都是为这两个目标服务的。
3. 数字比较(DC)子模块寄存器精讲与配置实战
数字比较模块的寄存器配置是一条清晰的链路:输入选择 -> 信号滤波 -> 事件产生 -> 动作映射。我们按这个流程来拆解。
3.1 输入选择寄存器:构建你的故障信号网络
数字比较模块有两组比较器:DCA(Digital Compare A)和DCB(Digital Compare B)。每组又分为高电平有效(High)和低电平有效(Low)两个子通道,分别对应DCAH/DCAL和DCBH/DCBL。为什么这么分?这是为了灵活支持不同极性的故障信号。比如,你的过流比较器输出可能是高电平有效(故障时变高),而过温信号可能是低电平有效(故障时变低)。通过配置,可以让高电平触发DCAH事件,低电平触发DCAL事件。
第一步,是告诉ePWM模块:外部那么多TRIPIN1到TRIPIN15引脚,你想让哪个信号进入哪个比较通道?这由四个寄存器控制:
- DCAHTRIPSEL(Digital Compare A High Trip Input Select)
- DCALTRIPSEL(Digital Compare A Low Trip Input Select)
- DCBHTRIPSEL(Digital Compare B High Trip Input Select)
- DCBLTRIPSEL(Digital Compare B Low Trip Input Select)
这些寄存器是位映射(bit-mapped)的。以DCAHTRIPSEL为例,它的Bit 0对应TRIPIN1,Bit 1对应TRIPIN2,以此类推,直到Bit 14对应TRIPIN15(Bit 12和15保留)。将某个位置1,就意味着将该TRIPIN信号纳入到DCAH通道的“或”逻辑输入池中。这意味着,你可以将多个故障源(比如三相电流的过流信号)连接到不同的TRIPIN引脚,然后在DCAHTRIPSEL中把对应的位都设为1。这样,任意一个故障信号变高,都会触发DCAH事件,实现了多路故障的“或”逻辑综合,极大地增强了系统的保护覆盖率。
关键细节与避坑指南:
- EALLOW保护:这四个寄存器(DCAHTRIPSEL, DCALTRIPSEL, DCBHTRIPSEL, DCBLTRIPSEL)是受EALLOW保护的。这意味着在写它们之前,必须先执行
EALLOW指令,写完后执行EDIS指令。忘记这一步是新手最常见的错误,会导致配置不生效。EALLOW; // 解除写保护 EPwm1Regs.DCAHTRIPSEL.bit.TRIPIN1 = 1; // 使能TRIPIN1到DCAH EPwm1Regs.DCAHTRIPSEL.bit.TRIPIN2 = 1; // 使能TRIPIN2到DCAH EDIS; // 恢复写保护
- 与TZ引脚的关系:TRIPIN1-3通常与TZ1-TZ3引脚复用。在DCTRIPSEL寄存器中,当你选择
0000(TRIPIN1 and TZ1 input) 等选项时,意味着该通道的输入是TRIPIN信号与对应的TZ引脚信号的逻辑与。TZ引脚通常有专门的硬件滤波和异步路径,响应更快。在需要最高安全等级的场合(如直通保护),应优先考虑使用TZ引脚路径。
DCTRIPSEL寄存器则是在上述“或”逻辑选择之后,进行最终的二选一或多选一。它每个通道(DCAHCOMPSEL, DCALCOMPSEL, DCBHCOMPSEL, DCBLCOMPSEL)有4位,可以:
- 选择具体的某个TRIPINx(和TZx)作为输入(值
0000-1110)。 - 或者选择
1111,即“Trip combination input”。这个模式非常强大,它意味着该通道的输入,来自于前面提到的DCAHTRIPSEL等寄存器所选择的所有TRIPIN信号的“或”运算结果。这为你提供了两级灵活性:先用DCAHTRIPSEL粗选一组信号,再用DCTRIPSEL的1111选项将它们作为一个整体信号送入后续处理。
3.2 控制与滤波寄存器:驯服噪声,精确定义事件
选好了输入��号,接下来要定义这个信号如何被处理,以及产生什么样的事件。这是DCACTL和DCBCTL(控制寄存器),以及DCFCTL(滤波控制寄存器)的舞台。
DCACTL/DCBCTL寄存器控制着事件(EVT1和EVT2)的生成与分发。每个比较器(A和B)都能产生两个事件:DCAEVT1/2 和 DCBEVT1/2。这两个事件可以独立配置去触发不同的动作(比如EVT1去触发PWM拉低,EVT2去触发同步信号SYNC)。寄存器中的关键位:
- EVT1SRCSEL / EVT2SRCSEL:事件源选择。这是第一个关键决策点。
0:事件源直接来自数字比较器输出的原始信号(DCAEVT1/2)。响应最快,但可能包含毛刺。1:事件源来自经过滤波后的信号(DCEVTFILT)。抗干扰能力强,但会引入延迟。
- EVT1SYNCE / EVT2SYNCE:是否将事件作为同步(SYNC)信号输出给其他ePWM模块。这在需要多个ePWM模块严格同步工作的场景(如交错并联电源)下非常有用。
- EVT1SOCE / EVT2SOCE:是否用该事件来触发ADC开始转换(SOC)。这是将故障事件与采样关联起来的重要途径。例如,你可以配置一个过流事件(DCAEVT1)在触发保护动作的同时,也强制启动一次ADC,用于记录故障发生时的电流电压值,便于后续的故障分析。
- EVT1FRCSYNCSEL / EVT2FRCSYNCSEL:当事件被用作SYNC源时,此位决定它是同步信号还是异步信号。简单理解:同步信号会等到下一个系统时钟边沿才生效,与系统时钟同步,更稳定;异步信号立即生效,响应更快但可能产生亚稳态。在大多数应用里,除非对延迟极其敏感,否则建议使用同步模式(设为0)。
DCFCTL寄存器是数字比较模块的“降噪滤波器”和“时间窗口控制器”。它的配置直接决定了系统的抗干扰能力和保护的准确性。
- SRCSEL:选择对哪个事件源进行滤波。你可以选择对DCAEVT1/2或DCBEVT1/2进行滤波,产生一个干净的
DCEVTFILT信号供后续使用。 - BLANKE:消隐窗口使能。这是抑制开关噪声干扰的利器。在PWM开关瞬间(MOSFET开通或关断),由于寄生参数和二极管反向恢复,电流或电压检测信号上会产生巨大的毛刺。如果此时数字比较器正在工作,很可能误触发保护。消隐窗口的作用就是在每个PWM周期的特定时间段内,暂时“屏蔽”掉数字比较器的输入,忽略这段时间内的任何信号变化。
- PULSESEL:定义消隐窗口的参考基准点。可以是PWM周期开始(TBCTR=0)或周期结束(TBCTR=TBPRD)。这决定了你的消隐窗口是从每个PWM周期的开头算起还是结尾算起。
- BLANKINV:消隐窗口反相。如果设为1,则上述定义的窗口变为“非消隐”窗口,即只有在这个窗口内比较器才工作,窗口外被屏蔽。这用于某些特殊保护逻辑。
- DCFOFFSET 和 DCFWINDOW:这两个寄存器共同定义了消隐窗口的位置和宽度。
DCFOFFSET:偏移量。从PULSESEL定义的基准点(0或TBPRD)开始,延迟多少个TBCLK周期后,消隐窗口才开始。DCFWINDOW:窗口宽度。消隐窗口持续多少个TBCLK周期。- 计算示例:假设你的PWM频率为100kHz (周期10us),
TBCLK=100MHz (10ns)。你希望在每个周期开始后的1us内屏蔽噪声,可以设置PULSESEL=01 (TBCTR=0),DCFOFFSET=0 (从0时刻立即开始),DCFWINDOW=100 (100 * 10ns = 1us)。
实操心得:滤波与消隐的权衡滤波(通过DCFCTL的SRCSEL选择DCEVTFILT)和消隐(BLANKE)都能抗干扰,但原理不同。滤波是通过数字延迟(比如连续检测到几个周期的高电平才认为有效)来滤除窄脉冲噪声,适用于随机、不规律的噪声。消隐则是基于PWM周期的确定性屏蔽,专门对付开关时刻的规律性噪声。在实际项目中,我通常的做法是“消隐为主,滤波为辅”。先用消隐窗口躲开已知的开关噪声区间,如果还有偶发的干扰,再辅以轻微的滤波(例如设置较小的滤波周期)。切忌将滤波深度设得过大,否则会严重拖慢真实故障的响应时间。
3.3 捕获与计数器寄存器:诊断与调试的利器
DCCAPCTL和DCCAP寄存器提供了一个强大的调试功能:捕获故障发生时的PWM计数器值。
当使能捕获(CAPE=1)后,在滤波后的事件信号(DCEVTFILT)的上升沿,当前时间基准计数器TBCTR的值会被锁存到DCCAP寄存器中。这个功能的价值在于:
- 故障定位:发生保护后,你可以通过读取
DCCAP的值,精确知道故障是在PWM周期的哪个时刻(相对于0点或周期点)发生的。这对于分析故障原因(是开通瞬间过流还是关断瞬间过压)至关重要。 - 系统诊断:可以判断故障是发生在消隐窗口内(可能是噪声误触发)还是窗口外(可能是真实故障)。
SHDWMODE位控制捕获值是立即读取(Active Mode)还是影子模式。影子模式下,捕获值会在PULSESEL定义的基准点(如周期点)才更新到影子寄存器,CPU读取的是影子寄存器,这能保证你读到一个完整的、稳定的值,避免在计数器变化时读到中间值。在需要精确诊断时,建议使用影子模式(SHDWMODE=0)。
4. 事件触发(ET)子模块寄存器精讲与配置实战
事件触发模块的核心任务是:基于PWM时基,在精确的时刻,产生ADC启动信号(SOC)或CPU中断(INT)。它的配置逻辑比数字比较更直观,但细节同样重要。
4.1 事件选择寄存器(ETSEL):定义“何时”触发
这是整个事件触发模块的“大脑”,它定义了触发事件的类型和条件。
- SOCASEL / SOCBSEL:选择产生EPWMxSOCA/B信号的事件源。这是实现同步采样的核心。
000: 由数字比较事件(DCAEVT1.soc / DCBEVT1.soc)触发。这建立了DC模块和ET模块的联动。001: TBCTR = 0x00 (计数器下溢点)。常用于上计数模式周期开始的采样。010: TBCTR = TBPRD (计数器周期匹配点)。常用于上计数模式周期结束的采样。011: TBCTR = 0x00 或 TBPRD。在上下计数模式中,常用于每个PWM周期开始和结束的采样。100/101/110/111: 由计数器与CMPA/CMPB/CMPC/CMPD的比较事件触发,并可选择在递增或递减计数时触发。这是最常用的高精度中点采样配置。例如,在中心对称PWM中,设置CMPA = TBPRD/2,然后配置SOCASEL = 100(TBCTR=CMPA when incrementing),这样就能在PWM波形的正峰值点(对于正弦调制波)精确触发ADC采样,完美避开开关噪声。
- SOCASELCMP / SOCBSELCMP / INTSELCMP:当上述事件源选择为CMPx时,此位决定具体使用CMPA/CMPB还是CMPC/CMPD。这为多路采样触发提供了可能。
- SOCAEN / SOCBEN / INTEN:简单但关键,使能或禁用对应的SOC或INT事件产生。
4.2 事件预分频寄存器(ETPS):定义“隔多久”触发一次
不是每次满足条件的事件都需要触发动作。ETPS寄存器提供了事件分频(预分频)功能。
- SOCAPRD / SOCBPRD / INTPRD:周期选择。定义需要累计多少个事件才产生一次脉冲。
01: 每1个事件触发一次(1分频)。10: 每2个��件触发一次(2分频)。11: 每3个事件触发一次(3分频)。00: 禁用计数器,不产生脉冲。
- SOCACNT / SOCBCNT / INTCNT:事件计数器(只读)。实时显示当前已累计的事件数量。当计数值达到
PRD设定的值时,产生触发脉冲,同时计数器自动清零。
这个功能非常实用。例如,在一个开关频率为100kHz的系统中,如果你希望ADC以50kHz的频率采样(即每隔一个PWM周期采样一次),就可以将SOCAPRD设置为10(每2个事件触发一次)。这比用CPU定时器去控制采样频率要精准和可靠得多。
ETPS寄存器中的SOCPSSEL和INTPSSEL位,则是一个扩展开关。当它们置1时,SOC和INT的分频器将使用扩展的ETSOCPS和ETINTPS寄存器。这两个寄存器将分频系数从0-3扩展到了0-15,意味着你可以实现最多15分频,为更低频率的触发需求提供了便利。
4.3 标志、清除与强制寄存器:状态管理与调试
- ETFLG:标志寄存器。当SOC或INT事件真正被产生时,对应的标志位(
SOCA,SOCB,INT)会被硬件置1。这里有一个重要区别:SOCA/B标志位被置位后,后续的SOC脉冲仍然会继续产生。而INT标志位置位后,在它被软件清除前,不会产生新的中断。这保证了中断不会丢失,但需要及时清除。 - ETCLR:清除寄存器。向对应的位写1,可以清除
ETFLG中的标志位。清除INT标志是重新允许中断产生的前提。 - ETFRC:强制寄存器。向对应的位写1,可以软件强制产生一个SOC脉冲或中断,同时也会置位对应的标志位。这是极其重要的调试和测试工具。你可以在代码中手动触发一个SOC来启动ADC转换,或者触发一个中断来测试你的中断服务程序,而无需等待真实的硬件事件发生。
4.4 计数器初始化寄存器:实现同步启动
在多模块协同工作的系统中(例如多个ePWM模块并联交错),常常需要所有模块的事件计数器从同一个初始值开始计数,以确保它们产生的SOC/INT信号是同步的。ETCNTINITCTL和ETCNTINIT寄存器就是为此而生。
ETCNTINIT:存放SOCA、SOCB、INT计数器的初始值(0-15)。ETCNTINITCTL:控制如何加载这些初始值。SOCAINITEN等:使能通过SYNC事件初始化计数器。SOCAINITFRC等:软件强制初始化计数器。
当主ePWM模块发出一个SYNC同步信号,所有从模块如果使能了对应的INITEN,就会将各自的计数器初始化为ETCNTINIT中设定的值。这确保了所有模块的触发事件在时间上是严格对齐的。
5. 典型应用场景与完整配置流程示例
让我们结合一个常见的永磁同步电机(PMSM)FOC控制的例子,把上面的寄存器配置串起来。
场景:三相逆变器,使用ePWM1/2/3生成三相PWM。需要实现:
- 硬件过流保护:当任意一相电流超过阈值(由硬件比较器检测,输出到TRIPIN1),需要立即关闭所有PWM输出(高阻态或拉低)。
- 同步电流采样:在PWM周期中点(中心对称模式)采样两相电流,用于FOC算法计算。
- 速度环中断:每100个PWM周期(即1ms,假设PWM频率10kHz)执行一次速度PI调节。
配置步骤:
5.1 配置数字比较模块用于过流保护
- 输入选择:假设过流信号连接至TRIPIN1,且为高电平有效。
EALLOW; // 将TRIPIN1信号路由到数字比较A的高通道 EPwm1Regs.DCAHTRIPSEL.bit.TRIPIN1 = 1; // TRIPIN1进入DCAH的或逻辑池 // 也可以同时配置其他ePWM模块的DCAHTRIPSEL,实现全局保护 EPwm2Regs.DCAHTRIPSEL.bit.TRIPIN1 = 1; EPwm3Regs.DCAHTRIPSEL.bit.TRIPIN1 = 1; EDIS; EALLOW; // 设置DCAH通道的输入源为“组合输入”,即上述TRIPSEL选择的所有信号的或结果 EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0xF; // 1111b, Trip combination input // 同样配置其他模块 EPwm2Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0xF; EPwm3Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 0xF; EDIS; - 配置动作:我们需要将DCAEVT1事件映射到PWM的“Trip Zone”动作,使其能直接关闭PWM。这通常通过配置TZSEL(选择哪个Trip事件触发TZ)和TZCTL(触发后PWM输出动作)寄存器实现,这部分属于Trip Zone子模块,但由DC模块触发。
// 假设我们使用TZ1通道来响应DCAEVT1 EPwm1Regs.TZSEL.bit.DCAEVT1 = 1; // 使能DCAEVT1触发TZ1动作 // 配置TZ事件触发后,PWM输出强制为高阻态(Hi-Z),安全关断 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HIZ; // PWMxA输出高阻 EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_HIZ; // PWMxB输出高阻 // 对ePWM2, ePWM3做同样配置 - (可选)配置滤波与消隐:为防止开关噪声误触发,启用消隐窗口。假设开关频率10kHz,消隐窗口设在每个周期开始后的2us。
// 假设TBCLK = 100MHz (10ns) Uint16 blanking_offset = 0; // 从周期点开始立即消隐 Uint16 blanking_width = 200; // 200 * 10ns = 2us EPwm1Regs.DCFCTL.bit.PULSESEL = DC_PULSESEL_BLANK_AT_PERIOD; // 以周期点为参考 EPwm1Regs.DCFCTL.bit.BLANKE = DC_BLANK_MODE_ENABLE; // 使能消隐 EPwm1Regs.DCFOFFSET = blanking_offset; EPwm1Regs.DCFWINDOW = blanking_width; // 选择对DCAEVT1信号进行滤波后,再用于触发事件 EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1_SRC_DCAEVT1_FILT; // 使用滤波后信号
5.2 配置事件触发模块用于同步采样与中断
- 配置PWM时基与比较器:首先设置ePWM为上下计数模式,并配置CMPA用于中点触发。
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式 EPwm1Regs.TBPRD = SYSTEM_FREQ / (2 * PWM_FREQ); // 计算周期值,例如PWM_FREQ=10kHz EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD / 2; // CMPA设为半周期,用于中点触发 - 配置SOCA触发:在计数器递增到CMPA值时,触发SOCA。
// 选择触发事件:计数器递增且等于CMPA时 EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTRU_CMPA_INC; // 选择使用CMPA寄存器(因为SOCASELCMP默认为0,即选择CMPA/CMPB) // EPwm1Regs.ETSEL.bit.SOCASELCMP = 0; // 默认即为0,可省略 // 使能SOCA产生 EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 设置分频:每个事件都触发一次ADC(1分频) EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // 01b,第一个事件即触发 - 配置中断触发:每100个PWM周期触发一次中断。由于是上下计数,一个完整的电气周期是2个计数周期。所以需要200个“TBCTR=0”事件。
// 选择触发事件:计数器等于0时(每个PWM周期开始) EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 使能中断 EPwm1Regs.ETSEL.bit.INTEN = 1; // 使用扩展分频器,实现更大分频 EPwm1Regs.ETPS.bit.INTPSSEL = ET_PSSEL_EXT; // 使用ETINTPS扩展分频器 // 设置分频为200个事件触发一次中断 EPwm1Regs.ETINTPS.bit.INTPRD2 = 200; // 200个CTR_ZERO事件后触发中断 - 关联ADC:在CPU系统层面,还需要将ePWM1的SOCA信号连接到ADC模块的SOC触发源。这通常通过AdcRegs.ADCSOCxCTL.bit.TRIGSEL寄存器进行配置,选择对应的EPWMxSOCA作为触发源。
6. 调试技巧与常见问题排查
即使配置看起来正确,在实际调试中也可能遇到各种问题。以下是一些我积累的排查经验:
问题1:数字比较保护不动作。
- 检查输入路径:首先用示波器确认TRIPIN引脚上的故障信号是否真的到达,并且电平符合要求(高/低有效)。
- 确认EALLOW保护:检查所有受EALLOW保护的寄存器(DCAHTRIPSEL等)配置代码是否被
EALLOW和EDIS包围。 - 验证TZ配置:数字比较事件(DCAEVT1)需要正确映射到Trip Zone动作。检查
TZSEL寄存器是否使能了对应的DC事件,并检查TZCTL配置的动作是否符合预期(是拉低、拉高还是高阻)。 - 检查消隐窗口:如果消隐窗口设置得过大,可能会把真实的故障信号也屏蔽掉。尝试暂时禁用消隐(
BLANKE=0)或减小窗口宽度,看保护是否恢复。 - 同步与异步路径:确认
DCACTL.bit.EVT1FRCSYNCSEL的设置。如果故障信号是异步的(来自芯片外部),而你在配置中选择了同步路径(SYNCSEL=0),那么该信号需要被系统时钟同步,可能会增加1个时钟周期的延迟,但在噪声环境下更稳定。根据实际情况选择。
问题2:ADC SOC触发时刻不准或没有触发。
- 确认事件源:检查
ETSEL.SOCASEL配置的事件是否确实会发生。例如,如果你配置为TBCTR=CMPA时触发,请确保CMPA的值在0到TBPRD之间,并且PWM时基计数器在正常运行。 - 检查SOC使能:最容易被忽略的一点:
ETSEL.SOCAEN必须设为1。 - 检查ADC配置:ePWM产生了SOC信号,但ADC可能没收到。确认ADC模块的SOC触发源选择寄存器(
ADCSOCxCTL.TRIGSEL)是否正确选择了对应的EPWMxSOCA。 - 使用ETFRC寄存器调试:在初始化代码的最后,尝试手动置位
ETFRC.bit.SOCA。如果ADC能正常启动一次转换,说明从ePWM到ADC的SOC路径是通的,问题可能出在事件选择或时基上。如果手动触发也不行,则问题可能在ADC配置或硬件连接上。
问题3:中断无法进入,或者只进入一次。
- 中断使能与标志位:确保
ETSEL.INTEN=1,并且中断在PIE控制器和CPU级别也被使能。 - 清除中断标志:这是最常见的原因。ePWM的中断逻辑是:当
ETFLG.INT=1时,不会产生新的中断。因此,必须在中断服务程序(ISR)中清除这个标志。interrupt void epwm1_isr(void) { // ... 你的中断处理代码 ... EPwm1Regs.ETCLR.bit.INT = 1; // 清除中断标志,允许下次中断产生 PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; // 应答PIE中断(假设ePWM1在GROUP3) } - 检查分频器:确认
ETPS.INTPRD或ETINTPS.INTPRD2的设置不是00(禁用)。同时,检查ETPS.INTPSSEL位,确保你使用的是期望的分频器(标准分频还是扩展分频)。
问题4:多个ePWM模块的SOC/INT不同步。
- 使用SYNC同步时基:确保所有需要同步的ePWM模块的时基通过SYNCIN/ SYNCOUT信号链正确同步。通常设置一个模块为主(Master),输出SYNCOUT,其他模块为从(Slave),接收SYNCIN。
- 使用ETCNTINIT同步事件计数器:在从模块中,使能
ETCNTINITCTL中对应计数器的同步初始化(SOCAINITEN=1等),并设置好初始值ETCNTINIT。当主模块发出SYNC脉冲时,所有从模块的事件计数器会从同一个值开始计数,从而实现触发事件的同步。
配置C28x ePWM的数字比较和事件触发模块,就像在为一个复杂的控制系统搭建神经和计时网络。寄存器是工具,手册是地图,而真正的理解来自于在具体项目中的反复实践和调试。开始时可能会觉得繁琐,但一旦你掌握了这套机制,就能游刃有余地设计出既安全又精准的电力电子控制系统。记住,多利用ETFRC进行软件强制触发来验证路径,多用示波器观察关键信号(SOC、PWM输出、TRIPIN),这是最高效的调试方法。