事件管理器的英文名为Event Manager,简称EV。DSPF2812具有两个事件管理器模块EVA和EVB,这两个事件管理器模块就像双胞胎一样,具有完全相同的功能。
事件管理器EVA模块具有2个16位的通用定时器(通用定时器1和通用定时器2)3个比较单元(比较单元1比较单元2和比较单元3)3个捕获单元(捕获单元1捕获单元2和捕获单元3)以及1个正交编码脉冲电路(QEP电路)。类似的EVB模块同样具有2个16位的通用定时器(通用定时器3和通用定时器4)3个比较单元比较单元4、比较单元5和比较单元6)3个捕获单元(捕获单元4捕获单元5和捕获单元6)以及1个正交编码脉冲电路(QEP电路)。
本期将带来利用EVA模块产生25kHz和EVB模块产生1kHz的互补且带有死区PWM信号
(1)在使用F2812产生PWM信号时,第一步先配置系统时钟信号,在源文件DSP28_SysCtrl.c对F2812的系统控制模块进行初始化。
#include "DSP28_Device.h"
void InitSysCtrl(void)
{
Uint16 i;
EALLOW;
// 对于TMX产品,为了能够使得片内RAM模块M0/M1/L0/L1LH0能够获得最好的性能,控制寄存器的位
// 必须使能,这些位在设备硬件仿真寄存器内。TMX是TI的试验型产品
DevEmuRegs.M0RAMDFT = 0x0300;
DevEmuRegs.M1RAMDFT = 0x0300;
DevEmuRegs.L0RAMDFT = 0x0300;
DevEmuRegs.L1RAMDFT = 0x0300;
DevEmuRegs.H0RAMDFT = 0x0300;
// 禁止看门狗模块
SysCtrlRegs.WDCR= 0x0068;
// 初始化PLL模块
SysCtrlRegs.PLLCR = 0xA; //如果外部晶振为30M,则SYSCLKOUT=30*10/2=150MHz
// 延时,使得PLL模块能够完成初始化操作
for(i= 0; i< 5000; i++){}
// 高速时钟预定标器和低速时钟预定标器,产生高速外设时钟HSPCLK 这里EVA、EVB模块需要高速外设提供
SysCtrlRegs.HISPCP.all = 0x0001; // HSPCLK=150/2=75MHz
// 对工程中使用到的外设进行时钟使能,在本例中,我们将用到EVA和EVB
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; //使能EVA的时钟
SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; //使能EVB的时钟
EDIS;
}
(2)在配置系统时钟后,需要对F2812的GPIO口进行配置,具体配置方式请看下面程序及对应注释。
#include "DSP28_Device.h"
void InitGpio(void)
{
EALLOW;
// 将GPIO中和PWM相关的引脚设置为PWM功能
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6=1; //设置T1PWM引脚
GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7=1; //设置T2PWM引脚
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1; //设置PWM1引脚
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1; //设置PWM2引脚
GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=1; //设置PWM3引脚
GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3=1; //设置PWM4引脚
GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4=1; //设置PWM5引脚
GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA5=1; //设置PWM6引脚
// GpioMuxRegs.GPAMUX.all=0x00FF;
GpioMuxRegs.GPBMUX.bit.T3PWM_GPIOB6=1; //设置T3PWM引脚
GpioMuxRegs.GPBMUX.bit.T4PWM_GPIOB7=1; //设置T4PWM引脚
GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=1; //设置PWM7引脚
GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1; //设置PWM8引脚
GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2=1; //设置PWM9引脚
GpioMuxRegs.GPBMUX.bit.PWM10_GPIOB3=1; //设置PWM10引脚
GpioMuxRegs.GPBMUX.bit.PWM11_GPIOB4=1; //设置PWM11引脚
GpioMuxRegs.GPBMUX.bit.PWM12_GPIOB5=1; //设置PWM12引脚
//GpioMuxRegs.GPBMUX.all=0x00FF;
EDIS;
}
(3)完成上述配置后,需要对EV模块进行初始化,具体配置方式请看下面程序及对应注释。
#include "DSP28_Device.h"
void InitEv(void)
{
//EVA模块
EvaRegs.T1CON.bit.TMODE=2; //连续增模式
EvaRegs.T1CON.bit.TPS=1; //T1CLK=HSPCLK/2=37.5M
EvaRegs.T1CON.bit.TENABLE=0; //暂时禁止T1计数
EvaRegs.T1CON.bit.TCLKS10=0; //使用内部时钟,T1CLK
EvaRegs.T1CON.bit.TECMPR=1; //使能定时器比较操作
EvaRegs.T2CON.bit.TMODE=2; //连续增模式
EvaRegs.T2CON.bit.TPS=1; //T2CLK=HSPCLK/2=37.5M
EvaRegs.T2CON.bit.TENABLE=0; //暂时禁止T2计数
EvaRegs.T2CON.bit.TCLKS10=0; //使用内部时钟,T2CLK
EvaRegs.T2CON.bit.TECMPR=1; //使能定时器比较操作
EvaRegs.GPTCONA.bit.TCOMPOE=1; //定时器比较输出T1PWM_T1CMPR和T2PWM_T2CMPR由各自的定时器比较逻辑驱动
EvaRegs.GPTCONA.bit.T1PIN=1; //低电平有效
EvaRegs.GPTCONA.bit.T2PIN=2; //高电平有效
EvaRegs.T1PR=0x05DB; //25KHz的PWM,周期为1/25KHZ
EvaRegs.T1CMPR=0x0258; //占空比为40%,低电平有效
EvaRegs.T1CNT=0;
EvaRegs.T2PR=0x05DB; //25KHz的PWM,周期为1/25KHZ
EvaRegs.T2CMPR=0x0384; //占空比为40%,高电平有效
EvaRegs.T2CNT=0;
EvaRegs.COMCONA.bit.CENABLE=1; //使能比较单元的比较操作
EvaRegs.COMCONA.bit.FCOMPOE=1; //全比较输出,PWM1-6引脚均由相应的比较逻辑驱动
EvaRegs.COMCONA.bit.CLD=2;
//死区时间为:4.27us
EvaRegs.DBTCONA.bit.DBT=4; //死区定时器周期,m=4
EvaRegs.DBTCONA.bit.EDBT1=1; //死区定时器1使能位
EvaRegs.DBTCONA.bit.EDBT2=1; //死区定时器2使能位
EvaRegs.DBTCONA.bit.EDBT3=1; //死区定时器3使能位
EvaRegs.DBTCONA.bit.DBTPS=4, //死区定时器预定标因子 Tdb=37.5M/16=2.34M
EvaRegs.ACTR.all=0x0666; //设定引脚PWM1-PWM6的动作属性
EvaRegs.CMPR1=0x01C2; //PWM1占空比为60% PWM2占空比为40% 80 20
EvaRegs.CMPR2=0x01C2; //PWM3占空比为60% PWM4占空比为40%
EvaRegs.CMPR3=0x01C2; //PWM5占空比为100% PWM6占空比为0
//EVB模块
EvbRegs.T3CON.bit.TMODE=1; //连续增/减模式
EvbRegs.T3CON.bit.TPS=1; //T3CLK=HSPCLK/2=37.5M
EvbRegs.T3CON.bit.TENABLE=0; //暂时禁止T3计数
EvbRegs.T3CON.bit.TCLKS10=0; //使用内部时钟,T3CLK
EvbRegs.T3CON.bit.TECMPR=1; //使能定时器比较操作
EvbRegs.T4CON.bit.TMODE=1; //连续增/减模式
EvbRegs.T4CON.bit.TPS=1; //T4CLK=HSPCLK/2=37.5M
EvbRegs.T4CON.bit.TENABLE=0; //暂时禁止T4计数
EvbRegs.T4CON.bit.TCLKS10=0; //使用内部时钟,T4CLK
EvbRegs.T4CON.bit.TECMPR=1; //使能定时器比较操作
EvbRegs.GPTCONB.bit.TCOMPOE=1; //定时器比较输出T3PWM_T3CMPR和T4PWM_T4CMPR由各自的定时器比较逻辑驱动
EvbRegs.GPTCONB.bit.T3PIN=1; //低电平有效
EvbRegs.GPTCONB.bit.T4PIN=2; //高电平有效
EvbRegs.T3PR=0x493E; //1KHz的PWM,周期为1ms
EvbRegs.T3CMPR=0x1D4C; //占空比为40%,低电平有效
EvbRegs.T3CNT=0;
EvbRegs.T4PR=0x493E; //1KHz的PWM,周期为1ms
EvbRegs.T4CMPR=0x2BF2; //占空比为40%,高电平有效
EvbRegs.T4CNT=0;
EvbRegs.COMCONB.bit.CENABLE=1; //使能比较单元的比较操作
EvbRegs.COMCONB.bit.FCOMPOE=1; //全比较输出,PWM7-12引脚均由相应的比较逻辑驱动
EvbRegs.COMCONB.bit.CLD=2;
//死区时间为:4.27us
EvbRegs.DBTCONB.bit.DBT=10; //死区定时器周期,m=10
EvbRegs.DBTCONB.bit.EDBT1=1; //死区定时器1使能位
EvbRegs.DBTCONB.bit.EDBT2=1; //死区定时器2使能位
EvbRegs.DBTCONB.bit.EDBT3=1; //死区定时器3使能位
EvbRegs.DBTCONB.bit.DBTPS=4, //死区定时器预定标因子 Tdb=37.5M/16=2.34M
EvbRegs.ACTRB.all=0x0999; //设定引脚PWM7-PWM12的动作属性
EvbRegs.CMPR4=0x1D4C; //PWM7占空比为40%d4c
EvbRegs.CMPR5=0x1D4C; //PWM9占空比为40%
EvbRegs.CMPR6=0x1D4C; //PWM11占空比为40%
}
(4)设置主程序。
void main(void)
{
InitSysCtrl(); //初始化系统函数
DINT;
IER = 0x0000; //禁止CPU中断
IFR = 0x0000; //清除CPU中断标志
InitPieCtrl(); //初始化PIE控制寄存器
InitPieVectTable(); //初始化PIE中断向量表
InitGpio(); //初始化Gpio口
InitEv(); //初始化EV
EvaRegs.T1CON.bit.TENABLE=1; //使能定时器T1计数操作
EvaRegs.T2CON.bit.TENABLE=1; //使能定时器T2计数操作
EvbRegs.T3CON.bit.TENABLE=1; //使能定时器T3计数操作
EvbRegs.T4CON.bit.TENABLE=1; //使能定时器T4计数操作
while(1)
{
}
}
EVA 模块PWM1生成的PWM信号(由于最近实验器材紧张,所以测出来效果不太好)
EVB 模块PWM7生成的PWM信号(由于最近实验器材紧张,所以测出来效果不太好)
下一期将带来利用DSPF2812产生SPWM信号程序。