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.

[参考译文] TMS320F28377D:同步三相逆变器应用的 EPWM1-3

Guru**** 2589280 points
Other Parts Discussed in Thread: CONTROLSUITE, TIDM-HV-1PH-DCAC

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/664841/tms320f28377d-synchronizing-epwm1-3-for-three-phase-inverter-application

器件型号:TMS320F28377D
主题中讨论的其他器件:controlSUITETIDM-HV-1PH-DCAC

我正在尝试在三相208V 逆变器应用中同步 EPWM1-3。 我遵循了 controlSUITE (VSI -单相 HP DC/AC)中提供的示例代码、后者修改了 ePWM 设置脚本。 但是、当我设置 spruhm8g.pdf 的 ePWM IWA 第14章时、我会看到 ePWM 1的 ePWM 2和3中的20ns 延迟(示波器图如下所示、代码段中的选项1)。 这是否被视为同步? 如果没有、我是否未正确设置 ePWM 寄存器?

此外、当我以替代形式(代码段中的选项2)设置寄存器时、与三相电机控制套件随附的 f803xPWM.h 文件中提供的选项类似、我可以使三个 PWM 脉冲精确对齐、 但对于 f28337xD 文档、它似乎不是 IAW。

这两种情况都提供了正确的输出占空比和频率。 任何见解都值得赞赏。

void setup3PPWM (uint16_t inV_pwm_no、uint16_t pwm_period_ticks、uint16_t pwm_dbred_tick、uint16_t pwm_dbfed_ticks)

EALLOW;

F2837x 上的// PWM 时钟被除以2
// ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV=1

