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.

[参考译文] TMS320F28384D:有关 PWM 占空比的问题。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1178363/tms320f28384d-question-about-duty-of-pwm

器件型号:TMS320F28384D

你(们)好

PWM 信号的占空比必须为零、但会出现满占空比。

程序代码不允许超过95%的占空比发生、但它确实会100%发生。

随机发生。 原因是什么?


以下是应用信息:

*太阳能逆变器33kw

 输入:650V  

 输出:220Vac 33KW

谢谢

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

    请注意。
    如果在 MCU 功能期间使用 Ramf、则发生频率降至1/10。

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

    嗨、David、

    我看到了一个类似的问题。 原因与没有足够执行时间的 ISR 有关。 您能否分享有关 ePWM 配置的更多信息?

    谢谢、

    Luke

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

    你好、Luke、

    ePWM 设置。

    请检查。

    谢谢、

    void FX_Init_INVEPwmSeting (UINT16模块、UINT16频率、UINT16位置、UINT16 DBR_Value、UINT16 DBF_Value、UINT16 Ctrl_Mode)

    //设置 TBCLK
    ePWM[模块]->TBPRD =__DIVf32 (PWM_CLOCK,(Freq*2));//频率:16kHzPWM_CLOCK:100MHz
    if (Position == PWM_TOP)

    ePWM[模块]->TBPHS.bit.TBPHS = 0x0000;//(相位为0)
    ePWM[模块]->TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载(0x0)

    else //if (Position = PWM_BOT)

    ePWM[模块]->TBPHS.bit.TBPHS =__DIVf32 (PWM_CLOCK,(Freq*2));//(相位为0)
    ePWM[模块]->TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载(0x0)

    ePWM[模块]->TBCTR = 0x0000;//计数器清零


    ePWM[模块]->CMPA.bit.CMPA = 0;//占空比:0%
    ePWM[模块]->CMPB.bit.CMPB = 0;//占空比:0%

    //设置计数器模式
    ePWM[模块]->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//计数器模式(CTR 模式):上-下计数模式

    ePWM[模块]->TBCTL.bit.PRDLD = TB_SHADOW;// 0x0
    ePWM[模块]->TBCTL.bit.HSPCLKDIV = TB_DIV1;//高速时基时钟预分频:/1
    ePWM[模块]->TBCTL.bit.CLKDIV = TB_DIV1;//时基时钟预分频:/1 TBCLK = SYSCLK /(HSPCLKDIV * CLKDIV)


    ePWM[模块]->CMPCTL.bit.SHDWAMODE = CC_SHADODE;//(启用影子寄存器和功能)
    ePWM[模块]->CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    ePWM[模块]->CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;  
    ePWM[模块]->CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;


    ePWM[模块]->AQCTLA.bit.CAU = AQ_CLEAR;  
    ePWM[模块]->AQCTLA.bit.CAD = AQ_SET;  


    ePWM[模块]->DBCTL.bit.out_mode=DB_full_enable;
    ePWM[模块]->DBCTL.bit.POLSEL = DB_ACTV_HIC;
    ePWM[模块]->DBRED.bit.DBRED = DBR_VALUE;//上升死区时间=(1 / TBCLK)* DBRED @ TBCLK = 200MHz
    ePWM[模块]->DBFED.bit.DBFED = DBF_VALUE;//下降死区时间=(1 / TBCLK)* DBFED

    if (ctrl_Mode =是)

    EPWM[模块]->EPWMSYNCOUTEN。bit.ZEROEN = SYNC_OUT_SRC_ENABLE;// TBCTR = 0x0000事件以设置 EPWMxSYNCOUT 信号。

    ePWM[模块]->ETSEL.bit.INTSEL = ET_CTR_PRD;
    ePWM[模块]->ETSEL.bit.INTEN = 1;
    ePWM[模块]->ETPS.bit.INTPRD = et_1st;

    其他

    ePWM[模块]->EPWMSYNCINSEL.bit.SEL = SYNC_IN_SRC_SYNCOUT_EPWM1;
    ePWM[模块]->ETSEL.bit.INTEN = 0;

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

    您好、Park、

    您的代码中此部分背后的理由是什么?

    ePWM[模块]->TBPHS.bit.TBPHS =__DIVf32 (PWM_CLOCK,(Freq*2));//(相位为0)
    ePWM[模块]->TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载(0x0)

    我怀疑在触发递减计数 CMPA 事件并设置输出后、SYNC 信号会将您的计数器重置为时基周期、这会跳过在递增计数 CMPA 上本来会发生的清除事件。 在您的系统环境中、这种情况是否可行?

    谢谢、

    Luke

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

    您好、Luke、

    ------------------------------------------------------------------

    ePWM[模块]->TBPHS.bit.TBPHS =__DIVf32 (PWM_CLOCK,(Freq*2));//(相位为0)
    ePWM[模块]->TBCTL.bit.PHSEN = TB_ENABLE;//启用相位加载(0x0)

    ------------------------------------------------------------------

    使用了上述内容、因此 ePWMA 和 ePWMb 的相位差为180度。

    删除上述内容后、我进行了测试、结果相同。

    使用 Ramfunc 时、这种情况发生得不太频繁。

    因此、我尝试添加以下内容并对其进行测试、但我想询问您是否使用得当。

    优先级已按如下方式更改。

    谢谢、

    ------------------------------------------------------------------

    #define INT1PL 2 //组1中断(PIEIER1)// XINT1、XINT2、TIMER0
    #define INT2PL 1 //组2中断(PIEIER2)// EPWM_TZ
    #define INT3PL 3 //组3中断(PIEIER3)// PWM
    #define INT4PL 4 //组4中断(PIEIER4)// ECAP
    #define INTTPL 0 //组5中断(PIEIER5)// eQEP
    #define INT6PL 0 //组6中断(PIEIER6)// SPI
    #define INT7PL 0 //组7中断(PIEIER6)// DMA
    #define INT8PL 0 //组8中断(PIEIER6)// I2C
    #define INT9PL 5 //组9中断(PIEIER9)// SCI/CAN
    #define INT10PL 0 //组10中断(PIEIER6)// ADC_EVT
    #define INT11PL 0 //组11中断(PIEIER6)// CLA
    #define INT12PL 0 //组12中断(PIEIER6)//
    #define INT13PL 6 // INT13 (TINT1)// Timer1
    #define INT14PL 7 // INT14 (TINT2)// TIMER2
    #define INT15PL 4 //数据记录//
    #define INT16PL 4 // RTOSINT //

    _interrupt void epwm1_ISR (void)

    // time_check_high;
    ///----------------------------------------------
    //设置中断优先级:
    ///----------------------------------------------
    易失性 uint16 TempPIEIER = PieCtrlRegs.PIEIER3.all;
    IER |= M_INT3;
    IER &= MINT3;//设置"全局"优先级
    PieCtrlRegs.PIEIER3.ALL &= MG3_1;//设置“组”优先级
    PieCtrlRegs.PIEACK.ALL = 0xFFFF;//启用 PIE 中断
    _asm (" NOP");
    EINT;

    *

    *

    Dint;
    EPwm1Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEIER3.ALL = TempPIEIER;

    _interrupt void CPU_Timer1_ISR (void)

    ///----------------------------------------------
    //设置中断优先级:
    ///----------------------------------------------
    IER &= MINT13;//设置"全局"优先级
    EINT;

    *

    *

    Dint;

    _interrupt void CPU_timer2_ISR (void)

    ///----------------------------------------------
    //设置中断优先级:
    ///----------------------------------------------
    IER &= MINT14;//设置"全局"优先级
    EINT;

    *

    *

    Dint;

    ------------------------------------------------------------------

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

    您好、Park、

    我可能需要咨询我们的 PIE 专家、以确定问题的可能原因。 我将在明天早上回到您的家。

    -Luke

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

    您好、Park、

    您的应用中是否有任何在运行时更新 ePWM 配置的实例、例如更新 CMPA 或 PRD 值? 在这些情况下、您是否正在使用影子加载或活动加载?

    我注意到、在您的100%占空比出现后、占空比在该周期之后为0。 是否有将 CMPA 值 设置为0或 PRD 的情况? 这可能会导致错过 CMPA 递增计数事件、具体取决于您的配置。

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

    您好、Luke、

    在运行时更新 CMPA 值。

    并且 SHDWAMODE 被启用。

    CMPA 值可能为0、具体取决于 PWM 开关方案。

    下面是 PWM 输出程序。

    如果可能导致问题、我应该使用其他方法吗?

    void FX_INV_PWM (void)

    如果(PWM_L1 > 0)

    EPwm6Regs.CMPA.bit.CMPA = 0;
    EPwm5Regs.CMPA.bit.CMPA = PWM_L1

    其他

    EPwm5Regs.CMPA.bit.CMPA = 0;
    EPwm6Regs.CMPA.bit.CMPA =-PWM_L1

    如果(PWM_L2 >0)

    EPwm4Regs.CMPA.bit.CMPA = 0;
    EPwm3Regs.CMPA.bit.CMPA = PWM_L2

    其他

    EPwm3Regs.CMPA.bit.CMPA = 0;
    EPwm4Regs.CMPA.bit.CMPA =-PWM_L2

    如果(PWM_L3 > 0)

    EPwm2Regs.CMPA.bit.CMPA = 0;
    EPwm1Regs.CMPA.bit.CMPA = PWM_L3

    其他

    EPwm1Regs.CMPA.bit.CMPA = 0;
    EPwm2Regs.CMPA.bit.CMPA =-PWM_L3

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

    嘿、Park、

    您能否尝试 更改您的 LOADAMODE 以在 CTR = PRD 上加载 CMPA、以查看此问题是否仍然存在? 我不确定这种行为是否在 TRM 中明确定义、但我相信这种行为的原因是、您在计数器等于0的同时加载 CMPA 值0。 您还在 CTR = CMPA 上计数模式和下计数模式下都有一个动作限定器事件、 我必须深入探究 TRM 以确定每个事件的优先级和时序。 您的应用是否需要仅在 CTR = 0时更新 CMPA? 如果是、则 可能存在其他解决方法、例如在需要0%占空比时禁用 PWM。

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

    您好、Park、

    来自 TRM:

    "如果计数器-比较 A 寄存器(CMPA)或计数器-比较 B 寄存器(CMPB)设置为0、并且 AQCTLA 和 AQCTLB 上的动作限定符动作配置为在影子到活动加载(即、 使用 AQCTL 寄存器 LDAQAMODE 和 LDAQAMODE 位、CMPA=0和 AQCTLA 影子到活动加载到 TBCTR=0上、然后两个事件都进入争用状态、建议在 TBCTR = 0边界上使用影子到活动加载限定器输出 A/B 控制寄存器时使用非零计数器比较。"

    似乎未定义此行为、并且您有两个事件与 eachother 冲突(在 CTR = 0和 CTR = CMPA 上加载 CMPA)。