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/TMS320F2.8379万D:交错相位问题

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/583848/ccs-tms320f28379d-problem-with-interleaving-phases

部件号:TMS320F2.8379万D

工具/软件:Code Composer Studio

你好

我有一个奇怪的问题。 我设置了3个ePWM (1,2和3),我想控制它们的占空比和相位转换。
占空比工作正常,相移工作到某个水平,但当我将第三个通道的相移增加到2300以上时,会发生一些奇怪的事情(例如 2400或该范围内的内容,而不是2300)。 在这种情况下,信号会消失(我假设它变成零左右,但PWM没有任何信号)

我会将三个信号转换为120°相位。 因此,对于2000年的TBPRD,这将成为2000*2*(1/3)和2000*2*(2/3)的相移,但这不起作用。
在下面,您可以找到我的代码,该代码是根据TI提供的ePWM_UDOWN AQ_cpu01示例改编的。

有没有人遇到类似的问题或您可以给我的任何建议?

此致

//###################################################################
//$TI发行版:F2837xD支持库V200 $
//$发布日期:星期二六月21 13:00:02 CDT 2016 $
//$Copyright:版权所有(C) 2013-2016 Texas2016 Texas Instruments Incorporated -
//            http://www.ti.com/ 保留所有权利$
//###################################################################

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

//
//定义
//
#define EPWM1_TIMER_TBPRD 2000 //期间寄存器

#define EPWM2_TIMER_TBPRD 2000 //期间寄存器

#define EPWM3_TIMER_TBPRD 2000 //期间寄存器

//
//全局
//
typedef结构

   易失性结构ePWM_regs *EPwmRegHandle;
   UINT16 ePWM_CMPA_方向;
   UINT16 ePWM_CMPB_方向;
   UINT16 EPwmTimerIntCount;
   UINT16 EPwmMaxCMPA;
   UINT16 EPwmMinCMPA;
   UINT16 EPwmMaxCMBB;
   UINT16 EPwmMinCMBB;
} ePWM_INFO;

ePWM_INFO epwm1_info;//WAT是编辑语音吗?????
ePWM_INFO epwm2_info;
ePWM_INFO epwm3_info;

双Delta 1A = 10;
双Delta 2A = 10;
双Delta 3A = 10;
INT SET_EPWM1_CMPA = 100;
INT SET_EPWM2_CMPA = 100;
INT Set_EPWM3_CMPA = 100;

Int phone_1A = 0;//(int)(2000*0);
Int phone_2A = 0;//667; //(int)(2000*(1/3));
Int phone_3A = 0;//1334;//(int)(2000*(2/3));


//
//函数原型
//
void InitEPwm1示例(void);
void InitEPwm2示例(void);
void InitEPwm3示例(void);

//
//主菜单
//
Void主(void)


   InitSysCtrl();
   伊尼特·格皮奥();

   phone_1A = 0;//(int)(2000*0);
   phone_2A = 667;//0;//x7D0;//(int)(2000*2/3);
   phone_3A = 3000;//xBB8;//3000;//(int)(2000*2*2/3);

   Initepwm1gpio();
   Initepwm2gpio();
   Initepwm3gpio();

   色调;

   InitPieCtrl();// de pie ->所有的都遇到了中断,例如maken heeft,moet in het begwoon geinitalizeerd worden

   IER = 0x0000;//中断启用寄存器
   IFR = 0x0000;//中断标志寄存器

   InitPieVectorTable();

   EALLOW;//这是写入EALLOW保护寄存器所必需的

   EDIS;  //这是禁用写入EALLOW保护寄存器所必需的

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

   InitEPwm1Example();
   InitEPwm2Example();
   InitEPwm3Example();

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

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

   同时(1)                      //无限循环-等待中断
   {
      Set_EPWM1_CMPA =(int)(((100-Delta_1A)/100)* EPWM1_TIMER_TBPRD-1);
      Set_EPWM2_CMPA =(int)(((100-Delta_2A)/100)* EPWM2_TIMER_TBPRD-1);
      Set_EPWM3_CMPA =(int)(((100-Delta_3A)/100)*EPWM3_TIME_TBPRD-1);

      EPwm1Regs.CMPA.bit.CMPA = Set_EPWM1_CMPA;// set比较值-确定
      EPwm2Regs.CMPA.bit.CMPA = Set_EPWM2_CMPA;// set比较值-确定
      EPwm3Regs.CMPA.bit.CMPA = Set_EPWM3_CMPA;// set比较值-确定

      ASM (" NOP");

   }
}
//
// InitEPwm1示例-初始化EPWM1配置
//
void InitEPwm1example()

   //
   //设置TBCLK
   //
   EPwm1Regs.TBPRD = EPWM1_TIMER_TBPRD;      //设置计时器周期801 TBCLK - OK,exacte waarde nadien aanpasen
   EPwm1Regs.TBPHS.bit.TBPHS = phone_1A;       //相位为0 -正常
   EPwm1Regs.TBCTR = 0x0000;                 //清除计数器-OK,gewoon op nul zetten

   //
   //设置比较值
   //
   EPwm1Regs.CMPA.bit.CMPA = Set_EPWM1_CMPA;   // set比较值-确定
   //EPwm1Regs.CMPB.bit.CMBB = EPWM1_MAX_CMBB;   //设置比较B值-确定

   //
   //设置计数器模式
   //
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//向上和向下计数-为什么这不等于01???
   EPwm1Regs.TBCTL.bit.PHSEN = 0;//TB_disable;       //禁用相位加载-确定
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;      //时钟比与SYSCLKOUT的比率-确定
   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;//-OK
   EPwm1Regs.TBCTL.bit.SYNCOSEL = 0x01;//-确定


   //
   //设置阴影- Niet nodig voor ons.
   //
   //   EPwm1Regs.CMPCTL.bit.SHDWAMODE = cc_shadow;
   //   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
   //   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//加载于零
   //   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

   //
   //设置操作
   //
   EPwm1Regs.AQCTLA.bit.CAU = AQ_set;           //在事件A上设置PWM1A,up
                                                 //计数
   EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;         //清除事件A上的PWM1A,
                                                 //向下计数

   EPwm1Regs.AQCTLB.bit.CBU = AQ_set;           //在事件B上设置PWM1B,up
                                                 //计数
   事件         B上的EPwm1Regs.AQCTLB.bit.CBD = AQ_Clear;//清除PWM1B,
                                                 //向下计数

   //
   //中断,我们将更改比较值- momenteel niet nodig
   //
   //EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//    在零事件上选择INT
   //EPwm1Regs.ETSEL.bit.inten = 1;               //启用INT
   //EPwm1Regs.ETPS.bit.INTPRD = ET_3;          //在第三个事件上生成INT

   //

}

