首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

]DSP---PWM波形源码

]DSP---PWM波形源码

        DSP2812---PWM波形

//$         Date:   6/11/2009       整理:  eyes417     $
//###########################################################################
//

//   FILE:  Example_281xEvPwm.c

//
//  TITLE:  EV-A --- PWM波形程序

//

//                                   ASSUMPTIONS:
//   
//   Assupplied, this project is configured for "boot to H0"operation.
//   Other thenboot mode pin configuration, no other hardware configuration isrequired.

//
//###########################################################################

# include"DSP281x_Device.h"                       // DSP281x Headerfile Include File
# include"DSP281x_Examples.h"                    // DSP281x Examples Include File
void init_eva(void);
void main(void)
{
  InitSysCtrl();
// InitGpio(); 配置IO口功能为PWM模式
   EALLOW;
   GpioMuxRegs.GPAMUX.all=0x00FF;       // EVA PWM 1-6  pins
   EDIS;

  DINT;                          //关CPU总中断

  InitPieCtrl();                //初始化PIE控制寄存器
  IER = 0x0000;
  IFR = 0x0000;
InitPieVectTable();            //初始化PIE中断向量表

init_eva();                   //初始化EV-A

  EvaRegs.T1CON.bit.TENABLE=1;   //手工启动定时器
  

EINT;       // 使能INTM(全局中断)
ERTM;        //Enable Global realtime interruptDBGM  

  for(;;);

}

//EV-A初始化
void init_eva(void)
{
  EvaRegs.T1PR =37500;   //周期值--连续增减时,PWM频率=TCLK/(2*T1PR)---频率设为1K,PWM=75M/(2*37500)
  EvaRegs.T1CMPR =0x3C00;         // Compare Reg--比较值
  EvaRegs.T1CNT =0x0000;          //计数器初值

//连续增/减模式,x/1分频,内部时钟,使能比较,使用自己的周期,禁止定时器启动(等初始化全部完成后手工启动)
  EvaRegs.T1CON.all = 0x0802;

  EvaRegs.GPTCONA.bit.TCMPOE =1;    //通过逻辑产生T1PWM
  EvaRegs.GPTCONA.bit.T1PIN =1;     //GP定时器1比较时低有效


//使能比较产生1--6 PWM波  1个比较单元控制2路互补的PWM输出,控制PWM占空比

//连续增减--低有效时:PWM占空比=CMPR1/T1PR,高有效时:PWM占空比=(T1PR-CMPR1)/T1PR
  EvaRegs.CMPR1 =15000;           //第一路PWM占空比设为0.4,0.4=15000/37500

  EvaRegs.CMPR2 = 0x3C00;
  EvaRegs.CMPR3 = 0xFC00;


// output pin 1 CMPR1 - 高有效,output pin 2 CMPR1 - 低有效
// output pin 3 CMPR2 - 高有效,output pin 4 CMPR2 -低有效
// output pin 5 CMPR3 - 高有效,output pin 6 CMPR3 - 低有效
  EvaRegs.ACTRA.all =0x0666;         //比较方式控制寄存器,控制PWM引脚的 高/低 有效
  EvaRegs.DBTCONA.all =0x0000;       //静止死区
  EvaRegs.COMCONA.all =0xA600;       //比较控制寄存器--禁止空间矢量PWM模式

}

                    用示波器观察到的PWM波形





                              
                         总结:PWM波形产生流程
1):将I/O口设置为PWM引脚模式
2):设置装载TxCON,决定计数方式,启动比较操作
3):设置装载TxPR,决定PWM波形周期
4):初始化EvaRegs.CMPR1--3的值,每个比较单元控制2路互补的PWM输出,控制PWM占空比
5):EvaRegs.ACTRA比较方式控制寄存器,控制PWM引脚的 高/低 有效
6):EvaRegs.DBTCONA死区时间的设置
7):EvaRegs.COMCONA设置比较控制寄存器

附:

EvaRegs.DBTCONA.bit.DBT=5;                 //死区定时器周期为5
EvaRegs.DBTCONA.bit.EDBT1=1;            //死区定时器1使能
EvaRegs.DBTCONA.bit.DBTPS=3;             //死区定时器预定标因子,死区时钟为HSPCLK/8

PWM模拟实现一般是通过三角波和一个直流量分别输入比较器的两个输入端,其输出实现脉宽调制;

DSP实现PWM就是要模拟三角波和直流电平;
DSP中,定时器定义成增减计数模式,就相当于输出一个三角波,CMPR值就相当于一个固定电平,全比较单元就是比较器,PWM1,2输出就是比较器输出;
改变CMPR值就实现脉宽调节;一个道理
返回列表