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.

[参考译文] TMS320F28335:TMS320F28335

Guru**** 2538955 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1263566/tms320f28335-tms320f28335

器件型号:TMS320F28335

大家好、是否可以通过任何方法在 PWM 死区时间期间打开/关闭 GPIO 信号? 我使用了 TI DSP 28335的 EPWM 事件触发器、但它似乎运行不正常。 你们对此有什么经验吗? 非常感谢。

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

    尊敬的 Trung:

    您何时设置事件触发器? 您能否提供有关事件 触发 ISR 何时发生以及 ISR 内容的信息?

    此致、

    艾里森

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

    当然、假设我有两个 PWM 模块:4A、B 和5A、B、以及一个 GPIO 信号、以确定两者协同工作还是一个工作。 例如、如果 GPIO 信号为低电平、则 PWM 模块4和5都工作、如果 GPIO 信号为高电平、则只有 PWM 模块4工作。  GPIO 信号基于读取的 ADC 值。

    这是 PWM4的设置、

    void PWM4_SET (void){
    // Time_Base (TB)
    EPwm4Regs.TBSTS.all = 0;
    EPwm4Regs.TBPHS.half.TBPHS = 0;
    EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;
    EPwm4Regs.TBCTR = 0;

    EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
    EPwm4Regs.TBCTL.bit.PRDLD = TB_immediate;
    EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    //EPwm1Regs.TBCTL.bit.SWFSYNC = 0;
    EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
    EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    //COMP 测试点
    EPwm4Regs.TBPRD = TBPRD;
    EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_LD_DISABLE;
    EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_LD_DISABLE;
    EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_immediate;
    EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_IMMEDIATE;
    EPwm4Regs.CMPA.half.CMPA = TBPRD/2;
    EPwm4Regs.CMPB = TBPRD;


    EPwm4Regs.AQCTLA.bit.CAU = AQ_CLEAR;
    EPwm4Regs.AQCTLA.bit.ZRO = AQ_SET;

    EPwm4Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE;
    EPwm4Regs.DBCTL.bit.POLSEL = DBA_RED_DBB_FED;
    EPwm4Regs.DBRED = TBPRD/2;
    EPwm4Regs.DBFED = TBPRD/2;

    //跳闸区域(TZ)
    EPwm4Regs.TZSEL.ALL = 1;
    EPwm4Regs.TZCTL.ALL = 0;
    EPwm4Regs.TZEINT.ALL = 0;
    EPwm4Regs.TZFLG.all = 0;
    EPwm4Regs.TZFRC.all = 0;

    EPwm4Regs.ETSEL.ALL = 0;
    EPwm4Regs.ETFLG.all = 0;
    EPwm4Regs.ETCLR.all = 0;
    EPwm4Regs.ETFRC.all = 0;

    //PWM4的 ET
    EPwm4Regs.ETSEL.bit.inten = 1;
    EPwm4Regs.ETPS.bit.INTPRD = 1;
    EPwm4Regs.ETSEL.bit.INTSEL = 1;


    EPwm4Regs.PCCTL.ALL = 0;

    这是用于打开或关闭 GPIO 信号的代码、我使用 PWM4的事件触发器来关闭 GPIO 信号。

    void Mode_SW (void){
    if (IADC > 1.66 &&操作=3){


    EPwm4Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_Group3;

    否则为(IADC < 1.59 &&操作=1){
    运行= 3;

    否则{
    运行=运行;

    这是 ET 中断子例程:

    中断失效 SW_ET_ISR (void){
    if (EPwm4Regs.ETFLG.bit.INT == 1){
    运行= 1;
    OperationGate();

    否则{
    EPwm4Regs.ETCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_Group3;

    这是我从输入滤波器获得的

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

    尊敬的 Trung:

    为什么在您的设置中、EPWM4A 上和 EPWM4B = TBPRD/2上的馈电是 RED? 然后、延迟将相互对齐、从而抵消死区时间。 要澄清一点、下图是否与您尝试生成的产品相符?

    GPIO 信号是在死区时间期间内还是在 PWM 信号的特定边沿变为低电平?

    如果您也可以在波形屏幕截图中阐明信号的名称、这将会有所帮助。

    此致、

    艾里森

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

    尊敬的 Allison:

    我的工程是使用频率控制方法来控制系统、因此我使用了 TBPRD 更新开关频率。 我有两种工作模式("1"和"3")需要根据 ADC 值"IPCA"进行切换。
    模式1 (IADC > 1.66):GPIO 26为低电平、所有 PWM 4A、4B、5A、5B 均工作。
    模式3 (IADC < 1.59):GPIO 26为高电平、PWM 4A、4B 工作、但 PWM 5A、5B 关闭。 (通过设置 DBRED 和 DBFED = TBPRD/2 +1)
    我想在 PWM 4A、4B 的死区时间周期切换模式、因此通过设置 CTRU=CMPB 使用了 PWM4的事件触发中断。

    (我的 PWM 设置用于时基计数模式)

    我的问题是 GPIO26信号在死区时间期间或 PWM 信号的特定边沿上未变为低电平。 随附的图片是 从模式3 到模式1的转换。

    此致

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

    尊敬的 Trung:  

    只是 GPIO 输出不遵循您尝试设置的内容吗? 或者 EPWM4或 EPWM5输出是否也不可取?

    此外、GPIO 切换需要与死区时间周期完全同步是否存在某种原因-是否有其他器件读取此 GPIO? 还是用于显示模式何时发生更改的调试目的? 使用 ISR 也会在事件触发器和 GPIO 切换之间引入一些预期的延迟。

    此致、

    艾里森

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

    尊敬的 Allison:

    GPIO 输出未遵循我尝试设置的内容。 我怀疑我在 ET ISR 子例程中放了如此多的内容。 GPIO 切换需要与死区时间完全同步、因为它用于控制需要在 PWM4死区时间内关断的电源开关。
    正如您提到的、"使用 ISR 也会在事件触发器和 GPIO 切换之间引入一些预期的延迟"。 是否有办法解决这个问题?
    顺便说一下、我使用 EPwmxRegs.TBPRD = TBPRD (x=4、5)来控制 EPwm4、EPwm5的频率。 如果我想在 GPIO 为高电平时关闭 EPwm5、在 GPIO 为低电平时将其重新打开。 要做到这一点、最好的方法是什么? 目前、我将 DBRED 和 DBFED 设置为大于 EPwm5的占空比的值、以关闭 EPwm5。

    此致、

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

    尊敬的 Trung:

    消除延迟的最佳方法是避免完全利用 ISR、否则这里始终会引入一些固有延迟。  

    如果要在 GPIO 切换为低电平时同步 EPWM5关闭、可以使用第三个 ePWM 模块作为 GPIO。 第三个 ePWM 可以 有一个动作限定符、它配置在您 定义"模式1"和"模式3"的同一位置。 对于模式3、您可以 将 动作限定符配置为发生在  CTR = 0时、以将 EPWM 设置 为高电平、然后对于模式1 、您可以将动作限定符配置为发生在与其他 EPWM 相同的 CMPA 上、以将其设置为低电平。 这样、您的 EPWM5和 GPIO/ePWM 模式更改将同步。 如果您有进一步的疑问、请在此处告诉我。

    此致、

    艾里森

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

    谢谢 Allison、我将尝试更新我的进度