//
// InitEPwm2Example -初始化EPWM2配置
//
void InitEPwm2Example()

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

   //
   //设置比较值
   //
   EPwm2Regs.CMPA.bit.CMPA = Set_EPWM2_CMPA;   // set比较值
   //EPwm2Regs.CMPB.bit.CMPB = EPWM2_MIN_CMPB;   //设置比较B值

   //
   //设置计数器模式
   //
   EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//向上和向下计数
   EPwm2Regs.TBCTL.bit.PHSEN = 1;//TB_disable;       //禁用相加载
   EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;      //与SYSCLKOUT的时钟比率
   EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
   EPwm2Regs.TBCTL.bit.SYNCOSEL = 0x01;//-确定

   //
   //设置阴影
   //
   //EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHAMODE;
   //EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
   //EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
   //EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

   //
   //设置操作
   //
   EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;        //在事件A上设置PWM2A,UP
                                              //计数
   EPwm2Regs.AQCTLA.bit.CAD = AQ_Clear;      //清除事件B上的PWM2A,关闭
                                              //计数

   EPwm2Regs.AQCTLB.bit.ZRO = AQ_Clear;      //清除零上的PWM2B
   EPwm2Regs.AQCTLB.bit.PRD = AQ_set;        //在句点设置PWM2B

   //
   //中断我们将更改比较值的位置
   //
   //EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//   在零事件上选择INT
   //EPwm2Regs.ETSEL.bit.inten = 1;              //启用INT
   //EPwm2Regs.ETPS.bit.INTPRD = ET_3;         //在第三个事件上生成INT
}

//
// InitEPwm3示例-初始化EPWM3配置
//
void InitEPwm3示例(void)


   EPwm3Regs.TBPRD = EPWM3_TIMER_TBPRD;          //设置计时器周期

   //
   //设置TBCLK
   //
   EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UDOWN;//向上/向下计数
   EPwm3Regs.TBCTL.bit.PHSEN = 1;//TB_disable;       //禁用相加载
   EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;      //与SYSCLKOUT的时钟比率
   EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
   EPwm3Regs.TBCTL.bit.SYNCOSEL = 0x01;//-确定

   EPwm3Regs.TBPHS.bit.TBPHS = phone_3A;//0x0000;           //相位为0
   EPwm3Regs.TBCTR = 0x0000;                     //清除计数器


   //
   //将阴影寄存器加载设置为零
   //
   //EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHAMODE;
   //EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
   //EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
   //EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

   //
   //设置比较值
   //
   EPwm3Regs.CMPA.bit.CMPA = Set_EPWM1_CMPA;  // set比较值
   //EPwm3Regs.CMPB.bit.CMBB = EPWM3_MAX_CMBB;  //设置比较B值

   //
   //设置操作
   //
   EPwm3Regs.AQCTLA.bit.CAU = AQ_SET;        //将PWM3A设置为周期
   EPwm3Regs.AQCTLA.bit.CAD = AQ_Clear;      //清除事件B上的PWM3A,关闭
                                              //计数

   EPwm3Regs.AQCTLB.bit.PRD = AQ_Clear;      //在句点清除PWM3A
   EPwm3Regs.AQCTLB.bit.CAU = AQ_set;        //在事件A上设置PWM3A
                                              //计数
}

//
//文件结束
//

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

    我想您还想使用PHSDIR位来控制计数器在同步后的运行方式。

    120度相位外=> TBPHS =~2/3 TBPRD,PHSDIR =向上
    240度相位外=> TBPHS =~2/3 TBPRD,PHSDIR =向下
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Simon Ravyts

    #define EPWM1_TIMER_TBPRD 2000 //期间寄存器
    您将期间寄存器定义为2000,其频率是多少?