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:通过使用逐周期跳闸事件(ADA馈电补偿)设置PWM低值来产生死区问题

Guru**** 2590580 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/658635/tms320f28377s-deanband-issue-by-using-cycle-by-cyle-trip-event-adc-feed-comp-to-set-pwm-low

部件号:TMS320F2.8377万S
尊敬的社区:
我需要你的帮助。 我是´m这种语言编程的新手,对我来说,很难理解所有有关控制器关联的信息。 我先举了一些例子,但有些地方却漏掉了一些信息。
现在我得到了一个PwmA
-在零时高(每一个循环)
当比较器统计信息为高电压时熄灭
-->这在选定的DAC值时发生

PwmB是另一种方式
-在零时熄灭(每一次循环)
当比较器状态为高时,将变为高
-->这在选定的DAC值时发生

两个PWM高均通过死区断开。
我知道PWM通常通过使用死区功能反转。 但是在通过比较器添加事件以在指定的ADC值关闭之后,两个PWM再次反向。 所以我开始颠倒PWM的命令,现在它们都按我的要求工作。
图2.

但现在我认识到,在死带有一个很大的错误行为。
我如何解决这个问题并阻止这种渗透?
图1
我是否必须再次切换命令的极性?

非常感谢!!!

整个代码将在末尾插入,现在开始。

////////////////////////////////////////////////////////////////////////////////

//###################################################################
////
文件:ePWM_TRIK_Zone.c
////
标题:ePWM模块使用TRIA-Zone子模块。
////
! \addtogroup cpu01_example_list
//! <h1>ePWM跳闸区域模块(ePWM_TRIK_ZONE)</h1>//!

//! 此示例将ePWM1和ePWM2配置如下
//! - ePWM1将TZ1作为单次触发源
//! - ePWM2将TZ1作为循环跳闸源
//!
//! 最初将TZ1拉高。 在测试过程中,请监视ePWM1或ePWM2
//! 范围上的输出。 将TZ1拉低以查看效果。
//!
//! \b外部连接\n//
! - EPWM1A在GPIO0
//上! - EPWM2A在GPIO2
//上 - TZ1在GPIO12
//!
//! 此示例还使用输入X条。 GPIO12 (外部
//! 触发器)将路由到输入X_bar,并从该处路由到TZ1。
//!
//! TZ-事件的定义是,EPWM1A将经历一次单次跳闸
//! EPWM2A将进行逐周期跳闸。
//!
// _________________ _________________
// | | | |//
GPIO12 --- | I/P X-bar |---- TZ1---- | ePWM TZ模块|---- TZ-事件
// |_________ | |_________________ |//////////////######################################################################################################




//$TI发布:F2837xS支持库V210 $//
发布日期:星期二11月1日15:35:23 CDT 2016 $//
$版权:版权所有(C) 2014-2016 Texas2016 Texas Instruments Incorporated -
//             http://www.ti.com/ 保留所有权利$//#########################################################################################


//
//包含的文件
//
#include "F28x_Project.h"

////
定义
//
#define EXTTRig //使用外部触发器进行测试时,保留未注释。
//使用ePWM触发器测试的备注。
#define DB_UP 1

//用于选择DACH参考
的定义#define reference_VDDA 0
#define reference_VDAC 1
// COMPH输入选择的定义
#define NEGIN_DAC 0
#define NEGIN_PIN 1
// CTRIPH/CTRIPOUTH输出选择的定义
#define携程_异步 0
#define携程同步 1
#define携程过滤器 2
#define CrtK_LATCH 3

////
Globals
/////UINT32
EPwm6TZIntCount;
UINT32 EPwm2TZIntCount;
UINT16 EPwm2_DB_Direction;

////
功能原型
///////void
InitEPwm6Example(void);
void InitEPwm2Example(void);
//rue_int_epzipue_invoid /void






