我想实现对LLC副边的高频电流过零采样实现同步整流;电流0A对应的采样基准电压为1.65v,我想在其过零附近1.6V和1.7V(由信号发生器模拟)实现控制EPWM1A和EPWM1B通道,即> 1.7V时EPWM1A 置高;≤ 1.7V时EPWM1A置低 ;< 1.6V时EPWM1B 置高;≥ 1.6V关闭下管EPWM1B 置低。
我将CMPSS2 的输出信号 CTRIPH
和 CTRIPL
通过 EPWM XBAR 的 TRIP4和TRIP5 路由到 ePWM 模块的DCAH和DCBH;
期望当DCAH为高时触发 DCAEVT1,而当DCAEVT1触发时,使EPWM1A强制输出为高;当DCAH为低时触发 DCAEVT2,而当DCAEVT2触发时,使EPWM1A强制输出为低;
同理,当DCBH为高时触发 DCBEVT1,而当DCBEVT1触发时,使EPWM1B强制输出为高;当DCBH为低时触发 DCBEVT2,而当DCAEVT2触发时,使EPWM1B强制输出为低;
下面是我配置的部分主要程序
//CMPSS2 配置 ==========
Cmpss2Regs.COMPCTL.bit.COMPDACE = 1;
Cmpss2Regs.COMPDACCTL.bit.SWLOADSEL=1;
Cmpss2Regs.COMPDACCTL.bit.DACSOURCE=0;
//高比较器配置(1.7V)
Cmpss2Regs.DACHVALS.bit.DACVAL = 2110; // 对应约 1.7V:2110*3.3/4096 ≈ 1.7V
Cmpss2Regs.COMPCTL.bit.COMPHSOURCE = 0; // 高比较器的负输入选择为内部 DAC(正输入通常接电流采样信号)。
Cmpss2Regs.COMPCTL.bit.COMPHINV = 0; // 不反相
Cmpss2Regs.COMPCTL.bit.CTRIPHSEL = 0; // 异步 CTRIPH
Cmpss2Regs.COMPCTL.bit.CTRIPOUTHSEL = 0; // 异步输出观察用
//低比较器配置(1.6V)
Cmpss2Regs.DACLVALS.bit.DACVAL = 1986; // 对应约 1.6V
Cmpss2Regs.COMPCTL.bit.COMPLSOURCE = 0;
Cmpss2Regs.COMPCTL.bit.COMPLINV = 1; // 低比较器反相,输出逻辑与上面匹配
Cmpss2Regs.COMPCTL.bit.CTRIPLSEL = 0; // 异步 CTRIPL
Cmpss2Regs.COMPCTL.bit.CTRIPOUTLSEL = 0;
OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX8 = 0;
OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX8 = 1;
//X-bar设置,连接到EPWMX-bar
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX2 = 0; // CMPSS2.CTRIPH → MUX2 → TRIP4(即CMPSS2 的高比较器输出 CTRIPH通过MUX2接入EPWM-XBAR的TRIP4信号线上)
EPwmXbarRegs.TRIP5MUX0TO15CFG.bit.MUX3 = 0; // CMPSS2.CTRIPL → MUX3 → TRIP5(即CMPSS2 的低比较器输出 CTRIPL通过MUX3接入EPWM-XBAR的TRIP5信号线上)
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX2 = 1;// 启用 MUX2路由到 TRIP4
EPwmXbarRegs.TRIP5MUXENABLE.bit.MUX3 = 1;// 启用 MUX3路由到 TRIP5
EPwmXbarRegs.TRIPOUTINV.bit.TRIP4 = 0; // 不反相输出(默认)
EPwmXbarRegs.TRIPOUTINV.bit.TRIP5 = 0; // 不反相输出(默认)
//EPWM1 配置 ==========
void InitEPwm1Example() //采样和中断
{
EPwm1Regs.TBPRD = 1000; // Set timer period 中断频率和采样频率100k
EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0
EPwm1Regs.TBCTR = 0x0000; // Clear counter
//EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
//EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
// Setup TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // Count up
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
// Setup compare
EPwm1Regs.CMPA.bit.CMPA = 500;
// Set actions
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // Set PWM1A on CAU
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM1A on CAD
EPwm1Regs.ETSEL.bit.SOCAEN = 1;
EPwm1Regs.ETSEL.bit.SOCASEL = 1;
EPwm1Regs.ETPS.bit.SOCAPRD = 1;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;
EPwm1Regs.ETSEL.bit.INTEN = 1;
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;
EPwm1Regs.ETFLG.bit.INT = 1;
}
//EPWM1中断 配置 ==========
__interrupt void epwm1_isr(void)
{
EALLOW;
// === Digital Compare 配置 ===
// A通道:控制EPWM1A(下管),对应 CMPSS2.CTRIPOUTH(高比较器) → DCAH
EPwm1Regs.DCAHTRIPSEL.bit.TRIPINPUT4 = 1; // 将TRIP4信号(即 CMPSS2.CTRIPH输出),指定为ePWM1的DCAH输入源;【即当 CMPSS2高比较器输出 CTRIPH为高时,TRIP4变高,DCAH接收到高电平。】
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 4; // TRIP4 -> DCAH
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_HI; // DCAH为高时触发 DCAEVT1
EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_LOW; // DCAH为低时触发 DCAEVT2
EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1; // 0x0源是DCAEVT1;0x1源是DCEVTFILT信号
EPwm1Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2; // 0x0源是DCAEVT2;0x1源是DCEVTFILT信号
EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_ASYNC;//异步方式输出,不依赖同步信号。
EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_ASYNC;//异步方式输出,不依赖同步信号。
// B通道:控制EPWM1B(下管),对应 CMPSS2.CTRIPOUTL(低比较器) → DCBH
EPwm1Regs.DCBHTRIPSEL.bit.TRIPINPUT5 = 1; // 将TRIP5信号(即 CMPSS2.CTRIPL输出),指定为 ePWM1的DCBH输入源;【即当 CMPSS2低比较器输出 CTRIPL为高时,TRIP5变高,DCBH接收到高电平】
EPwm1Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 5; // TRIP5 -> DCBH
EPwm1Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_HI; // DCBH为高时触发DCBEVT1
EPwm1Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBH_LOW; // DCBH为低时触发 DCBEVT2
EPwm1Regs.DCBCTL.bit.EVT1SRCSEL = DC_EVT1;
EPwm1Regs.DCBCTL.bit.EVT2SRCSEL = DC_EVT2;
EPwm1Regs.DCBCTL.bit.EVT1FRCSYNCSEL = DC_EVT_ASYNC;
EPwm1Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_ASYNC;
// 启用 DCAEVT1 和 DCBEVT1 的“事件使能”(同时触发强制)
EPwm1Regs.TZSEL.bit.DCAEVT1 = 1;
EPwm1Regs.TZSEL.bit.DCAEVT2 = 1;
EPwm1Regs.TZSEL.bit.DCBEVT1 = 1;
EPwm1Regs.TZSEL.bit.DCBEVT2 = 1;
EPwm1Regs.TZCTL.bit.DCAEVT1 = TZ_FORCE_HI;
EPwm1Regs.TZCTL.bit.DCAEVT2 = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.DCBEVT1 = TZ_FORCE_HI;
EPwm1Regs.TZCTL.bit.DCBEVT2 = TZ_FORCE_LO;
EDIS;
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
我在上述代码的调试过程中将CMPSS2 的输出信号 CTRIPH
和 CTRIPL
分别通过 output- XBAR连接到两个gpio进行观测,是可以正常看到两个基本为互补的方波信号,但是将其通过EPWM XBAR连接到EPWM1A和1B上,两个输出一直为低,这是为什么?上述代码配置能否能够符合我所描述功能的逻辑,编程是否存在问题,烦请解释原因。
您提到的 CMPSS->ePWM 用例逻辑是完全可以接受的。
您是否使用 SysConfig 工具来生成配置/初始化代码?