This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
IM 配置 EPWM 通道以从 CMPSS 模块触发。 我生成一个跳闸信号、并将其与直流模块进行比较。 直流模块的输出随后馈入动作限定符模块以触发 ePWM。 问题是、配置死区模块在通道 B 中生成否定信号后、通道 A 和 B 之间会发生重叠。有人可以帮助我解决这个问题吗?
我附加了配置 ePWM 通道的代码部分。
//时基子模块寄存器
(* ePWM[n]).TBCTL.bit.PRDLD = TB_Immediate;//从影子选择中激活周期寄存器加载//设置立即加载
(* ePWM[n]).TBPRD =周期;
(* ePWM[n]).TBPHS.bit.TBPHS = 0;//时基相位高电平
(* ePWM[n]).TBCTR = 0;//时基计数器寄存器
(* ePWM[n]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(* ePWM[n]).TBCTL.bit.PHSEN = TB_DISABLE;//从相位寄存器启用加载计数器寄存器
//(* ePWM[n]).TBCTL.bit.SYNCOSEL = TB_CTR_CMPB;//用于同步 ePWM (n+1)"下流"
//替换
(* ePWM[n]).EPWMSYNCOUTEN。bit.CMPBEN = 1;
//
(* ePWM[n]).TBCTL.bit.HSPCLKDIV = TB_DIV1;//高速时基时钟预分频位
(* ePWM[n]).TBCTL.bit.CLKDIV = TB_DIV1;//时基时钟预分频位
//计数器比较子模块寄存器
(* ePWM[n]).cmPCTL.bit.SHDWAMODE = CC_IMMEAL;//计数器比较 A (CMPA)寄存器运行模式
(* ePWM[n]).cmPCTL.bit.SHDWBMODE = CC_IMMETERE;//计数器比较 B (CMPB)寄存器运行模式
(* ePWM[n]).cmpa.bit.cmpA =周期-10000;
(* ePWM[n]).CMPB.bit.CMPB =周期;
//操作限定符子模块寄存器
(* ePWM[n]).AQCTLA.bit.ZRO = AQ_CLEAR;//当 TBCTR = 0时执行操作
(* ePWM[n]).AQCTLA.bit.PRD = AQ_SET;//当 TBCTR = TBPRD 时执行操作
//死区控制寄存器
(* ePWM[n]).DBCTL.bit.out_mode = DB_full_enable;
(* ePWM[n]).DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
(* ePWM[n]).DBRED.bit.DBRED = 20;//初始值
(* ePWM[n]).DBFED.bit.DBFED = 20;//初始值
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ePWM (n+1)初始化。 ePWM (n+1)是滞后的腿//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
N=0;
//时基子模块寄存器
(* ePWM[n+1]).TBCTL.bit.PRDLD = TB_SHADOW;
(* ePWM[n+1]).TBPRD =周期;
(* ePWM[n+1]).TBPHS.bit.TBPHS = 0;//时基相位高电平
(* ePWM[n+1]).TBCTR = 0;//时基计数器寄存器
(* ePWM[n+1]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(* ePWM[n+1]).TBCTL.bit.PHSEN = TB_DISABLE;//从相位寄存器启用加载计数器寄存器
//(* ePWM[n+1]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步"直通"模式
(* ePWM[n+1]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(* ePWM[n+1]).TBCTL.bit.CLKDIV = TB_DIV1;
//
(* ePWM[n+1]).EPWMSYNCINSEL.bit.SEL=0x01;// EPWMxSYNCIN 源选择寄存器-> EPWM1.SYNCOUT
//
//计数器比较子模块寄存器
(* ePWM[n+1]).cmpa.bit.cmpA = 200;//初始值
(* ePWM[n+1]).CMPB.bit.CMPB = 100;//初始值
(* ePWM[n+1]).cmPCTL.bit.LOADAMODE = CC_CTR_ZERO;//从影子选择模式加载活动计数器比较 A (CMPA)
(* ePWM[n+1]).cmPCTL.bit.SHDWAMODE = CC_SHADODE;//计数器比较 A (CMPA)寄存器运行模式
(* ePWM[n+1]).cmPCTL.bit.LOADBMODE = CC_CTR_ZERO;
(* ePWM[n+1]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
//操作限定符子模块寄存器
//(* ePWM[n+1]).AQCTLA.bit.CAU = AQ_SET;// TCTR = CMPA on Up Count 时的操作
//(* ePWM[n+1]).AQCTLA.bit.CBD = AQ_CLEAR;
//(* ePWM[n+1]).AQCTLA.bit.ZRO = AQ_SET;//当 TBCTR = 0时执行操作
//(* ePWM[n+1]).AQCTLA.bit.PRD = AQ_CLEAR;//当 TBCTR = TBPRD 时执行操作
//死区控制寄存器
(* ePWM[n+1]).DBCTL.bit.out_mode = DB_full_enable;
(* ePWM[n+1]).DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
(* ePWM[n+1]).DBRED.bit.DBRED = 0;//初始值
(* ePWM[n+1]).DBFED.bit.DBFED = 0;//初始值
// PWM n+1的逐周期(CBC)触发区
//这部分代码配置 DC (数字比较)模块以使用 TRIPIN4信号触发 PWM 模块。
// TRIPIN4中的高电平状态应在逐周期基础上触发 PWM。
EALLOW;
// DCACTL -数字比较 A 控制寄存器
(* ePWM[n+1]).DCACTL.bit.EVT1FRCSYNCSEL=1;
// DCTRIPSEL -数字比较跳闸选择寄存器
(* ePWM[n+1]).DCTRIPSEL.bit.DCAHCOMPSEL = 0b0011;//数字比较 A 高输入选择位:0011->TRIPIN4
// TZDCSEL -触发区数字比较器选择寄存器
(* ePWM[n+1]).TZDCSEL.bit.DCAEVT2 = 0b010;//数字比较输出 A 事件2选择010:DCAH =高电平、DCAL =无关
// TZSEL-触发区选择寄存器
//(* ePWM[n+1]).TZSEL.bit.DCAEVT2 = 1;//数字比较输出 A 事件2选择:1>启用 DCAEVT2作为此 ePWM 模块的 CBC 跳闸源
// TZCTL -触发区控制寄存器
//(* ePWM[n+1]).TZCTL.bit.TZA=1;
// TZCTL2 -跳匣区域控制寄存器
//(* ePWM[n+1]).TZCTL2.bit.ETZE = 1;//1 ->使用在 TZCTL2、TZCTLDCA 和 TZCTLDCB 中定义的跳闸操作。 TZCTL 中的设置被忽略
//(* ePWM[n+1]).TZCTL2.bit.TZAU = 0b111;//计数方向为低时、EPWMxA 上的跳闸动作:010->强制低电平(EPWMxA =低电平状态)
//(* ePWM[n+1]).TZCTL2.bit.TZAD = 0b111;//计数方向为低时 EPWMxA 上的跳闸动作:010->强制低电平(EPWMxA =低电平状态)
//(* ePWM[n+1]).TZCTL2.bit.TZBU = 0b111;//计数方向为递增时 EPWMxB 上的跳闸动作:010->强制低电平(EPWMxB =低电平状态)
//(* ePWM[n+1]).TZCTL2.bit.TZBD = 0b111;//计数方向为递增时 EPWMxB 上的跳闸动作:010->强制低电平(EPWMxB =低电平状态)
//(* ePWM[n+1]).TZCTLDCA.bit.DCAEVT1D = 0b111;
//(* ePWM[n+1]).TZCTLDCA.bit.DCAEVT1U = 0b111;
//(* ePWM[n+1]).TZCTLDCA.bit.DCAEVT2D = 0b111;
//(* ePWM[n+1]).TZCTLDCA.bit.DCAEVT2U = 0b111;
//操作限定符////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(* ePWM[n+1]).AQTSRCSEL.bit.T2SEL=0b0001;//动作限定器触发事件源选择寄存器:0001 -> DCAEVT2
//(* ePWM[n+1]).AQTSRCSEL.bit.T1SEL=0b0001;//动作限定器触发事件源选择寄存器:0001 -> DCAEVT2
(* ePWM[n+1]).AQCTLA2.bit.T2U=0b01;//输出 A 的附加动作限定器控制寄存器:01->清零:强制 EPWMxB 输出为低电平
(* ePWM[n+1]).AQCTLA2.bit.T2D=0b10;//输出 A 的附加动作限定器控制寄存器:10->置位:强制 EPWMxB 输出高电平
//(* ePWM[n+1]).AQCTLB2.bit.T2U=0b01;//输出 A 的附加动作限定符控制寄存器:01->清零:强制 EPWMxB 输出为低电平
//(* ePWM[n+1]).AQCTLB2.bit.T2D=0b10;//输出 A 的附加动作限定符控制寄存器:10->置位:强制 EPWMxB 输出高电平
//(* ePWM[n+1]).AQCTLB2.bit.T2D=0b11;//输出 B 的附加动作限定符控制寄存器:01->清零:强制 EPWMxB 输出为低电平
// ePWM X-BAR 配置////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TRIP4MUX0TO15CFG - TRIP4的 ePWM XBAR 多路复用器配置
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0=0;// 00 ->为 Mux0选择.0输入;0.0 - CMPSS1.CTRIPH
// TRIP4MUXENABLE -针对 TRIP4启用 ePWM XBAR 多路复用器
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0=1;// 1->相应的 Mux0输出被启用以驱动 ePWM-XBAR 的 TRIP4
// TRIPOUTINV:ePWM XBAR 输出反转寄存器
EPwmXbarRegs.TRIPOUTINV.bit.TRIP4=0;// 0:驱动高电平有效输出1:驱动低电平有效输出
EDIS;
在这里、您可以看到该问题的另一个视图。 死区计时器配置为0;
尊敬的 Marcos:
您能否在波形中标记哪个信号是 ePWM[n]和 ePWM[n+1]?
概括而言、它看起来像是一个 PWM 变为低电平之前的跳闸触发。 您是否可以通过提供 DB 来检查问题是否仍然 存在?
最棒的
Uttam
尊敬的 Marcos:
对此采取后续行动。 问题是否已解决?
最棒的
Uttam