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.

[参考译文] TMS320F2.8335万:ePWM1x和ePWM5x之间的相移-波形朝相反方向移动

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/582633/tms320f28335-phase-shift-between-epwm1x-and-epwm5x---waveform-is-moving-in-the-opposite-direction

部件号:TMS320F2.8335万

您好,

我正在使用TMS320F2.8335万 DSP来控制两个PWM模块(即ePWM1A和ePWM5A)之间的相移。 根据数据表(第28页)的理解,我设置了PWM模块,以便所有PWM模块都与ePWM1模块同步。

我注意到,移向寄存器中的值不断增加,从而移动PWM模块的波形。 但是,波形的移动方向与我实际需要的方向相反:D

特别是,增大ePWM5A的相移值会使与ePWM1A相关的波形向左移动。 换言之,TBPHS寄存器中的值不断增加,导致波形相对于固定的ePWM1A通道向左移动。 下面您将找到我的代码,我为两个不同的分段值的波形做了一些屏幕截图,以澄清我的顾虑。 我希望实现相反的行为,即TBPHS寄存器中的值增加,就ePWM1A而言,波形向右移动。

您是否知道我的误解/错误C实现在哪里? 感谢你的帮助。

#include "DSP28x_Project.h"
#include "DCL.h"


void InitialADC();
void InitePWM1();
void InitePWM2();
void InitePWM5();
void InitePWM6();
__interrupt void ADC_ISR();
__interrupt void TZ_ISR();

//闪存功能
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadEnd;
extern UINT16 RamfuncsRunStart;

UINT16 phaseshift;
UINT16 phaseshift1;
volatile Int32 dummy;

volatile UINT16 ConversionCount;
volatile fluat32 Voltage1[256];
volatile fluat32 current[256];

