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