利用DSPF2812的EVA和EVB模块产生带死区的PWM信号(带示波器实验结果波形)

事件管理器的英文名为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信号程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值