TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] CCS/TMS320F2.8035万:在ePWM 2a或2b中同步后,PWM信号中的额外延迟为1 TBCLK(16.66ns)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/575658/ccs-tms320f28035-extra-delay-of-1-tbclk-16-66ns-in-pwm-signals-after-syncing-in-epwm-2a-or-2b

部件号:TMS320F2.8035万
主题:controlSUITE中讨论的其他部件

工具/软件:Code Composer Studio

参考代码

#include "DSP28x_Project.h"//设备头文件

//本文件中找到的函数的prototype语句。
void InitEPwm4n5 (void);
void InitEPwm2 (void);
void InitEPwm3 (void);
__interrupt void epwm2_isr (void);
__interrupt void epwm3_isr (void);
__interrupt void ADC_ISR(void);
void ADC_Config (void);

typedef结构

易失性结构ePWM_regs *EPwmRegHandle4;
易失性结构ePWM_regs *EPwmRegHandle5;
易失性结构ePWM_regs *EPwmRegHandle2;
易失性结构ePWM_regs *EPwmRegHandle3;
UINT16 TBPRD;
UINT16工作集;
UINT16 MAX_CMP;
UINT16 MIN_CMP;
UINT16 DB_SET;
UINT16 DELAY设置;
UINT16 EPwmTimerIntCountP;
UINT16 EPwmTimerIntCountC;
} ePWM_INFO;

void add_Miss脉冲P (ePWM_INFO_*);
void add_Miss脉冲_C (ePWM_INFO_*);


//
#define TBCLK 6万 //请勿更改
#define STEP_UP_DOWN 0 // if 0, Delay in PWM2 and PWM3 ELSE Delay in PWM1
#define FREQ 100 // kHz
#define DB 200 // ns (最好是50ns的倍数)
#define delay 200 // ns (最好是50ns的倍数)
#define pulse_Miss FREQ 100 // Miss pulse_Miss每puls_Miss频率
#define pulse_Miss 1 //要删除的脉冲数

ePWM_INFO ePWM_INFO;

UINT16环计数;
UINT16转换计数;
UINT16电压ADC;
双实电压=0;


Void主(void)

//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟

InitSysCtrl();

//步骤2. 初始化GPIO:
//此示例函数可在DSP2803x_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();//跳过此示例

//在这种情况下,只需初始化ePWM1,ePWM2,ePWM3的GPIO引脚
//这些函数位于DSP2803x_ePWM.c文件中
Initepwm2gpio();
Initepwm3gpio();
Initepwm4gpio();
Initepwm5gpio();
InitAdc();
AdcOffsetSelfCal();

//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;

//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2803x_PIECTRL.c文件中。
InitPieCtrl();

//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程可在DSP2803x_DefaultIsr.C.中找到
//此函数位于DSP2803x_PieVect.C.中
InitPieVectorTable();

EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.EPWM2_INT =&epwm2_isr;
PieVectorTable.EPWM3_INT =&epwm3/isr;
PieVectorTable.ADCINT1 =&ADC_ISR;

EDIS;//这是禁用写入EALLOW保护寄存器所必需的


//初始化所有设备外围设备:
//此示例不需要

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;

ePWM_INFO.TBPRD = TBCLK/(FREQ*2);
ePWM_INFO.DB_SET = DB*3/50;
ePWM_INFO.DELAY = DELAY *3/50;
ePWM_INFO.Duty_set = ePWM_INFO.TBPRD/2;
ePWM_INFO.MAX_CMP = ePWM_INFO.TBPRD;
ePWM_INFO.MIN_CMP = 0;

Initepwm4n5();
Initepwm2 ();
InitEPwm3();
InitAdc();
AdcOffsetSelfCal();

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;

//启用连接到EPWM1-3 INT的CPU INT3:
IER |= M_INT3;

//在PIE中启用ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx1 =1;//在饼图中启用INT 1.1
IER || M_INT1;//启用CPU中断1

