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.

[参考译文] 编译器/LAUNCHXL-F28377S:ePWM 频率问题

Guru**** 2562120 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/640257/compiler-launchxl-f28377s-epwm-frequency-problem

器件型号:LAUNCHXL-F28377S

工具/软件:TI C/C++编译器

大家好、

我知道、与这个问题相关的主题有很多。 但是、我仍然遇到问题。 我在项目中使用启动 F28377。 我想生成10kHz SPWM。 我使用向上向下计数模式、因此我使用公式(TPWM = 2 x T_BPRD x T_TBCLK)来确定 PWM 频率。 如果 ePWM 模块时钟频率等于100Mhz (1/T_TBCLK)、  则 T_BPRD  必须等于5000。 但是、通过使用上面的简单代码、我可以获得5kHz PWM 信号。

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


#define EPWM2_TIMER_TBPRD 5000
#define PI 3.14159265358979323846

void InitEPwm7Examples(void);
void InitEPwm8Examples(void);
void poweroff (void);
void poweron (void);
_interrupt void epwm8_ISR (void);

unsigned int i=0、m=0、sample_number=0、start_button=0、stop_button=0;
float A=0、sin 值=0;
int sin_array[100]={0};

//主函

void main (void)
{


InitSysCtrl();

CpuSysRegs.PCLKCR2.bit.EPWM7=1;
CpuSysRegs.PCLKCR2.bit.EPWM8=1;
//InitGpio();
EALLOW;
poweroff();
EDIS;

Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

EALLOW;

PieVectTable.EPWM8_INT =&epwm8_ISR;

EDIS;
EALLOW;

CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;

EDIS;

InitEPwm7Examples();
InitEPwm8Examples();

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

EDIS;
IER |= M_INT3;

PieCtrlRegs.PIEIER3.bit.INTx8 = 1;

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

for (sample_number=0;sample_number<100;sample_number++){
sin 值=4800*sin (sample_number*pi*0.02);
//if (sin 值<0){sin 值=sin 值;}
Sin_array[sample_number]=(int) sin_value;}
//sin_array[400]=0;


/* for (;;)
{
ASM (" NOP");

}*/


//通罗巴丹 aldım!!!!!!!!!
Git01:
if (GpioDataRegs.GPCDAT.bit.GPIO78 == 1 && START_Button == 100)
{powerON();
}
如果(STOP_Button == 100)
{poweroff();
I=0;
}
goto git01;
//buraya kadar!!!!




!!}

_interrupt void epwm8_ISR (void)
{
if (GpioDataRegs.GPCDAT.bit.GPIO78 =1)
{if (start_button<100) start_button++;
STOP_button=0;}
其他
{if (stop_button<100) stop_button++;
START_button=0;}

if (i<99) i++;
否则 I=0;


if (sin_array[i]>0){


EPwm7Regs.CMPA.bit.CMPA = sin_array[i]+100;
EPwm7Regs.CMPB.bit.CMPB = 1;
EPwm8Regs.CMPA.bit.CMPA = sin_array[i]+100;
EPwm8Regs.CMPB.bit.CMPB = sin_array[i]+100;

EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR;// S5 anahtarına
EPwm7Regs.AQCTLA.bit.CAD =AQ_SET;


EPwm7Regs.AQCTLB.bit.CBU = AQ_CLEAR;//死区时间 üretirken ters üretiyo // S1-S4 anahtarlarına gidior
EPwm7Regs.AQCTLB.bit.CBD = AQ_CLEAR;


EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR;// S6 anahtarına
EPwm8Regs.AQCTLA.bit.CAD = AQ_SET;

EPwm8Regs.AQCTLB.bit.CBU = AQ_CLEAR;// S2-S3 anahtarlarına gidior。 Tersleneerek cıkısa verilyor diltime dan dolayı
EPwm8Regs.AQCTLB.bit.CBD = AQ_SET;


}
否则{

EPwm7Regs.CMPB.bit.CMPB =(-sin_array[i])+100;
EPwm7Regs.CMPA.bit.CMPA =(-sin_array[i])+100;
EPwm8Regs.CMPA.bit.CMPA =(-sin_array[i])+100;
EPwm8Regs.CMPB.bit.CMPB = 1;

EPwm7Regs.AQCTLA.bit.CAU = AQ_CLEAR;// S5
EPwm7Regs.AQCTLA.bit.CAD = AQ_SET;

EPwm7Regs.AQCTLB.bit.CBU = AQ_CLEAR;//S1-S4 tersleneerek cıkısa verilyor diltime dan dolayı
EPwm7Regs.AQCTLB.bit.CBD = AQ_SET;

EPwm8Regs.AQCTLA.bit.CAU = AQ_CLEAR;//S6
EPwm8Regs.AQCTLA.bit.CAD = AQ_SET;

EPwm8Regs.AQCTLB.bit.CBU = AQ_CLEAR;//S2-S3 anahtarlarına tersleneerek cıkısa verilior dadimtime dan dolayı
EPwm8Regs.AQCTLB.bit.CBD = AQ_CLEAR;

}

EPwm8Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;
}


