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.

[参考译文] TMS320F28377S:CAN#39;t 使 CAD 或 CBD 正常工作

Guru**** 2480245 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/878378/tms320f28377s-can-t-get-cad-or-cbd-to-work

器件型号:TMS320F28377S

我正在尝试使用 EPwm6A 复制 TRM (SPRUHX5F)中图14-30的行为。

向上计数设置按预期工作、但向下计数设置不工作。  

EPwm6寄存器设置如下:

EPwm6Regs.TBCTL.bit.CTRMODE      = TB_COUNT_updown;

EPwm6Regs.CMPCTL.bit.LOADAMODE = 0;  // CTR 上的负载= 0 *
EPwm6Regs.CMPCTL.bit.LOADBMODE = 0;  // CTR 上的负载= 0 *
EPwm6Regs.CMPCTL.bit.SHDWAMODE = 0;  //启用影子
EPwm6Regs.CMPCTL.bit.SHDWBMODE = 0;  //启用影子
EPwm6Regs.CMPCTL.bit.LOADASHNC  = 0;  //使用 LOADAMODE *
EPwm6Regs.CMPCTL.bit.LOADBSYNC  = 0;  /*使用 LOADBMODE *

EPwm6Regs.AQCTL.bit.LDAQAMODE    = 0;//在 CTR 上加载= 0 *
EPwm6Regs.AQCTL.bit.LDAQBMODE    = 0;// CTR 上的负载= 0 *
EPwm6Regs.AQCTL.bit.SHDWAQAMODE = 1;//启用影子
EPwm6Regs.AQCTL.bit.SHDWAQBMODE = 1;//启用影子
EPwm6Regs.AQCTL.bit.LDAQASYNC     = 0;/*使用 LDAQAMODE *
EPwm6Regs.AQCTL.bit.LDAQBSYNC     = 0;/*使用 LDAQBMODE *

EPwm6Regs.TBPRD = 166;
EPwm6Regs.CMPA.bit.CMPA = 120;
EPwm6Regs.CMPB.bit.CMPB =(EPwm6Regs.TBPRD - EPwm6Regs.CMPA.bit.CMPA);// CMPB = 46 *

EPwm6Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
EPwm6Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm6Regs.AQCTLA.bit.CAD = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CBU = AQ_NO_ACTION;
EPwm6Regs.AQCTLA.bit.CBD = AQ_CLEAR;

 在这些设置下、我希望出现图14-30中所示的行为:

下面的示波器图中显示了我实际得到的结果。  通道1为 EPwm2A (其上升沿对应于 EPwm2.TBCNT = EPwm6.TBCNT = 0)。  CH2 = EPwm6A。  为了清晰起见、死区为零。

请注意、EPwm6A 在递增计数时在 TBCNT = CMPA 时变为高电平、正如预期的那样。  在倒计数时、它不会在 TBCNT = CMPB 时变为低电平、而是在 TBCNT = 0前保持高电平。

我已经尝试交换 EPwm6Regs.CMPA.bit.CMPA 和 EPwm6Regs.CMPB.BIT.CMPB 的值(即 CMPA = 46、CMPB = 120)、结果是一样的。   

我还尝试将 EPwm6Regs.CMPCTL.bit.LOADAMODE 和 EPwm6Regs.CMPCTL.bit.LOADBMODE 设置为1和2 (PRD 负载以及 ZRO 和 PRD 负载)、但也没有效果。   

我是设置错误的寄存器、还是尝试无法完成的操作?  提前感谢您的任何见解。   

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

    1.尝试立即模式,让我们看看它是否会改变任何东西。

    2.在调试器中完成设置后进行检查、以确保为寄存器设置的值生效。

    NIMA

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

    NIMA、

    我将 AQCTL 更改为立即加载、如下所示、它没有改变行为。   

    您能否总结一下图30中实现 EPWMxA 波形所需的寄存器设置。  我想、如果我能做到这一点、我就能解决这个问题。

    感谢你的帮助。

    EPwm6Regs.AQCTL.bit.LDAQAMODE = 0;
    EPwm6Regs.AQCTL.bit.LDAQBMODE = 0;


    EPwm6Regs.AQCTL.bit.SHDWAQAMODE = 0;
    EPwm6Regs.AQCTL.bit.SHDWAQBMODE = 0;


    EPwm6Regs.AQCTL.bit.LDAQASYS = 0;
    EPwm6Regs.AQCTL.bit.LDAQBSYNC = 0;

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

    抱歉、我指的是图14-30、如上所示

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

    我将为您发送一个简单的示例。

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

    仍在进行此工作、我会在准备好后发布它!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    void initEPWM (uint32_t base)
    {
    //
    //设置 TBCLK
    //
    ePWM_setTimeBasePeriod (base、ePWM_TIMER_TBPRD);
    ePWM_setPhaseShift (base、0U);
    ePWM_setTimeBaseCounter (base、0U);
    
    //
    //设置比较值
    //
    ePWM_setCounterCompareValue (基本值、
    ePWM_COUNTER_COMPARE_A、
    ePWM_TIMER_TBPRD/2);
    ePWM_setCounterCompareValue (基本值、
    ePWM_COUNTER_COMPARE_B、
    ePWM_TIMER_TBPRD/4*3);
    
    //
    //设置计数器模式
    //
    ePWM_setTimeBaseCounterMode (base、ePWM_COUNTER_MODE_UP_DOWN);
    ePWM_DisablePhaseShiftLoad (base);
    ePWM_setClockPrescaler (base、
    ePWM_CLOCK 分频器_8、
    ePWM_HSCLOCK_DEVIDER_1);
    
    //
    //设置隐藏
    //
    EPWM_setCounterCompareShadowImage LoadMode (基本、
    ePWM_COUNTER_COMPARE_A、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    EPWM_setCounterCompareShadowImage LoadMode (基本、
    ePWM_COUNTER_COMPARE_B、
    ePWM_COMP_LOAD_ON_CNTR_ZERO);
    
    //
    //设置操作
    //
    
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_zero);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT NO_CHANGE、
    ePWM_AQ_output_on_timebase_period);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT A、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_down_CMPB);
    
    
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT 低电平、
    ePWM_AQ_output_on_timebase_zero);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT NO_CHANGE、
    ePWM_AQ_output_on_timebase_up_CMPA);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT 高电平、
    ePWM_AQ_output_on_timebase_period);
    ePWM_setActionQualifierAction (base、
    ePWM_AQ_OUTPUT _B、
    ePWM_AQ_OUTPUT NO_CHANGE、
    ePWM_AQ_output_on_timebase_down_CMPB);
    
    
    
    //
    //中断,我们将在其中更改比较值
    //选择 INT on 时基计数器零事件,
    //启用 INT,在发生第1个事件时生成 INT
    //
    ePWM_setInterruptSource (base、ePWM_INT_TBCTR_ZERO);
    ePWM_enableInterrupt (base);
    ePWM_setInterruptEventCount (base、1U);
    }