部件号:LAUNCHXL-F2.8377万S
工具/软件:Code Composer Studio
您好,
我想在每个中断期间更新TBPRD TBPRDHR CMPA CMPAHR寄存器。 但我有一个+-1周期抖动的问题。 在技术参考手册p 1744/2352中2352中我找到了
当启用高分辨率周期模式时,EPWMxSYNC脉冲将引入+/- 1 - 2
对PWM循环抖动(加载计数模式下的+/- 1循环和加减计数中的+/- 2循环)
模式)。 因此,TBCTL[SYNCOSEL]不应设置为1 (CTR =0为
EPWMxSYNCO源)或2 (CTR = CMBB为EPWMxSYNCO源)。 否则,抖动
将在同步脉冲的每个PWM循环上发生。
当TBCTL[SYNCOSEL]= 0 (EPWMxSYNCI是EPWMxSYNCO源)时,是一个软件
在高分辨率初始化期间,同步脉冲只能发出一次。
如果在PWM运行时应用软件同步脉冲,则抖动将出现在上
同步脉冲时的PWM输出。
我的设置为:
//抖动 EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; //使用HRPWM的ePWM通道寄存器配置 EPwm2Regs.TBCTL.bit.PRDLD = TB_shadow; //设置阴影加载TBPRD寄存器在时基计数器为零时从阴影寄存器加载 EPwm2Regs.TBPRD =周期1; // PWM频率= 1/周期 EPwm2Regs.CMPA.bit.CMPA =周期/ 2; //初始设置占空比50 % EPwm2Regs.CMPA.bit.CMPAHR =(1 <8); //初始化HRPWM扩展 // zweiten中断生成器 EPwm2Regs.CMPB.Bit.CMPB =周期/ 20;//初始设置占空比5 % //EPwm2Regs.CMPB.all ||(1 << 8); //初始化HRPWM扩展 EPwm2Regs.TBPHS.ALL = 0; EPwm2Regs.TBCTR = 0; // Time_base计数器等于零| Zaehler auf null setzen EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //计数模式 EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; //不要从时基相寄存器(TBPHS)加载时基计数器(TBCTR)。 //抖动 //EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; //测试 //EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;//EPWMXSYNCO由TBCTL2[SYNCOSELX]|JITTERvermeidung nicht auf 1 oder 2 setzten定义 //抖动 EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; // Setzt man HSPCLKDIV CLKDIV auf Teiler 1. // Dann ist SYSCLK=TBCLK -> T_SYSCLK =T_TBCLK EPwm2Regs.TBCTL.bit.FREE_SOFT = 11; //选择ePWM的行为 //仿真事件期间的时基计数器 EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR _PRD; // UP计数模式bei CTR = PRD满载S1744参考手册 EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHAMODE; //用作双缓冲区。 所有通过CPU进行的写入都访问卷影寄存器 EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; //当TBCTR = 0 -> 10时的操作:设置:强制EPWMxA输出高 EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Setze EPWM2A bei TBCTR = CMPA auf LOW EALLOW; EPwm2Regs.HRCNFG.all = 0x0; //首先清除所有位 //EPwm2Regs.HRCNFG.bit.EDGMODE = HR_FEP; //在下降边缘上进行MEP控制 EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP; // MEP控制两条边 EPwm2Regs.HRCNFG.bit.CTLMODE = HR_CMP; // CMPDHR/TBPRDHR控制MEP //EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR归零; // CTR Zero上的影子负载 EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR PRD; //模拟zu LOADAMODE EPwm2Regs.HRCNFG.bit.AUTOCONV = 1; //启用自动转换逻辑MEP SFO EPwm2Regs.HRPCTL.bit.HRPE = 1; //打开高分辨率周期控制。 EPwm2Regs.DBCTL.bit.out模式= DB_FULL启用;//启用上升边缘延迟和下降边缘延迟 EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 10:有源高互补(AHC)。 EPWMxB反转。 EPwm2Regs.DBCTL.bit.in_mode = DBA_All; //死带输入模式控制:EPWMxA是上升和下降边缘的来源 EPwm2Regs.DBRED = EPWM2_DB; //上升边缘延迟值 EPwm2Regs.DBFED = EPWM2_DB; //下降边缘延迟值 // ADC versuch einen中断zu erzeugen adca1_ISR EPwm2Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的SOC EPwm2Regs.ETSEL.bit.SOCASEL = ET_CTRU_CMBB;//当计数器= CMBB时,选择SOC on up-count (计数器= CMBB) EPwm2Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件上生成脉冲 EPwm2Regs.ETSEL.bit.INTSEL = ET_CTRU_CMBB; EPwm2Regs.ETSEL.bit.inten = 1; //启用INT EPwm2Regs.ETPS.bit.INTPRD = ET_1st; //在第一个事件上生成INT EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; EPwm2Regs.TBCTL.bit.SWFSYNC = 1; //同步高 //解析阶段至 //开始HR期间 EDIS; }
这种抖动的原因是什么?为什么在我的示例中HRPWM_PRDUPDOWN SFO_cpu01没有抖动?
我是否应该使用向上-向下-计数模式?