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.

[参考译文] TMS320F28379D:如果我将 AQSFRC.bit.RLDSF 设置为立即、则无法强制 ePWM 上发生连续 S/W 事件

Guru**** 2609895 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1116089/tms320f28379d-cannot-force-continuous-s-w-event-on-epwm-if-i-set-aqsfrc-bit-rldcsf-to-immediate

器件型号:TMS320F28379D

您好!

我"简单地"尝试尽快将 PWM 强制为高电平或低电平(即时事件)、而无需等待 PWM 计数周期结束。

我通过以下方式初始化 ePWM:

 

void InitEPwm5(void)
{

    // Over-sampling
    //---------------------------------------------------------------------------------------

    // Setup timebase
    EPwm5Regs.TBCTL.bit.CTRMODE = 2;             // Count up/down
    EPwm5Regs.TBPRD = HALF_PERIOD;               // Set timer period
    EPwm5Regs.TBCTL.bit.PHSEN = 1;               // Enable phase loading
    EPwm5Regs.TBPHS.bit.TBPHS = HALF_PERIOD/2;   // Phase is 90deg  we might need to tweak this, but 90deg should ensure ADC sensing is 4x per PWM cycle
    EPwm5Regs.TBCTR = 0x0000;                    // Clear counter

    // Set TBCLK = EPWMCLK = 100MHz
    EPwm5Regs.TBCTL.bit.HSPCLKDIV = 0;           // Clock ratio to SYSCLKOUT
    EPwm5Regs.TBCTL.bit.CLKDIV = 0;              //
    //EPwm3Regs.TBCTL.bit.SYNCOSEL = 1;          // SYNC output on CTR = 0
    EPwm5Regs.TBCTL.bit.SYNCOSEL = 0;            // SYNCthrough


    // Set up ADC trigger pulse to ADC SOC A & B
    EPwm5Regs.ETSEL.bit.SOCAEN   = 0;            // Disable SOCA on A group
    EPwm5Regs.ETSEL.bit.SOCBEN   = 0;            // Disable SOCB on A group
    EPwm5Regs.ETSEL.bit.SOCASEL  = 2;            // Select SOCA on period match
    EPwm5Regs.ETSEL.bit.SOCBSEL  = 1;            // Select SOCB on counter = 0
    EPwm5Regs.ETSEL.bit.SOCAEN = 1;              // Enable SOCA
    EPwm5Regs.ETSEL.bit.SOCBEN = 1;              // Enable SOCB
    EPwm5Regs.ETPS.bit.SOCAPRD = 1;              // Generate pulse on 1st event
    EPwm5Regs.ETPS.bit.SOCBPRD = 1;              // Generate pulse on 1st event

    //---------------------------------------------------------------------------------------

    // Input control (managing switching of circuit breakers)
    //---------------------------------------------------------------------------------------

    // According to Steve we go along the following lines:
    // - no EPWM triggering from the compares
    // - EPwm5Regs.CMPA.but.CMPA or B can be any value as it will be ignored
    // - AQCTLA CAU, CAD etc by default are zero (do nothing)
    // - We do want to impose any deatime between PWM5A and B
    // - PWMA = +ve breaker PWMB = -ve breaker

    //how to force the outputs:
    EPwm5Regs.AQSFRC.bit.RLDCSF = 3;    // A software force event in AQSFRC is loaded immediately
    EPwm5Regs.AQCSFRC.bit.CSFA = 01;    // we can use this in code to force A output,00 = forcing is disabled,01=low 10 = high
    EPwm5Regs.AQCSFRC.bit.CSFB = 01;    // we can use this in code to force B output,00 = forcing is disabled, 01=low 10 = high
    
    }

但是、当我实际执行我的代码时:

EPwm5Regs.AQCSFRC.bit.CSFA = 10;    //Brk+ on
EPwm5Regs.AQCSFRC.bit.CSFB = 10;    //Brk- on

实际上没有发生任何事情。 如果我在初始化中删除了立即强制:

EPwm5Regs.AQSFRC.bit.RLDSF= 3;

那么、只有在这种情况下、当 CSFA/B 被执行时、输出被强制为高电平。 但是、这意味着我无论如何都要等到 PWM 的计数结束、并且不会立即连续施加!

您对我是否遗漏了什么有什么建议吗?

非常感谢、

Nicola

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

    我猜"CCSFA = 10"您是指 "CCSFA = 10b"还是"CCSFA = 2"?

    我将您的代码复制并粘贴到项目中、然后尝试执行该操作。 这似乎对我很有效。 我在1和2之间切换了 CSFA、可以看到它在我的示波器上切换。 也许我会误解您的问题。 您是否说过更改 CSFA 中的值不会执行任何操作、除非您将 RLDCSF 设置为0? 还是两者都起作用、但时间不对?

    惠特尼

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

    感谢您的回复、Whitney。 是的、您回答正确。 我是指您指定的内容。

    问题是另一个。 我将 TZFRC 子模块中的 OST 留在上、这会使主代码中的内容混乱。   

    谢谢、

    Nicola