void poweroff()
{
EALLOW;
/*GpioCtrlRegs.GPAPUD.bit.GPIO12=1;//禁用 GPIO12上的上拉电阻(EPWM7A)
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;//将 GPIO12配置为 GPIO 引脚40
GpioCtrlRegs.GPADIR.bit.GPIO12 = 0; //将 GPIO78配置为输入*/



GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;//禁用 GPIO13上的上拉电阻(EPWM7B)
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;//将 GPIO13配置为 GPIO 引脚39
GpioCtrlRegs.GPADIR.bit.GPIO12=1; //将 GPIO78配置为输出
GpioDataRegs.GPACLEAR.bit.GPIO12=1; //设置0

GpioCtrlRegs.GPAPUD.bit.GPIO13 = 1;//禁用 GPIO13上的上拉电阻(EPWM7B)
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;//将 GPIO13配置为 GPIO 引脚39
GpioCtrlRegs.GPADIR.bit.GPIO13 = 1; //将 GPIO78配置为输入
GpioDataRegs.GPACLEAR.bit.GPIO13=1;


GpioCtrlRegs.GPAPUD.bit.GPIO14 = 1;//禁用 GPIO13上的上拉电阻(EPWM7B)
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;//将 GPIO13配置为 GPIO 引脚39
GpioCtrlRegs.GPADIR.bit.GPIO14 = 1; //将 GPIO78配置为输入
GpioDataRegs.GPACLEAR.bit.GPIO14=1;

GpioCtrlRegs.GPAPUD.bit.GPIO15 = 1;//禁用 GPIO13上的上拉电阻(EPWM7B)
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0;//将 GPIO13配置为 GPIO 引脚39
GpioCtrlRegs.GPADIR.bit.GPIO15 = 1; //将 GPIO78配置为输入
GpioDataRegs.GPACLEAR.bit.GPIO15=1;

GpioCtrlRegs.GPCPUD.bit.GPIO78 = 1; GPIO71 PIN11上的//Disable 上拉电阻器
GpioCtrlRegs.GPCMUX1.bit.GPIO78=0; //将 GPIO2配置为 GPIO PIN11
GpioCtrlRegs.GPCDIR.bit.GPIO78 = 0; //将 GPIO78配置为输入
EDIS;
}

void poweron ()
{EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;//禁用 GPIO12上的上拉(EPWM7A

) GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 1;//将 GPIO12配置为 EPWM7B.GPIO13
;GPW771.GPIO13 = GPIO13 = GPIPM13。GPO13 = GPW14 = GPIO13。
GPO13 = GPO13。GPO14 = GPMR13 //禁用 GPIO14 (EPWM8A)
GpioCtrlRegs.GPAMUX1.bit.GPIO14上的上拉电阻;//将 GPIO14配置为 EPWM8A 引脚38
GpioCtrlRegs.GPAPUD.bit.GPIO15 = 1;//禁用 GPIO15上的上拉电阻器(EPWM8B = GPIPD.GPIO15
= GPIPDP.GPIO15;GPW8 = GPW15 = GPIPDP.GPIO15 = GPM15.GPM8B = GPIPD/ GPIO15引脚 GPM8B = GPIPDP.GPIO15;GPW15 = GPW15 = GPM8B = GPIPM15.GPIPDP.GPIO15;GPM
GPIO71 PIN11上的//Disable 上拉电阻器
GpioCtrlRegs.GPCMUX1.bit.GPIO78=0; //将 GPIO2配置为 GPIO PIN11
GpioCtrlRegs.GPCDIR.bit.GPIO78=0; //将 GPIO78配置为输入
EDIS;
}



