您好!
我在使用 HRPWM 更改 EPWM 1和 EPWM 2之间的相位时遇到问题。 我已经通过执行 EPwm2Regs.TBPHS.Half.TBPHSHR =(58 << 8)、 并将 TBPRD 寄存 器设置为 EPwm2Regs.TBPRD = 86来看到120度的相移、从而将 TBPHSHR 寄存器设置为58。 这是设置 TBPHSHR 的正确方法吗? 下面是我的代码、其中初始化了 ePWM 1和2。
无效
InitEPwm1Examples()
{
EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;//周期= 900 TBCLK 计数
//EPwm1Regs.TBPHS.Half.TBPHS = 0;//将相位寄存器设置为零(由于我想使用高分辨率、所以添加了注释)
EPwm1Regs.TBPHS.Half.TBPHSHR = 0;//将相位寄存器设置为零
EPwm1Regs.TBCTR = 0x0000;//清除计数器
EPwm1Regs.CMPA.half.CMPA = EPWM1_MIN_CMPA;//设置比较 A 值
EPwm1Regs.CMPB = EPWM1_MIN_CMPB;//设置比较 B 值
//在3月31日之前没有在这里
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比值-> TBCLK = SYSCLKOUT = 60MHz
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//主机模块
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步下流模块
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM1A 的操作
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
//在3月31日之前没有在这里
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 B 上设置 PWM1B、递增计数
EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;//在事件 B 上清除 PWM1B,递减计数
// HRPWM 代码
EALLOW;//注意这些寄存器受保护
EPwm1Regs.HRCNFG.ALL = 0x0;//首先清除所有位
EPwm1Regs.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换
EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1;//此位允许您在 SYNCIN、TBCTL[SWFSYNC]或数字比较事件上同步具有高分辨率相位的 ePWM 模块
EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的影子负载= 0
EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP;//控制双边沿位置
EPwm1Regs.HRCNFG.bit.CTLMODE = HR_PHS;// PHSHR 控制 MEP
EDIS;
//
// InitEPwm2Example -
//
无效
InitEPwm2Examples()
{
EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD;//周期= 900 TBCLK 计数
//EPwm2Regs.TBPHS.Half.TBPHS = 58;//将相位寄存器设置为零 (由于我想使用高分辨率、所以添加了注释)
EPwm2Regs.TBPHS.half.TBPHSHR =(58 << 8);//将相位寄存器设置为零
EPwm2Regs.TBCTR = 0x0000;//清除计数器
EPwm2Regs.CMPA.half.CMPA = EPWM2_MIN_CMPA;//设置比较 A 值
EPwm2Regs.CMPB = EPWM2_MIN_CMPB;//设置比较 B 值
//在3月31日之前没有在这里
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率--> TBCLK = SYSCLKOUT = 60MHz
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//对称模式
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//主机模块
EPwm2Regs.TBCTL.bit.PHSDIR = TB_DOWN;//同步时倒计数(=120度)
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步下流模块
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;// CTR 上的负载=零
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM1A 的操作
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
//在3月31日之前没有在这里
EPwm2Regs.AQCTLB.bit.CBU = AQ_SET;//在事件 B 上设置 PWM1B、递增计数
EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;//在事件 B 上清除 PWM1B,递减计数
// HRPWM 代码
EALLOW;//注意这些寄存器受保护
EPwm2Regs.HRCNFG.ALL = 0x0;//首先清除所有位
EPwm2Regs.HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换
EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1;//此位允许您在 SYNCIN、TBCTL[SWFSYNC]或数字比较事件上同步具有高分辨率相位的 ePWM 模块
EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的影子加载= 0
EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP;//控制双边沿位置
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_PHS;// PHSHR 控制 MEP
EDIS;
}