打印

TMS320F2812的PWM程序全中文解析

[复制链接]
947|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Roses|  楼主 | 2017-8-8 12:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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(中断服务子程序)

相关帖子

沙发
zhangmangui| | 2017-8-8 20:28 | 只看该作者
有注释看起来方便多了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

709

主题

1023

帖子

7

粉丝