DSP

DSP实验剖析系列:实验2 PWM波形生成 (本实验基于TMS320F28335芯片)

2019-07-13 10:50发布

实验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; }