#define SYSCLK 150E6 /* 150MHz */
#define TBCLK 2343750 /* 60MHz */
#define PWMCARRIER 20000 /* 20KHz */ (? : 목표 pwm 주파수?)
void InitEPwm1Module(void)
{
/* Setup TBCLK */
//PWM Counter Set
EPwm1Regs.TBPRD = (TBCLK/PWMCARRIER)-1; /* Set Timer Period */
EPwm1Regs.TBCTR = 0; /* Clear Counter */
/* Set Compare values */
EPwm1Regs.CMPA.half.CMPA = ((EPwm1Regs.TBPRD+1)>>1); /* Set Compare A value to 50% */
EPwm1Regs.CMPB = ((EPwm1Regs.TBPRD+1)>>1); /* Set Compare B value to 50% */
/* Setup counter mode */
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; /* Count Up (Asymmetric) */
EPwm1Regs.TBPHS.half.TBPHS = 0; /* Phase is 0 */
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; /* Disable phase loading */
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; /* Period Register is loaded from its shadow when CNTR=Zero */
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0x0; /* Clock ratio to SYSCLKOUT */
EPwm1Regs.TBCTL.bit.CLKDIV = 0x6; /* TBCLK = SYSCLK / (HSPCLKDIV * CLKDIV) */ //important
/* Setup shadowing */
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; /* Enable Shadowing */
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; /* Load on CNTR=Zero */
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
/* Set actions */
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; /* Set EPWM1A on CNTR=Zero */
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; /* Clear EPWM1A on event A, up count */
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
}
이전 자료와 함께 설명한다.(http://yeahhappyday.tistory.com/search/epwm)
DSP 28335의 SYSCLK는 150Mhz 이다.
TBCLK는 Time Base clock을 의미하며 pwm의 clock으로써 사용한다.
이는 SYSCLK에서 분배하여 그 값을 정하며 수식적으로는 위에 표시해 놓았듯이 TBCLK = SYSCLK / (HSPCLKDIV * CLKDIV) 이다.
관련 그림은 다음과 같다.
위 소스에서는 CLKDIV를 0x6, HSPCLKDIV를 0으로 해놓았기 때문에 TBCLK는 150Mhz/64 로 2343750hz 가 된다.
위 그림을 보면 어떻게 돌아가는지 일목요연하다.
코드에 설정해 놓은것을 분석해 놓으면
150Mhz인 SYSCLK에서 1/64를 한 값인 2343750hz를 TBCLK로 설정하였으며
이에 역수를 취한 2343750^(-1) 값은 4.26e-7인데 이는 PWM생성을 위한 카운트 주기가 된다.
TBPRD값을 2343750/20000-1을 한 값은 116인데 이는 위에 설정한 카운트 주기에 대하여 117회 카운트를 한 것을 PWM의 1주기로 잡는다는 것이다.
따라서 (4.26e-7)*117 = 0.00004992 로 약 0.05ms(20kHz) 를 pwm의 한 주기로 설정한다는 것이다.
TBCLK : 2343750hz : 4.26e-7 (sec)
TBPRD : 117 count
PWM 주기 : 4.26e-7 * 117 = 0.00004992 (sec)