空 InitEPwm7Examples()
{
///PWM 时钟的正常频率为100MHz、但此处使用两分频、因此使用50MHz 频率
EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数
EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟与 SYSCLKOUT 的比率
EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV2;

//EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
//EPwm2Regs.TBCTL.bit.SWFSYNC = 1;
EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;

//EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;
// EPwm2Regs.CMPCTL.bit.LOADAMODE=0;
//EPwm2Regs.CMPCTL.bit.LOADASINC=0;


EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_IMMETERM;
EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_IMMETERM;

//EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
//EPwm2Regs.CMPCTL.bit.LOADBMODE=0;
//EPwm2Regs.CMPCTL.bit.LOADBSYNC=0;

EPwm7Regs.AQCTL.bit.SHDWAQAMODE=0;
//EPwm2Regs.AQCTL.bit.LDAQAMODE=0;
//EPwm2Regs.AQCTL.bit.LDAQASYNC=0;

EPwm7Regs.AQCTL.bit.SHDWAQBMODE=0;
//EPwm2Regs.AQCTL.bit.LDAQBMODE=0;
//EPwm2Regs.AQCTL.bit.LDAQBSYNC=0;

EPwm7Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm7Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm7Regs.DBCTL.bit.IN_MODE = DBA_RED_DBB_FED;
EPwm7Regs.DBRED.bit.DBRED = 80;
EPwm7Regs.DBFED.bit.DBFED = 80;

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

器}

空 InitEPwm8Examples()
{
EPwm8Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;// Hem 0 hemde TBPRD zamanında Inrupt alıyo。
EPwm8Regs.ETSEL.bit.INTEN = 1; //启用 INT
EPwm8Regs.ETPS.bit.INTPRD = et_1st; //在发生第一个事件时生成 INT

EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上和向下计数
EPwm8Regs.TBCTL.bit.PHSEN = TB_ENABLE; //禁用相位加载
EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟与 SYSCLKOUT 的比率
EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV2;

//EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;
//EPwm3Regs.TBCTL.bit.SWFSYNC = 1;
EPwm8Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;

EPwm8Regs.CMPCTL.bit.SHDWAMODE = CC_IMMETERM;
EPwm8Regs.CMPCTL.bit.SHDWBMODE = CC_IMMETERM;
//EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;
//EPwm3Regs.CMPCTL.bit.LOADAMODE=0;
//EPwm3Regs.CMPCTL.bit.LOADASINC=0;

EPwm8Regs.AQCTL.bit.SHDWAQAMODE=0;
EPwm8Regs.AQCTL.bit.SHDWAQBMODE=0;
//EPwm3Regs.AQCTL.bit.LDAQAMODE=0;
//EPwm3Regs.AQCTL.bit.LDAQASYNC=0;

EPwm8Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm8Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm8Regs.DBCTL.bit.IN_MODE = DBA_RED_DBB_FED;
EPwm8Regs.DBRED.bit.DBRED = 80;
EPwm8Regs.DBFED.bit.DBFED = 80;

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

器}

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

    [引述]我知道、与此问题相关的主题有很多。 但是、我仍然遇到问题。 我在项目中使用启动 F28377。 我想生成10kHz SPWM。 我使用向上向下计数模式、因此我使用公式(TPWM = 2 x T_BPRD x T_TBCLK)来确定 PWM 频率。 如果 ePWM 模块时钟频率等于100Mhz (1/T_TBCLK)、  则 T_BPRD 必须等于5000。 但是、通过使用上面的简单代码、我可以获得5kHz PWM 信号。

    [引用]EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率

    EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV2;[/ quot]

     

    您好、Enes、

    在高于 hspclkdiv 和 clkdiv 设置的情况下、TBCLK 将为50MHz、因此 TBPRD 值应为2500以获得10kHz 信号。 请参阅下图、了解更好的 epwmclk 和 TBCLK 之间的关系。


    谢谢

    Vasudha