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.

[参考译文] 示波器上未显示 ePWM 输出/缺少 SYNCOUT

Guru**** 2538955 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1132779/epwm-output-not-displaying-on-oscilloscope-missing-syncout

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

我正在尝试同步两个板、一个用作主板、另一个用作从板。下面是主板的代码、不提供 GPIO 6中的任何同步脉冲。代码中的问题是什么

主器件:

//*** ePWM 中的主代码*********

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;   

SyncSockRegs.SYNCSELECT.BIT.SYNCOUT = 0;  //EPWM1SYNCOUT

//***** GPIO *********

EALLOW;
//将 GPIO 配置为 ePWM
//PWM 1A e 1B
GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;//启用上拉电阻

GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 3;//将 GPIO6设置为 SYNCOUT

GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;//设置为输出
EDIS;

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

    您好、Jahangeer、

    我看不到您提供的代码有任何问题。

    您是否看到 EPWM1A 和 EPWM1B 的任何输出?

    此致、

    Marlyn

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

    ePWM 无输出

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

    这是 ePWM 配置

    void ConfigEPwm1 (void)//q

    EPwm1Regs.TBPRD = 5000;//设置定时器周期
    EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD >> 1;
    EPwm1Regs.TBPHS.bit.TBPHS = 0;//相位为0
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
    SyncSockRegs.SYNCSELECT.BIT.SYNCOUT = 0;//EPWM1SYNCOUT
    EPwm1Regs.TBCTR = 0x0000;//清除计数器
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上/向下计数
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//每0加载一次寄存器
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_Zero_PRD;

    EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;
    EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;//设置 EPWM1A 的操作
    EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;

    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动高电平互补
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;//启用死区模块
    EPwm1Regs.DBFED.bit.DBFED = 50;// FED = 20 TBCLK
    EPwm1Regs.DBRED.bit.DBRED = 50;//红色= 20 TBCLK


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

    Jahangeer、

    您是否 启用了 TBCLKSYNC 来启动 ePWM 模块?

    此致、

    Marlyn

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

    我已启用  

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

    您好、Jahangeer、

    我复制并粘贴了您的代码、并添加了一些内容。 我在示波器上获得了 ePWM1A 输出。

    1.在 main.c 文件中,确保在进行任何其他初始化之前声明 Device_init()。  

    我遇到了无法查看电路板上的任何 PWM 信号的问题、因为我没有声明这一点。

    在主 GPIO 配置中、我添加了以下行。

    DEVICE_INIT();// 1.

    //*** ePWM 中的主代码*********

    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

    SyncSockRegs.SYNCSELECT.BIT.SYNCOUT = 0;//EPWM1SYNCOUT

    //***** GPIO *********

    EALLOW;
    //将 GPIO 配置为 ePWM
    //PWM 1A e 1B
    GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0;//启用上拉电阻

    GpioCtrlRegs.GPAGMUX1.bit.GPIO6 = 0;// 2.

    GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 3;//将 GPIO6设置为 SYNCOUT

    GpioCtrlRegs.GPADIR.bit.GPIO6 = 1;//设置为输出
    EDIS;

    请先让我知道这是否能解决您的 EPWM1A 输出问题。  如果您仍然无法看到 ePWM 输出、能否在 C2000Ware 中运行示例并查看其是否起作用? 如果这是您的应用程序中的软件问题、这将有助于我们缩小解决范围。

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

    在代码中添加 device_init()后,我将获得此保修  
    "此声明没有存储类或类型说明符 main.c /jahangeer/src 第7行 C/C++问题"

    当我禁用外部同步时,ePWM 会发出脉冲,但当我需要同步时,它不会输出

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

    TExaS 给出的示例工作正常

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

    当我在主函数之外调用 Device_init()函数时,我得到同样的错误。 您的 Device_init()是否已在主函数内声明? 此外、您是否在 main.c 中包含了正确的头文件?

    #include "F28x_Project.h"
    #include "driverlib.h"
    #include "device.h"

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

     ;我是否需要为 epwm1写入 InitEPwm1Gpio(),就像为 ePWM 2和 epwm3写入一样

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

    正确、您可以参阅中的示例  /device_support/ /examples/cpu1/epwm_up_aq_cpu01. 您是否能够从输出引脚查看 SYNCOUT 信号?

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

    我能够复制您的配置并附加了生成预期输出的代码。  

    标准:

    -来自100MHz 时基时钟的50%占空比对称 PWM、具有10kHz PWM 信号

    - 500 ns 的死区延迟

    下面是示波器的屏幕截图。

    //
    // Included Files
    //
    #include "F28x_Project.h"
    #include "driverlib.h"
    #include "device.h"
    
    void init_GPIO(void);
    void ConfigEPwm1(void);
    void init_device(void);
    
    
    
    void ConfigEPwm1(void)//q
    {
        // Time Base config
        EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
        EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // Scale time base clock relative to ePWM clock (TBCLK), TBCLK = 1/(100MHz) = 10 ns
        EPwm1Regs.TBPRD = 5000; // Set timer period, Freq. of pwm = 10kHz (Configure TBCTR freq or period)
        EPwm1Regs.TBPHS.bit.TBPHS = 0; // Phase is 0
        EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Set the mode for time base counter: Count up/down
        EPwm1Regs.TBCTR = 0x0000; // Clear counter
        EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
        EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // Sync output select
        SyncSocRegs.SYNCSELECT.bit.SYNCOUT = 0; //EPWM1SYNCOUT specify source for sync output of ePWM module (SYNCOUT from figure 15-7 TRM)
    
        // Counter Compare
        EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // Load registers every ZERO
        EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO_PRD;
        EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // Load registers every ZERO
        EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO_PRD;
        EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD >> 1; // 2500
    
        // Action Qualifier sets epwm1a 1b outputs
        EPwm1Regs.AQCTLA.bit.PRD = AQ_NO_ACTION;
        EPwm1Regs.AQCTLA.bit.ZRO = AQ_NO_ACTION;
        EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // set off on up count
        EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // set on down count
        // Deadband module
        EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // Active Hi complementary
        EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // enable Dead-band module
        EPwm1Regs.DBFED.bit.DBFED = 50; // FED = 20 TBCLKs || 50*10 = 500 ns delay
        EPwm1Regs.DBRED.bit.DBRED = 50; // RED = 20 TBCLKs || 50*10 = 500 ns delay
    
    }
    
    void init_GPIO(void){
        EALLOW;
        // EPWM SYNCOUT signal
        GpioCtrlRegs.GPAPUD.bit.GPIO6 = 0; // pull up enabled
        GpioCtrlRegs.GPAGMUX1.bit.GPIO6 = 0; // configured mux peripheral group
        GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 3; // configured mux peripheral
        GpioCtrlRegs.GPADIR.bit.GPIO6 = 1; // configured output of SYNCOUT
    
        // EPWM1A output from GPIO0
        GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // pull up enabled
        GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0; // configured mux peripheral group
        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // configured mux peripheral
        GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // configured output of EPWM1A
    
        // EPWM1B output from GPIO1
        GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0; // pull up enabled
        GpioCtrlRegs.GPAGMUX1.bit.GPIO1 = 0; // configured mux peripheral group
        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // configured mux peripheral
        GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; // configured output of EPWM1A
    
        EDIS;
    }
    void main(void)
    {
        Device_init();
    
        init_GPIO();
    
        ConfigEPwm1();
    
        while(1);
    }
    

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

    现在输出是否只需将 GPIO6引脚连接到另一个使用以下代码的板上

    从属方:

    //*** ePWM 中的主代码*********

    EPwm4Regs.TBSTS.bit.SYNCI = 1;

    EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;  

    SyncSockRegs.SYNCSELECT.BIT.EPWM4SYNCIN = 5;  // SYNCIN 源:EXTSYNCIN1

    EPwm4Regs.TBCTL.bit.PHSEN = TB_ENABLE;

    EPwm4Regs.TBPHS.bit.TBPHS = 1;

    //********* GPIO *********

    InputXbarRegs.INPUT5SELECT = 0x15; //将 INPUT5连接到 GPIO15

    GpioCtrlRegs.GPAPUD.bit.GPIO15 = 0; //启用 上拉 电阻

    GpioCtrlRegs.GPAMUX1.bit.GPIO15= 0; //设置 GPIO15

    GpioCtrlRegs.GPADIR.bit.GPIO15 = 0; //设置为输入

    ===================================================================================================

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

    Jahangeer、

    我很高兴听到您有输出。 是的、您所描述的是正确的。 将 GPIO6连接到从板上的 GPIO、并使用输入 x-bar 将该 GPIO 路由到 INPUT5。  

    如果您对此还有其他疑问、请打开一个有关新问题的新 e2e 主题。

    (下面是 TMS320F2837xD 器件 TRM 的图表)  

    此致、

    Ryan Ma