28027 产生占空比为50%的PWM
参考利尔达的例子,
/***************************************************************************************************
**FileName: ** main.c
**Description: 产生占空比50%的PWM
***************************************************************************************************/
#include "DSP28x_Project.h"
/*******************************************************************************/
void Delay (Uint16 k);
void EPWM_init(void);
interrupt void epwm1_timer_isr(void); // EPWM1中断
/*******************************************************************************
* Function Name : main
* Description : Main program
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void main(void)
{
InitSysCtrl();
/* Flash初始化*/
#ifdef FLASH
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &epwm1_timer_isr;
EDIS;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; //禁止上拉电阻
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; //禁止上拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //选择EPWM模式
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //选择EPWM模式
EDIS;
/* 配置GPIO12 */
EALLOW; // 关闭寄存器保护
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; // 选择上拉
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // 选择普通 GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO12 = 1; // 配置输出
EDIS; // 开启寄存器保护
EPWM_init();
IER |= M_INT3;//使能 INT3
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//使能EPWM1
EINT;// INTM=0开中断
ERTM;// 使能调试事件
Num=1;
GpioDataRegs.GPADAT.bit.GPIO12=0; //flash LED
while(1)
{
Delay(500);
GpioDataRegs.GPADAT.bit.GPIO12=1;
Delay(500);
GpioDataRegs.GPADAT.bit.GPIO12=0;
}
}
/***************************************************************************************************
**Function: ** void EPWM_init(void)
**Description: ** 初始化EPWM模块
**Input: ** Null
**Output: ** Null
**Others: ** Null
***************************************************************************************************/
void EPWM_init(void)
{
EPwm3Regs.TBPRD = 0x1FF;//计数器累加到551就产生中断
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 增计数模式
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 使能中断在计数值等于0的时候
EPwm3Regs.ETSEL.bit.INTEN = 1; // 使能中断
EPwm3Regs.ETPS.bit.INTPRD = ET_3RD; // 值时产生中断
/* 初始化TB定时器*/
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA; // 计数值等于比较值时产生中断
EPwm1Regs.ETSEL.bit.INTEN = 1; // 使能中断
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 第一次时产生中断
EPwm1Regs.TBPRD = 60000; // 定时器周期60000
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // 同步值
EPwm1Regs.TBCTR = 0; // 清除定时器计数
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 定时器增模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 同步脉冲装载不使能
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 从镜像装载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 关闭同步输出
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TB时钟等于SYSCLK
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 镜像模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // 当CTR=prd的时候装载镜像数据
EPwm1Regs.CMPA.half.CMPA = 30000;
EPwm1Regs.AQCTLA.bit.CAU =AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU =AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
}
/***************************************************************************************************
**Function: ** void epwm1_timer_isr(void)
**Description: ** EPWM1中断函数
**Input: ** NULL
**Output: ** Null
**Others: ** Null
***************************************************************************************************/
interrupt void epwm1_timer_isr(void)
{
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
/***************************************************************************************************
**Function: ** void Delay (Uint16 k)
**Description: ** 延时函数
**Input: ** Uint16 k
**Output: ** Null
**Others: ** Null
***************************************************************************************************/
void Delay (Uint16 k){
Uint16 i,j;
for(i = 0;i < k;i++){
for(j = 0;j < 4999;j++);
}
}
/***************************************************************************************************
**FileName: ** main.c
**Description: 产生占空比50%的PWM
***************************************************************************************************/
#include "DSP28x_Project.h"
/*******************************************************************************/
void Delay (Uint16 k);
void EPWM_init(void);
interrupt void epwm1_timer_isr(void); // EPWM1中断
/*******************************************************************************
* Function Name : main
* Description : Main program
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void main(void)
{
InitSysCtrl();
/* Flash初始化*/
#ifdef FLASH
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
#endif
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.EPWM1_INT = &epwm1_timer_isr;
EDIS;
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 1; //禁止上拉电阻
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; //禁止上拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; //选择EPWM模式
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; //选择EPWM模式
EDIS;
/* 配置GPIO12 */
EALLOW; // 关闭寄存器保护
GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; // 选择上拉
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // 选择普通 GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO12 = 1; // 配置输出
EDIS; // 开启寄存器保护
EPWM_init();
IER |= M_INT3;//使能 INT3
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//使能EPWM1
EINT;// INTM=0开中断
ERTM;// 使能调试事件
Num=1;
GpioDataRegs.GPADAT.bit.GPIO12=0; //flash LED
while(1)
{
Delay(500);
GpioDataRegs.GPADAT.bit.GPIO12=1;
Delay(500);
GpioDataRegs.GPADAT.bit.GPIO12=0;
}
}
/***************************************************************************************************
**Function: ** void EPWM_init(void)
**Description: ** 初始化EPWM模块
**Input: ** Null
**Output: ** Null
**Others: ** Null
***************************************************************************************************/
void EPWM_init(void)
{
EPwm3Regs.TBPRD = 0x1FF;//计数器累加到551就产生中断
EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 增计数模式
EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 使能中断在计数值等于0的时候
EPwm3Regs.ETSEL.bit.INTEN = 1; // 使能中断
EPwm3Regs.ETPS.bit.INTPRD = ET_3RD; // 值时产生中断
/* 初始化TB定时器*/
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTRU_CMPA; // 计数值等于比较值时产生中断
EPwm1Regs.ETSEL.bit.INTEN = 1; // 使能中断
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 第一次时产生中断
EPwm1Regs.TBPRD = 60000; // 定时器周期60000
EPwm1Regs.TBPHS.half.TBPHS = 0x0000; // 同步值
EPwm1Regs.TBCTR = 0; // 清除定时器计数
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 定时器增模式
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 同步脉冲装载不使能
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 从镜像装载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 关闭同步输出
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // TB时钟等于SYSCLK
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 镜像模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // 当CTR=prd的时候装载镜像数据
EPwm1Regs.CMPA.half.CMPA = 30000;
EPwm1Regs.AQCTLA.bit.CAU =AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU =AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
}
/***************************************************************************************************
**Function: ** void epwm1_timer_isr(void)
**Description: ** EPWM1中断函数
**Input: ** NULL
**Output: ** Null
**Others: ** Null
***************************************************************************************************/
interrupt void epwm1_timer_isr(void)
{
EPwm1Regs.ETCLR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
/***************************************************************************************************
**Function: ** void Delay (Uint16 k)
**Description: ** 延时函数
**Input: ** Uint16 k
**Output: ** Null
**Others: ** Null
***************************************************************************************************/
void Delay (Uint16 k){
Uint16 i,j;
for(i = 0;i < k;i++){
for(j = 0;j < 4999;j++);
}
}
还没人转发这篇日记