器件型号: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; //清除计数
器}