TMS320F2812的PWM程序全中文解析
//###########################################################################
//
// 文件名: Example_281xEvPwm.c
//
// 说明:
// 设置事件管理器的定时器(TIMER1, TIMER2, TIMER3 and TIMER4)
// 来产生 T1PWM, T2PWM, T3PWM, T4PWM 和 PWM1-12 波形(16路PWM波)。
//
//###########################################################################
#include "DSP281x_Device.h" // DSP281x 设备包含文件
#include "DSP281x_Examples.h" // DSP281x 例程包含文件
// 函数原型声明
void init_eva(void);
void init_evb(void);
void main(void) //主函数
{
// 第1步:初始化系统控制量:PLL,看门狗,使能外围时钟
InitSysCtrl();//系统初始化程序,原型在DSP281x_SysCtrl.c中
// 第2步:初始化 GPIO:
EALLOW; //使能保护寄存器
GpioMuxRegs.GPAMUX.all = 0x00FF; // 将EVA PWM 1-6 引脚配置成通用I/O
GpioMuxRegs.GPBMUX.all = 0x00FF; // 将EVB PWM 7-12 引脚配置成通用I/O
EDIS; //禁止修改保护寄存器
// 第3步:清除所有中断,初始化PIE向量表
DINT; //关闭总中断
IER = 0x0000;//关闭外设中断
IFR = 0x0000;//清除中断标志
InitPieCtrl();//初始化PIE控制寄存器
InitPieVectTable();//初始化PIE向量表
// 第4步:初始化所有外围设备
init_eva(); // 初始化事件管理器A
init_evb(); //初始化事件管理器B
// 第5步:IDLE循环,采用示波器可以观察波形
for(;;);
}
void init_eva()
{
// 初始化EVA Timer1
EvaRegs.T1PR = 0xFFFF; // 定时器1 周期值
EvaRegs.T1CMPR = 0x3C00; // 定时器1 比较值
EvaRegs.T1CNT = 0x0000; // 定时器1 计数器初值
EvaRegs.T1CON.all = 0x1042; //控制方式:连续增减;定时器使能,比较使能
// 初始化 EVA Timer2
EvaRegs.T2PR = 0x0FFF; // 定时器2 周期值
EvaRegs.T2CMPR = 0x03C0; // 定时器2 比较值
EvaRegs.T2CNT = 0x0000; // 定时器2 计数器初值
EvaRegs.T2CON.all = 0x1042; //控制方式:连续增减;定时器使能,比较使能
// 设置 T1PWM and T2PWM
EvaRegs.GPTCONA.bit.TCMPOE = 1; //比较逻辑驱动T1/T2PWM
EvaRegs.GPTCONA.bit.T1PIN = 1; //定时器1比较器极性设置为低电平有效
EvaRegs.GPTCONA.bit.T2PIN = 2; //定时器2比较器极性设置为高电平有效
//使能 PWM1-PWM6比较功能
EvaRegs.CMPR1 = 0x0C00; //比较单元比较器1设值
EvaRegs.CMPR2 = 0x3C00; //比较单元比较器2设值
EvaRegs.CMPR3 = 0xFC00; //比较单元比较器3设值
EvaRegs.ACTRA.all = 0x0666;//输出引脚1、3、5高有效,2、4、6低有效
EvaRegs.COMCONA.all = 0xA600; //允许比较输出;下溢或等于周期值时重载
EvaRegs.DBTCONA.all = 0x0000; // 禁止死区
}
void init_evb()
{
// 初始化EVB Timer3
// Timer3 控制 T3PWM and PWM7-12
EvbRegs.T3PR = 0xFFFF; // Timer3 周期值
EvbRegs.T3CMPR = 0x3C00; // Timer3 比较值
EvbRegs.T3CNT = 0x0000; // Timer3 计数器初值
// TMODE = 连续增减
// Timer 使能
// Timer 比较使能
EvbRegs.T3CON.all = 0x1042;
// 初始化EVB Timer4
// Timer4 控制T4PWM
EvbRegs.T4PR = 0x00FF; // Timer4 周期值
EvbRegs.T4CMPR = 0x0030; // Timer4 比较值
EvbRegs.T4CNT = 0x0000; // Timer4 计数初值
// TMODE = 连续增减
// Timer 使能
// Timer 比较使能
EvbRegs.T4CON.all = 0x1042;
// 设置T3PWM and T4PWM
// 由比较逻辑来驱动 T3/T4 PWM
EvbRegs.GPTCONB.bit.TCMPOE = 1;
// T3PWM的 比较极性 =低有效
EvbRegs.GPTCONB.bit.T3PIN = 1;
// T4PWM的比较极性 = 高有效
EvbRegs.GPTCONB.bit.T4PIN = 2;
//使能PWM7-PWM12比较功能
EvbRegs.CMPR4 = 0x0C00;
EvbRegs.CMPR5 = 0x3C00;
EvbRegs.CMPR6 = 0xFC00;
EvbRegs.ACTRB.all = 0x0666; // 比较动作控制,动作在一个比较情况下发生
// 输出管脚 1 CMPR4 - 高有效
// 输出管脚 2 CMPR4 - 低有效
// 输出管脚 3 CMPR5 - 高有效
// 输出管脚4 CMPR5 - 低有效
// 输出管脚 5 CMPR6 - 高有效
// 输出管脚6 CMPR6 - 低有效
EvbRegs.COMCONB.all = 0xA600; //允许比较输出;下溢或等于周期值时重载
EvbRegs.DBTCONB.all = 0x0000; //禁止死区
}
// 此例程没有使用ISR(中断服务子程序) |