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:TMS320F28377S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1213164/tms320f28377s-tms320f28377s

器件型号:TMS320F28377S
主题中讨论的其他器件:C2000WARE

您好!  

我的问题分两部分:

编号1: 我有8小时 ePWM 来控制一个转换器。 它们都具有相同的频率和占空比、但存在不同的相移。 我还需要一个 PWM (称为 ePWM 9A)才能以100%占空比运行。 正常 PWM 10 - 16中的任何一个都可以提供技术的1786页的100%占空比。 参考 Manual 表示其受占空比限制(12.5%- 87.5%)?

编号2:如果编号1可行、如何将 ePWM9A 配置为100%占空比运行、已将前八个 PWM (HR ePWM)配置为50%占空比运行?

编号3:我需要在满足特定条件时打开 ePWM 9A。  我在这方面不是野蛮的(对不起),但我将用下面的类比解释这一点

    如果(A >B){

            不要打开 ePWM 9A           

            所有8小时 ePWM 都在 旋转

          }

     否则{

            打开 ePWM 9A;

            所有8个 ePWM 仍在切换;

         {

那么、如何禁用和启用 ePWM 9A?  

以下内容看起来像是之前已回答的问题的解决方案:

"

禁用 PWM、其中 x 是 PWM 编号

EALLOW;
epwmxRegs.TZFRC.bit.OST = 1;
EPwmxRegs.TZCTL.bit.tZA = 0x02;//表示强制低电平
EPwmxRegs.TZCTL.bit.TZB = 0x02;//用于强制低电平
EDIS;

//启用 PWM,其中 x 是 PWM 编号


EALLOW;
EPwmxRegs.TZCTL.bit.OST = 0x01;//表示强制低电平
EPwmxRegs.TZCTL.bit.OST = 0x01;//用于强制低电平
EDIS;

"

但 anable 和 disable 的注释都指向强制低电平。 请告知。

此致、

Olutayo。

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

    尊敬的 Olutayo:

    注1:对于没有 HR 的 EPWM、您可以具有100%的占空比。

    NO2/3: 通过使用跳闸事件将 ePWM9A/B 的输出设置为恒定的高电平、可实现100%占空比。

    TZFRC.bit.OST 将强制发生软件跳闸事件、从而强制输出为您配置的任何 TZCTL.bit.tZA /B。 TZCTL.bit.tZA 将配置 EPWMA 输出发生的情况。 要设置输出为低电平或高电平、您可以参阅寄存器 TRM 表中的此内容

    如果  

    EPwmxRegs.TZCTL.bit.OST = 0x01;

    然后将输出设置为恒定的高电平状态。 (将 PWM 调为100%占空比)

    如果 EPwmxRegs.TZCTL.bit.OST = 0x02;

    输出保持恒定低电平  

    希望这对您有所帮助。

    Ryan Ma

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

    您好!  

    感谢您的建议。 我能够在 ePWM 1-8上实现这一点。  我当前面临的挑战是、我无法为 ePWM9 (&10)提供输出。  因此我无法测试您对  ePWM9 (&10)的建议。 我知道如果有一个输出、它会起作用。 如果我无法获得任何 PWM 输出的原因有多种、您能否帮助我查看我的已连接代码。

    我已尝试研究 TMS320F28377S 的代码示例 、还查看了数据表和 TRM。 请提供帮助。

    此致、

     // >>>>>

    #include

    空隙 InitEPwm9_PRJ1155 ( 空隙 );

    空隙 InitEPwm10_PRJ1155 ( 空隙 );

    空隙 维护1 ( 空隙 )

      {

          InitSysCtrl();                       //步骤1. 初始化系统控制:PLL、安全装置、启用外设时钟

     

          InitGpio();                          // GPIO 初始化为默认值

     

          CpuSysRegs.PCLKCR2.bit.EPWM9 = 1;    //启用 PWM9

          CpuSysRegs.PCLKCR2.bit.EPWM10 = 1;   //启用 PWM10

     

          InitEPwm9Gpio ();                     //初始化 ePWM9的 GPIO 引脚

          InitEPwm10Gpio();                    // ePWM10的 GPIO 引脚初始化

     

          dint;                                //清除所有中断并初始化 PIE 矢量表:禁用 CPU 中断

          InitPieCtrl ();                       // PIE 控制寄存器初始化为默认状态。 默认状态是禁用所有 PIE 中断并清除标志。

     

          //禁用 CPU 中断并清除所有 CPU 中断标志:

          IER = 0x0000;

          IFR = 0x0000;

     

          //使用指向 shell 中断服务例程(ISR)的指针初始化 PIE 矢量表。

          InitPieVectTable();

     

          //初始化 ePWM

          EALLOW;

          CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;

          EDIS;

     

          InitEPwm9_PRJ1155 ();

          InitEPwm10_PRJ1155 ();

     

          EALLOW;

          CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

          EDIS;

     

          //启用连接到 EPWM9-10 INT 的 CPU INT3:

          IER |= M_INT3;

     

          //在 PIE 中启用 ePWM INTn:组3中断9-10

          PieCtrlRegs.PIEIER3.bit.INTx9 = 1;

          PieCtrlRegs.PIEIER3.bit.INTx10 = 1;

     

          EINT; //启用全局中断 INTM

          ERTM; //启用全局实时中断 DBGM

     

          表示 (;;)

                    {

                        ASM (" NOP"         );

                    }

      }

     

     

     空隙 InitEPwm9_PRJ1155 ()

     

     {

     

         EPwm9Regs.TBPRD = 999;//周期= 1000 TBCLK 计数

         EPwm9Regs.TBPHS.bit.TBPHS = 0;//相位= 0/1000 * 360 = 0

         EPwm9Regs.TBCTR = 0x0000;                    //清除计数器

     

         EPwm9Regs.TBCTL.bit.CTRMODE = 2;//对称模式

         EPwm9Regs.TBCTL.bit.PHSEN = 1;//从模块

         EPwm9Regs.TBCTL.bit.PHSDIR = 1;//同步递减计数(=120)

     

         EPwm9Regs.TBCTL.bit.HSPCLKDIV = 0;      //时钟与 SYSCLKOUT 的比率

         EPwm9Regs.TBCTL.bit.CLKDIV = 0;

     

         EPwm9Regs.TBCTL.bit.PRDLD = TB_shadow;

         EPwm9Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步直通

         EPwm9Regs.CMPCTL.bit.SHDWAMODE = CC_shadow;

         EPwm9Regs.CMPCTL.bit.SHDWBMODE = CC_影子;

         EPwm9Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在 CTR=Zero 时加载

         EPwm9Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;//在 CTR=Zero 时加载

         EPwm9Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM2A 的操作

         EPwm9Regs.AQCTLA.bit.CAD = AQ_CLEAR;

         EPwm9Regs.DBCTL.bit.IN_MODE = DBA_ALL;//启用死区模块

         EPwm9Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//有效高电平互补

         EPwm9Regs.DBFED.bit.DBFED = 40;//不重要、因为仅使用高侧

         EPwm9Regs.DBRED.bit.DBRED = 40;//不重要、因为仅使用高侧

         EPwm9Regs.CMPA.bit.CMPA = 540;//调整输出 EPWM9A 的占空比

         EPwm9Regs.CMPB.bit.CMPB = 500;//调整输出 EPWM9A 的占空比

         //EPwm10Regs.TZCTL.bit.tZA = TZ_FORCE_HI;        //当跳闸强制为低电平时

         // EPwm10Regs.TZCTL.bit.TZB = TZ_FORCE_HI;        //当跳闸强制为低电平时

     }

     // ePWM 模块10配置

     

     空隙 InitEPwm10_PRJ1155 ( 空隙 )

     {

          EPwm10Regs.TBPRD = 999;//周期= 1000 TBCLK 计数

          EPwm10Regs.TBPHS.bit.TBPHS = 0;//相位= 0/1000 * 360 = 0

          EPwm10Regs.TBCTR = 0x0000;                    //清除计数器

     

          EPwm10Regs.TBCTL.bit.CTRMODE = 2;//对称模式

          EPwm10Regs.TBCTL.bit.PHSEN = 1;//从模块

          EPwm10Regs.TBCTL.bit.PHSDIR = 1;//同步递减计数(=120)

     

          EPwm10Regs.TBCTL.bit.HSPCLKDIV = 0;      //时钟与 SYSCLKOUT 的比率

          EPwm10Regs.TBCTL.bit.CLKDIV = 0;

     

          EPwm10Regs.TBCTL.bit.PRDLD = TB_shadow;

          EPwm10Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步直通

          EPwm10Regs.CMPCTL.bit.SHDWAMODE = CC_影子;

          EPwm10Regs.CMPCTL.bit.SHDWBMODE = CC_影子;

          EPwm10Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在 CTR=Zero 时加载

          EPwm10Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;//在 CTR=Zero 时加载

          EPwm10Regs.AQCTLA.bit.CAU = AQ_SET;//设置 EPWM2A 的操作

          EPwm10Regs.AQCTLA.bit.CAD = AQ_CLEAR;

          EPwm10Regs.DBCTL.bit.IN_MODE = DBA_ALL;//启用死区模块

          EPwm10Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//有效高电平互补

          EPwm10Regs.DBFED.bit.DBFED = 40;//不重要、因为仅使用高侧

          EPwm10Regs.DBRED.bit.DBRED = 40;//不重要、因为仅使用高侧

          EPwm10Regs.CMPA.bit.CMPA = 540;//调整输出 EPWM9A 的占空比

          EPwm10Regs.CMPB.bit.CMPB = 500;//调整输出 EPWM9A 的占空比

          // EPwm10Regs.TZCTL.bit.tZA = TZ_FORCE_HI;        //当跳闸强制为低电平时

          // EPwm10Regs.TZCTL.bit.TZB = TZ_FORCE_HI;        //当跳闸强制为低电平时

     }

    //>>>>>

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

    在初始化中、我将设置您的 TZCTL.bit.TZA / TZB、您必须使用 EALLOW 和 EDIS 将其打包、因为它们是受保护的寄存器

    EALLOW;

     EPwm10Regs.TZCTL.bit.tZA = TZ_FORCE_HI;        //当跳闸强制为低电平时

     EPwm10Regs.TZCTL.bit.TZB = TZ_FORCE_HI;        //当跳闸强制为低电平时

    EDIS;

    然后、当您想通过软件强制输出变为高电平或低电平时、您可以对进行写入  

     epwm10Regs.TZFRC.bit.OST = 1;

    为了使输出根据其动作限定符恢复到其原始设置、您可以使用清除 OST 标志

    TZCLR[OST]=1;

    此致!

    Ryan Ma

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

    您好!

    感谢您的建议。  

    但是、该主题现在涉及到这样一个事实、即我无法获取传统的 PWM 输出。 这是您最后提出的建议吗-如果我有点困惑、很抱歉? 如果需要、我将尝试它。 否则、我需要您的建议、以便在第一个实例中获取自定义 PWM。

    此致

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

    抱歉、如果我误解了您没有在 epwm9 / 10的引脚上看到任何 PWM 输出? 您是否为这些模块正确配置了引脚?

    此致!

    Ryan Ma

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

    我已经按照配置流程完成了、并给出了我之前发送的代码、但没有输出。 如果您可以帮助查看、我们将会很高兴。

    此致。

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

    尊敬的 Olutayo:

    我还能看到您是如何配置 GPIO 的吗?

    您的 PWM 初始化看起来没有问题。  

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

    void InitEPwm9Gpio (void)

    EALLOW;

    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1;//禁用 GPIO16上的上拉电阻(EPWM9A)
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 1;//禁用 GPIO17上的上拉电阻(EPWM9B)


    GpioCtrlRegs.GPAGMUX2.bit.GPIO16 = 1;//将 GPIO16配置为 EPWM9A
    GpioCtrlRegs.GPAGMUX2.bit.GPIO17 = 1;//将 GPIO17配置为 EPWM9B

    EDIS;
    }


    void InitEPwm10Gpio (void)

    EALLOW;

    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1;//禁用 GPIO163上的上拉电阻(EPWM10A)
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 1;//禁用 GPIO164上的上拉电阻(EPWM10B)


    GpioCtrlRegs.GPAGMUX2.bit.GPIO18 = 1;//将 GPIO163配置为 EPWM10A
    GpioCtrlRegs.GPAGMUX2.bit.GPIO19 = 1;//将 GPIO164配置为 EPWM10B

    EDIS;
    }

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

    尊敬的 Olutayo:

    您可以尝试改用此器件吗?

    void InitEPwm9Gpio(void)
    {
        EALLOW;
        //
        // Disable internal pull-up for the selected output pins
        // for reduced power consumption
        // Pull-ups can be enabled or disabled by the user.
        // This will enable the pullups for the specified pins.
        // Comment out other unwanted lines.
        //
        GpioCtrlRegs.GPFPUD.bit.GPIO161 = 1;    // Disable pull-up on GPIO161 (EPWM9A)
        GpioCtrlRegs.GPFPUD.bit.GPIO162 = 1;    // Disable pull-up on GPIO162 (EPWM9B)
    
        //
        // Configure EPWM-6 pins using GPIO regs
        // This specifies which of the possible GPIO pins will be EPWM6 functional
        // pins.
        // Comment out other unwanted lines.
        //
        GpioCtrlRegs.GPFMUX1.bit.GPIO161 = 1;   // Configure GPIO161 as EPWM9A
        GpioCtrlRegs.GPFMUX1.bit.GPIO162 = 1;   // Configure GPIO162 as EPWM9B
        // GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1; // Disable pull-up on GPIO16 (EPWM9A)
        // GpioCtrlRegs.GPAPUD.bit.GPIO17 = 1; // Disable pull-up on GPIO17 (EPWM9B)
        
        
        // GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as EPWM9A
        // GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as EPWM9B
        EDIS;
    }
    
    //
    // InitEPwm10Gpio - Initialize EPWM10 GPIOs
    //
    void InitEPwm10Gpio(void)
    {
        EALLOW;
        //
        // Disable internal pull-up for the selected output pins
        // for reduced power consumption
        // Pull-ups can be enabled or disabled by the user.
        // This will enable the pullups for the specified pins.
        // Comment out other unwanted lines.
        //
        GpioCtrlRegs.GPFPUD.bit.GPIO163 = 1;    // Disable pull-up on GPIO163 (EPWM10A)
        GpioCtrlRegs.GPFPUD.bit.GPIO164 = 1;    // Disable pull-up on GPIO164 (EPWM10B)
    
        //
        // Configure EPWM-6 pins using GPIO regs
        // This specifies which of the possible GPIO pins will be EPWM6 functional
        // pins.
        // Comment out other unwanted lines.
        //
        GpioCtrlRegs.GPFMUX1.bit.GPIO163 = 1;   // Configure GPIO163 as EPWM10A
        GpioCtrlRegs.GPFMUX1.bit.GPIO164 = 1;   // Configure GPIO164 as EPWM10B
        //GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1; // Disable pull-up on GPIO163 (EPWM10A)
        //GpioCtrlRegs.GPAPUD.bit.GPIO19 = 1; // Disable pull-up on GPIO164 (EPWM10B)
    
        //GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO163 as EPWM10A
        //GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO164 as EPWM10B
        EDIS;
    }

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

    您好、Ryan、

    谢谢你的建议。

    我缺少什么吗? F28377SPTP 的 GPIO 没有 GPIOS161 - 164等数字分配、但引脚编号为161 - 164。 在任何情况下、我都分配了 引脚160、161、162、163、164 165、166、167、1、2、 4、5、6、7、18、 19  (对应于 GPIO 0-7、10、11和12-18)到 ePWM1-8。  因此、我之前已将引脚  8、9、10、12 (对应于 GPIO 16、17、18和19)分配至 ePWM9&10。

    同样、如 TRM 中所示、MUX1和 MUX2 分别用于(GPIO0至15)和(GPIO16至31)。  如果我的分析有误、请更正我。

    此致

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

    尊敬的 Olutayo:

    我还参考了我们的 C2000WARE SDK 中的一个示例、该示例展示如何为 pwm1-12设置 GPIO。

    MUX1表示 GPIO0-15、MUX2为 GPIO 16-31。 没错。

    组字母对应于 GPIO。

    MUX1和 MUX2会将这些组拆分为上半部分 MUX1和下半部分 MUX2 (如果该端口总共有32个 GPIO)。 这就是您看到 GPIO161情况的原因:

    GpioCtrlRegs.GPFMUX1.bit.GPIO161 = 1;

                  ^--"F"表示端口 F,我可以选择 GPIO160-168

    但是、您现在必须考虑 GPIO 的两种配置、因为您使用的是不同的外设组。

    由于您希望使用 GPIO 16、因此它属于端口 A (GPIO0-31)。

    由于我们要使用外设 EPWM9A (O)、这属于 外设组 GPIOz 行的01b 不在组00b 中

    然后您可以配置哪些 外设 从该组中选择所需的所有列。

    因此、在 bitfield 中、当需要 PWM 外设输出时、从此引脚获得输出的正确方法是:

         GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1;    // Disable pull-up on GPIO16 (EPWM9A)
        GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1;    // Disable pull-up on GPIO16 (EPWM9B)
        GpioCtrlRegs.GPAGMUX2.bit.GPIO16 = 0x1; // configure the peripheral group (01b)
        GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0x1; // configure the peripheral (01) (EPWM9A)
        GpioCtrlRegs.GPAGMUX2.bit.GPIO17 = 0x1; 
        GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0x1;

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

    您好、Ryan、

    感谢您的建议。

    这是初始配置、从中没有获得任何输出。 查看我们之前的对话或查看以下对话的热门内容:

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

    尊敬的 Olutayo:

    是的、您答对了、但之后还需要此行。

    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0x1;//配置外设(01)(EPWM9A)

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

    您好、Ryan、

    您是说我应该重复该行吗? 您是否观察到以下屏幕截图中突出显示的线条?

    如果需要包含、请告知我。

    此致

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

    尊敬的 Olutayo:

    是的、您需要包括这两行。 请注意、这些线是不同的。 一个用于配置外设组、另一个用于配置该组中的哪个外设。

    GpioCtrlRegs.GPAGMUX2.bit.GPIO16 = 0x1;//配置外设组(01b)

    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0x1;//配置外设(01)(EPWM9A)

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

    谢谢 Ryan。 ePWM9B 现在有输出、但9B 没有输出。  

    中断可以是原因吗? 我可以检查中断是否设置正确:

    IER |= M_INT3;

    //在 PIE 中启用 ePWM INTn:组3中断9-10

    PieCtrlRegs.PIEIER3.bit.INTx9 = 1;
    PieCtrlRegs.PIEIER3.bit.INTx10 = 1;

    EINT;//启用全局中断 INTM

    ERTM;//启用全局实时中断 DBGM。

    请您在此处向我发送参考资料:  

    此致

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

    中断不应是 GPIO/ePWM 初始化的原因。 中断初始化看上去一切正常。

    我为您展示了 EPWM9A/9B、它对于10A/B 也是类似的

    以下是此处的示例、我推荐您参考: C:\ti\c2000\C2000Ware_4_03_00\device_support\f2837xs+ examples\cpu\ePWM_up_AQ

    此致!

    Ryan Ma