garfield

TMS320LF2407硬件产生SVPWM

0
阅读(3202)

电压空间矢量脉宽调制( SVPWM)算法谐波小,电压利用率高,是一种先进的调制方法。在TI的电机控制芯片TMS320LF2407A上产生SVPWM具有结构简单、稳定可靠、成本低廉等优点。在分析SVPWM基本原理的基础上,介绍了TMS320LF2407A芯片产生SVPWM的硬件结构和软件实现方法。

不多说,上程序:

#include "regs240x.h"
#define period 0xafff
#define T0  750
//unsigned char add[100];
unsigned char vec_tab[6];
unsigned char update_flag;
unsigned int t0,t1,t2;
void interrupt gptime1(void);
unsigned int uWork,uWork1;
unsigned int count;
main()
{

 unsigned int k;
 unsigned int temp;
 
 // asm(" setc INTM"); /* 关中断 */
 asm(" clrc SXM"); /* 符号位扩展有效 */
 asm(" clrc OVM"); /* 累加器中结果正常溢出 */
 asm(" clrc CNF"); /* B0被配置为数据存储空间 */
 
/* 关闭看门狗中断 */
 WDCR=0x6f;
 WDKEY=0x5555;
 WDKEY=0xaaaa; 
 SCSR1=0x82fe; /* DSP工作在40MHz */
 IMR=3;   /*  */
 IFR=0x0ffff; /* 清除中断标志 */
 asm(" clrc INTM"); /* 开中断 */
  
 uWork=WSGR;  /* I/O引脚0等待 */
 uWork&=0x0fe3f;
 WSGR=uWork;
 MCRA=MCRA|0x0fc0; /* IOPA6-11被配置为基本功能方式,PWM1-6 */
 ACTRA=0x1666;       /* PWM2低有效,PWM1高有效 */
 DBTCONA=0xae8;  /* 使能死区控制 */
 CMPR1=period/3;    /* 比较单元1设置 */ 
 CMPR2=period/2;  /* 比较单元2设置 */ 
 T1PER=period;  /* 设置定时器1的周期寄存器,以确定不同的输出占空比 */
 EVAIMRA = 0x080; /* 使能T1PINT */
 EVAIFRA = 0xffff; /* 清中断标志 */
// T1CNT=0; 
 COMCONA=0x9200;  /* 使能比较操作 */
 T1CON=0x0800;  /* 定时器1为连续增计数模式 */
 T1CON=T1CON|0x0040; /* 启动定时器1 */
 count=0;
 vec_tab[0]=1;
 vec_tab[1]=3;
 vec_tab[2]=2;
 vec_tab[3]=6;
 vec_tab[4]=4;
 vec_tab[5]=5;
 update_flag=0;
 t0=T0;
 
// for(k=0;k<100;k++){
//  add[k]=k*100;
//  }
 while ( 1 )
 {
  if(update_flag){
   update_flag=0;
   temp=ACTRA;
   ACTRA=(vec_tab[count/80]<<12)+0x666;
   t1=(count%80);
   t1=((long)t1*period)/80;
  // t1=t1/80;
   if(t1<10){
    t1=10;
   }
   if(t1>period-50){
    t1=period-50;
   }
   t2=period-t0;
   CMPR1=t1;     /*比较单元1设置 */ 
   CMPR2=t2;  /*比较单元2设置 */ 
   
  }
//  add[0]=add[0]+1000;
 }
}
void pwm_init(void){
 EVAIMRA = 0x80; /* 使能T1PINT */
 EVAIFRA = 0xffff; /* 清中断标志 */
 GPTCONA = 0x0100; 
 T1PR    = 2000; /* 保存结果周期=2000*25ns=50us=20KHz */
 T1CNT   = 0;  /* 计数器从0开始计数 */
 T1CON   = 0x1040; /* 连续增计数方式,启动计数器 */
}
void interrupt gptime1(void)
{
   uWork1=(PIVR);
   switch ( uWork1 )
   { 
     case 0x27:
     {
   //nNewConvert=1; /* 设置保存标志 */
   (EVAIFRA)=0x80;/* 清中断标志位 */
   count++;
   if(count>=480){
    count=0;
    
   }
   update_flag=1;
         break;
     }
   }
}       
波形:
说明一下:tms320lf2407产生的svpwm波形跟通常所说的svpwm波形不同,它产生的波形有一路是不变的