您好,
我正在使用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



