实验2 PWM波形生成
首先直接贴上程序
“PWM.c”
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
void EPwmSetup(); //声明PWM设置函数,此函数在下文中有
Uint16 i; //定义变量i
void main(void) //主函数
{
InitSysCtrl(); //调用系统初始化函数
InitXintf16Gpio(); //调用总线初始化函数
DINT; //禁止CPU全局中断
InitPieCtrl();//调用此函数,初始化PIE中断控制器
IER = 0x0000;
IFR = 0x0000; //禁止CPU中断和清除所有CPU中断标志
InitPieVectTable();//调用此函数初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
EPwmSetup(); // 调用此函数,对EPWM1A和1B进行配置,此函数在下文中会给出
for(; ;)
{
} //此函数使程序陷入循环
}
PWM初始化配置程序(此部分是配置PWM波参数的重要部分)
“Example_EPwmSetup.C”
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h" // 添加两个头文件
#if (CPU_FRQ_150MHZ) //如果CPU的时钟频率是150MHz
#define CPU_CLK 150e6 //那么CPU_CLK就代表150*e6这个数字
#endif
#if (CPU_FRQ_100MHZ) //如果CPU的时钟频率是100MHz
#define CPU_CLK 100e6 //那么CPU_CLK就代表100*e6这个数字
#endif //结束条件语句
#define PWM_CLK 10e3 //定义所要生成的PWM波形的频率,想要改变输出PWM频率的就可以改变程序的这个值
#define SP CPU_CLK/(2*PWM_CLK) //定义SP的值等于CPU工作频率除以两倍的PWM波频率
#define TBCTLVAL 0x200E //定义TBCTLVAL值为0x200E,Up-down cnt, timebase = SYSCLKOUT
//下面正式开始编写PWM配置程序
void EPwmSetup()
{
InitEPwm1Gpio(); //运行PWM初始化程序,初始化PWM口
EPwm1Regs.TBSTS.all=0;
EPwm1Regs.TBPHS.half.TBPHS=0;
EPwm1Regs.TBCTR=0;
EPwm1Regs.CMPCTL.all=0x50; // Immediate mode for CMPA and CMPB
EPwm1Regs.CMPA.half.CMPA =SP/4;
EPwm1Regs.CMPB=SP/4;
EPwm1Regs.AQCTLA.all=0x60; // EPWMxA = 1 when CTR=CMPA and counter inc
// EPWMxA = 0 when CTR=CMPA and counter dec
EPwm1Regs.AQCTLB.all=0x60;
// EPwm1Regs.AQCTLB.all=0;
EPwm1Regs.AQSFRC.all=0;
EPwm1Regs.AQCSFRC.all=0;
EPwm1Regs.DBCTL.all=0x23; // EPWMxB is inverted
EPwm1Regs.DBRED=0;
EPwm1Regs.DBFED=0;
EPwm1Regs.TZSEL.all=0;
EPwm1Regs.TZCTL.all=0;
EPwm1Regs.TZEINT.all=0;
EPwm1Regs.TZFLG.all=0;
EPwm1Regs.TZCLR.all=0;
EPwm1Regs.TZFRC.all=0;
EPwm1Regs.ETSEL.all=0; // Interrupt when TBCTR = 0x0000
EPwm1Regs.ETFLG.all=0;
EPwm1Regs.ETCLR.all=0;
EPwm1Regs.ETFRC.all=0;
EPwm1Regs.PCCTL.all=0;
EPwm1Regs.TBCTL.all=0x0010+TBCTLVAL; // Enable Timer
EPwm1Regs.TBPRD=SP;
}