////
主
//
void主(void)
{////

步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例功能可在F2837xS_sysctrl.c文件中找到。
//
InitSysCtrl();////


步骤2. 初始化GPIO:
//此示例函数可在F2837xS_GPIO .c文件中找到,
//说明了如何将GPIO设置为其默认状态。
//
InitGpio();////


启用PWM1和PWM2
//
//CpuSysRegs.PCLKCR2.bit.EPWM6=1;
CpuSysRegs.PCLKCR2.bit.EPWM2=1;////


在这种情况下,只需初始化ePWM1,ePWM2,ePWM3
//的GPIO引脚
InitEPwmGpio_TZ();
//raus gestricthen
//InitTzGpio();

////
步骤3。 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
//
dint;

////
将PIE控制寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断,
并清除标志//。
//此函数位于F2837xS_PIECTRL.c文件中。
//
InitPieCtrl();////


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

////
使用指向shell Interrupt
//服务例程(ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使在此
示例中未使用中断//。 这对于调试非常有用。
// shell ISR例程位于F2837xS_DefaultIsr.C.中
//此函数位于F2837xS_PieVect.C.中
//
本


示例中使用的InitPieVectorTable();////中断被重新映射到此
文件中找到的// ISR函数。
//
EALLOW;//这是写入EALLOW保护寄存器所必需的
//PieVectorTable.EPWM6_TZ_INT =&epwm6_tzint_isr;
PieVectorTable.EPWM2_TZ_INT =&epwm2_tzint_isr;
EDIS;//这是禁用写入EALLOW保护寄存器

的必需项////
步骤4。 初始化设备外围设备:
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =0;
EDIS;

//InitEPwm6Example();
InitEPwm2Example();
//配置比较器COMP1H以接受来自引脚和NEG输入的POS输入
//来自DAC
//
InitCMPS();

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC =1;
EDIS;

////
步骤5。 用户特定代码,启用中断:
//
//EPwm6TZIntCount = 0;
EPwm2TZIntCount = 0;

////
启用连接到EPWM1-3 INT:
//的CPU INT2
IER || M_INT1;

//
在PIE中启用ePWM INTN:组3中断1-3
//
//PieCtrlRegs.PIEIER2.bit.INTx6 = 1;
PieCtrlRegs.PIEIER2.bit.INTx2 = 1;

////
启用全局中断和较高优先级的实时调试事件:
//
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM

////
步骤6。 空闲循环。 只需坐下来永远循环(可选):
//
对于(;;)
{
ASM (" NOP");
}
}////


epwm1_tzint_ISR - EPWM1 TZ ISR
///*__interrupt
void epwm6_tzint_isr (void)
{
EPwm6TZIntCount++;

//
//要重新启用OST中断,请执行以下操作:
// EALLOW;
// EPwm1Regs.TZCLL.bit.OST = 1;
// EPwm1Regs.TZCLL.bit.INT = 1;
// EDIS;
//

//
//确认此中断以接收来自组2的更多中断
//
PieCtrlRegs.PIEACK.ALL = PIEACK_group2;
}*////


epwm2_tzint_ISR - EPWM2 TZ ISR//

__interrupt void epwm2_tzint_ISR(void)
{//zusatz-->wnicht
	gebrauht
//GpioDataRegs.GPATOGLE.bit.GPIO11 = 1;



EPwm2TZIntCount++;

//
//清除标记-我们将继续采取行动
//此中断,直到TZ引脚变高
//
EALLOW;
EPwm2Regs.TZCLL.bit.CBC = 1;
EPwm2Regs.TZCLR.bit.INT =1;
EDIS;

//
//确认此中断以接收来自组2的更多中断
//
PieCtrlRegs.PIEACK.ALL = PIEACK_group2;
}////



