您好!
我想生成360/N°的 N PWM 偏移、以控制交错降压转换器。
我使用 PWM1作为基准(主器件)、并在 CTR = 0时生成 SYNCOUT 信号以馈送其他 PWM 模块(从器件)。
当放大从器件 PWM 的边沿时、我观察到20ns 的抖动、这似乎与 TRM 的第1967页说明相对应(+/-2时钟周期的抖动)。
如何在 HR 模式下同步 PWM 而不产生此抖动?
以下是我的初始化代码:
void PWM_configureModule (PWM_moduleConfiguration_s* conf)
{
volatile struct ePWM_regs * moduleRegs =&EPwm1Regs + conf->module;
PWM_CALIBRATE ();
EALLOW;
SyncSockRegs.SYNCSELECT.BIT.EPWM4SYNCIN = 0U;
SyncSockRegs.SYNCSELECT.BIT.EPWM7SYNCIN = 0U;
SyncSockRegs.SYNCSELECT.BIT.EPWM10SYNCIN = 0U;
//配置期间停止 PWM 同步
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0U;
moduleRegs->TBCTL.bit.PRDLD = 0U;//周期寄存器被影子化
*((volatile uint32_t*)(&moduleRegs->TBPRDHR)=(uint32_t)(64000.0F *(float32_t) sysctrl_getCpuFreqInMhz ()/ conf->频率)<< 8U;
if (conf->module =PWM_MODULE_1)
{
moduleRegs->TBCTL.bit.PHSEN = 0U;
moduleRegs->TBCTL.bit.SYNCOSEL = 1U;
}
其他
{
moduleRegs->TBCTL.bit.SYNCOSEL = 0U;
if (conf->enablePhaseSynchronization)
{
if (conf->PHASE < 180.0F)
{
moduleRegs->TBPHS.all =(uint32_t)(conf->PHASE /180.0F *(float32_t)(*(volatile uint32_t*)(&moduleRegs->TBPRDHR))));
moduleRegs->TBCTL.bit.PHSDIR = 0U;
}
其他
{
moduleRegs->TBPHS.all =(uint32_t)((360.0F - conf->PHASE)/180.0F *(float32_t)(*(volatile uint32_t*)(&moduleRegs->TBPRDHR))));
moduleRegs->TBCTL.bit.PHSDIR = 1U;
}
moduleRegs->TBCTL.bit.PHSEN = 1U;
}
其他
{
moduleRegs->TBCTL.bit.PHSEN = 0U;
}
}
moduleRegs->TBCTR = 0U;//重置时基计数器
moduleRegs->TBCTL.bit.CTRMODE = 2U;//向上向下计数模式
moduleRegs->TBCTL.bit.CLKDIV = 0U;
moduleRegs->TBCTL.bit.HSPCLKDIV = 0U;
moduleRegs->TBCTL.bit.free_soft = 2U;
if (conf->linkDutyCycle)
{
moduleRegs->EPWMXLINK.bit.CMPALINK = conf->linkedModule;
moduleRegs->EPWMXLINK。bit.CMPBLINK = conf->linkedModule;
}
其他
{
}
//启用死区半周期计时
//在死区上实现高分辨率
moduleRegs->DBCTL.bit.HALFCYCLE = 1U;
moduleRegs->DBCTL.bit.DEDB_MODE = 0U;
moduleRegs->DBCTL.bit.out_mode = 3U;//下降沿和上升沿死区
moduleRegs->DBCTL.bit.in_mode = 2U;// PWMA 是上升沿延迟的源,PWMB 是下降沿延迟的源
moduleRegs->DBCTL.bit.SHDWDBFEDMODE = 0U;//死区寄存器被影子化
moduleRegs->DBCTL.bit.SHDWDBREDMODE = 0U;
moduleRegs->DBCTL2.bit.LOADDBCTLMODE = 1U;
switch (conf->mode)(交换机(conf->mode)模式)
{
PWM_SINGLE_A 案例:
moduleRegs->DBCTL.bit.POLSEL = 0U;//同相 A
moduleRegs->AQCTLA.bit.CAU = 2U;
moduleRegs->AQCTLA.bit.CAD = 1U;
中断;
PWM_SINGLE_B 案例:
moduleRegs->DBCTL.bit.POLSEL = 0U;//同相 B
moduleRegs->AQCTLB.bit.CBU = 2U;
moduleRegs->AQCTLB.bit.CBD = 1U;
中断;
PWM_互补_AB 案例:
moduleRegs->DBCTL.bit.POLSEL = 2U;//非反相 A,反相 B 路径
moduleRegs->AQCTLA.bit.CAU = 2U;
moduleRegs->AQCTLA.bit.CAD = 1U;
moduleRegs->AQCTLB.bit.CBU = 2U;
moduleRegs->AQCTLB.bit.CBD = 1U;
中断;
PWM_互补_BA 案例:
moduleRegs->DBCTL.bit.POLSEL = 1U;//反转 A 路径,非反转 B
moduleRegs->AQCTLA.bit.CAU = 2U;
moduleRegs->AQCTLA.bit.CAD = 1U;
moduleRegs->AQCTLB.bit.CBU = 2U;
moduleRegs->AQCTLB.bit.CBD = 1U;
中断;
}
*((volatile uint32_t*)(&moduleRegs->DBREDHR.all)=(uint32_t)(conf->risingDeadband / 90.0F *(float32_t)(*(volatile uint32_t*)(&moduleRegs->TBPRDHR))))));
*((volatile uint32_t*)(&moduleRegs->DBFEDH.all)=(uint32_t)(conf->FallingDeadband / 90.0F *(float32_t)(*(volatile uint32_t*)(&moduleRegs->TBPRDHR)))));
moduleRegs->CMPCTL.bit.SHDWAMODE = 0U;// CMPA 寄存器被影子化
moduleRegs->CMPCTL.bit.SHDWBMODE = 0U;// CMPB 寄存器被影子化
moduleRegs->CMPCTL.bit.LOADAMODE = 2U;//加载 TBCTR 的 CMPA = PRD
moduleRegs->CMPCTL.bit.LOADBMODE = 2U;//加载 TBCTR 的 CMPB = PRD
/*使用 TZCTL2、TZCTLDCA 和 TZCTLDCB 中定义的跳闸操作*/
moduleRegs->TZCTL2.all = 0x8FFF;
moduleRegs->TZCTLDCA.all = 0xFFF;
moduleRegs->TZCTLDCA.all = 0xFFF;
moduleRegs->TZCTLDCB.all = 0xFFF;
moduleRegs->TZCTLDCB.all = 0xFFF;
/*数字比较子模块输入是跳闸输入的组合*/
moduleRegs->DCTRIPSEL.bit.DCAHCOMPSEL = 0xF;
moduleRegs->DCTRIPSEL.bit.DCALCOMPSEL = 0xF;
moduleRegs->DCTRIPSEL.bit.DCBHCOMPSEL = 0xF;
moduleRegs->DCTRIPSEL.bit.DCBLCOMPSEL = 0xF;
moduleRegs->TZDCSEL.bit.DCAEVT1 = 0x2U;
moduleRegs->TZDCSEL.bit.DCAEVT2 = 0x4U;
moduleRegs->TZDCSEL.bit.DCBEVT1 = 0x2U;
moduleRegs->TZDCSEL.bit.DCBEVT2 = 0x4U;
moduleRegs->TBCTL.bit.CTRMODE = 2U;//向上计数模式
if (pwm_module_ha_HR_capability (conf->module)&& conf->enableHighResolution)
{
moduleRegs->HRCNFG.all = 0x0000U;//清除寄存器
moduleRegs->HRCNFG.bit.CTLMODE = 0U;// TBPRDHR 寄存器控制边沿位置
//(即、这是占空比或周期控制模式)。
moduleRegs->HRCNFG.bit.CTLMODEB = 0U;//TBPRDHR (8)寄存器控制边沿位置
//(即、这是占空比或周期控制模式)。
moduleRegs->HRCNFG.bit.HRLOAD = 2U;//在 CTR = 0或 CTR = PRD 上加载 CMPAHR
moduleRegs->HRCNFG.bit.HRLOADB = 2U;//在 CTR = 0或 CTR = PRD 上加载 CMPBHR
moduleRegs->HRCNFG.bit.AUTOCONV = 1U;//自动转换打开
moduleRegs->HRCNFG.bit.EDGMODE = 3U;// MEP 控制两个边沿
moduleRegs->HRCNFG.bit.EDGMODEB = 3U;// MEP 控制两个边沿
moduleRegs->HRCNFG2.bit.EDGMODEDB= 3U;// MEP 控制两个边沿(DBREDHR 的上升沿或下降沿)
// DBFEDHR 边缘)
moduleRegs->HRCNFG2.bit.CTLMODEBFED = 1U;// CTR = 0或 CTR = PRD 上的负载
moduleRegs->HRCNFG2.bit.CTLMODEDBRED = 1U;// CTR = 0或 CTR = PRD 上的负载
moduleRegs->HRPCTL.bit.PWMSYNCSEL = 0U;
moduleRegs->HRPCTL.bit.TBPHSHRLOADE = 1U;
moduleRegs->HRPCTL.bit.HRPE = 1U;
moduleRegs->HRPWR.bit.CALPWRON = 1U;//启用 MEP 校准逻辑
}
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1U;
forceSynchronization (conf->module);
EDIS;
}
感谢您的支持、
Arthur