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.

[参考译文] TMS320F280049C:如何通过 CMPSS 比较功能强制 ePWM2B 为低电平而 ePWM2A 为高电平时获得 ePWM2a 上升沿死区延迟?

Guru**** 2394295 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1254115/tms320f280049c-how-to-obtain-an-epwm2a-rising-edge-deadband-delay-when-epwm2b-is-forced-low-and-epwm2a-is-forced-high-via-cmpss-compare-function

器件型号:TMS320F280049C
主题中讨论的其他器件:SysConfig

我希望通过 CMPSS ePWM CBC 跳匣区域控制功能实现死区延迟。

但当发生 TripZone 时、epwm2b 被强制为低电平、epwm2a 被强制为高电平(此时、我希望 epwm2a 上升沿延迟约为80ns)。

我知道正常的死区功能在这里不起作用。

参考:(e2e.ti.com/.../tms320f28384s-one-question-of-epwm-trip-zone-submodule)

因此、我将使用谷底开关功能、但它不起作用。 (其工作方式与下图类似)

示波器记录的波形。

有人能指导我吗?  

我编写的代码是:

空 main (void)
{
InitSysCtrl ();//初始化器件时钟和外设
InitGpio();//初始化 GPIO
dint;//禁用 CPU 中断
InitPieCtrl ();//将 PIE 控制寄存器初始化为默认状态。

//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();//使用指向 shell 中断的指针初始化 PIE 向量表
setup1GPIO ();//用于启用 GPIO 的用户特定代码

// ADC (A4) CMPSS (CMP2)被选择(编号1415)
EALLOW;
AnalogSubsysRegs.CMPHPMXSEL.bit.CMP2HPMXSEL = 0;//IA-A4
EDIS;

//映射 ISR 函数
EALLOW;
PieVectTable.ADCA1_INT =&adcA1ISR;// ADCA 中断1的函数
EDIS;

initADC ();//配置 ADC 并启动

initEPWM1 (a);//配置 ePWM1
initEPWM2 (a);//配置 ePWM2
initEPWM3 (a);//配置 ePWM2

initADCSOC ();//在通道1上为 ePWM 触发的转换设置 ADC
CMPSSInit ();// CMPSS 已初始化。
XBARInit ();// XBAR 函数调用

//启用全局中断和更高优先级的实时调试事件:
IER |= M_INT1;//启用组1中断

EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//启用 PIE 中断

//同步 ePWM
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

//在循环中无限地进行转换

while (1)
{
//
//启动 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//解冻、并进入向上计数模式

////空闲循环。 只需永久坐下并循环(可选):
////
for (;;)
{
__ asm (" NOP");



void initEPWM2 (UINT16周期)
{
EALLOW;

EPwm2Regs.TBPRD = a;//设置计时器周期
EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0

EPwm2Regs.TBCTR = 0x0000;
EPwm2Regs.TBCTL.bit.FREE_SOFT = 3;

EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;//禁用相位加载
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm2Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO;
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//递增/递减计数

EPwm2Regs.TBCTL.bit.PRDLD = TB_shadow;

EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_HOLD;//每0加载一次寄存器
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_影子;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;// page.264
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

EPwm2Regs.DBCTL.bit.out_mode = DB_FULL_ENABLE;//启用死区模块
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//高电平有效互补模式(输出反相)
// EPwm2Regs.DBRED.bit.DBRED = DB;
EPwm2Regs.DBFED.bit.DBFED = DB;

//通过以下代码行,将 DB 延迟设置为 epwmB。
EPwm2Regs.CMPB.bit.CMPB = A-1;//设置比较  
EPwm2Regs.AQCTLA.bit.CBU = AQ_SET;
EPwm2Regs.CMPA.bit.CMPA = A;
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;//AQ_CLEAR


// DCAH =比较器2输出
// DCAEVT2 = DCAH HI (将随着比较器输出变为 HI)>>>用于 epmwA
EPwm2Regs.DCTRIPSEL.bit.dCAHCOMPSEL = DC_TRIPIN4;//(页。 1980年)
EPwm2Regs.TZDCSEL.bit.dCAEVT2 = TZ_DCAH_HI;
EPwm2Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT_FLT;// DCAEVT2 = DCAEVT2 (未滤波) DC_EVT2
EPwm2Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_ASYNC;//获取异步路径
EPwm2Regs.TZSEL.bit.dCAEVT2 = 1;
EPwm2Regs.TZCTL.bit.tZA = TZ_FORCE_HI;// EPWM1A 将变为低电平

//谷底开关。
//第1步。
EPwm2Regs.DCFCTL.bit.SRCSEL = 1;//数字滤波器输入源为 DCAEVT2。 (第1984号编)
//第2步。
EPwm2Regs.DCFCTL.bit.EDGEMODE = 0;// 0 =选择低边沿到高边沿(页号:1983)
// 1 =高到低
// 2 =两者
EPwm2Regs.DCFCTL.bit.EDGEUNT = 0;//更改值以验证(P.NO.1983)
//第3步。
EPwm2Regs.VCAPCTL.bit.TRIGSEL = 5;//捕获序列由 DCAEVT2事件触发。 (第1905号编)
//第4步。
EPwm2Regs.VCAPCTL.bit.VCAPE = 1;//启用谷底捕捉
//第5步。
EPwm2Regs.VCNTCFG.bit.STARTEDGE = 2 //(P.No.、
//第6步。
EPwm2Regs.VCNTCFG.bit.STOPEDGE = 3;//该值必须大于起始边沿。
//第7步。
EPwm2Regs.VCAPCTL.bit.VDELAYDIV =1;//HWVDELVAL = SWVDELVAL (P.NO.1905)

EPwm2Regs.SWVDELVAL = 5;//
//步骤8。
EPwm2Regs.VCAPCTL.bit.EDGEFILTDLYSEL = 1;//应用硬件谷值延迟(P.NO.1905)

// EPwm2Regs.HWVDELVAL = 5;//硬件谷底延迟值寄存器
//选择
EPwm2Regs.DCFCTL.bit.EDGEFILTSEL = 1;//数字滤波器(P.No.1984)

// DCAEVT2 = DCAH HI (将随着比较器输出变为 HI)>>>用于 epmwA
EPwm2Regs.DCTRIPSEL.bit.dCBHCOMPSEL = DC_TRIPIN4;
EPwm2Regs.TZDCSEL.bit.DCBEVT2 = TZ_DCBH_HI;
EPwm2Regs.DCBCTL.bit.EVT2CSEL = DC_EVT2;// DCAEVT2 = DCAEVT2 (未滤波)
EPwm2Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_ASYNC;//获取异步路径
EPwm2Regs.TZSEL.bit.DCBEVT2 = 1;
EPwm2Regs.TZCTL.bit.TZB = TZ_FORCE_LO;// EPWM1B 将变为高电平

//启用 TZ 中断
EPwm2Regs.TZEINT.bit.CBC = 1;
EPwm1Regs.TZCLR.bit.INT = 1;


EDIS;


__interrupt void adcA1ISR (void)
{
//
//将最新结果添加到缓冲区中
// ADCRESULT0是 SOC0的结果寄存器

V_out = AdcaResultRegs.ADCRESULT0*3.3/4095;
V_IN = AdccResultRegs.ADCRESULT0*3.3/4095;
V1 = AdccResultRegs.ADCRESULT0*3.3/4095*30;//数字表单


// DACAL 值随负载电流而变化

Cmpss2Regs.DACHVALS.bit.DACVAL = 2500;// CMPSS DACVAL

EPwm2Regs.TBPRD =(a + b);

//清除中断标志

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;


//检查是否发生了溢出
if (1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;//清除 INT1溢出标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//确认中断

void CMPSSInit (void){

EALLOW;
///CMP2_H、用于 IL 电流检测
Cmpss2Regs.COMPCTL.bit.COMPDACE = 1;启用//Comparator/DAC
Cmpss2Regs.COMPCTL.bit.ASYNCHEN = 0;//不馈入或门
Cmpss2Regs.COMPHYSCTL.bit.COMPHYS = 1;

//// 滤波器功能
Cmpss2Regs.CTRIPHFILCTL.bit.SAMPWIN = 4;
Cmpss2Regs.CTRIPHFILCTL.bit.THRESH = 2;
Cmpss2Regs.CTRIPHFILCLKCTL.bit.CLKPRESCALE = 0;
Cmpss2Regs.CTRIPHFILCTL.bit.FILINIT = 1;
Cmpss2Regs.COMPSTSCLR.bit.HLATCHCLR = 1;

//// CTRIPOUTH = CLBX-BAR 输入
Cmpss2Regs.COMPCTL.bit.CTRIPOUTHSEL = 2;//同步比较器输出驱动 CTRIPOUTH
Cmpss2Regs.COMPCTL.bit.CTRIPHSEL = 2;//同步比较器输出驱动 CTRIPH
Cmpss2Regs.COMPCTL.bit.COMPHINV = 0;//比较器的输出未反相
Cmpss2Regs.COMPCTL.bit.COMPHSOURCE = 0;//内部 DAC 驱动的比较器的反相输入

//// 选择 DACVAL 源。
Cmpss2Regs.COMPDACCTL.bit.SWLOADSEL = 0;//DACxVALA 在 SYSCLK 上从 DACxVALS 更新
Cmpss2Regs.COMPDACCTL.bit.DACSOURCE = 0;//DACHVALA 从 DACHVALS 更新
EDIS;


void XBARInit (void){
EALLOW;
//配置 EPWM_XBAR (页号1029)
//TRIP4、用于 OVP/OVP TRIG
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX2 = 0;//配置为 CMPSS2 CTRIPH
EPwmXbarRegs.TRIP4MUXENABLE .bit.MUX2 = 1;// Trip4 ePWM XBAR 多路复用器使能

//编写下面的代码行以查看 CMPSS 值
//配置 OUTPUT_XBAR3 GPIO5
//配置 OUTPUTXBAR3 = CMP2_H
OutputXbarRegs.OUTPUT1MUX0TO15CFG.bit.MUX2 = 0;//CMPSS2.CTRIPOUTH
OutputXbarRegs.OUTPUT1MUXENABLE。bit.MUX2 = 1;

// OutputXbarRegs.OUTPUT6MUX0TO15CFG.bit.MUX2 = 0;// CMPSS2.CTRIPOUTH
// OutputXbarRegs.OUTPUT6MUXENABLE.bit.MUX2 = 1;
EDIS;

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

    尊敬的 Faheem:  

    为了澄清这一点、您希望输出上升沿的80ns 延迟发生在跳闸事件之后吗?

    在这种情况下、您将无法使用跳闸区域模块来控制输出。 不过、您可以在 T1上生成动作限定器事件、其行为与跳闸事件相同、并将 T1配置为由数字比较事件生成、该事件由 EPWM XBAR 生成。 死区模块将动作限定器模块的输出作为输入、因此可以对 T1引起的上升沿应用延迟。

    请告诉我此解决方案是否符合您的应用需求。

    谢谢!

    卢克

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

    这在 CBC 中工作还是只工作一次? 我在这个链接中看到、它只显示一次、但我们需要在循环中工作:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1238444/tms320f2800157-q1-behavior-of-action-qualifier-t1?tisearch=e2e-sitesearch&keymatch=generate%20an%20action%20qualifier%20event%20on%20T1#

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

    我们在哪里可以看到一些例子? Plz

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

    尊敬的 Ginger、

    不幸的是,这是一个一次性事件,直到下一个边缘,杰森在他的帖子中提到。

    如果您希望实现与跳闸区域模块相同的行为、但对跳闸影响 EPWM 输出的时间应用延迟、则另一种潜在的解决方案是通过 CLB-XBAR 路由 CMPSS 事件、使用 CLB 计数器应用延迟、 通过 CLB 输出将事件路由到 EPWMXBAR、并以正常方式配置跳闸、但信号将被 CLB 延迟、因此对 EPWM 输出的影响将延迟。

    我强烈建议使用 SysConfig 配置您的 XBAR 和 CLB、如果您在使用 SysConfig 方面有任何问题、请告诉我。

    谢谢!

    卢克

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

    您好 Luke、

    因此、在本例中、我们需要使用 CLB 函数来获取死区延迟。

    其含义为:   

    我们 只有一个选项可供使用、即 CLB 块。

    2.在本例中,通过 T1操作,动作限定符将不起作用。 (对吗?) 幻灯片。

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

    尊敬的 Faheem:

    1) 1)是的、在这种情况下需要 CLB 块。 这样做的原因是跳闸区域模块会覆盖死区模块的输出、因此延迟跳闸事件对 EPWM 输出的影响的唯一方法是通过 CLB 为其馈送并施加一定的延迟。

    2) 2)通过死区模块延迟的 T1事件可能会根据 CMPSS 比较条件的行为工作。 T1动作限定器 只会在 CMPSS 条件的上升沿触发、这意味着 T1动作限定器事件不会再次发生、直到 CMPSS 条件变为 false、然后又变为 true。 如果您在 TBCTR=0上有一个正在做与 T1事件相反的动作限定器事件、这可能会导致几个100%或0%占空比的周期、具体取决于 CMPSS 条件的行为、但这可能适合您的系统。

    通过 CLB 使用延迟的跳闸事件将在每个周期开始时清除跳闸条件、 但 CMPSS 条件的状态将在每个周期开始时重新评估、并在 PWM 输出端产生跳闸区域行为、直到 CMPSS 条件变为 false 为止。 因此、PWM 输出不会受到 TBCTR=0时动作限定器事件的影响、直到 CMPSS 条件变为 false。 如果这是您需要的行为、那么我认为使用 CLB 是延迟 CMPSS 条件对 PWM 输出的影响的唯一方法。

    如果您有任何进一步的问题、请告诉我。

    谢谢!

    卢克