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.

[参考译文] TMS320F280049:高电平有效的互补 PWM

Guru**** 2595805 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/838289/tms320f280049-active-high-complementary-pwms

器件型号:TMS320F280049
主题中讨论的其他器件:C2000WARE

我对 F280049的 ePWM 有疑问。

此 PWM 设置基于 TI 提供的以下示例程序“高电平有效互补 PWM”。

...\ti\c2000Ware_2_00_00_02\device_support\f2805x\examples\c28\ePWM_dul带\example_2805xEPwmDeadBand.c

空 InitEPwm3Examples()

当 TBCTR = 0时、此 PWM 设置已更改、因此 EPWMxA 输出变为高电平。

启动时会产生意外脉冲、如下所示。

请告诉我原因和对策。

下面列出了导致此问题的程序。

更改代码以红色显示。

(二

//
//定义
//
//
//最大死区值
//
#define EPWM1_MAX_DB 0x03FF
#define EPWM2_MAX_DB 0x03FF
#define EPWM3_MAX_DB 0x03FF

#define EPWM1_MIN_DB 0
#define EPWM2_MIN_DB 0
#define EPWM3_MIN_DB


0 #define EPWM3_DB_DB/TRFT/TBR0



/ TBIT_TBIT_T/ COUNT/#T/ COUNT/#T/ COUNT/#T/

COUNT//#COUNT/ COUNT/ COUNT/#COUNT/#T/ COUNT/#T/ 0x0
#define TB_COUNT_DOWN 0x1
#define TB_COUNT_updown 0x2
#define TB_FREEZE 0x3

//
// PHSEN 位
//
#define TB_disable 0x0
#define TB_enable 0x1

//
//// PRDLD 位
//
#define TB_SHADOW 0x0
#define TB_Immediate 0x1

//
// SYNCOSEL 位
//
#define TB_SYNC_IN 0x0
#define TB_CTR_ZERO 0x1
#define TB_CTR_CMPB 0x2
#define TB_SYNC_DISABLE 0x3

//
// HSPCLKDIV 和 CLKDIV 位
//
#define TB_DIV1 0x0
#define TB_DIV2 0x1
#define TB_DIV4 0x2

//
// PHSDIR 位
//
#define TB_DOWN 0x0
#define TB_UP 0x1

//
//// CMPCTL (比较控制)
//


////// LOADAMODE 和 LOADBMODE 位
//
#define CC_CTR_ZERO 0x0
#define CC_CTR_PRD 0x1
#define CC_CTR_ZERO PRD 0x2
#define CC_LD_DISABLE 0x3

//
// SHDWAMODE 和 SHDWBMODE 位
//
#define CC_SHADOW 0x0
#define CC_Immediate 0x1

//
// AQCTLA 和 AQCTLB (动作限定符控制)
//


//// ZRO、PRD、CAU、CAD、CBU、 CBD 位
//
#define AQ_NO_ACTION 0x0
#define AQ_CLEAR 0x1
#define AQ_SET 0x2
#define AQ_TOGGLE 0x3

//
//// DBCTL (死区控制)
//


//////输出模式位
//
#define DB_disable 0x0
#define DBB_ENABLE 0x1
#define DBA_ENABLE 0x2
#define DB_FUL_ENABLE 0x3

//
// POLSEL 位
//
#define DB_ACTV_HI 0x0
#define DB_ACTV_LOC 0x1
#define DB_ACTV_HIC 0x2
#define DB_ACTV_LO 0x3

//
//在模式
//
#define DBA_ALL 0x0
#define DBB_RED_DBA_FED 0x1
#define DBA_RED_DBB_FED 0x2
#define DBB_ALL 0x3

//
//// CHPCTL (斩波控制)
//


//// CHPEN 位
//
#define CHR_DISABLE 0x0
#define CHR_ENABLE 0x1

//
// CHPFRQ 位
//
#define CHR_DIV1 0x0
#define CHR_DIV2 0x1
#define CHR_DIV3 0x2
#define CHR_DIV4 0x3
#define CHP CHP CHP DIV5 0x4 0x4 0x4 0x4 0x4 0x4 #define CHP DIV6





0x6 0x8 /

define DIV6 0xDIV7 #define CHP DIV/ define DIV7 0xTH_DIV7 0xTH_DIV7 #define TH_DIV7 0x6
CHP2_8 0x1
#define CHP3_8 0x2
#define CHP4_8 0x3
#define CHP5_8 0x4
#define CHP6_8 0x5
#define CHP7_8 0x6

//
// TZSEL (跳匣区域选择)
//


//// CBCn 和 OSHTn 位
//#define TZ_DISABLE
0x0 // TZL
(定义


跳匣区域选择)// TZ1控制
//

//
//// TZA 和 TZB 位
//
#define TZ_HIZ 0x0
#define TZ_FORCE_HI 0x1
#define TZ_FORCE_LO 0x2
#define TZ_NO_CHANGE 0x3

//
// TZDCSEL (跳闸区域数字比较)
//


//// DCAEVT1、DCAEVT2、DCBEVT1、DCBEVT2位
//
#TZ_EVT_DISABLE 0x0
#define TZ_DCAH_LOW 0x1
#define TZ_DCAH_HI 0x2
#define TZ_FCAL_LOW 0x3
#define TZ_FCAL_HI 0x4
#define TZ_FCAL_HI_DCAH_LOW 0x5

#define TZ_DCBH_LOW 0x1
#define TZ_DCBH_HI 0x2
#define TZ_DCBL_LOW 0x3
#define TZ_DCBL_HI 0x4
#define TZ_DCBL_HI_DCBH_LOW 0x5

//
ETSEL (事件触发选择)
//
#define ET_DCAEVT1SOC 0x0
#define ET_CTR_ZERO 0x1
#define ET_CTR_PRD 0x2
#define ET_CTR_PRDZERO 0x3
#define ET_CTRL_CMPA 0x4
#define ET_CTRD_CMPA 0x5
#define ET_CTRU_CMPB 0x6
#define ET_CTRD_CMPB 0x7

//
ETPS (事件触发器预分频)
//


// INTPRD_DISABLE 0x0 #define ET_SOPRD 位

#define 0x7 // ET_CAP0
0x1
#define ET_2ND 0x2
#define ET_3rd 0x3

//
//步骤4. 初始化所有器件外设:
//此示例不需要
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;

// GPIO 配置
GpioCtrlRegs.GPAMUX1.bit.GPIO4=1;//将 GPIO4配置为 EPWM3A
GpioCtrlRegs.GPAMUX1.bit.GPIO5=1;//将 GPIO5配置为 EPWM3B
EDIS;

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

//
//设置 TBCLK
//
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm3Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4; //时钟与 SYSCLKOUT 的比率
EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV4; //在示波器上观察速度慢

//
//设置比较
//
EPwm3Regs.CMPA.bit.CMPA = 3000;

//
//设置操作
//
EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET; //将 PWM3A 设置为零
EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;


EPwm3Regs.AQCTLB.bit.CAU = AQ_CLEAR; //将 PWM3A 设置为零
EPwm3Regs.AQCTLB.bit.CAD = AQ_SET;

//
//高电平有效互补 PWM -设置死区
//
EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm3Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm3Regs.DBRED.ALL = EPWM3_MIN_DB;
EPwm3Regs.DBFED.ALL = EPWM3_MIN_DB;

//
//中断,我们将在其中更改死区
//
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; //选择“零时 INT”事件
EPwm3Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm3Regs.ETPS.bit.INTPRD = et_3rd; //在发生第三个事件时生成 INT

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

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

    您好!

    [引用 user="user_ban]...\ti\c2000Ware_2_00_00_02\device_support\f2805x\examples\c28\ePWM_dul带\example_2805xEPwmDeadBand.c

    上面提到的示例适用于 F2805x? 正在使用哪个设备?

    谢谢

    Vasudha

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

    Vasudha、您好!

    感谢您的评论。

    我使用 F280049。

    我考虑了 F280049的新设置。
    但是、发生了"意外脉冲"。

    因此,我搜索了 F280049“高电平有效互补 PWM”的示例代码,但找不到它。
    另一方面、我在 C2000文件夹中找到了 f2805x 的示例代码。

    所以我尝试使用 f2805x 示例代码、但它也产生了一个"意外脉冲"。

    请告诉我原因和对策。

    谢谢、此致

    USER_BAN

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

    您好!

    在您开始 PWM 操作时或定期进行一次 PWM 操作吗?

    谢谢

    Vasudha

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

    Vasudha、您好!

    感谢您的评论。

    当您开始 PWM 操作时、它会在开始时发生一次。

    我认为这是在执行以下代码时发生的。

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;

    谢谢、此致

    USER_BAN

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

    您好、Ban、

    这是因为您要为 DB_ACTV_HIC (互补的高电平有效)配置 DBCTL 寄存器。

    在配置 DBCTL 之前、PWMA 和 PWMB 都为"0"。 一旦配置发生、PWMB 立即成为 PWMA 的反相版本。

    当 TBCLKSYNC=1时、TBCOUNT 开始递增、当 CMPA =TBCNT 时、PWMA 变为"1"、并且由于 PWMB=!PWMA、PWMB 在 CMPAEQ 上变为"0"。

    如果期望 PWMB 在更长的时间内(相当于 PWMA =1的顺序)应该是高电平,那么在写入 TBCLKSYNC=1之前,你可以在 DBCTL 配置之后添加所需的 NOP。

    希望这对您有所帮助。

    谢谢、此致、

    Akshaya

     

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

    您好、Akshaya、

    感谢您的评论。

    我不希望增加"意外脉冲"持续时间。
    我希望缩短"意外脉冲"持续时间。
    如果可能、我希望消除"意外脉冲"。

    在为 DB_ACTV_HIC 配置 DBCTL 寄存器时、是否有任何方法可以擦除此"意外脉冲"?

    谢谢、此致、

    USER_BAN

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

    您好!

    由于配置更改、初始切换可见。

    脉冲宽度还取决于决定 PWM-A 变化的 CMPA 值

    因此、您只能通过-

    1. 使 DBCTL 配置更接近 PWM-A 更改
    2. 此外、您还可以使用 DBCTL 寄存器的影子到活动重新加载、并将重新加载与 EPWMA-A 输出中的更改对齐。

    另一种方法是-只有在启用 PWM 操作后(使用 TBCLKSYNC 写入)才使用 PWM 输出、在这种情况下、在 TBCLKSYNC=1之前更改 PWM 输出是无关的。

    Rgds、

    Akshaya

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

    您好、Akshaya、

    感谢您的评论。

    >另一种方法是-仅在启用 PWM 操作后才使用 PWM 输出
    >被使能(TBCLKSYNC 写入)、在这种情况下、任何在 TBCLKSYNC=1之前改变 PWM 输出都无关。

    上述程序代码是否与以下程序代码类似?

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

    // GPIO 配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO4=1;//将 GPIO4配置为 EPWM3A
    GpioCtrlRegs.GPAMUX1.bit.GPIO5=1;//将 GPIO5配置为 EPWM3B
    EDIS;

    > 1. 使 DBCTL 配置更接近 PWM-A 更改
    > 2. 此外、您还可以使用 DBCTL 寄存器的影子到活动重新加载、并将重新加载与 EPWMA-A 输出中的更改对齐。

    请告诉我上述方法的可执行程序代码。

    谢谢、此致、

    USER_BAN

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

    您好、Ban、

    您可以尝试2种解决方案-

    解决方案1 -

    由于您要在 ZRO 上设置 PWMA (根据 EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;)、 请在 TBCLKSYNC 之后配置 DBCTL-POLSEL (如下所示)-

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

        EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;

    这样可以消除您在本例中看到的初始干扰。
    但是、请注意、如果您保留 AQCTLA.bit.ZRO = AQ_SET、这将起作用。
    解决方案2 -
     您可以停止使用 HIC 模式。 由于您同时配置 AQCTLA 和 AQCTLB、因此您可以使用以下配置(用蓝色突出显示对代码的更改)-  
        //
        // Set actions
        //
        EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;              // Set PWM3A on Zero
        EPwm3Regs.AQCTLA.bit.CAD = AQ_CLEAR;
        EPwm3Regs.AQCTLB.bit.ZRO = AQ_CLEAR;            // Set PWM3A on Zero
        EPwm3Regs.AQCTLB.bit.CAD = AQ_SET;
        //
        // Active high complementary PWMs - Setup the deadband
        //
        EPwm3Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
        EPwm3Regs.DBCTL.bit.POLSEL = DB_ACTV_HI;
        EPwm3Regs.DBCTL.bit.IN_MODE = DBA_RED_DBB_FED; //Use it as per your delay requirements
        EPwm3Regs.DBRED.all = EPWM3_MIN_DB;
        EPwm3Regs.DBFED.all = EPWM3_MIN_DB;
     
    请尝试这些、并告诉我这是否有帮助。
    Rgds、
    Akshaya