//在PIE中启用ePWM INTN:组3中断1-3
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
PieCtrlRegs.PIEIER3.bit.INTx3 = 1;

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM

//配置ADC
//注:通道ADCINA1将被重复采样,以解决关于rev0硅勘误的ADC第一个样例问题

EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//ADCINT1在AdcResults锁定后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1;//已启用ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT =0;//禁用ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL =2;//设置EOC2触发ADCINT1
AdcRegs.ADCSOC0CTL.bit.CHSEL = 1;//将SOC0通道选择设置为ADCINA1 (rev0勘误工作区的伪示例)
AdcRegs.ADCSOC1CTL.bit.CHSEL = 1;//将SOC1通道选择设置为ADCINA1
AdcRegs.ADCSOC2CTL.bit.CHSEL = 2;//将SOC2信道选择设置为ADCINA2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//在EPWM1A上设置SOC0启动触发器,因为循环SOC0先转换SOC1,然后转换SOC2
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;//在EPWM1A上设置SOC1启动触发器,因为循环SOC0先转换SOC1,然后转换SOC2
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;//在EPWM1A上设置SOC2启动触发器,因为循环SOC0先转换SOC1,然后转换SOC2
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;//将SOC0 S/H窗口设置为7 ADC时钟周期,(6 ACQPS加1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;//将SOC1 S/H窗口设置为7 ADC时钟周期,(6 ACQPS加1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6;//将SOC2 S/H窗口设置为7 ADC时钟周期,(6 ACQPS加1)
EDIS;

//假定ePWM1时钟已在InitSysCtrl()中启用;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//在组上启用SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在计数增加时从CPMA中选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第一个事件上生成脉冲
EPwm1Regs.CMPA.Half.CMPA = 0x0080;// set比较值
EPwm1Regs.TBPRD = 0xFFFF;//为ePWM1设置期间
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//开始计数

//步骤6。 空闲循环。 只需坐下来永远循环(可选):
对于(;;)

LoopCount++;
_ASM (" NOP");
}
}

void InitEPwm4n5()

EPwm4Regs.TBPRD = ePWM_INFO.TBPRD;//设置计时器周期
EPwm4Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm4Regs.TBCTR = 0x0000;//清除计数器

EPwm5Regs.TBPRD = ePWM_INFO.TBPRD;//设置计时器周期
EPwm5Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm5Regs.TBCTR = 0x0000;//清除计数器

//设置TBCLK pwm4
EPwm4Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//计数
EPwm4Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相加载
//EPwm4Regs.TBCTL.bit.SYNCOSEL = TB_CTR归零;//同步下流模块
EPwm4Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm4Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_Immediate;//加载寄存器为零
EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_Immediate;

//设置TBCLK pwm5
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//计数
EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相加载
//EPwm5Regs.TBCTL.bit.PHSDIR = TB_UP;//同步时倒计时
//EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步流过
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;

EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_Immediate;//加载寄存器IMM
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_Immediate;

//安装程序与PWM4比较
IF (!STEP_UP_DOWN)

EPwm4Regs.CMPA.Half.CMPA = ePWM_info.Duty_set;//150
}
否则

EPwm4Regs.CMPA.Half.CMPA = ePWM_info.Duty_set - ePWM_info.delay_set;//138
}
//设置比较pwm5
IF (!STEP_UP_DOWN)

EPwm5Regs.CMPA.Half.CMPA = ePWM_info.Duty_set;//150
}
否则

EPwm5Regs.CMPA.Half.CMPA = ePWM_info.Duty_set + ePWM_info.delay_set;//162
}

//设置操作
EPwm5Regs.AQCTLA.bit.CAU = AQ_SET;//
EPwm5Regs.AQCTLA.bit.CAD = AQ_clear;//

EPwm4Regs.AQCTLA.bit.CAU = AQ_clear;//
EPwm4Regs.AQCTLA.bit.CAD = AQ_set;//

