主题中讨论的其他器件:C2000WARE
您好!
对于我的应用、我需要在 ePWM1A 上为两个边沿(CMP 和外设值)提供 HRPWM。
我使用以下代码执行了初始化:
void PWM_init (ePWM_DEVICE PWM、uint32_t TimerPeriod、uint32_t cmpAInit、uint32_t cmpBInit、bool SYNC)
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0U;//*在 ePWM 内禁用 TBCLK */
EDIS;
PWM->TBPRD = TimerPeriod;
PWM->CMPA.bit.CMPA = cmpAInit;/*初始时将占空比设置为小*/
PWM->CMPB.bit.CMPB = cmpBInit;/*初始时将占空比设置为小*/
PWM->TBPHS.bit.TBPHS = 0U;/*将相位寄存器设置为 PhaseShiftVal */
PWM->TBCTR = 0u;/*将计数器设置为零*/
PWM->TBCTL.bit.CTRMODE = TB_COUNT_UP;/*对称模式*/
PWM->TBCTL.bit.PHSEN = TB_ENABLE;
PWM->TBCTL.bit.PRDLD = TB_shadow;
PWM->TBCTL.bit.HSPCLKDIV = TB_DIV1;/*时钟与 SYSCLKOUT 的比率*/
PWM->TBCTL.bit.CLKDIV = TB_DIV1;/*请确保全速计数*/
PWM->CMPCTL.bit.SHDWAMODE = CC_shadow;
PWM->CMPCTL.bit.LOADAMODE = CC_CTR_PRD;/*选择了 CTR = PRD、因为此时也会加载外设*/
PWM->AQCTLA.bit.ZRO = AQ_SET;
PWM->AQCTLA.bit.CAU = AQ_CLEAR;/*如果达到 CMP 值,则清除 PWM */
PWM->EPWMSYNCINSEL.bit.SEL = 0x00;
//配置 HRPWM 寄存器
EALLOW;
PWM->HRCNFG.ALL = 0;/* ShadowImage 设置,RE 上的 MEP 控制,Autoconv 被禁用,CTR 上的负载= ZRO,HRPWM 电容器被禁用*/
PWM->HRCNFG.bit.EDGMODE = HR_BEP;/*在两个边沿上启用 MEP 控制*/
PWM->HRCNFG.bit.CTLMODE = HR_CMP;/*开启高分辨率周期控制*/
PWM->HRCNFG.bit.HRLOAD = HR_CTR_Zero_PRD;/*在 CTR = 0且 CTR = TBPRD 上加载*/
PWM->HRCNFG.bit.AUTOCONV = 1;/*启用自动转换*/
PWM->HRPCTL.bit.HRPE = 1;/*打开高分辨率周期控制*/
PWM->TBCTL.bit.PHSEN = 1;
PWM->HRPCTL.bit.TBPHSHRLOADE = 1;
//启用 TBCLKSYNC
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
PWM->DBCTL.bit.out_mode = DB_disable;/*禁用死区模块*/
}
这样、我会在 ePWM1A 信号上得到抖动。
GPIO0的初始化:
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1;//禁用 GPIO0上的上拉电阻(EPWM1A)
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;//将 GPIO0配置为 EPWM1A
当我将 PWM->AQCTLA.bit.ZRO = AQ_SET ;更 改为 PWM->AQCTLA.bit.PRD = AQ_SET ;
然后抖动消失、但占空比为+ 10ns。
为什么我不能使用第一个命令、在我看来、加载 CTR = ZRO 上的值更有意义。
下一步是在通道 B 上创建具有 HR 死区时间的反相信号。
我进行了以下寄存器设置:
/*死区初始化*/
PWM->DBFED.all = DEAD_TIME_FED_INIT;
PWM->DBFEDHR.all = DEAD_TIME_FED_HR_INIT;
PWM->DBRED.all = DEAD_TIME_RED_INIT;
PWM->DBREDHR.all = DEAD_TIME_RED_HR_INIT;
// PWM->AQSFRC.bit.RLDCSF = 2;//事件计数器加载等于零或计数器等于周期*/
PWM->DBCTL.ALL = 0;/*半周期时钟使能位*/
PWM->DBCTL.bit.HALFCYCLE = 1;/*半周期时钟使能位*/
PWM->DBCTL.bit.IN_MODE = DBA_ALL;/* EPWMxA IN (来自动作限定器)是上升沿和下降沿延迟信号的源*/
PWM->DBCTL.bit.DEDB_MODE = 0;/*上升沿延迟应用于由 S4开关选择的 INA/INB
(模式位)仅在信号路径上。 下降沿延迟应用于
仅由 B 信号路径上的 S5开关(INMODE 位)选择 INA/INB */
PWM->DBCTL.bit.SHDWDBFEDMODE = 1;/*阴影模式。 作为双缓冲器运行*/
PWM->DBCTL.bit.SHDWDBREDMODE = 1;/*阴影模式。 作为双缓冲器运行*/
PWM->DBCTL.bit.LOADREDMODE = 2;/*在计数器= 0或计数器=周期时加载*/
PWM->DBCTL.bit.LOADFEDMODE = 2;/*在计数器= 0或计数器=周期时加载*/
PWM->DBCTL.bit.POLSEL = DB_ACTV_HIC;/*高电平有效互补*/
PWM->DBCTL.bit.out_mode = DB_FULL_ENABLE;/*启用死区模块*/
PWM->HRCNFG2.bit.CTLMODEDBFED = HR_CTR_Zero_PRD;
PWM->HRCNFG2.bit.CTLMODEDBRED = HR_CTR_Zero_PRD;
PWM->HRCNFG2.bit.EDGMODEDB = HR_BEP;/* 11 MEP 对两个边沿(DBREDHR 的上升沿或 DBFEDHR 的下降沿)*/
有了这个、我没有发现 ePWM1A 和 B 无抖动的工作区。将它与双边沿 HRPWM 配合使用是否有任何问题?
提前感谢您的帮助、
此致
艾琳