ePWM模块(2)
时基模块的使用
TBPRD:周期寄存器 (设置的时钟周期存入此,可通过阴影寄存器缓冲后写入,也可通过活动寄存器立即写入)
TBCTR:时基计数变值寄存器 (时基当前所计数的值存入,用于和所设定周期值比较)
TBPHS:时基相位寄存器
TBSTS:时基状态寄存器
TBCTL:控制寄存器 (重要)
CTRMOD:计数模式
00:加
01:减
10:加减
11:停止计数
PHSEN:使能相位
0:禁止加载
1:加载相位寄存器值
PRDLD:周期寄存器阴影加载方式
0:加载阴影寄存器值
1:不加载阴影
SYNCOSEL:选择ePWMxSYNCO信号输出源
00:ePWMxSYNCI
01:CTR=ZER0:时基计数器为0
10:CTR=CMPA:时基计数器等于比较寄存器A
11:禁止输出
SWFSYNC:软件强制同步脉冲
0:无效果
1:强制一次
HSPCLKDIV:分频,同CLKDIV用。TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV)
CLKDIV:分频,同HSPCLKDIV用
000:1分频
001:2分频
010:4分频
…
111:128分频
PHSDIR: 增减模式下,同步信号到来时,装载相位值后增减状态的计数方向
0:减计数
1:增计数
#include "EPWM.h"
#include "leds.h"
//时基模块 TB 单独的应用,使用中断实现呼吸灯
void EPWM1_Init(Uint16 tbprd) //输入参数为PWM的周期
{
//使能 ePWM 外设时钟及失能时基模块时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//失能TBCLKSYNC
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;//使能ePWM1外设时钟
EDIS;
//中断向量表
EALLOW;
PieVectTable.EPWM1_INT = &epwm1_timer_isr;
EDIS;
//使能时基时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//使能TBCLKSYNC
EDIS;
//设置同步
EPwm1Regs.TBCTL.bit.SYNCOSEL= 0x0;//TB_SYNC_IN
//允许每个使用被同步
EPwm1Regs.TBCTL.bit.PHSEN = 0x1;//TB_ENABLE
时基相位寄存器赋值0
EPwm1Regs.TBPHS.half.TBPHS = 0;
//设置周期数值
EPwm1Regs.TBPRD = tbprd;
// 递增计数模式
EPwm1Regs.TBCTL.bit.CTRMODE = 0x0;//TB_COUNT_UP
//TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV)
EPwm1Regs.TBCTL.bit.HSPCLKDIV=0x0;//不分频TB_DIV1
EPwm1Regs.TBCTL.bit.CLKDIV=0x0;//不分频TB_DIV1
// 在零事件上选择INT
EPwm1Regs.ETSEL.bit.INTSEL = 0x1;//ET_CTR_ZERO
// 使能 INT
EPwm1Regs.ETSEL.bit.INTEN = 1; //ET_1ST
// 在第一个事件上生成INT
EPwm1Regs.ETPS.bit.INTPRD = 0x1;
// 同步启动所有计时器
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;
// 使能连接EPWM1-6 INT的CPU INT3:
IER |= M_INT3;
// 使能PIE中的EPWM INTn:组3中断1-6
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// 启用全局中断和更高优先级的实时调试事件:
EINT; // 启用全局中断INTM
ERTM; // 启用全局实时中断DBGM
}
interrupt void epwm1_timer_isr(void)
{
static Uint16 cnt = 0;
cnt++;
if(cnt==5000)
{
cnt=0;
LED3_TOGGLE;
}
// 清除此计时器的INT标志
EPwm1Regs.ETCLR.bit.INT = 1;
// 确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACK.bit.ACK3 = 1;
}
#ifndef APP_EPWM_EPWM_H_
#define APP_EPWM_EPWM_H_
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
void EPWM1_Init(Uint16 tbprd);
interrupt void epwm1_timer_isr(void);
#endif /* APP_EPWM_EPWM_H_ */