根据规范、 来自 XBAR 输出以同步其他 MCU PWM 的 SYNCOUT 脉冲为20nSec (四个时钟周期)。 但是、是否可以增加中的脉冲? 20ns 是将信号从一个 MCU 发送到另一个 MCU 的极短持续时间、无需非常精确 的硬件电路。
如果我能够增加 XBARSYNCOUT 的脉冲宽度、我的问题可能会得到解决。
如果 有人对此有解决方案、我们将不胜感激。 如果有任何参考 、请 提供链接。
奥什托什
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.
根据规范、 来自 XBAR 输出以同步其他 MCU PWM 的 SYNCOUT 脉冲为20nSec (四个时钟周期)。 但是、是否可以增加中的脉冲? 20ns 是将信号从一个 MCU 发送到另一个 MCU 的极短持续时间、无需非常精确 的硬件电路。
如果我能够增加 XBARSYNCOUT 的脉冲宽度、我的问题可能会得到解决。
如果 有人对此有解决方案、我们将不胜感激。 如果有任何参考 、请 提供链接。
奥什托什
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
}
//
文件结束
//