This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8377万S:HRPWM处于UpDown模式,不带自动转换

Guru**** 2487105 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/619690/tms320f28377s-hrpwm-in-updown-mode-without-auto-conversion

部件号: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;
}


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Dominik,

    我对拖延表示歉意。 我已离开办公室很长时间,并完成了所有职位的工作。

    您的理解似乎相当准确。 您将无法在此模式下创建"真正对称"PWM,原因如您所述。 我不认为这会对应用产生重大影响,因为我们谈论的最多是几纳秒的转换。

    如果我能提供任何帮助,请告诉我。

    此致,
    克里斯