// Active High COMP PWM -设置死区
EPwm5Regs.DBCTL.bit.out模式= dba_enable;
EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_HI;
EPwm5Regs.DBCTL.bit.in_mode = DBA_RED_DBB_FED;
EPwm5Regs.DBRED = ePWM_INFO.DB_SET;
EPwm5Regs.DBFED = ePWM_INFO.DB_SET;

EPwm4Regs.DBCTL.bit.out模式= dba_enable;
EPwm4Regs.DBCTL.bit.POLSEL = DB_ACTV_HI;
EPwm4Regs.DBCTL.bit.in_mode = DBA_RED_DBB_FED;
EPwm4Regs.DBRED = ePWM_INFO.DB_SET;
EPwm4Regs.DBFED = ePWM_INFO.DB_SET;

ePWM_INFO.EPwmTimerIntCountP = 0;
ePWM_INFO.EPwmTimerIntCountC = 0;
ePWM_INFO.EPwmRegHandle4 =&EPwm4Regs;//将指针设置为ePWM模块
ePWM_INFO.EPwmRegHandle5 =&EPwm5Regs;//将指针设置为ePWM模块

}

void Initepwm2 ()

EPwm2Regs.TBPRD = ePWM_INFO.TBPRD;//设置计时器周期
EPwm2Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm2Regs.TBCTR = 0x0000;//清除计数器

//设置TBCLK
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相加载
//EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;//同步时倒计时
//EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步流过
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;//仅为观察范围而缓慢

EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_Immediate;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_Immediate;

//设置比较
IF (!STEP_UP_DOWN)

EPwm2Regs.CMPA.Half.CMPA = ePWM_info.Duty_set-ePWM_info.delay_set;//138
EPwm2Regs.CMBB = ePWM_info.Duty_set+ePWM_info.delay_set;//162
}
否则

EPwm2Regs.CMPA.Half.CMPA = ePWM_info.Duty_set;//150
EPwm2Regs.CMBB = ePWM_INFO.Duty_set;//150
}
//设置操作
EPwm2Regs.AQCTLA.bit.CAU = AQ_Clear;//在CAU上设置PWM2A
EPwm2Regs.AQCTLA.bit.CAD = AQ_set;//清除CAD上的PWM2A

EPwm2Regs.AQCTLB.bit.CBU = AQ_Clear;//清除CAU上的PWM2B
EPwm2Regs.AQCTLB.bit.CBD = AQ_set;//在CAD上设置PWM2B

EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//在零事件上选择INT
EPwm2Regs.ETSEL.bit.inten = 1;//启用INT
EPwm2Regs.ETPS.bit.INTPRD = ET_1ST;//在第一个事件上生成INT

//有源低互补PWM -设置死区
EPwm2Regs.DBCTL.bit.out模式= DB_FULL启用;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm2Regs.DBCTL.bit.in_mode = DBA_RED_DBB_FED;
EPwm2Regs.DBRED = ePWM_INFO.DB_SET;
EPwm2Regs.DBFED = ePWM_INFO.DB_SET;

ePWM_INFO.EPwmRegHandle2 =&EPwm2Regs;//将指针设置为ePWM模块

}

void Initepwm3()

EPwm3Regs.TBPRD = ePWM_INFO.TBPRD;//设置计时器周期
EPwm3Regs.TBPHS.Half.TBPHS = 0x0000;//相位为0
EPwm3Regs.TBCTR = 0x0000;//清除计数器

//设置TBCLK
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相加载
//EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//同步流过
//EPwm3Regs.TBCTL.bit.PHSDIR = TB_UP;//同步时倒计时
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//与SYSCLKOUT的时钟比率
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;//仅为观察范围而缓慢

EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_Immediate;
EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_Immediate;

//设置比较
IF (!STEP_UP_DOWN)

