请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F28027 主题中讨论的其他器件:C2000WARE
您好!
在°500kHz 的 PWM 运行情况下、我可以在同步链中的两个 PWM 信号之间实现的最佳相移粒度为3 μ V (SYSCLKOUT=60MHz)。 对于我的应用、我需要更好的相移粒度、但在使相移操作与高分辨率 PWM 配合使用时遇到了困难。
下面显示了我的相关代码。 有人能帮我实现 HRPWM 相移和/或向我解释为什么该代码不起作用吗?
EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0; EDIS; //配置 ePWM1 uint16周期= 120; // 60MHz/120 = 500kHz EPwm1Regs.TBPRD =周期-1; // PWM 频率= 1/周期 EPwm1Regs.CMPA.half.CMPA =周期/2; //初始设置占空比50% EPwm1Regs.CMPA.half.CMPAHR =(0 << 8); //初始化 HRPWM 扩展 EPwm1Regs.TBPHS.Half.TBPHS = 0; //将粗相初始化为0 EPwm1Regs.TBCTR = 0; EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //向上计数模式 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // EPwm1是主设备 EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //设置立即加载 EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // ePWM1上的高/低行为 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; EALLOW; EPwm1Regs.HRCNFG.ALL = 0x0; EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; // HR_CTR_zero_PRD;// CTR = 0且 CTR = TBPRD 上的负载 EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; //为 HR 周期启用自动转换 EPwm1Regs.HRCNFG.bit.EDGMODE = HR_BEP; //两个边沿上的 MEP 控制 EPwm1Regs.HRCNFG.bit.CTLMODE = HR_PHS; //选择控制 MEP 的寄存器(CMP/TBPRD 或 TBPHS): EPwm1Regs.HRPCTL.bit.TBPHSHRLOADE = 1; //此位允许您在发生 SYNCIN 事件时将 ePWM 模块与高分辨率相位同步 EPwm1Regs.TBCTL.bit.PHSDIR = 1; //在同步事件后递增计数、并加载相位的新值(TBPHS)。 EPwm1Regs.HRPCTL.bit.HRPE = 1; //启用高分辨率周期控制。 EDIS; //配置 ePWM2 EPwm2Regs.TBPRD =周期-1; // PWM 频率= 1/周期 EPwm2Regs.CMPA.half.CMPA =周期/2; //初始设置占空比50% EPwm2Regs.CMPA.half.CMPAHR =(0 << 8); //初始化 HRPWM 扩展 EPwm2Regs.TBPHS.Half.TBPHS = 0; EPwm2Regs.TBCTR = 0; EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; //设置立即加载 EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // EPwm2是从设备 EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; EALLOW; EPwm2Regs.HRCNFG.ALL = 0x0; EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; //HR_CTR_zero_PRD;// CTR = 0且 CTR = TBPRD 上的负载 EPwm2Regs.HRCNFG.bit.AUTOCONV = 1; //为 HR 周期启用自动转换 EPwm2Regs.HRCNFG.bit.EDGMODE = HR_BEP; //两个边沿上的 MEP 控制 EPwm2Regs.HRCNFG.bit.CTLMODE = HR_PHS; //选择控制 MEP 的寄存器(CMP/TBPRD 或 TBPHS): EPwm2Regs.HRPCTL.bit.TBPHSHRLOADE = 1; //此位允许您在发生 SYNCIN 事件时将 ePWM 模块与高分辨率相位同步 EPwm2Regs.TBCTL.bit.PHSDIR = 1; //在同步事件后递增计数、并加载相位的新值(TBPHS)。 EPwm2Regs.HRPCTL.bit.HRPE = 1; //启用高分辨率周期控制。 EDIS; //设置 ePWM2的相位寄存器 EPwm2Regs.TBPHS.Half.TBPHS = 119; //°ePWM1 -> ePWM2的粗略相移为9°或-351 EPwm2Regs.TBPHS.Half.TBPHSHR = 100; //从 ePWM1 -> ePWM2提供任意值的精细相移 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1; EDIS;
我°此代码观察 ePWM1在 ePWM2上的领先度为9 μ s。 它的工作方式与我从未配置过任何 HR 寄存器的工作方式相同、并且只使用 TBPHS.Halt.TBPHS 进行相位加载。 从本质上讲、高分辨率似乎不起作用。
衷心感谢您的帮助。 谢谢你。
-Jeff