void main(void){//Initialize

	PLL, Watchdog,enable Peripheral Clocks
	InitSysCtrl();//

	用于对闪存进行编程
Memcopy (&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);

	// VecePWM和TZ
	InitEPwmGpio();
	InitTzGpio();

	//初始化PIE控制寄存器
	InitPievector();

	IER = 0x0000;
	IFR = 0x0000;

	//
	

	初始化Isr_Pie =表;Isr_EPTEDMI; In_EPTEPTEPTI=初始化Isr_EPTEPTEPTEPTI=
	
	
	
	

	//设置ADC采样速率
	EALLOW的第一步;
	SysCtrlRegs.HISPPP.ALL =3;// HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3)= 25.0 MHZ
	EDIS;

	//同步已在InitSysCtrl()函数中完成-->要求TI支持来验证
	SysReg1.PCW; SYLNC*
	
	= SYLLOKW.CLW; 	//从DSP
	EDIS中使用SYSCLKOUT启用时基时钟同步;
	*/

InitFlash();

	dummy = 0;

	//初始化ADC
	InitAdc();
	phaseshift1 = 4;	//补偿a ca. ePWM1和ePWM6
	InitialADC()之间的15ns延迟;		//为电压和电流测量

	EALLOW设置ADC;
	SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
	EDIS;

	InitePWM1();
	InitePWM2();
	InitePWM5();
	InitePWM6();

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

	/*
	将GPIO4设置为输出以测量ISR */
	
	EALLOW内的执行时间;
	//将GPIO10设置为GPIO -已在InitGpio()
	GpioERlRegs.GPAMUX1.bit.GPIO4 = 0中完成;
	//将GPIO10设置为输出GpioCtrlRegs.GPADIR.bit.EDI1
	
	
	
	= 1;1. 	//用于ADC
	PieCtrlRegs.PIEIER2.bit.INTx1 = 1的组1,位6;	//用于ePWM1_TZ
	IER || M_INT1的组2,位1;						//设置组1
	IER || M_INT2的中断启用位;						//设置组3
	EINT的中断启用位; 								//启用全局中断INTM

	for(;;)
	{

	}


__interrupt void ADC_ISR(void)
{

	Voltage1[ConversionCount]= AdcRegs.ADCRESULT0 >>4;	//从ADCINA5读取值
	[ConversionCount]= AdcRegs.ADCREST1 >4;	//从ADCESVm5.PESPHS



			读取= P5PESPHS.Pesfulphsb05.PESPESPESP1= PUTHs = P5PESPESPESV05.PUTHs = PUTH5.PESPESPESPESPESV0= PUTH5.PESPESPESV0= PUTHs = PUTH5.PUTH5.PESPESPES
			ePWM6的16ns延迟

	//如果记录了256个转换,请重新开始
	IF (ConversionCount == 255)
	{
	ConversionCount = 0;
	}
	否则
	{
	ConversionCount++;}
	

		//重新初始化下一个ADC
		AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;	//重置SEQ1
		AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;	//清除中断标志位
		PieCtrlRegs.PIEACK.ALL = PIEACK_GROUP1;	//中断确认PIE.CC1 = PCADR1.CADR1




	
		= 1= 1= 1CADRC.1= 1; ADC1= ADC1= ADC1= 1= ADC1= 1= ADC1= 1= ADC1= 1= 1CA.CA.CADRC1= 1= ADC1= 1= 1= 1= ADC1= 1= 1= 1= 1= ADC1= 1= 1= 1= 1= 1= 1= 1= 0
			//
	AdcRegs.ADCTRL1.bit.SEQ_CASC= 0;	//级联模式
	AdcRegs.ADCTRL1.bit.CONT_RUN = 0;	//启动-停止模式
	AdcRegs.ADCTRL3.bit.SMODE_B5 = 1;	//同步采样模式AdcRegs.ADCTRCA.ADCA_SECA.AD1
		= CONV1
		= SECA.INCA.CA.CA_ADCA.CA.CA.ADCA.CA.CA.CA.CA= SECASECA.CA.CASECA.CA.CA.CA.CA= CONV1 = CONV1 = SECADE.CA.CA.CA.CA.CA.CA.CA.CASECA.CASECA.CADE.CA.CA.CASECADE= CONV1 = CONV1 = CONV1 = CONV1 = CODE.CADE.CA.CADE.CA.CA.CADE.CA
		
		//中断请求已启用
}

void InitePWM1(void)
{//
	为ADC测量启用SOCA
EPwm1Regs.ETSEL.bit.SOCAEN = 1; 	//启用SOCA
EPwm1Regs.ETSEL.bit.SOCASEL = 4; //在50 % 占空比下生成SOCA脉冲
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //生成第一个事件的脉冲

	EPwm1Regs.TBPRD = 1499;	//将PWM周期时间
	EPwm1Regs.CMPA.Half.CMPA =(1499+1)/2;EPw1Regs.TBPHPHPHPHPHPHPHPHPHPHPHPHPS.CTMPs.TR_1Regs.s.PTB.PTB.MP_ZOP.TB_DE_ZOPTB.PTB.PTB.PTB.PTB.PE.PTB.=
	0
	= 0;TBEPMP_DE_DE_DE.PTB.PTB.PTB.PTB.PTB.PTB.PTB.PTB.PTB.PE.PTB.PE.ST_DE_DE_DE_DE.PTB.PTB.PTB.PE.PE.PE.PE.PE.PE.PTB.PE.PE.PTB.PE.PTB.PE.B=	
	
	
	0 //同步下流模块
	EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;	//将时基时钟设置为SYSCLKOUT
	EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_shadow;EPwm1Regs.CMCL=1PRD=DAMP0
	
		或PRD=1DAMP0 PRD=DAMP0 PRD=1DAMP0
	;PRD = PRD_REG=1DAMP0	
	或DAMP0 PRD = PRD = PRD = PRD = 0;0 = 0 = PRD = PRD = 0;0 = 0 = 0 = 0;0 = 0 = 0 = 0;0 = 0 = 0 = 0 = 0 = 0;0 = 0 = 0 = 0;0 = 0 = 0 = 0;0 = 0;0 = 0 = 0 = 0 = 0;0 = 0; 	//在ctr=pd
	epwm1Regs.AQCTLA.bit.CAU = AQ_clear时设置pin;	//在ctr=compa


	epwm1Regs.DBCTL.bit.in_mode = 0时清除pin;	// ePWMxA跌落和上升边缘EPwm1Regs.DBCTL.bit.ut_DB_mode.db_enable=1PEPT_rema_DE.DBwd=
		full
			

	
	


void InitePWM2 (void)
{
	EPwm2Regs.TBPRD = 1499;	//将PWM周期时间
	EPwm2Regs.CMPA.Half.CMPA =(1499+1)/2;
	EPwm2Regs.HSPSL.TBPHPHPHPHPHPHPHPHPHPHPHPHPHPHPHPHPS= 0;//零
	EPw2Regs.PTB.DR.EPS_EPm= P2PTB.PTB.MP_DE_DE.PTB.PTB.PTB.PTB.EP.ST_EPm_DE=	
	
	
	零EPm= EPm= EPMP.PTB.PTB.PTB.PTB.PT.PE.PE.PE.PTT.PE.PTB.PTB_DE= P= PE.PE.PE.PTB.PT.PT.PE.PE.PTB.PTB.PTB.PT.PTB.PTB.PTB.PT.PE.PE.PE.PE.PTB= P= P=零EPMP.PE.PE.PTB.PT.PTB.PT.PTB.PT.PE.
		//将时基时钟设置为SYSCLKOUT
	EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;
	EPwm2Regs.CMPTL.bit.SHDWBMODE = CC_SHAD影子;EPw2Regs.CMTR.CMCL=PRD=0;
		PRD=PAQPA=零
		
		
		时PRD=E=2PA= PIN= PRD.C=0;PRD= PRD=2PAQPAQ= PRD=0;EC=0时= PRD= PRD= PRD= PRD = PN.C= PRD = PREC=2PA= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P= P=

	
	EPwm2Regs.TZsel.bit.OSHT3 = 1;		//启用TZ3
	EPwm2Regs.TZCTL.bit.TZA = 2;		//清除TZ事件上的ePWM2A
	EPwm2Regs.TZCTL.Bit.TZB = 2;		//清除TZ上的ePWM2B;
	DB_RegmEPT.DB_Reg.EPT.DB_DEP=

		
		全尺寸模式;DB_DEPT.2DEPT.DB_DEPT.DB_DEPT.DB_DEPT.2=
			//有源高互补

	EPwm2Regs.DBRED = DT;
	EPwm2Regs.DBFED = DT;
}

void InitePWM5 (void)
{
	EPwm5Regs.TBPRD = 1499;//	设置PWM周期时间
	EPwm5Regs.CMPCTBPA.CMPA =(1499+1)/2;EPwtb.PTV_REG=
	0
	;EPmPS.PTV_0 =零位EPS.PTBPH_0 =零位EPS.PTBPTB_0 =零位EPS.PTBPH_0 	
	//主模块
	EPwm5Regs.TBCTL.bit.PRDLD = Tb_shadow;
	EPwm5Regs.TBCTL.bit.SYNCOSEL = Tb_ctr_zero;//同步下流模块
	EPwm5Regs.TBCTL.bit.HSDBDE PCLDPPCLKDIV = 0;	//将时基时基时钟设置为STDAMP0 = SOMP0
	;SOMP0
	
		
	= SOMP0 = SOMP0 = SOMP0 = SOMP0;SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0;SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = SOMP0 = 	//在cTR=0或cTR=PRD
	EPwm5Regs.AQCTLA.bit.ZRO = AQ_SET时设置	引脚;//在cTR=PRD
	EPwm5Regs.AQCTLA.bit.CAU = ZB_CLEAR时	清除引脚;在ctr=compa


	EALLOW时清除引脚;
	Cwm5Regs.OSTZ5.PTZI= TTE1.PTZEPT1.B/		
			
			在TDET5.ZI时清除T= T= T5PTZEZ= T= T5PTZEZEZEZ= T= T5PT5.ZEZEZ= TTEXEZEZ= T= TTEXEQ/ T5PT5.ZEZEZEZEZ= T= T= TTEXEZEZ
	


	EPwm5Regs.DBCTL.bit.in_mode = 0;	// ePWMxA跌落和上升边缘
	EPwm5Regs.DBCTL.bit.out模式= DB_FULL启用;	// DB全启用
	EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;		// DBMS.EPm1= DEP.1= DEP.1= DBw1= DBw1DEP.1= DBw1= DBw1= DBw1DEP.1= DBw1= DBw1= DBw1= DBw1= DBw1= DBw1= DBw1= DBw1= DBw1= DBw1= DBw1= DBw1= DBw1= DB1= DBw1= DB1= DB1= DB1= DB1= DBw1= DB1= DB1= DB1= DB1= DB1= DB1= DB1= DB1= DBw1=

	
	




		
	
	//将相位寄存器设置为零
	EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;	// UP计数模式
	EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE;//从模块
	EPwm6Regs.HPTTB.bit.PRDLD = TB_SHADPCWCM.PTL =
	ZADMP0
		= ZODM.MP0;SOMP0 = ZOPTL.CMSTDAMP0 = ZOPT.MP0 = ZOPT.MP0 = ZODM.CMSTDAMP0 = ZOPT.MP0 = ZOPT.MP0 = ZOPT.CMSTDAMP0 = DMP0 = DMP0 = DMP0 = DMP0
	
	
	= DMP0 = DMP0 = 0 = DCMSTMP0 	// ctr=0或ctr=pD
	EPwm6Regs.cmpctl.bit.LOADBMODE = 0;	// ctr=0或ctr=PRD
	EPwm6Regs.QCTLA.bit.ZRO = sel_clear;	//在ctr=PRD=Cwm6Regs.OSCLA.bit.PRD时清除引脚;在设置
		


	
			
	= EQT1.ZAQZWA.Z1.= Pin时清除引脚 		//在TZ事件
	上清除ePWM6A EPwm6Regs.TZCTL.bit.TZB =2;		//在TZ事件
	EDIS上清除ePWM6B;


	EPwm6Regs.DBCTL.bit.in_mode =0;	// ePWMxA下降和上升边缘DBwm6Regs.DBC.DB_REEPmDE.DB_F6DE.DB_DEP.DE_DEP.DEPfbit
		
			

	
	
=全模式DB_DE_DE.DB_DEPw_DE_DE.DBwf6DB_DB_DE_DE.DBw_DE_DE_DE_DBwf6DB_DE.DB_DE_DE.DB_DE.DB_DE.DBwf.DB_DE.DB_DE.DB_DE.DBwf.DB_DE.DB_DE_DE

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

    编辑:2017年3月22日此帖子毫无用处,可以忽略

    亚历山大

    我的第一个建议是确保100 % 确保您的示波器探测不会颠倒。

    其次,您如何更新 TBPHS? 您能否读取ePWM5 TBPHS并确保正确写入此值?

    您如何配置ePWM5的SYNCISEL?

    此致,

    科迪

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

    您好,Cody:

    感谢您的回答。 我研究了你的建议。

    1.示波器探测器不反向。 黄色波形对应于连接到UC上ePWM1A引脚的探头。 品红色波形对应于连接到UC上ePWM5A引脚的探头。 我刚刚仔细检查了配置,可以确认探头没有反转。

    2.我正在更新ADC_ISR中计算出的TBPHS值,在该处执行PI控制器以计算TBPHS值。 特别是,我正在以100kHz的速率更新我的TBPHS值。  

    3.我看不到可以主动配置/设置/清除任何PWM模块上SYNCISEL位的选项。 但是,我所做的是将ePWM1的SYNCOSEL配置为在CTR_ZERO上。 然后,将以下模块配置为SYNCOSEL = TB_SYNC_In。 这个逻辑是从这个数字上改编的,我相信这就是你问我的,对吗?:

    查看此模块的相应波形,我可以看到从设备也在主设备的时间之前,这正是我的测量结果。

    因此,我的测量结果实际上确认了图58中的原理,不是吗? TBPHS寄存器中的正值将使从属模块移至左侧。 引用您的参考:

    "图58显示了此配置的相关定时波形。 此处,主从TbPRD = 600。 对于从机,TBPHS = 200 (即200/600 X 360°= 120°)。 只要主中继器生成SyncIn脉冲(CTR = PRD),TBPHS = 200的值就会加载到从属TBCTR寄存器中,因此从属时基始终会使主中继器的时基领先120°"  

    底线是,我的测量结果与您的数据表中的原理相符,我只是一开始就有一个误解。 正确吗?

    巴西,

    亚历山大

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

    Alex,

                   我错了,我不知道我在想什么。

    设备按预期工作。 只要发生同步脉冲,PWM5就会被TBPHS中的值“高级”。 每当发生同步脉冲(ePWM1的TBCTR = 0)时,TBCTR将加载TBPHS,当然,这意味着ePWM5 (TBCTR = TBPHS在同步时)应'引导' ePWM1 (TBCTR = 0在同步时)。

    此外,我提到“EPWMxSYNCI”是“SYNCIEL”;我想我昨天已经很累了。 如果未设置TBCTL.PHSEN,则点是与ePWM模块的脉冲同步将被忽略。 您不会遇到此问题,因为您可以调整ePWM 1和ePWM5之间的相位。

     

    此致,
    科迪

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

    谢谢你,Cody。 然后我一开始就有了一个误解,再次了解了有关F2.8335万的一些新知识。

    最后一个问题是:

    如果我想要操作双向DC/DC转换器,其中相移可以是正的也可以是负的(根据电流/功率流动方向),如何将其正确地应用到移相寄存器中?

    我现在的解决方案是将正   或负值(取决于当前流量)加载到TBPHS (例如TBPHS=-50)。  

    例如:

    TBPHS = 0 ->两个PWM模块都有0相位移

    TBPHS = 50 -> ePWM5 (从属)ePWM1 (主)的前面,正如我们在本线程中讨论的那样。

    TBPHS =-50 -> ePWM5 (从属)滞后ePWM1 (主)

    该解决方案运行良好,我可以根据需要获得波形。 但是,(出于某种原因)我不希望TBPHS寄存器接受负值。 (可能是因为我的大脑仍被占空比0 % ... 100 % 所支配)。

    您能否详细说明一下,TBPHS登记簿也接受负值? 我在数据表中找不到答案。

    谢谢!

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

    亚历山大

    您可以通过仅写入正值来调整相位。 假设您使用的PWM周期为1000,50 % 占空比为。 如果您写入一个值1-499,则从属设备将会提前;如果您写入一个值501-999,则从属设备将滞后。 领导和滞后并不总是最好的思考方式,在我看来,造成信号滞后的最好方式是写(Period-PhaseShift),例如,如果你想滞后50个计数,而你的时期是1000个; 1000-50= 950将为您提供所需的结果。

    它接受负值的原因更多是一个基本带符号整数…-50的问题,因为带符号整数是(1111.1111万11001110),1100.111万,如果将该值放在“UP计数器”中,则它将计数50次,然后溢出到(0万00 00000000)0万00000),0万,从而导致滞后。

    请注意,只有当您的符号扩展扩展到或超过TBCTR长度,并且负值小于(2^n)-1 (n是TBCTR的长度,以位为单位)时,才可以写入负值。 此设备的TPCTR为16位,因此只要使用16位带符号的整数或更大的整数,就可以使用,因为负数的符号扩展。

    如果这仍然令人困惑,请查看带符号的负数如何以二进制表示,以及为什么需要符号扩展。 然后,我可以帮助您回答您可能仍然存在的一些问题。

    我希望这对我有帮助!!!  

    此致,
    科迪