请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:TMS320F2.8377万S 您好,
我有几个关于不带自动转换的UpDown模式下的HRPWM的问题。
是否可以在此模式下创建对称HRPWM? 如果是,我必须使用哪个EDGMODE?
目前我比较 一个HR PWM (EPWM2A) 和 一个ePWM (EPWM2B)。 它们都使用相同的CMP值(CMPA=CMPB), 并且我 只更改CMPAHR值(通过更改currentSample)。
如果我使用BEP, 则高脉冲仅会偏移,而 不会与ePWM相比增加或减少。
如果我使用MEP和MEP_ScaleFactor 120,我可以增加或减少占空比,但似乎它不再与PRD对称。
我想使用FEP会是一样的,但为此,我必须改变逻辑。
在“自动转换”模式下,一个类似的项目 正在运行,因此我认为整体设置 是可以的。
我的代码:
Initepwm();
//映射中断
EALLOW;
PieVectorTable.EPWM2_INT =&ePWM_ISR;
EDIS;
//主程序循环-连续样品温度
对于(;;)
{
IF (ISR_FLAG=1)
{
//样例ADCIN14
// MIT der Funktion und forcen
//GpioDataRegs.GPBTOGLE.bit.GPIO42 = 1;// Anzeigen dass gelesen wipd.
currentSample = sampleADC();
//GpioDataRegs.GPBTOGLE.bit.GPIO42 = 1;// Anzeigen dass gelesen wurde
//替代的mit getriggerter PWM
// da 12位Auflösung最大4096
q_Duty_cycle=3.2768万-8*当前样本;// da cs max 4096 (Q15中的0 % - 100 %)
// cmpa_value bestimmen
cmpa_value=(Q_Duty_cycle*counter_max)>15;
// Q15中的差异
q_fraction =(Q_Duty_cycle*counter_max)-(cmpa值<15);
cmpahr_value=((Q_fring*MEP_ScaleFactor)+(0x0080<7)">15;
cmpahr_value=cmpahr_value<8;
EPwm2Regs.CMPA.bit.CMPA = cmpa值;
EPwm2Regs.CMPB.bit.CMBB = cmpa值;
EPwm2Regs.CMPA.bit.CMPAHR= cmpahr_value;
ISR_FLAG=0;
}
}
void InitEPwm()
{
// PWM1 wrd nicht herrausgeführt -> EPWM2
//启用PWM时钟
CpuSysRegs.PCLKCR2.bit.EPWM2=1;
// evtl启用HRPWM时钟
CpuSysRegs.PCLKCR0.bit.HRPWM=1;
//重置EPWMCLK=SYSCLK/2
EALLOW;
ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1;
EDIS;
//初始化GPIO设置
Initepwm2gpio();
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0;
EDIS;
//设置TBCLK
EPwm2Regs.TBPRD = counter_max; //设置向上/向下计数的最大值
EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0
EPwm2Regs.TBCTR = 0x0000; //清除计数器
//设置比较值
EPwm2Regs.CMPA.bit.CMPA = cmpa值;//设置比较值
EPwm2Regs.CMPA.bit.CMPAHR=(0<8);
EPwm2Regs.CMPB.bit.CMPB = CMPB_Value;//设置比较B值
//设置计数器模式
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//向上和向下计数 //
//EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //计数
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; //在DEN计数器bei同步中启用满载时相位
// bei计数器上升(+ HR) notwendig
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //与SYSCLKOUT的时钟比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
//设置阴影
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZE;//零加载
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//设置操作
//向上向下
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; //在事件A上设置PWM1A
//计数
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR; //在事件A上清除PWM1A,
//向下计数
EPwm2Regs.AQCTLB.bit.CBU = AQ_SET; //在事件B上设置PWM1B,启动
//计数
EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR; //在事件B上清除PWM1B,
//向下计数
//中断我们将更改比较值的位置
EPwm2Regs.ETSEL.bit.INTSEL = 3; //选择INT ON:1 =零2 =最大3 =零+最大
EPwm2Regs.ETSEL.bit.inten = 1; //启用INT
EPwm2Regs.ETPS.bit.INTPRD = ET_1st; //在第一个(第三个)事件上生成INT
// HR Einstellungen
EALLOW;
EPwm2Regs.HRCNFG.ALL =0x0;
EPwm2Regs.HRCNFG.bit.HRLOAD=2;
EPwm2Regs.HRCNFG.bit.AUTOCONV=0;
EPwm2Regs.HRCNFG.bit.EDGMODE=1;
EPwm2Regs.HRCNFG.bit.CTLMODE = HR_CMP;
EDIS;
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
}//
__interrupt void ePWM_ISR(void)
{
ISR_FLAG=1;
//清除此计时器的INT标志
EPwm2Regs.ETCLR.bit.INT = 1;
//确认此中断以接收来自组3的更多中断
PIECtrlRegs.PIEACK/ALL = PIEACK_Group3;
}