TMS320F280049C: 关于280049CEPWM模块全局加载与一次性加载配置问题

Part Number: TMS320F280049C
Other Parts Discussed in Thread: C2000WARE

Hi All,

我在配置EPWM模块的全局加载与一次性加载的时候,遇到了一次性加载不生效的问题?我希望的配置是通过配置一次性加载,仅在我更新 EPWM_setGlobalLoadOneShotLatch(myEPWM1_BASE);一次加载寄存器后,才会从下一加载时刻将影子寄存器更新值到活动寄存器;目前配置完成后,我在中断中更新EPWM影子寄存器的值,但我并未使能一次加载,但实际epwm的输出产生了变化,这让我相信我的一次加载的配置没有生效,文章末尾会给出相关代码,相关配置说明参考下图:
image.png

关于全局加载与一次加载的配置代码如下:其余epwm配置再另一函数中完成,包括CMPA\CMPB\TBPRD\DEADB的配置,如果需要我可以在后续给出;请帮我确认一下我的哪里配置有问题导致我的一次加载没生效?

//全局加载配置--软件手动触发
void SetupPWM_GlobalLoad(void)
{
    // 1. 使能 TBPRD, CMPA, CMPB 参与全局加载//GLDCFG
    EPWM_enableGlobalLoad(EPWM1_BASE);//使能全局加载
    EPWM_enableGlobalLoadOneShotMode(EPWM1_BASE);// 启用 One-Shot 模式(每次触发只加载一次)
    EPWM_setGlobalLoadOneShotLatch(EPWM1_BASE);//设置One shot global shadow
    //2、启用全局加载寄存器
    EPWM_enableGlobalLoadRegisters(EPWM1_BASE,EPWM_GL_REGISTER_TBPRD_TBPRDHR);
    EPWM_enableGlobalLoadRegisters(EPWM1_BASE,EPWM_GL_REGISTER_CMPA_CMPAHR);
    EPWM_enableGlobalLoadRegisters(EPWM1_BASE,EPWM_GL_REGISTER_CMPB_CMPBHR);

    //EPWM2
    // 1. 使能 TBPRD, CMPA, CMPB 参与全局加载//GLDCFG
    EPWM_enableGlobalLoad(EPWM2_BASE);//使能全局加载
    EPWM_enableGlobalLoadOneShotMode(EPWM2_BASE);// 启用 One-Shot 模式(每次触发只加载一次)
    EPWM_setGlobalLoadOneShotLatch(EPWM2_BASE);//设置One shot global shadow
    //2、启用全局加载寄存器
    EPWM_enableGlobalLoadRegisters(EPWM2_BASE,EPWM_GL_REGISTER_TBPRD_TBPRDHR);
    EPWM_enableGlobalLoadRegisters(EPWM2_BASE,EPWM_GL_REGISTER_CMPA_CMPAHR);
    EPWM_enableGlobalLoadRegisters(EPWM2_BASE,EPWM_GL_REGISTER_CMPB_CMPBHR);
    //3、配置与EPWM1的GLDCTL2链接
    EPWM_setupEPWMLinks(EPWM2_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_GLDCTL2);
    
    //EPWM3
    // 1. 使能 TBPRD, CMPA, CMPB 参与全局加载//GLDCFG
    EPWM_enableGlobalLoad(EPWM3_BASE);//使能全局加载
    EPWM_enableGlobalLoadOneShotMode(EPWM3_BASE);// 启用 One-Shot 模式(每次触发只加载一次)
    EPWM_setGlobalLoadOneShotLatch(EPWM3_BASE);//设置One shot global shadow
    //2、启用全局加载寄存器
    EPWM_enableGlobalLoadRegisters(EPWM3_BASE,EPWM_GL_REGISTER_TBPRD_TBPRDHR);
    EPWM_enableGlobalLoadRegisters(EPWM3_BASE,EPWM_GL_REGISTER_CMPA_CMPAHR);
    EPWM_enableGlobalLoadRegisters(EPWM3_BASE,EPWM_GL_REGISTER_CMPB_CMPBHR);
    //3、配置与EPWM1的GLDCTL2链接
    EPWM_setupEPWMLinks(EPWM3_BASE, EPWM_LINK_WITH_EPWM_1, EPWM_LINK_GLDCTL2);

    //5、软件触发加载
    //EPWM_setGlobalLoadOneShotLatch(base);//设置一次性加载脉冲
    //EPWM_forceGlobalLoadOneShotEvent(base);//强制软件触发一次加载

}
  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好

    我明白了,所以你的担忧是,你只希望在应用程序代码中的一个特定点(即你想用软件触发全局加载的地方)更新寄存器,否则你希望阻止在任何其他时间加载这些值。

    有几个问题需要澄清:

    请务必查看我们在C2000Ware中的全局加载软件示例:{C2000Ware}\driverlib\f28004x\examples\epwm\epwm_ex14_global_load_use_case
    你的全局加载触发器是什么?(例如,CNTR=0事件,仅软件强制触发等)
    在您的设置和全局加载单触发强制中,您是否仅使用了EPWM1?由于EPWM2和EPWM3似乎与EPWM1相关联,因此在此处只需更新EPWM1即可。在您的应用中,这个由软件强制触发的EPWM1全局加载触发器出现在哪里?
    你的全局加载事件预缩放值是多少?(例如,你是否每1个事件就触发一次全局加载)
    你之后有没有检查寄存器,看看是否识别出了全局加载事件?你可以使用EPWM_getGlobalLoadEventCount(uint32_t base)函数

  • 你好,

    我找到我存在的问题了,全局加载与一次加载对相位寄存器不适用,所以会出现没使能也发生相移的情况;我把相位换成比较器就功能正常了;对于你提到的全局加载触发器,EPWM1使用的是CNTR=0事件,EPWM2\3使用的是从epwm1触发的同步信号EPWM_GL_LOAD_PULSE_SYNC;软件强制触发的EPWM1全局加载触发器我放在CLA中,在epwm值更新后触发;对于全局加载事件预缩放值,因为搭配一次加载使用,所以我认为不需要配置,默认值为0,相关例程中也未看到配置。