EPwm3Regs.CMPA.Half.CMPA = ePWM_info.Duty_set+ePWM_info.delay_set;//162
EPwm3Regs.CMBB = ePWM_info.Duty_set-ePWM_info.delay_set;//138
}
否则

EPwm3Regs.CMPA.Half.CMPA = ePWM_info.Duty_set;//150
EPwm3Regs.CMBB = ePWM_INFO.Duty_set;//150
}
//设置操作
EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;//在CAU上设置PWM2A
EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;//清除CAD上的PWM2A

EPwm3Regs.AQCTLB.bit.CBU = AQ_set;//清除CAU上的PWM2B
EPwm3Regs.AQCTLB.bit.CBD = AQ_Clear;//在CAD上设置PWM2B

EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;//在期间事件上选择INT
EPwm3Regs.ETSEL.bit.inten = 1;//启用INT
EPwm3Regs.ETPS.bit.INTPRD = ET_1ST;//在第一个事件上生成INT

//有源低互补PWM -设置死区
EPwm3Regs.DBCTL.bit.out模式= DB_FULL启用;
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm3Regs.DBCTL.bit.in_mode = DBA_RED_DBB_FED;
EPwm3Regs.DBRED = ePWM_INFO.DB_SET;
EPwm3Regs.DBFED = ePWM_INFO.DB_SET;

ePWM_INFO.EPwmRegHandle3 =&EPwm3Regs;//将指针设置为ePWM模块
}

__interrupt void epwm2_isr (void)

//更新CMP值
ADD_MUSE_Pulse_P (&ePWM_INFO);

//清除此计时器的INT标志
EPwm2Regs.ETCLR.bit.INT = 1;

//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
}

__interrupt void epwm3_isr (void)

//更新CMP值
ADD_MUSE_Pulse_C (&ePWM_INFO);

//清除此计时器的INT标志
EPwm3Regs.ETCLR.bit.INT = 1;

//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACG.ALL = PIEACK_Group3;
}

__interrupt void ADC_ISR(void)

VoltageADC = AdcResult.ADCRESULT1;//丢弃ADCRESULT0,作为版本0的第一个示例勘误表的变通办法的一部分
/*int i =0;
while (i < 32 && Voltage1 <= temp_table[i])

I++;
}
双精度m = 1.0 /(temp_table[I]-temp_table[I-1]);
双精度c = i - m*temp_table[i];
温度=4*(m*Voltage1 + c);*/

ADcRegs.ADCINTFLGCLL.bit.ADCINT1 =1;//清除ADCINT1标志重新初始化下一个SOC
PIECtrlRegs.PIEACK/ALL = PIEACK_Group1;//确认中断到PIE

返回;
}

Int MP = 0;
Int MC =0;
int enablep =0;
int enablec =0;
void add_Miss脉冲P (ePWM_INFO *ePWM_infoF)

IF (ePWM_infoF->EPwmTimerIntCountP == puls_mis_FREQ - puls_mes-1)

ePWM_infoF->EPwmTimerIntCountP =0;
MP=0;
enablep = 1;
//ePWM_infoF->EPwmRegHandle2->CMPA.Half.CMPA = ePWM_INFO.MIN_CMP;
ePWM_infoF->EPwmRegHandle2->CMBB = ePWM_INFO.MAX_CMP;

ePWM_infoF->EPwmRegHandle3->CMPA.Half.CMPA = ePWM_INFO.MAX_CMP;
//ePWM_infoF->EPwmRegHandle3->CMBB = ePWM_INFO.MIN_CMP;

//ePWM_infoF->EPwmRegHandle4->CMPA.Half.CMPA = ePWM_INFO.MIN_CMP;
ePWM_infoF->EPwmRegHandle5->CMPA.Half.CMPA = ePWM_INFO.MAX_CMP;

}
否则,如果(enable)

MP++;
IF (MP == pulse_piss)

