你(们)好
我们正在尝试进行四相降压。 所有四个 ePWM 都 链接了 CMPA 和 CMPB 寄存器。 ePWM7、ePWM8、ePWM6和 ePWM2应始终产生相同的脉冲宽度、但 ePWM2脉冲比其他脉冲宽大约1ns。 我已经对所有例程进行了双重检查、它们几乎相同 、除了不同的初始 TBCTR。 打开或关闭 HRPWM 不会改变任何东西。 我想知道什么原因会导致这种情况? InitPWM7()和 InitPWM2()如下。 两个 LaunchPad 板在 ePWM2上产生相同的 PW 差异。
2.SFO_V8_Fpu_lib_build_c28.lib 中的 SFO 例程似乎确定了 MEP_ScaleFactor、但不应该针对不同的 ePWM 执行该操作? 我只能看到为 ePWM1配置的 HRMSTEP。 所有其他的东西看起来都没有改变、 HRMSTEP = 0。 那么 、ePWM[]数组的用途是什么? 无论如何、第一个元件指向 ePWM1或 ePWM8、仍然只有 ePWM1.HRMSTEP 被改变。
谢谢
Edward
静态空 InitPWM7 (空)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;//禁用 GPIO12上的上拉电阻(EPWM7A)
GpioCtrlRegs.GPAPUD.bit.GPIO13 = 1;//禁用 GPIO13上的上拉电阻(EPWM7B)
GpioCtrlRegs.GPAGMUX1.bit.GPIO12 = 0;//将 GPIO2配置为 EPWM7A
GpioCtrlRegs.GPAMUX1.bit.GPIO12=1;//将 GPIO2配置为 EPWM7A
GpioCtrlRegs.GPAGMUX1.bit.GPIO13 = 0;//将 GPIO3配置为 EPWM7B
GpioCtrlRegs.GPAMUX1.bit.GPIO13=1;//将 GPIO3配置为 EPWM7B
EPwm7Regs.TBCTL.bit.CTRMODE = TB_FREEZE;//向上计数
EPwm7Regs.TBCTL.bit.FREE_SOFT = 2;//自由运行
EPwm7Regs.TBCTR = 0x0000+INIPHOFFSET;//初始 CTR
EPwm7Regs.TBPRD =(ePWM_CLOCK / PWM_FREQ)-1;//设置计时器周期
EPwm7Regs.TBPHS.ALL = 0x0000;//相位为0
//
//设置 TBCLK
//
EPwm7Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV1;//慢、只观察
//范围
EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
//设置比较
//
EPwm7Regs.CMPA.bit.CMPA = 0;
//
//设置操作
//
EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm7Regs.AQCTLA.bit.ZRO = AQ_SET;
//EPwm2Regs.AQCTLB.bit.CAU = AQ_SET;//可选
//EPwm2Regs.AQCTLB.bit.PRD = AQ_CLEAR;//可选
//
//低电平有效互补 PWM -设置死区
//
EPwm7Regs.DBCTL.bit.HALFCYCLE = 1;
EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm7Regs.DBCTL.bit.IN_MODE = DBA_ALL;
//EPwm2Regs.DBRED.bit.DBRED = 4;
//EPwm2Regs.DBREDHR.bit.DBREDHR = 100;
//EPwm2Regs.DBFED.bit.DBFED = 4;
//EPwm2Regs.DBFEDHR.bit.DBFEDHR = 100;
//到 ADC 的 SOCA 脉冲
EPwm7Regs.ETPS.bit.SOCAPRD = 1;
EPwm7Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm7Regs.ETSEL.bit.SOCAEN = 1;
//
//中断,我们将在其中修改死区
//
// EPwm7Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
// EPwm7Regs.ETSEL.bit.INTEN = 1;//启用 INT
// EPwm7Regs.ETPS.bit.INTPRD = et_3rd;//在第三个事件发生时生成 INT
EPwm7Regs.HRCNFG.ALL = 0x0;
#if!NOHRPWM
EPwm7Regs.HRCNFG.bit.EDGMODE = HR_FEP;
EPwm7Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm7Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
EPwm7Regs.HRCNFG.bit.EDGMODEB = HR_REP;
EPwm7Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
EPwm7Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;
EPwm7Regs.HRCNFG2.bit.EDGMODEDB=3;//两者都有
#endif
EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数
//EPwm7Regs.HRCNFG.bit.AUTOCONV = 1;
//EPwm7Regs.HRMSTEP.ALL = 0xFFFF;
EPwm7Regs.TZSEL.bit.CBC6 = 1;//在 CPU 停止时
EPwm7Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm7Regs.TZCTL.bit.TSB = TZ_NO_CHANGE;
EDIS;
}
静态空 InitPWM2 (空)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//禁用 GPIO12上的上拉电阻(EPWM7A)
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;//禁用 GPIO13上的上拉电阻(EPWM7B)
GpioCtrlRegs.GPAGMUX1.bit.GPIO2 = 0;//将 GPIO2配置为 EPWM7A
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将 GPIO2配置为 EPWM7A
GpioCtrlRegs.GPAGMUX1.bit.GPIO3 = 0;//将 GPIO3配置为 EPWM7B
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1;//将 GPIO3配置为 EPWM7B
if (phbcfg = PHBCFG_4ph)
EPwm2Regs.TBCTL.bit.FREE_SOFT = 2;//自由运行
其他
EPwm2Regs.TBCTL.bit.free_soft = 1;//在整个周期完成时停止,~调试器停止是安全的
EPwm2Regs.TBPRD =(ePWM_CLOCK / PWM_FREQ)-1;//设置计时器周期
EPwm2Regs.TBPHS.ALL = 0x0000;//相位为0
if (phbcfg = PHBCFG_4ph)
EPwm2Regs.TBCTR = ePWM_CLOCK / PWM_FREQ / 2 -1+INIPHOFFSET;
其他
EPwm2Regs.TBCTR = 0;//同步 TEC
//
//设置 TBCLK
//
EPwm2Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;//慢、只观察
//范围
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//
//设置比较
//
EPwm2Regs.CMPA.bit.CMPA = 0;
//
//设置操作
//
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
//EPwm2Regs.AQCTLB.bit.CAU = AQ_SET;//可选
//EPwm2Regs.AQCTLB.bit.PRD = AQ_CLEAR;//可选
//
//低电平有效互补 PWM -设置死区
//
EPwm2Regs.DBCTL.bit.HALFCYCLE = 1;
EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;
//EPwm2Regs.DBRED.bit.DBRED = 4;
//EPwm2Regs.DBREDHR.bit.DBREDHR = 100;
//EPwm2Regs.DBFED.bit.DBFED = 4;
//EPwm2Regs.DBFEDHR.bit.DBFEDHR = 100;
//
//中断,我们将在其中修改死区
//
// EPwm7Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
// EPwm7Regs.ETSEL.bit.INTEN = 1;//启用 INT
// EPwm7Regs.ETPS.bit.INTPRD = et_3rd;//在第三个事件发生时生成 INT
EPwm2Regs.HRCNFG.ALL = 0x0;
#if!NOHRPWM
EPwm2Regs.HRCNFG.bit.EDGMODE = HR_FEP;
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EPwm2Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO;
EPwm2Regs.HRCNFG.bit.EDGMODEB = HR_REP;
EPwm2Regs.HRCNFG.bit.CTLMODEB = HR_CMP;
EPwm2Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO;
EPwm2Regs.HRCNFG2.bit.EDGMODEDB=3;//两者都有
#endif
//EPwm2Regs.HRCNFG.bit.AUTOCONV = 1;
//EPwm2Regs.HRMSTEP.ALL = 0xFFFF;
if (phbcfg = PHBCFG_4ph)
{
#if!BUG1ns
EPwm2Regs.EPWMXLINK 位 CMPBLINK = 7-1;
EPwm2Regs.EPWMXLINK.BIT.CMPALINK = 7-1;
#endif
EPwm2Regs.TZSEL.bit.CBC6 = 1;//在 CPU 停止时
EPwm2Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm2Regs.TZCTL.bit.TSB = TZ_NO_CHANGE;
}
EDIS;
}