InitEPwm2Example-初始化EPWM2配置
//
void InitEPwm2Example()
{
//
//启用TZ1作为一个逐周期跳闸源
//
EALLOW;
// für μ m komplettes PWM模块
EPwm2Regs.TZsel.bit.CBC1 = 1;

//
//设置TZA
//
EPwm2Regs.TZCTL.bit.TZA = TZ_FORT_LO;
//
EPwm2Regs.TZCTL.bit.TZB = TZ_FORT_HI;
//
//启用TZ中断
//
// für μ m komplettes PWM模块
EPwm2Regs.TZEINT.Bit.CBC = 1;
EDIS;

EPwm2Regs.TBPRD = 250; //设置计时器周期
EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0
EPwm2Regs.TBCTR = 0x0000; //清除计数器

//
//设置TBCLK
//
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//UP;//updown;// Count Up
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//TB_DIV4; //与SYSCLKOUT的时钟比率
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;//TB_DIV4; //只是为了观察而放慢速度
//范围。

//
//设置比较
//
EPwm2Regs.CMPA.bit.CMPA = 0;

//设置操作
//
EPwm2Regs.AQCTLB.bit.ZRO = AQ_CLEAR;
	EPwm2Regs.AQCTLA.bit.ZRO = AQ_SET;
//设置操作
///*

EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在CAU上设置PWM2A
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET; //清除CAD上的PWM2A
EPwm2Regs.AQCTLB.bit.CBU = AQ_set;//清除CAU上的PWM2B
EPwm2Regs.AQCTLB.bit.CBD = AQ_CLEAR;//在CAD
*上设置PWM2B

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// hinzufügen ä der Deadband Einstellungen
//Dreht alle PWM Einstellungen um
//有源低互补PWM -设置死区
//
EPwm2Regs.DBCTL.bit.out模式= DB_FULL启用;
EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;//DB_ACTV_LOC;
EPwm2Regs.DBCTL.bit.in_mode = DBA_All;
EPwm2Regs.DBRED.bit.DBRED = 2;//EPWM2_MIN_DB;
EPwm2Regs.DBFED.bit.DBFED = 2;//EPWM2_MIN_DB;
EPwm2_DB_direction = DB_up;
//
//中断,我们将在此处修改死区
//
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择INT ON Zero Event
EPwm2Regs.ETSEL.bit.inten = 1; //启用INT
EPwm2Regs.ETPS.bit.INTPRD = ET_3; //在第三个事件上生成INT
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////// für

EALLOW;
//
//将DCB配置为TRIP4
//
//EPwm8Regs.TZDCSEL.bit.DCBEVT1 = TZ_DCBH_HI;
EPwm2Regs.TZDCSEL.bit.DCBEVT2 = CBC中的TZ_DCBH_HI;// Abänderung
// Polarität kann noch die f ü r eingestellt werden的工作非常积极

//EPwm8Regs.DCTRIPSEL.bit.DCBHCOMPSEL = 0xF;
EPwm2Regs.DCTRIPsel.bit.DCBHCOMPSEL = 0xF;//kann so bleiben alle tIPS sid Aktiv
//EPwm8Regs.DCBHTRIPSEL.bit.TRIPINPUT4 = 1;
EPwm2Regs.DCBHTRIPSEL.Bit.TRIPINPUT4 =1;//输入1被选为DCBH mux的组合式ORed输入

//
//将DCB配置为OST
//
//EPwm8Regs.TZsel.bit.DCBEVT1 = 1;
//启用DCBEVT2作为此ePWM模块的CBC跳闸源
EPwm2Regs.TZsel.bit.DCBEVT2 = 1;//CBC中Abänderung
//Erweiterung um a
EPwm2Regs.TZsel.bit.DCAEVT2 = 1;
//noch möglich -->启用TZ1作为此ePWM模块的CBC跳闸源

//
//将DCB路径配置为未过滤和异步
//
//EPwm8Regs.DCBCTL.bit.EVT1SRCSEL = DC_EVT1;
EPwm2Regs.DCBCTL.bit.EVT2SRCSEL = DC_EVT2;//CBC中的Abänderung
//Erweiterung um a
EPwm2Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2;
//EPwm8Regs.DCBCTL.bit.EVT1FRCSYNCSEL = DC_EVT_Async;
EPwm2Regs.DCBCTL.bit.EVT2FRCSYNCSEL = DC_EVT_Async;//CBC中的Abänderung
//Erweiterung um a
EPwm2Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_Async;

CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

//
//将TRIP4配置为CTRIP1H
//
EPwmXbarRegs.TRIP4MUX0TO15CFG.bit.MUX0 = 0;

//
//为输出启用TRIP4 Mux
//
EPwmXbarRegs.TRIP4MUXENABLE.bit.MUX0 = 1;

//
//清除行程标志
//
//EPwm8Regs.TZCLL.bit.OST = 1;
EPwm2Regs.TZCLL.bit.DCBEVT2 = 1;
//Erweiterung um a
EPwm2Regs.TZCLL.bit.DCAEVT2 = 1;
//EPwm8Regs.TZCLL.bit.INT = 1;
EPwm2Regs.TZCLR.bit.INT =1;
//注意:将不再生成ePWMx_TZINT PIE中断
//直到清除标志。 如果TZFLG[INT]位被清除,并且有任何
//设置了其他标志位,然后将设置另一个中断脉冲
//已生成。 清除所有标志位将防止进一步中断。

//
//启用DCB中断
//
//EPwm8Regs.TZEINT.Bit.OST = 1;
EPwm2Regs.TZEINT.Bit.DCBEVT2 = 1;
//Erweiterung um a
EPwm2Regs.TZEINT.Bit.DCAEVT2 = 1;
EDIS;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//
////// InitTzGpio -初始化TZ GPIO
///*

void InitTzGpio (void)
{
//
//对于外部触发器,GPIO12作为TripZone的触发器
//
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;//在GPIO12上启用上拉(TZ1)

GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3;//异步输入GPIO12 (TZ1)

EALLOW;
InputXbarRegs.INPUT1SELECT = 12;
EDIS;

//
//用于在输入TZ中断时进行监护
//

}
*//////


InitEPwmGpio_TZ -初始化EPWM1A和EPWM2A GPIO
//
void InitEPwmGpio_TZ(void)
{
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO2 = 1;//在GPIO2上禁用上拉(EPWM2A)
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;//将GPIO2配置为EPWM2A
GpioCtrlRegs.GPAPUD.bit.GPIO3 = 1;//在GPIO3上禁用上拉(EPWM2B)
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;//将GPIO3配置为EPWM2B
EDIS;
}////


文件结尾
////


// InitCMCSS -初始化CMPS1并配置设置
//
void InitCMPS(void)
{
EALLOW;

//
//启用CMDSS
//
Cmpss1Regs.COMPCTL.bit.COMPDACE = 1;

//
//NEG信号来自DAC
//
Cmpss1Regs.COMPCTL.bit.COMPHSOURCE = NEGIN_DAC;

//
//使用VDDA作为DAC的参考
//
Cmpss1Regs.COMPDACCTL.bit.SELREF =参考_VDDA;

//
//将DAC设置为中点以进行任意引用
//
CMps1Regs.DACHVALS.bit.DACVAL = 1048;

//
//配置CTRIPOUT路径
//异步输出馈入CTRIPH和CTRIPOUTH
//
Cmpss1Regs.COMPCTL.bit.CTRIPHSEL =携程_异步;
//Cmpss1Regs.COMPCTL.bit.CTRIPOUTHSEL =携程_异步;

//
//配置CTRIPOUTH输出引脚
//将OUTPUTXBAR3配置为CTRIPOUT1H
//
//OutputXbarRegs.OUTPUT3MUX0TO15CFG.bit.MUX0 = 0;

//
//为输出启用OUTPUTXBAR3 Mux
//
//OutputXbarRegs.OUTPUT3MUXENABLE.bit.MUX0 = 1;
EDIS;
}

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

    您好,Basti36,

    我想确认问题。 PWM的极性现在适用于您的应用,但由于PWM边缘上产生的额外脉冲问题,您正在发布。 是这样吗?

    您能否确认哪些PWM通道与图像中显示的波形颜色相关?

    此致,

    克里斯

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

    是的,PWM的极性现在适用于我的应用。 PWM边缘上产生的额外脉冲是问题所在。 如何解决这一问题?
    很抱歉让人困惑的帖子。 粘贴结果n‘t显示在我的浏览器上,现在我只在我的手机上。
    此致,

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

    感谢您的澄清。 我事后编辑了我的上一篇文章,所以您可能在电子邮件通知中没有看到它,但您能否确认哪些PWM通道与图像中显示的波形颜色相关?

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

    信道1 (黄色- Pwm2A)在每个周期为零时变为高位,当信道3 (蓝色)达到1048的比较值时变为低位(仅用于测试DAC)。 蓝色为锯齿输入信号。 信道2 (红色- Pwm2B)在达到的比较值时,在低和高时执行每个循环。 对于100kHz的PWM周期,系统从0到250进行计数。
    此致,

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

    您好,Kris,
    我仍在处理这个问题,但我不得不说,只有当Pwm2A在TRIP事件中切换到低电平时,才会出现这种额外的边缘。
    (另一个方向是Pwm2B。 行程事件中切换至高时的额外边缘)

    此致

    Basti

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

    我想我明白了这个问题。 这是由PWM周期的异步和我测量的信号引起的,由外部函数发生器驱动的信号使比较器跳闸。 在这种情况下,由于锯齿上升边缘在短时间内构造不完美,信号形式会使结果恶化。 所以我用矩形信号形式测试了同样的信号,在这种情况下没有额外的边缘(下降;上升)。

    为了最终证明这一点,最好将另一个GPIO设置为仅在PWM循环的零时高,并在示波器dass dort ein Neuer Zyklus beginnt上显示最短的时间。
    我如何才能轻松做到这一点? (每个循环开始时的GPIO高信号。)

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

    Basti,您好!

    听起来是伟大的进步。 如果EPWM3可用,我建议将其配置为创建您的脉搏。 基本想法是使用EPWM2生成一个SYNCOUT到EPWM3的SYNTIN。 这将对齐计时器(传播延迟会有一些周期变化)。

    获得精确结果的最佳方法是将EPWM3设置为与EPWM2类似,以开始生成相同的波形。 预计EPWM3上会出现一些相移。 然后,您可以使用TBPHS寄存器移动EPWM3,使它们对齐。 它通常是从属PWM中约TBPHS=3的值,以使其对齐。

    现在,您可以修改EPWM3的操作限定符,以在零事件上生成脉冲。

    此致,
    克里斯

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

    您好,Kris,额外边缘仍然存在问题。
    好的,我的最后一篇文章更多的是论文,而不是证明性的答案。

    但现在我可以说,只有当PWM被比较器触发的逐周期事件强制降低时,才会出现额外的边缘。

    如何避免这种额外的边缘?

    我尝试使用空白窗口。 当比较器触发事件时,必须设置窗口。 但是在这个时刻,我不能把窗口偏移量设置得非常好。 这是否可行?或者是否有其他方法可以这样做并避免这些边缘?

    祝您好

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

    我想这就是你在上一篇文章中所说的话,但听起来这是比较器由于临界值而暂时激活/取消激活的问题。

    是否已尝试在比较器触发器中激活滤波器?

    此致,
    克里斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您不想将比较器事件的反应时间延迟与PWM更改相加,另一个选项是使用T1和T2事件,而不是CBC断路。 查看AQTSRCSDEL注册表以了解更多信息。

    它们具有您所寻求的相同效果,但我认为更适合您所寻求的功能。 它们可以配置为强制PWM输出至与跳闸类似的状态,但当条件清除时,它们不会释放力。 它的行为与比较事件类似,但可以是比较器的输入。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kris,
    很抱歉耽误了很长时间。 我正在从事其他项目。
    是的,由于临界值,比较器启动/关闭似乎存在问题。 但这会激活CBC事件,并激活行程。 跳闸将PWMA设置为低,PWMB设置为高。 设置输出后,它如何再次切换(全部在PWM循环中)。

    或标记问题,在设置后重置CBC-Event Direct。

    比较器之后的过滤器被激活。

    祝您好
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Kris,
    过滤器是防止在另一个半桥接器切换时出现不规则切换的最佳方法。
    顺便说一下,技术参考中的信息对于我来说太小了,不能正确使用。

    我是否理解正确? 当CBC事件时设置条件清除时,输出也会切换相同的PWM边界?

    祝您好