This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
您好!
我将 ECAP 用作 PWM 信号。 以下是我的测试的详细信息:
当我通过 ePWM1的 CTR_EQ_ZERO 使 ECAP1与 ePWM1同步并且 ECAP1的相位为0或接近0时、我的问题就会开始。 eCAP 驱动程序的中断会发生、因此 CAP4的影子寄存器不会写入 CAP2、因为 CTR=PRD 永远不会发生! 如果我不能同步、则输入两个选项时不会出现任何问题、并且正确写入占空比值。 由于应用要求、我需要 ePWM 与 eCAP 同步、有任何解决方案可确保 ECAP 的 PRD=CTR、以便正确加载 CAP4的值? 或者是否可以在同步时刻更新 CAP2值? 因为在 eCAP 的参考指南中、他们说 CAP4和 CAP3在 PRD=CTR 时加载到 CAP1和 CAP2中。
在这里、代码使用的定义与 eCAP 参考指南中使用的定义相同:
======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== INTERRUPT void APWM_ISR1 () { _ISR_COUNTER++;//如果 (_ISR_COUNTER>=150){_ISR_COUNTER=0;} GpioDataRegs.GPATOGGLE.bit.GPIO16=1、则该计数器仅用于调试模式; //确认此中断以从组4 PieCRIT.GPIOL.C=4接收更多的中断 ; 非常重要| GPIOCRIT.GPIOCRIT.BO.GPIO=1;//确认此中断以接收更多中断 ========================================================================================================================================================================================================================================================PRD,然后是 INT 标志 ECap1Regs.ECCLR.bit.INT=1,再是 INT 标志 ECap1Regs.ECCLR.bit.CTRL_EQPRD=1;//clear 标志}========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== // ePWM 中断 void ePWM_SYNC_ISR () { ECap1Regs.CAP4=_newDuty_value;//uint32变量(如果它与同步使能且 PHASE = 0时的起始值不同、则不更新该值!) 为什么? ECap1Regs.CTRPHS=_newPhase_value;//uint32变量 /*我的新占空比和相位值代码... 将占空比从0增加到1并根据 PRD 调整到 uint32值 更改相位值并根据 PRD 调整到 uint32值、因为 ECAP1始终为0! ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================确认 此中断接收来自组3 的更多中断 PieCtrlRegs.PIEACk.PIEACk.PIEACk.all |PIEACK_Group3 //main //==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== void main (void) { //Configuraton of DSP EALLOW; SysCtrlRegs.WDCR = 0x0068;//看门狗关闭 SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;// PLL SysCtrlRegs.PLLCR.BIT.DIV = 10;// 30MHz * 10 / 2 = 0x0000.SysCtrlRegs.0XCLPCP = 0x0000.SysCLP= 0x0000.SysCROP SysCLCR.all;SYSCRP.0.SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.0.SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.all SysCLP= 0x0000.SysCLP= 0x0000.SysCLP= 0x0000.SysCP. //启用 PWM 和 ECAP CLK SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//在 ePWM SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;//启用 EPWM1 SysClRegs.PCLCLK 内的 TBCLK;// 启用 TBCLKCLK = 1;启用 TCLKCLKCLK = 0;/启用 TCLKCLKCLKCLKCLK = 0;启用 TCLKCLKCLKCLKCLKCLK=0;启用 TCLKCLKCLKCLKCLKCLKCLKCLK=0;必须启用 TCLKCLKCLKCLKCLKCLKCLKCLKCLK.GPIOCLK=0;/位 //启用命令 GpioCtrlRegs.GPADIR.bit.GPIO16 = 1;// GPIOX = OUT EDIS; //配置 ePWM EALLOW 的输出; GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; GpioCtrlRegs.bit.GPIO0 = 1 ;GPO1.GPIOX=GP1/ GPIO1.GPIO1.GPIO1.GPIO1.bit.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1. GpioCtrlRegs.GPADIR.bit.GPIO5=1;// GPIOX =输出 GpioCtrlRegs.GPAMUX1.bit.GPIO10=1; GpioCtrlRegs.GPADIR.bit.GPIO10=1;// GPIOX =输出 GpioCtrlRegs.gpio11Ms/GPU1.150 ;/pio1.1Ms.gpintr.1ms/gpiox1.150 = 1;/gpio1.mpr.gp1.ms/p1.mr.gp1ms/p1.mr.gp1.mr.gp1.ms/gp1.mr.gp1.mr.gp1.mr.gp1.ms/gp1.mr.gp1.mr.gp1.ms/gp1.ms/p1.mr.gp1.ms/p1. //计数类型 EPwm1Regs.TBPHS.half.TBPHS=0;//将相位寄存器设置为零 EPwm1Regs.TBCTR=0;//清除 TB 计数 器 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_TBRDD.TBIT.TBR = 0 ;EPwm1RCTL.TBIT.TBR = 0 ;EPWCLTBIT.TBIT.TBIT.TBIT.TCMTL.TL.TBIT.TBIT.TBIT.TBIT.TCMTL.TB.TBIT.TB.TBIT.TB.TBIT.TBIT.Tb = 0 = 0 = 0;EP_TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TBIT.TCMTCMTB.TB.TBIT.TB.TB.TBIT.TBIT.TB.TB.TBIT.TB.TCMTB.TB.TBIT.TBIT.TCMTB.TB.TBIT.TBIT.TBIT.TBIT.TCM //对 CMPA EPwm1Regs.CMPCTL.bit.SHHDWBMODE 使用阴影模式= CC_SHADDADE;//对 CMPB EPwm1Regs.CMPCTL.bit.LOADAMOCompare = CC_CTR_ZERO;//对 CTR 加载= EPwm1Regs.CMPCTL.bit.LOADAMODE = CCR 0;//在 CTR 上加载= 0;//初始 CMPADR0 = 0 = 0 = CMPADCMPA.0;//非 CMPADRPM0 = 0 = 0 = 0 = 0;//初始 CMPADCMPADRCMPADRCMPADRPM0 = 0 = 0 = 0;// CTR = 0 = 0 = 0 = 0;CMPAD //开始时的 PWM 比率 //动作限定符:互补模式 EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;//通过 CMPA CAD 将 EPWMxB 从0转换为1 (AQCTLB.bit.CAU = AQ_CLEAR;//通过交叉点将 EPWM1REGS.AQCTAQACA.bit.CAU 设置为0 ( 即 EQMCLA_SET)/从0转换为1 (即 EQMCAMB) 如果 CMPB 增大、则 EPWMA 的占空比增大。 //如果死区被启用为互补高电平有效、AQCTLA 位被覆盖!!! EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;//通过 CMPB CAD (交叉)设置 EPWMxA 从1转换为0 (AQCTLA.bit.CAU = AQ_SET;//设置 EPWMxA 从0转换为1 (交叉)( 即通过 CMPB / CAU 设置) 如果 CMPB 增大、EPWMB 的占空比减小。 //死区 EPwm1Regs.DBCTL.bit.out_mode = DB_full_enable;//启用死区模块,ePWMB 的上升被延迟,ePWMA 的下降被延迟 EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//活动 HIC ,//如果启用了互补高电平! EPwm1Regs.DBFED = dt_1;// FED = XX TBCLK;1 TBCLK=SYSCLKOUT = 6.67ns; EPwm1Regs.DBRED = dt_1;// RED = XX TBCLK;299 ~ 2us //为 aPWM EALLOW 配置输出; // ECCCL1CLK = ENCLK1CLK;// ECC1CLK = ENCLK1CLK = ENCLK = CLKCLK;// ECLK = ENCLKCLKCLKCLKCLKCLK1CLK = ENCLK = CLK1CLKCLKCLK //为 ECAP2 SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK 启用 CLK = 1;//为 ECAP3 SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;//为 ECAPSysCtrlRegs.PCLKCRs.PCLKCR1.bit.ECAP4ENCLK 启用 CLK = 1;// 为 ECAP1.GPIOCLK = 1。 // GPIOX =输出 GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 1; GpioCtrlRegs.GPADIR.bit.GPIO25 = 1;// GPIOX=输出 GpioRegs.GPBMUX2.bit.GPIOX2= 1; GpioCtrl.GPIOX=GPIO1.GPIO1.bit.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1.GPIO1. // GPIOX =输出 EDIS; //预设值: GpioDataRegs.gpACLEAR.bit.GPIO16=1; //定义 PWM 占空 比 EPwm1Regs.CMPB=(tsw_us*TR75)* duty1; EPwm1Regs.tb.SYNCOSEL = 0 ;/eEC_TREC_TR2.tb.eEC_EC_TREC_TR2.tb.eAC2.t_EC_EC_TREC_TREC_MOTION = 0;/eEC_EC_TREC_TREC_TREC_TREC_TRL2.t_TREC_TREC_MOTION = 0;/eEC_TREC_TREC_TREC_TREC_TRIP.EC_TRIP.EC_TREC_TREC_TRL2.t_TRIP.EC_TRIP.EC_TRIP.EC_MOTION = 0;/TRIP.EC_TRIP.EC_TRIP.EC_TRIP.EC_TRIP.EC_TRIP.EC_TRIP.EC_TRIP.ECT. //运行时钟 ECap1Regs.CAP1 = 50*150;//设置信号的周期。 //启用 ECAP 中断 DINT;//可寻 址中断 ECap1Regs.ECEINT.ALL=0;//可寻址所有中断 ECap1Regs.ECCLR.ALL=1;//清除所有标志 ECap1Regs.ECEINT.bit.CTR_EQ_PRD=1;//启用 CTR=CMP 中断 EALLOOR.INT.1R= 1;// ETR1.ETR1.ETR1.ETR1.t_INT.ETRP= 1;// ETR1.ETR1.ETR1.ETR_INT.ETR1;ENTR1.ETR1.ETR_INT.ETR1;ENTR1.ETR_INT.ETRP= 1;// ETR1.ETR1.INT.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR1.ETR //启用 INT EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在第一个事件发生时生成 INT //启用 PWM 中断 EALLOW; *(&PieVectTable.EPWM1_INT + 0)= ePWM_SYNC_ISR; EDIS; //启用连接到 EPWM1-6*的 CPU INT3;* = ePWM_SYn1|eR= ePREC1 ;//启用 eCAP1.150| eR= eMR1<= eMR1<|eIP1;/I1<= ePREC1 = eMR1<= eMR1<= eMR1<|eIP1 //设置周期值(150无预分频器) ECap1Regs.CAP2 =50*150*0.5;//设置比较值(150无预分频器) ECap1Regs.CTRPHS = 0x0;//使相位为零 //启用中断; //启用 PIE PieCtrlRegs.PIECTRL.BIT.ENPE = 0x1;启用 PIE 脉冲到所有 CPU; //在 CPU 级别 EINT 启用中断; //启用全局实时中断 DBGM ERTM; //********* //无限循环 //********* while (1) { //******** }//End Infinity Loop }//end main
尊敬的惠特尼:
我停止获取中断、但只有 eCAP1中断、ePWM1 PRD=CTR 在每个周期都正确发生。 我将尝试 澄清我要做的事情:
在更新相位或在同步时强制更新 CAP2之前、是否有任何方法等待或检查 PRD=CTR 八倍频? 还是在将 CAP4加载到 CAP2中时强制 PHASE/SYNC_SIGNAL 更新? 或者检查 CAP2是否尚未更新、因此不更新阶段?
如果 eCAP 的 CTR=PRD 之前的 EPWM 八倍周期都设置为相同的周期和相同的相位、那么为什么这两个周期都设置为零呢?
米格尔