我希望在使用向上计数模式时生成具有高分辨率占空比和周期数的 PWM。 我编写了一个简短的测试程序、代码如下。
在向上计数模式下(ZRO = OUT 高电平;CAU = OUT 低电平)、我可以使用 CMPAHR、它在占空比下工作正常。 但是、如果我在 TBPRDHR 寄存器中写入一些内容、我会得到一个周期的抖动、而不是高分辨率的类比。
在向上向下计数模式下(CAU = OUT 高电平、CAD = OUT 低电平)、我可以使用 CMPAHR 或(!) TBPRDHR 用于改变占空比和周期、一切正常。 但是、如果我使用任何其他 AQ 来更改输出、那么我也会得到抖动。 例如、我将 AQ 配置为类似(ZRO =高电平、CAU =低电平)、如(CAU =高电平、CBD =低电平)等。 只有当仅使用 CMPA 将输出更改为高/低时、我才可以使用 TBPRDHR 而不会获得抖动。
现在我的问题是、是否甚至可以将 TBPRD 与上面写的其他配置一起使用、如果是、我的错误是什么?
感谢您的帮助!
我的代码:
#include "F28x_Project.h" #include "SFO_v8.h" int MEP_ScaleFactor; volatile struct ePWM_regs * ePWM[PWM_CH]={&EPwm1Regs、&EPwm1Regs、&EPwm2Regs、&EPwm3Regs、&EPwm4Regs、&EPwm4Regs、 EPwm5Regs、&EPwm6Regs、&EPwm7Regs、&EPwm8Regs}; uint16 PRD = 9、PRDHR = 0、CMPA = 5、CMPAHR = 0、CMPB = 5、 CMPBHR = 0; void PWM_Cnfg (void); void main (void) { DINT; InitSysCtrl (); InitPieCtrl (); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EINT; ERTM; while (SFO ()=0); InitEPwmGpio(); PWM_Cnfg (); while (1) { EPwm1Regs.TBPRD = PRD; EPwm1Regs.TBPRDHR = PRDHR << 8; EPwm1Regs.CMPA.bit.CMPA = CMPA; EPwm1Regs.CMPA.bit.EPWCLPADHR =(CMPADRP.8 );EPwCMPADCMPb = EPwCMPADRP.TBR = EPwCMPb = EPwCMPADCMPb = EPwCMPb;EPwCMPADCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb;EPwCMPADCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb;EPwCMPb = EPwCMPb = EPwCMPb = EPwCMPb = EP EPwm1Regs.CMPA.bit.CMPA = CMPA; EPwm1Regs.CMPA.bit.CMPAHR =(CMPAHR << 8); EPwm1Regs.CMPB.BIPB.CMPB = CMPB; EPwm1Regs.CMPBHR = (EPwTBRCR.CTS=8) ;EPwmRtb.CTS=EPwTBR0.TBR0.Tb.Tb.Tb.Tb.Tb.Tb.TbRtb = EPwTb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tb.Tbrs = EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;EPwm1Regs.TBCTL.TBIT.CLKDIV = 0xWCTL.TCC_FREE = TAM_TON.TL.TL.TBIT.TL.BIT.TL.TCMTL.TL.BIT.TL.BIT_TL.TCMTL.TL.BIT.TL.BIT.TL.BIT_TR_TL. EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE; EPwm1Regs.CMPCTL.bit.SHADCMODE = CC_AQ; EPwm1Regs.AQCTLA.bit.EPWM1RC.EPCTLA.SET = EPwBAD.CHOQMODE;EPw_CARO.OQW1Regs.AM.BIT.OQ_SET EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; EPwm1Regs.AQCTLB.BIT.PRD = AQ_CLEAR; EPwm1Regs.HRCNFG.ALL = 0x0; EPwm1Regs.HRCNFG.bit.EDGMODE=HR_RPM1.RPM_RPM_RPM_RPM_RPRD;EP_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPRD.E=RPM_RPM_RPM_RPM_RPM_RPM_RUN.HR.HR_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RPM_RUN.PRD = 0_RPM_RPM_RPM_HR.HR.HR.PRD;EP_HR_RPM_RPM_HR EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1; EPwm1Regs.HRPCTL.bit.HRPE = 1; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;EPwm1Regs.TBSW1NC.TBIN.TBIN.THRCLKSYNC= 1;EPw0.TBIN.THRFCR.TBIN.TBIN.TBIN.THRCMOSR = 1; EDIS; }