//////////////////////////////////////////////////////////////////////////////////////////////
//时基子模块寄存器
//////////////////////////////////////////////////////////////////////////////////////////////
(* ePWM[INV_PWM_no]).TBCTL.bit.PRDLD = TB_SHADOW;
(* ePWM[INV_PWM_NO]).TBPRD = PWM_PERIOD_TICKs >>1;// PWM 频率= 1/周期
(* ePWM[INV_PWM_no]).TBPHS.bit.TBPHS = 0;
(* ePWM[INV_PWM_no]).TBCTR = 0;
(* ePWM[INV_PWM_no]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(* ePWM[INV_PWM_no]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(* ePWM[INV_PWM_no]).TBCTL.bit.CLKDIV = TB_DIV1;

(* ePWM[INV_PWM_NO+1]).TBCTL.bit.PRDLD = TB_SHADOW;
(* ePWM[INV_PWM_NO+1])。TBPRD = PWM_PERIOD_TICKs >>1;// PWM 频率= 1/周期
(* ePWM[INV_PWM_NO+1]).TBPHS.bit.TBPHS = 0;
(* ePWM[INV_PWM_NO+1]).TBCTR = 0;
(* ePWM[INV_PWM_NO+1]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(* ePWM[INV_PWM_NO+1]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(* ePWM[INV_PWM_NO+1]).TBCTL.bit.CLKDIV = TB_DIV1;

(* ePWM[INV_PWM_NO+2]).TBCTL.bit.PRDLD = TB_SHADOW;
(* ePWM[INV_PWM_NO+2])。TBPRD = PWM_PERIOD_TICKs >>1;// PWM 频率= 1/周期
(* ePWM[INV_PWM_NO+2]).TBPHS.bit.TBPHS = 0;
(* ePWM[INV_PWM_NO+2]).TBCTR = 0;
(* ePWM[INV_PWM_NO+2]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(* ePWM[INV_PWM_NO+2]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(* ePWM[INV_PWM_NO+2]).TBCTL.bit.CLKDIV = TB_DIV1;

//Option 1 -类似于 TI 针对 f28377D 的文档
(* ePWM[INV_PWM_no]).TBCTL.bit.PHSEN = TB_DISABLE;
(* ePWM[INV_PWM_NO+1]).TBCTL.bit.PHSEN = TB_ENABLE;
(* ePWM[INV_PWM_NO+2]).TBCTL.bit.PHSEN = TB_ENABLE;

//将 PWM 2和3配置为从器件并使其从 PWM1传递 SYNC IN 脉冲
(* ePWM[INV_PWM_no]).TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;//同步"下流"-如示例文档所示,但给出了范围上的相位延迟
(* ePWM[INV_PWM_NO+1]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//-类似示例文档、但给出了范围上的相位延迟
(* ePWM[INV_PWM_NO+2]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//-类似示例文档、但给出了范围上的相位延迟

//选项2 -与 f2803xPWM.h 类似,具有三相电机控制套件
//(* ePWM[inV_PWM_no]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//所有设置均相等-通过-这是电机控制器实现它的方式
//(* ePWM[INV_PWM_NO+1]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//所有设置均相等-通过-这是电机控制器实现它的方式
//(* ePWM[INV_PWM_NO+2]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//所有设置均相等-通过-这是电机控制器实现它的方式

//(* ePWM[INV_PWM_no]).TBCTL.bit.PHSEN = TB_DISABLE;
//(* ePWM[INV_PWM_NO+1]).TBCTL.bit.PHSEN = TB_DISABLE;
//(* ePWM[INV_PWM_NO+2]).TBCTL.bit.PHSEN = TB_DISABLE;

(* ePWM[INV_PWM_no]).TBPHS.bit.TBPHS = 0;
(* ePWM[INV_PWM_NO+1]).TBPHS.bit.TBPHS = 0;
(* ePWM[INV_PWM_NO+2]).TBPHS.bit.TBPHS = 0;

(* ePWM[INV_PWM_no]).TBCTL.bit.PHSDIR = TB_UP;
(* ePWM[INV_PWM_NO+1]).TBCTL.bit.PHSDIR = TB_UP;
(* ePWM[INV_PWM_NO+2]).TBCTL.bit.PHSDIR = TB_UP;

//////////////////////////////////////////////////////////////////////////////////////////////
//计数器比较子模块寄存器
//////////////////////////////////////////////////////////////////////////////////////////////
(* ePWM[INV_PWM_no]).cmpA.bit.cmpA = 0;//初始设置占空比0%
(* ePWM[INV_PWM_no]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;
(* ePWM[INV_PWM_no]).cmPCTL.bit.LOADAMODE = CC_CTR_zero_PRD;//TLB 采样两次?

(* ePWM[INV_PWM_NO+1]).cmpa.bit.cmpA = 0;//最初设置占空比0%
(* ePWM[INV_PWM_NO+1]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;
(* ePWM[INV_PWM_NO+1]).cmPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;

(* ePWM[INV_PWM_NO+2]).cmpa.bit.cmpA = 0;//开始时设置占空比0%
(* ePWM[INV_PWM_NO+2]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;
(* ePWM[INV_PWM_NO+2]).cmPCTL.bit.LOADAMODE = CC_CTR_Zero_PRD;

//////////////////////////////////////////////////////////////////////////////////////////////
//操作限定符子模块寄存器
//////////////////////////////////////////////////////////////////////////////////////////////
(* ePWM[INV_PWM_no]).AQCTLA.bit.CAU = AQ_CLEAR;// CTR = CMPA@向上,打开 B (GND 输出)
(* ePWM[INV_PWM_NO]).AQCTLA.bit.CAD = AQ_SET;// CTR = CMPA@DOWN,关闭 B (V OUT)

(* ePWM[INV_PWM_NO+1]).AQCTLA.bit.CAU = AQ_CLEAR;// CTR = CMPA@向上,打开 B (GND 输出)
(* ePWM[INV_PWM_NO+1]).AQCTLA.bit.CAD = AQ_SET;// CTR = CMPA@DOWN,关闭 B (V OUT)

(* ePWM[INV_PWM_NO+2]).AQCTLA.bit.CAU = AQ_CLEAR;// CTR = CMPA@向上,打开 B (GND 输出)
(* ePWM[INV_PWM_NO+2]).AQCTLA.bit.CAD = AQ_SET;// CTR = CMPA@DOWN,关闭 B (V OUT)

//开始时,不要将 PWM 配置为执行任何操作
//(* ePWM[inV_PWM_no]).AQCTLA.all = 0;
//(* ePWM[INV_PWM_NO+1]).AQCTLA.ALL = 0;
//(* ePWM[INV_PWM_NO+2]).AQCTLA.ALL = 0;

//////////////////////////////////////////////////////////////////////////////////////////////
//高电平有效互补 PWM -设置死区
//////////////////////////////////////////////////////////////////////////////////////////////
(* ePWM[INV_PWM_no]).DBCTL.bit.IN_MODE = DBA_ALL;
(* ePWM[INV_PWM_no]).DBCTL.bit.out_mode = DB_full_enable;
(* ePWM[INV_PWM_no]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
(* ePWM[INV_PWM_no]).DBRED = PWM_DBRED_TICKs;
(* ePWM[INV_PWM_no]).DBFED = PWM_DBRED_TICKs;

(* ePWM[INV_PWM_NO+1]).DBCTL.bit.IN_MODE = DBA_ALL;
(* ePWM[INV_PWM_NO+1]).DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
(* ePWM[INV_PWM_NO+1]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
(* ePWM[INV_PWM_NO+1])。DBRED = PWM_DBRED_TICKs;
(* ePWM[INV_PWM_NO+1])。DBFED = PWM_DBRED_TICKs;

(* ePWM[INV_PWM_NO+2]).DBCTL.bit.IN_MODE = DBA_ALL;
(* ePWM[INV_PWM_NO+2]).DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
(* ePWM[INV_PWM_NO+2]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
(* ePWM[INV_PWM_NO+2])。DBRED = PWM_DBRED_TICKs;
(* ePWM[INV_PWM_NO+2])。DBFED = PWM_DBRED_TICKs;

EDIS;

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

    您好、Troy、

    您在示波器捕获1中看到的内容与您发布的代码保持一致。

    在 F2837xD TRM 中、请参阅 ePWM 一章中的"时基计数器同步"部分。  在其中、您将 看到 ePWM 主器件与其任何从器件 ePWM 之间存在2周期逻辑延迟。
    (EPWMxSYNCI:同步输入脉冲)

    要对此进行补偿、您需要将 ePWM2和 ePWM3的 TBPHS 设置为2。  

    希望这对您有所帮助。


    谢谢、
    Brett

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

    完美、我想我不会运气就尝试了。 但当然、它现在已经同步好了。

    感谢你的帮助。

    特洛伊

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    TIDM-HV-1PH-DCAC 中的不理想同步是有意实现的、因此在低频开关转换时、在过零附近正确发生转换、为此需要使用 AQSRFC。