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.

[参考译文] CCS/TMS320F28377D:# ePWM

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/638794/ccs-tms320f28377d-epwm

器件型号:TMS320F28377D

工具/软件:Code Composer Studio

大家好、

    我 使用28377D 生成 PWM 波形、每个相位具有4个 PWM。EPWM1是主器件、EPWM2~EPWM6是从器件。 A 相使用 EPWM1和 EPWM2、B 相使用 EPWM3和 EPWM4.C 相使用 EPWM4和 EPWM5。    

     这种现象非常奇怪、相位 B 和相位 C 可以生成正常的波形、但 从相位 A 生成的波形具有一些较大的过冲、过冲 不会经常出现 、  并且在出现时将连续出现。

      。、我怀疑它与 EPWM1和 EPWM2有关、也许有些寄存 器配置不正确。

我的寄存器配置如下。

初始部分:


void PWMchUpDwnCntConfig (Int16 n、Int16 mode、Int16相)


(* ePWM[n]).TBCTL.bit.HSPCLKDIV=1;
(* ePWM[n]).TBCTL.bit.CLKDIV=1;
(* ePWM[n]).TBCTL.bit.PRDLD = TB_SHADOW;
(* ePWM[n]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
(* ePWM[n]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(* ePWM[n]).TBCTL.bit.CLKDIV = TB_DIV1;

if (mode = 1)//配置为主设备

(* ePWM[n]).TBCTL.bit.PHSEN = TB_DISABLE;
(* ePWM[n]).TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

否则、如果(MODE = 0)//配置为从器件

(* ePWM[n]).TBCTL.bit.PHSEN = TB_ENABLE;
(* ePWM[n]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
(* ePWM[n]).TBCTL.bit.PHSDIR = TB_UP;


如果(n % 2 = 0)

(* ePWM[n]).TBCTR = 0;
(* ePWM[n]).TBPHS.bit.TBPHS = 0;
(* ePWM[n]).TBPRD = 3200;
(* ePWM[n]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;
(* ePWM[n]).cmPCTL.bit.SHDWBMODE = CC_SHADOW;
(* ePWM[n]).cmPCTL.bit.LOADAMODE = CC_CTR_ZERO;
(* ePWM[n]).cmPCTL.bit.LOADBMODE = CC_CTR_ZERO;

其他

(* ePWM[n]).TBCTR = 0;
(* ePWM[n]).TBPHS.bit.TBPHS = 3200;
(* ePWM[n]).TBPRD = 6400;
(* ePWM[n]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;
(* ePWM[n]).cmPCTL.bit.SHDWBMODE = CC_SHADOW;
(* ePWM[n]).cmPCTL.bit.LOADAMODE = CC_CTR_PRD;
(* ePWM[n]).cmPCTL.bit.LOADBMODE = CC_CTR_PRD;


(* ePWM[n]).cmpa.bit.cmpA = 0;

(* ePWM[n]).AQCTLA.bit.CAU = AQ_CLEAR;
(* ePWM[n]).AQCTLA.bit.CAD = AQ_SET;
(* ePWM[n]).AQCTLA.bit.CBU = AQ_NO_ACTION;
(* ePWM[n]).AQCTLA.bit.CBD = AQ_NO_ACTION;
(* ePWM[n]).AQCTLA.bit.PRD = AQ_NO_ACTION;
(* ePWM[n]).AQCTLA.bit.ZRO = AQ_NO_ACTION;

(* ePWM[n]).AQCTLB.bit.CAU = AQ_CLEAR;
(* ePWM[n]).AQCTLB.bit.CAD = AQ_SET;
(* ePWM[n]).AQCTLB.bit.CBU = AQ_NO_ACTION;
(* ePWM[n]).AQCTLB.bit.CBD = AQ_NO_ACTION;
(* ePWM[n]).AQCTLB.bit.PRD = AQ_NO_ACTION;
(* ePWM[n]).AQCTLB.bit.ZRO = AQ_NO_ACTION;

(* ePWM[n]).DBCTL.bit.out_mode = DB_full_enable;
(* ePWM[n]).DBCTL.bit.POLSEL = DB_ACTV_HIC;
(* ePWM[n]).DBCTL.bit.in_mode = DBA_RED_DBB_FED;
(* ePWM[n]).DBRED.bit.DBRED = DB_RISE_EDGE_DELAY;
(* ePWM[n]).DBFED.bit.DBFED = DB_FALLING_EDGE_DELAY;

PWMchUpDwnCntConfig (0、1、0);//EPWM1为主器件
PWMchUpDwnCntConfig (1、0、0);
PWMchUpDwnCntConfig (2、0、0);
PWMchUpDwnCntConfig (3、0、0);
PWMchUpDwnCntConfig (4、0、0);
PWMchUpDwnCntConfig (5、0、0);

当定时器中断 出现时、ePWM (1~6)将更新 CMPA。

您能提供一些建议吗?谢谢!

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

    几个周期的大过冲可能表示您写入的比较值大于 TBPRD。 看起来您有2个不同的周期值、是否确定您从未写入过大的比较值?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    每个相位都有两个 ePWM,一个 TBCTR 示波器介于0和3200之间,另一个介于3200和6400之间,  COMPA 介于0和6400之间(ePWM 具有一些 COMPA 值)。B 相和 C 相没有问题,但 A 相有问题,导致过冲。

    作为主器件的 EPWM1存在问题、但当 CTR 为零时、会与其他 ePWM 模块同步、这一点我怀疑。 那么、我的 EPWM1寄存器配置是否错误?

    在某处、COMPA 大于 EPWM1 (此时 PWM 为高电平)、也小于 EPWM2 (此时 PWM 为低电平)。 该 策略存在于 EPWM3和 EPWM4 (B 相)之间、在 EPWM5和 EPWM6 (C 相)之间。

    在 EPWM1 (CTR 等于零)和 EPWM2 (CTR 等于周期)之间、加载 COMPA 的时间不同、我也尝试 将 COMPA 设置为相同的负载时间、但输出波上出现了缺陷。