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.

[参考译文] CCS/F28M36P63C2:ePWM 输出问题

Guru**** 2614955 points

Other Parts Discussed in Thread: F28M36P63C2

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/695455/ccs-f28m36p63c2-epwm-outputs-issue

器件型号:F28M36P63C2

工具/软件:Code Composer Studio

您好!

我一直在使用协处理器系列器件 F28M36P63C2来设计开关模式电源电池充电器。 我一直在尝试设置 PWM 波形输出。 我正在使用 ePWM 子模块1和2来实现这一点。

这就是我为2个 PWM 模块配置动作事件的方法。 计数器处于向上计数模式。

   // EPWM1的动作限定器子模块寄存器


   EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
   EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;
   EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;

   EPwm1Regs.AQCTLB.bit.CAD = AQ_NO_ACTION;
   EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;
   EPwm1Regs.AQCTLB.bit.CAU = AQ_NO_ACTION;

// EPWM2的动作限定器子模块寄存器

   EPwm2Regs.AQCTLA.bit.CAD = AQ_NO_ACTION;
   EPwm2Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;
   EPwm2Regs.AQCTLA.bit.CAU = AQ_NO_ACTION;

   EPwm2 Regs.AQCTLB.bit.CAD = AQ_SET;
   EPwm2Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;
   EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;

我这样做是因为我想看到 EPWM1A 和 EPWM2B 的 PWM 输出、但我不想看到 EPWM1B 和 EPWM2A 中的任何内容。 但出于某种原因、当我查看 PWM 的示波器输出时、它们会显示意外结果。 请查看随附的图片。

ePWM 1A

 

ePWM 1B

ePWM 2A

 


 

ePWM 2B

 

 

我们非常感谢您的任何建议或帮助。 感谢你能抽出时间、

Srini.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Srini,

    我猜您已经重新配置了动作限定符、此外、您可能已经配置了 ePWM1、以便在 ePWM1b 上输出互补波形。

    如果不想输出信号、为什么在输出多路复用器上选择 ePWM1B? 您可以将其保留为"GPIO"。

    最后检查 ePWM2 A 和 B 的 GPIO 配置、您是否提供了对 C28x 的访问? 您是否选择了正确的多路复用器位置?

    谢谢、
    Cody  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Cody、

    我尚未将波形配置为相互补充。 我将 polsel 位设置为0。

    我选择输出 ePWM 1B 的多路复用、因为我将需要它用于另一个事件。

    我要做的是

    void EventFunc (void)

    if (事件=0)

    InitEPwm1Exampl();//此函数在禁用 EPWM 1B 和 EPWM 2A 时将相同的输出设置为 EPWM 1A 和 EPWM 2B

    event+=1;
    EventChecker=100;//用于调试

    //延迟
    对于(延迟= 0;延迟< 2000000;延迟++)


    对于(延迟= 0;延迟< 2000000;延迟++)



    其他

    InitEPwm2Examples();//this 函数在禁用 ePWM 1A 和 ePWM 2B 的同时将相同的输出设置为 ePWM 1B 和 ePWM 2A

    event-=1;
    EventChecker=99;//用于调试

    //延迟
    对于(延迟= 0;延迟< 2000000;延迟++)


    对于(延迟= 0;延迟< 2000000;延迟++)





    谢谢、
    Srini.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Cody、

    这是我的修订版代码:

    禁用 ePWM 1B 并启用 ePWM 1A 输出。

    您认为我在这里做了些什么错吗???

    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
    EPwm1Regs.TBPRD = TPWM1-1;         // 150MHz/ISR_FREQ/24-1
    EPwm1Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
    EPwm1Regs.TBCTR = 0x0000;//清除计数器

    //设置 TBCLK
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//顺计时
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步下流模块

    //预分频
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x3;
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV2;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    //计数器比较子模块寄存器
    EPwm1Regs.CMPA.half.CMPA = 0;//初始设置占空比0%
    EPwm1Regs.CMPB = 0;//初始设置占空比0%
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;


    //操作限定符子模块寄存器
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;

    EPwm1Regs.AQCTLB.bit.CBD = AQ_CLEAR;
    EPwm1Regs.AQCTLB.bit.ZRO = AQ_NO_ACTION;
    EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;

    //EPwm1Regs.AQCSFRC.bit.CSFB = 1;//我也尝试了此行来禁用 ePWM 1B 上的输出。 但没有结果。

    /*设置死区*/
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HI;// A 或 B 均未反相、高电平有效模式。
    EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;

    //根据 TZ1定义事件(OST),根据 TZ2定义事件(CBC)
    EALLOW;
    EPwm1Regs.TZSEL.bit.OSHT1 = TZ_ENABLE;//启用 TZ1作为单次触发源
    EPwm1Regs.TZSEL.bit.CBC2 = TZ_ENABLE;//启用 TZ2作为 CBC 跳闸源
    EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
    EPwm1Regs.TZCTL.bit.TSB = TZ_FORCE_LO;
    EDIS;




    我具有与类似的配置函数
    1) 1)启用1B 和禁用1A
    2) 2)启用2A 和禁用2B
    3) 3)启用2B 和禁用2A


    我在一个名为 EventFunc()的函数中调用上述函数。 此 EventFunc()函数放置在项目主函数的无限循环中。


    下面是我的修订版事件函数、

    void EventFunc (void)

    if (事件=0)

    InitEPwm1AExamples();//启用1A 并禁用1B
    InitEPwm2BExamples();//启用2B 并禁用2A

    event+=1;//一个连续运行事件的切换变量
    EventChecker=100;//调试监视窗口变量

    //延迟以留出时间清晰地观察示波器输出
    对于(延迟= 0;延迟< 2000000;延迟++)


    对于(延迟= 0;延迟< 2000000;延迟++)



    其他

    InitEPwm1BExamples();//启用1B 并禁用1A
    InitEPwm2AExamples();//启用2A 并禁用2B

    event-=1;//一个连续运行事件的切换变量
    EventChecker=99;//调试监视窗口变量


    //延迟以留出时间清晰地观察示波器输出
    对于(延迟= 0;延迟< 2000000;延迟++)


    对于(延迟= 0;延迟< 2000000;延迟++)






    一如既往、欢迎并感谢您提出任何建议或建议。 感谢你能抽出时间

    Srini.