enable=0;
//ePWM_infoF->EPwmRegHandle2->CMPA.Half.CMPA =(!STEP_UP_DOWN)? ePWM_info.Duty_set - ePWM_info.delay_set:ePWM_info.Duty_set;
ePWM_infoF->EPwmRegHandle2->CMBB =(!STEP_UP_DOWN )?ePWM_INFO.Duty_set + ePWM_INFO.DELAY:ePWM_INFO.Duty_set;

ePWM_infoF->EPwmRegHandle3->CMPA.Half.CMPA =(!STEP_UP_DOWN)? ePWM_info.Duty_set + ePWM_info.delay_set:ePWM_info.Duty_set;
//ePWM_infoF->EPwmRegHandle3->CMBB =(!STEP_UP_DOWN )?ePWM_INFO.Duty_set - ePWM_INFO.Delay_set : ePWM_INFO.Duty_set;

//ePWM_infoF->EPwmRegHandle4->CMPA.Half.CMPA =(!STEP_UP_DOWN)? ePWM_info.Duty_set:ePWM_info.Duty_set - ePWM_info.delay_set;
ePWM_infoF->EPwmRegHandle5->CMPA.Half.CMPA =(!STEP_UP_DOWN)? ePWM_info.Duty_set:ePWM_info.Duty_set + ePWM_info.delay_set;

}
}
否则
++ePWM_infoF->EPwmTimerIntCountP;

返回;
}

void add_Miss脉冲C (ePWM_INFO *ePWM_infoF)

IF (ePWM_infoF->EPwmTimerIntCountC == puls_mis_FREQ -pulse_miss - 1)

ePWM_infoF->EPwmTimerIntCountC =0;
MC=0;
enablec = 1;
ePWM_infoF->EPwmRegHandle2->CMPA.Half.CMPA = ePWM_INFO.MIN_CMP;
//ePWM_infoF->EPwmRegHandle2->CMBB = ePWM_INFO.MAX_CMP;

//ePWM_infoF->EPwmRegHandle3->CMPA.Half.CMPA = ePWM_INFO.MAX_CMP;
ePWM_infoF->EPwmRegHandle3->CMBB = ePWM_INFO.MIN_CMP;

ePWM_infoF->EPwmRegHandle4->CMPA.Half.CMPA = ePWM_INFO.MIN_CMP;
//ePWM_infoF->EPwmRegHandle5->CMPA.Half.CMPA = ePWM_INFO.MAX_CMP;

}
否则IF (enableec)

MC++;
IF (MC == pulse_miss)

enablec=0;
//+ePWM_infoF->EPwmTimerIntCountC;
ePWM_infoF->EPwmRegHandle2->CMPA.Half.CMPA =(!STEP_UP_DOWN)? ePWM_info.Duty_set - ePWM_info.delay_set:ePWM_info.Duty_set;
//ePWM_infoF->EPwmRegHandle2->CMBB =(!STEP_UP_DOWN )?ePWM_INFO.Duty_set + ePWM_INFO.Delay_set:ePWM_INFO.Duty_set;

//ePWM_infoF->EPwmRegHandle3->CMPA.Half.CMPA =(!STEP_UP_DOWN)? ePWM_info.Duty_set + ePWM_info.delay_set:ePWM_info.Duty_set;
ePWM_infoF->EPwmRegHandle3->CMBB =(!STEP_UP_DOWN )?ePWM_info.Duty_set - ePWM_info.Delay_set : ePWM_info.Duty_set;

ePWM_infoF->EPwmRegHandle4->CMPA.Half.CMPA =(!STEP_UP_DOWN)? ePWM_info.Duty_set:ePWM_info.Duty_set - ePWM_info.delay_set;
//ePWM_infoF->EPwmRegHandle5->CMPA.Half.CMPA =(!STEP_UP_DOWN)? ePWM_info.Duty_set:ePWM_info.Duty_set + ePWM_info.delay_set;
}
}
否则
++ePWM_infoF->EPwmTimerIntCountC;

