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:关于 XBAR SYNCOUT 信号

Guru**** 2538955 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/743013/tms320f28379d-regarding-xbar-syncout-signal

器件型号:TMS320F28379D

根据规范、  来自 XBAR 输出以同步其他 MCU PWM 的 SYNCOUT 脉冲为20nSec (四个时钟周期)。 但是、是否可以增加中的脉冲?  20ns 是将信号从一个 MCU 发送到另一个 MCU 的极短持续时间、无需非常精确 的硬件电路。  

如果我能够增加 XBARSYNCOUT 的脉冲宽度、我的问题可能会得到解决。

如果 有人对此有解决方案、我们将不胜感激。 如果有任何参考 、请 提供链接。

奥什托什

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

    我将询问这是否可行。

    NIMA Eskandari

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通过执行所有这些操作、我的最终目标是同步所有 MCU PWM。
    感谢您的支持、
    如果有其他解决方案,请提出建议...

    奥什托什
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、答案是否定的、你不能拉伸 EXTSYNCOUT 信号。

    但是、您可以做的不是在 PINMUX 上选择 EXTSYNCOUT、而是选择一个源自 EXTSYNCOUT 的 OUTPUTXBAR。
    然后在 OUTPUTXBAR 上启用锁存器、并在您感觉信号足够长时手动清除锁存器。

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

    奥什托什
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在这里、我已经启用了锁存器、但您的意思是我需要强制将锁存器放入其中吗?

    Xbar_enableOutputMux (XBAR_Output1、XBAR_MUX14);
    Xbar_setOutputLatchMode (XBAR_Output1、true);
    Xbar_setOutputMuxConfig (XBAR_Output1、XBAR_OUT_MUX14_EXTSYNCOUT);

    我完成了上述配置、仅获得20nSec 脉冲。

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

    下图显示了我共享的内容。 这应能满足您的需求。 锁存器会保留信号、直到您将其清除。

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

    e2e.ti.com/.../epwm_5F00_ex2_5F00_updown_5F00_aq.cHi

    通过使用您的上述建议、我更改了 TI C2000器件提供的代码之一。 我将向您分享我更改的波形和代码。

    首先、我找到了锁存状态、当我获得锁存状态高电平时、我将 GPIO 设为高电平、根据我的要求、我执行了脉冲下降并清除了锁存器、但在这里、我遇到了一个问题、您也可以从 CRO 波形 I 中找出这一问题 与您分享。 两个脉冲都有大约500ns 的延迟、同步另一个 MCU PWM 是否可以接受?

    但是、我的主要问题仍然没有得到解决、那就是我无法在声明转换为功率模式时同步两个 MCU PWM。 即使我通过光缆发送信号也是如此。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我会尝试这个。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉耽误你的时间、现在还在处理这个问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    明白了。 向您发送工作代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    使用 GPIO24和 GPIO0。 GPIO24是 EXTSYNCOUT。

    CTR = ZRO 时、在中断中设置变量"clearFlag"。 当需要时、主 while 环路会清除 OUTPUTXBAR 锁存器。 在本例中、我希望宽度大约为2us。

    // Nima Eskandari
    //包含的文件
    //
    #include "F28x_Project.h"
    
    //
    定义
    //
    #define EPWM1_TIMER_TBPRD 1250 //句点寄存
    
    
    器//
    //函数原型
    //
    void InitEPwm1Exampline (void);
    __interrupt epwm1_ISR (void);
    //
    
    
    
    
    
    
    
    空步骤1 / void //trand (void)/////trand 1 (void)////void / main/void / void /////void //t。 初始化系统控制:
    // PLL、看门狗、启用外设时钟
    //此示例函数位于 F2837xD_sysctrl.c 文件中。
    //
    InitSysCtrl();
    
    //
    //步骤2。 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件中,
    //说明了如何将 GPIO 设置为其默认状态。
    //
    // InitGpio ();
    
    //
    //启用 PWM1、PWM2和 PWM3
    //
    CpuSysRegs.PCLKCR2.bit.EPWM1=1;
    
    //
    对于这种情况、只需初始化 ePWM1、ePWM2、ePWM3的 GPIO 引脚
    //这些函数位于 F2837xD_ePWM.c 文件
    //
    InitEPwm1Gpio();
    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO24 = 1;//禁用 GPIO24上的上拉
    GpioCtrlRegs.GPAGMUX2.bit.GPIO24 = 0;//将 GPIO24配置为 OUTPUTXBAR1
    GpioCtrlRegs.GPAMUX2.bit.GPIO24=1;//将 GPIO24配置为 OUTPUTXBAR1
    EDIS;
    ////
    步骤3。 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;
    
    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态是禁用所有 PIE 中断并
    清除标志//。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    InitPieCtrl();
    
    //
    禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;
    
    //
    //初始化 PIE 矢量表,其中包含指向 shell 中断
    //服务例程(service routines,ISR)的指针。
    //这将填充整个表,即使在
    本示例中未使用中断//也是如此。 这对于调试很有用。
    //可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    InitPieVectTable();
    
    //
    //此示例中使用的中断被重新映射到
    这个文件中的// ISR 函数。
    //
    EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
    PieVectTable.EPWM1_INT =&epwm1_ISR;
    EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需
    
    的//
    //对于这个示例,只初始化 ePWM
    //
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
    EDIS;
    
    InitEPwm1Examples();
    
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EDIS;
    
    EALLOW;
    OutputXbarRegs.OUTPUT1MUX0TO15CFG.bit.MUX14 = 3;
    OutputXbarRegs.OUTPUT1MUXENABLE.bit.MUX14 = 1;
    OutputXbarRegs.outTPUTLATCHENABLE.bit.Output1 = 1;
    EDIS;
    
    ////
    步骤4。 用户特定代码、启用中断:
    //
    
    
    ////启用连接到 EPWM1-3 INT 的 CPU INT3:
    //
    IER |= M_INT3;
    
    //
    //在 PIE 中启用 ePWM INTn:组3中断1-3
    //
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    
    //
    启用全局中断和更高优先级的实时调试事件:
    //
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM
    
    //
    //步骤5。 空闲循环。 只需坐下来循环(可选):
    //
    for (;;)
    {
    ASM (" NOP");
    如果(clearFlag = 1)
    {
    DELAY_US (2);
    OutputXbarRegs.OUTPUTLATCHCLR.bit.Output1 = 1;
    clearFlag = 0;
    }
    }
    }//
    
    
    // epwm1_ISR - EPWM1 ISR
    //
    __interrupt void epwm1_ISR (void)
    {
    
    clearFlag = 1;
    
    //
    //清除此计时器的 INT 标志
    //
    EPwm1Regs.ETCLR.bit.INT = 1;
    
    //
    //确认此中断以接收来自组3的更多中断
    //
    PieCtrlRegs.PIEACK.all = PIEACK_Group3;
    
    
    }
    
    //
    InitEPwm1Example -初始化 EPWM1配置
    //
    空 InitEPwm1Examples()
    {
    //
    //设置 TBCLK
    //
    EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD; //设置计时器周期801 TBCLK
    EPwm1Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0
    EPwm1Regs.TBCTR = 0x0000; //清除计数器
    
    //
    //设置比较值
    //
    EPwm1Regs.CMPA.bit.CMPA = EPWM1_TIMER_TBPRD/2;//设置比较值
    EPwm1Regs.CMPB.bit.CMPB = EPWM1_TIMER_TBPRD/2;//设置比较 B 值
    
    //
    //设置计数器模式
    //
    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_SHADOW;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
    
    //
    //设置操作
    //
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //在事件 A 上设置 PWM1A、向上
    //计数
    EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR; //在事件 A 上清除 PWM1A、
    //倒计数
    
    EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; //在事件 A 上设置 PWM1A、向上
    //计数
    EPwm1Regs.AQCTLB.bit.PRD = AQ_CLEAR; //在事件 A 上清除 PWM1A、
    //倒计数
    
    //
    //中断,我们将在其中更改比较值
    //
    EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择“零时 INT”事件
    EPwm1Regs.ETSEL.bit.INTEN = 1; //启用 INT
    EPwm1Regs.ETPS.bit.INTPRD = et_1st; //在第3个事件上生成 INT
    
    }
    
    //
    文件结束
    //