Part Number:TMS320F28035
使用28035两路pwm1与pwm2,
增减计数模式,
AQCTLA.BIT.ZRO=AQ_set;
AQCTLA.BIT.CAU=AQ_CLEAR;
PWM1.TBCTL.BIT.PHSEN=TB_DISABLE;
PWM1.TBCTL.BIT.SYNCOSEL=TB_CTR_ZERO
PWM2.TBCTL.BIT.PHSEN=TB_ENABLE;
PWM2.TBCTL.BIT.SYNCOSEL=TB_SYNC_IN
生成的pwm1A与pwm2A不能完全同步,pwm2之后大概52ns的时间,请问是什么原因造成的,谢谢!
song wenbin:
pwm2滞后pwm1大概52ns时间
,
Green Deng:
你好,工程师将在工作时间回复你的问题。
,
Green Deng:
你好,看配置没看出来有什么问题,你可以对比一下芯片TRM中第290页的同步配置example“Example 3-9. Code Snippet for Configuration in Figure 3-56”,看一下有什么不同的地方:www.ti.com.cn/…/sprui10.pdf
,
song wenbin:
你好,就是参考上面的设计例程,包括controlsuilt里的例程。发出来的波形不是完全对齐的。是不是在经过这几个寄存器配置后有延时呢。用的是外部有源晶振。从DSP出来经过一个74HC245就没有其他电路了。你能测试出这个现象吗?下面是配置代码。
EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS;
//PWM增计数模式
(*ePWM[1]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //TB_COUNT_UPDOWN; (*ePWM[1]).TBCTL.bit.PRDLD = TB_SHADOW; (*ePWM[1]).TBCTL.bit.PHSEN = TB_DISABLE; (*ePWM[1]).TBCTL.bit.SYNCOSEL = 1; (*ePWM[1]).TBCTL.bit.HSPCLKDIV = TB_DIV1; (*ePWM[1]).TBCTL.bit.CLKDIV = TB_DIV1;
(*ePWM[1]).TBPRD = period/2; (*ePWM[1]).CMPA.half.CMPA = 16; (*ePWM[1]).CMPA.half.CMPAHR = 0; (*ePWM[1]).CMPB = period/2-16; (*ePWM[1]).TBPHS.all = 0; (*ePWM[1]).TBCTR = 0; (*ePWM[1]).DBFED = 0; (*ePWM[1]).DBRED = 0;
(*ePWM[1]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; (*ePWM[1]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; (*ePWM[1]).CMPCTL.bit.SHDWAMODE = CC_SHADOW; (*ePWM[1]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
(*ePWM[1]).AQCTLA.bit.ZRO = AQ_SET; (*ePWM[1]).AQCTLA.bit.CAU = AQ_CLEAR; (*ePWM[1]).AQCTLB.bit.CBD = AQ_CLEAR; (*ePWM[1]).AQCTLB.bit.PRD = AQ_SET;
(*ePWM[1]).DBCTL.bit.IN_MODE = 0; // (*ePWM[1]).DBCTL.bit.POLSEL = 0;// (*ePWM[1]).DBCTL.bit.OUT_MODE = 2; //
(*ePWM[1]).AQSFRC.bit.RLDCSF = 3;
//PWM2增计数模式
(*ePWM[2]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; (*ePWM[2]).TBCTL.bit.PHSEN = TB_ENABLE; (*ePWM[2]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN; (*ePWM[2]).TBCTL.bit.HSPCLKDIV = TB_DIV1; (*ePWM[2]).TBCTL.bit.CLKDIV = TB_DIV1; (*ePWM[2]).TBCTL.bit.PRDLD = TB_SHADOW; //(*ePWM[2]).TBCTL.bit.PHSDIR = TB_UP;
(*ePWM[2]).TBPRD = period/2; (*ePWM[2]).CMPA.half.CMPA = period/2; (*ePWM[2]).CMPA.half.CMPAHR = 0; (*ePWM[2]).CMPB = 0; (*ePWM[2]).TBPHS.half.TBPHS = 0; (*ePWM[2]).TBCTR = 0;
(*ePWM[2]).CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; (*ePWM[2]).CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; (*ePWM[2]).CMPCTL.bit.SHDWAMODE = CC_SHADOW; (*ePWM[2]).CMPCTL.bit.SHDWBMODE = CC_SHADOW;
(*ePWM[2]).AQCTLA.bit.ZRO = AQ_SET; (*ePWM[2]).AQCTLA.bit.CAU = AQ_CLEAR; (*ePWM[2]).AQCTLB.bit.CBD = AQ_CLEAR; (*ePWM[2]).AQCTLB.bit.PRD = AQ_SET;
(*ePWM[2]).DBCTL.bit.IN_MODE = DBA_ALL; (*ePWM[2]).DBCTL.bit.POLSEL = DB_ACTV_HIC;//DB_ACTV_HIC; (*ePWM[2]).DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //
(*ePWM[2]).DBFED = 0; (*ePWM[2]).DBRED = 0; (*ePWM[2]).AQSFRC.bit.RLDCSF = 3;
EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//必要配置结束后使能同步信号 EDIS;
,
Green Deng:
你好,确认一下你这边测试到的延迟是52ns?
根据主频60MHz算的话一个时钟周期是16.7ns,52ns应该是3个时钟周期多点,这样的话还算是正常的同步延时。
可以通过:
EPwm1Regs.TBPHS.half.TBPHS=3;
这样设置后可以补偿同步延迟的3个周期。可能在调试的时候回发现并不完全是3个周期,每个PWM都可以根据实际情况调整,因为这也会被外部电路影响.
,
song wenbin:
也就是说按照例程配置也不能完全同步,pwm1A和pwm2A的相位延时是存在的,需要靠相位寄存器修正
,
Green Deng:
是的,理论上也是这样的,因为信号是从PWM1传送到PWM2的,肯定会有一个机械延时。