返回;
}

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

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

    Laskshmi,

    同步ePWM 2a或2b后,您在哪里看到此额外延迟? 例如:信号周期是否增加? 更长或更短的时间/非工作时间? 还是两个ePWM之间应同步的增量?如果是,  您的预期值是多少?您看到的值是多少?

    此致,
    科迪

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


    有6个信号
    5A和4a是带死区200ns和50 % 占空比的堆肥器
    2B和2a是完成的死区200ns,占空比是这样的,2b上升边缘(RE)在5a Re的200ns之后,下降边缘(FE)在FE的5a之前为200ns。但我在2b上分别得到200ns +16.66ns和200nns - 16.66ns。同样2a和4a,但200ns是 正确。但两种情况下脉冲宽度保持相同。
    3A和3b是完成的。这里也有类似的问题。

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

    Lakshmi,

    由于您使用了controlSUITE头文件,因此我能够构建您的代码,请注意,对头文件所做的任何更改都会导致我测试的代码与您正在使用的代码之间的差异。 我看不出来你们所说的拖延。

    我验证了以下内容:

    2B -> 5a对于下降边缘和上升边缘均为200ns

    2A->5a是两个跃迁之间的400ns

    2B->2a对于两个跃迁为600ns

    3a=2b

    3b=2a

    我测量的所有数值都非常接近偶数值100。 当然,如果您测量一个信号的0 % 过渡水平和下一个信号的100 % 过渡水平,您的测量值将比预期的长。 您能否验证您的测量值是否始终测量 1.65V (50 % 到转换)下的转换之间的延迟?

    此致,
    科迪

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

    感谢您回复和运行我的代码并进行检查。 我尚未对头文件进行任何更改。
    存在问题:wrt 5a->2b,不是确切的200ns。 约185 ns RE和215 ns FE

    我正在共享此链接中的图片以供参考
    drive.google.com/open

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

    LT,

    我仍然没有看到这个问题,这可能是一个很小的代码差异,甚至是编译器设置。  您可以给我发送 您正在使用的编译器版本和优化设置吗? 其次,如果可能,请 将 您的.out文件发送给我, 然后我可以检查  是否发现硬件设置中存在与您相同的差异。

    注意: 您可以直接将.out文件附加到您的帖子中。

    此致,
    科迪

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

    Cody,

    我使用和优化设置上传了编译器版本的屏幕截图。 输出文件也位于同一文件夹中。
    drive.google.com/open

    此致,

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

    LT,

                   我目前不知道造成差异的原因,您需要在代码中对其进行调试。 但是,所需代码与编译并发送给我的.out文件之间的区别如下:

    参数         :设置良好  --设置错误

    ePWM2 CMPA :0x8A0000          --0x87万
    ePWM2 CMBB  :0xA2                   
    --0xA5
    ePWM2 DBRED :0x0C                   
    --0x18
    ePWM2 DBFED :0x0C                   
    --0x18
    ePWM5 DBRED :0x0C                   
    --0x18
    ePWM5 DBFED :0x0C                    --0x18

    注:良好的设置来自我的工作代码,“坏设置”是我运行.out文件时在寄存器中找到的设置。
    注意:我没有列出所有差异,只是列出了ePWM 2和ePWM5的相关差异。

    当我将工作代码强制为上面的“坏设置”时,我在使用您发送给我的.out时看到了相同的行为。 这至少应该告诉您在代码中要查看的内容。

     

    希望它有所帮助,
    科迪

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

    LT,

    您是否已了解导致这些小差异的原因? 如果是,请发布,以便其他人可以避免您将来的问题!

    此致,
    科迪

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

    正如您所说,我将CMP和DB寄存器值更改为。 但错误仍然存在,您可以在同一文件夹 drive.google.com/open中签出文件 。 现在延迟16.66毫秒并不是大问题。 但我不想有任何这种拖延。

    此致,