⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spwm.c

📁 本程序是通过TMS320CS2047的DSP处理器,经过DSP内部事件管理器的配合,实现SPWM波输出!
💻 C
字号:

#include "f2407.h"
//#include "sin.h"
int i;
#define uint unsigned long int 
uint t1,t2,t3,x1,x2,x3,X,Y,Z;
signed int  w,h,L,M=64;
const int sin_tab[]={  
 0,    8,   17,    26,  35,    44,  53,    62,  71,   80, 
 88,   97,  106,  115,  123,  132,  141,  149,  158,  166,
175,  183,  191,  200,  208,  216,  224,  232,  240,  248,
255,  263,  271,  278,  286,  293,  300,  308,  315,  322, 
329,  335,  342,  349,  355,  362,  368,  374,  380,  386,
392,  397,  403,  408,  414,  419,  424,  429,  434,  438,
443,  447,  452,  456,  460,  464,  467,  471,  474,  477,
481,  484,  486,  489,  492,  494,  496,  498,  500,  502,
504,  505,  507,  508,  509,  510,  510,  511,  512,  512,
512,  512,  512,  511,  510,  510,  509,  508,  507,  505,
504,  502,  500,  498,  496,  494,  492,  489,  486,  484,
481,  477,  474,  471,  467,  464,  460,  456,  452,  447,
443,  438,  434,  429,  424,  419,  414,  408,  403,  397,
392,  386,  380,  374,  368,  362,  355,  349,  342,  335,
329,  322,  315,  308,  300,  293,  286,  278,  271,  263,  
256,  248,  240,  232,  224,  216,  208,  200,  191,  183,  
175,  166,  158,  149,  141,  132,  123,  115,  106,  97,  
88,   80,    71,  62,    53,  44,    35,   26,  17,     8, 
0,     -8,    -17,   -26,   -35,   -44,   -53,   -62,   -71,  -80, 
-88,   -97,   -106,  -115,  -123,  -132,  -141,  -149,  -158, -166,  
-175,  -183,  -191,  -200,  -208,  -216,  -224,  -232,  -240,  -248,  
-255,  -263,  -271,  -278,  -286,  -293,  -300,  -308,  -315,  -322,  
-329,  -335,  -342,  -349,  -355,  -362,  -368,  -374,  -380,  -386,  
-392,  -397,  -403,  -408,  -414,  -419,  -424,  -429,  -434,  -438,  
-443,  -447,  -452,  -456,  -460,  -464,  -467,  -471,  -474,  -477,  
-481,  -484,  -486,  -489,  -492,  -494,  -496,  -498,  -500,  -502,
-504,  -505,  -507,  -508,  -509,  -510,  -510,  -511,  -512,  -512,  
-512,  -512,  -512,  -511,  -510,  -510,  -509,  -508,  -507,  -505,  
-504,  -502,  -500,  -498,  -496,  -494,  -492,  -489,  -486,  -484,  
-481,  -477,  -474,  -471,  -467,  -464,  -460,  -456,  -452,  -447,  
-443,  -438,  -434,  -429,  -424,  -419,  -414,  -408,  -403,  -397,  
-392,  -386,  -380,  -374,  -368,  -362,  -355,  -349,  -342,  -335,  
-329,  -322,  -315,  -308,  -300,  -293,  -286,  -278,  -271,  -263,  
-256,  -248,  -240,  -232,  -224,  -216,  -208,  -200,  -191,  -183,
-175,  -166,  -158,  -149,  -141,  -132,  -123,  -115,  -106,  -97,  
-88,   -80,   -71,   -62,   -53,   -44,    -35,  -26,  -17,  -8};
int initial()
{
 asm(" setc SXM");//符号扩展位有效
 asm(" clrc OVM");//累加器结果正常益出
 asm(" clrc CNF");//B0=RAM
 *SCSR1=0X81FE; //系统
 *WDCR=0X0E8; //DOG 
 *IMR=0X0000; //禁止所有中断
 *IFR=0X0FFFF; //清除全部中断标志
 WSGR=0X0000; //禁止所有的等待状态
 i=0;
}
int pwminitial()
{
 *MCRC=*MCRC|0X007F;//设置 IOE1-6为基本方式
 *GPTCONB=0X0040;//0000 0000 0100 0000使用所有通用定时器输出
 *T3CON=0X084E;  //0000 1000 0100 1110    连续增减记数 不分频 内部时钟
 *EVBIMRA=0X0200;//0000 0010 0000 0000 
 *COMCONB=0X8200;//1000 0010 0000 0000 比较控制寄存器
 *ACTRB=0X0999;  //0000 0110 0110 1001 
 *DBTCONB=0X0FFE8; //死区设置
   //1111 1111 1110 0100 m=16 p=001二分频  0.025*16*
 *T3CNT=0X00;
 *CMPR4=0X1000;  //比较寄存器初始设置
 *CMPR5=0X1000;
 *CMPR6=0X1000;
 *T3PR=1111; //0110 0000 0000 0000  周期寄存器设置10ms=T3PR*0.025ns
                  //T3PR=400
 
}
void interrupt nothing()
{
 return;
}
 void interrupt T3INT()
{
   if ( w>360 ) w= 0 ;
   {           
   if (sin_tab[w]<0)
    {t1=M*abs(sin_tab[w]);
                 t1>>=6; //M值定标
     x1=-t1;
    }
    else
     {t1=M*(sin_tab[w]);
                 t1>>=6;  //M值定标
                 x1=t1;
    }
               t1 = (512+x1) ;
    X = (*T3PR)*t1;
    X >>=10;  //512定标移9bit,T3PR/2
    *CMPR4=X;
    
   h= w + 120 ;
   if (h> 360 ) h = h - 360 ; 
    {
    if (sin_tab[h]<0)
     {t2=M*abs(sin_tab[h]);
                  t2>>=6;
     x2=-t2;
     }
    else
      {t2=M*(sin_tab[h]);
                  t2>>=6;
                  x2=t2;
     }
    t2 =(512+x2);
    Y = *T3PR*(unsigned long )t2;
     Y >>= 10;
    *CMPR5=Y;
    }
    
   L= w + 240 ;
   if (L> 360 ) L = L - 360 ; 
    {
    if (sin_tab[L]<0)
     {t3=M*abs(sin_tab[L]);
                  t3>>=6;
     x3=-t3;
     }
    else
      {t3=M*(sin_tab[L]);
                  t3>>=6;
                  x3=t3;
     }
    t3 =(512+x3);
    Z = *T3PR*(unsigned long )t3;
    Z >>=10;
    *CMPR6=Z;
    }   
       
   }
 w=w+1;
 *EVBIFRA=*EVBIFRA&0X0200;//清除定时器3周期中断标志,否则以后中断被忽略
 asm(" clrc INTM");//enable globle interrupt
 return;
}
main()
{
 asm(" setc INTM");//关总中断
 initial();
 pwminitial();
 *IMR=0XFFFF;
 *T3CON=*T3CON|0X0040;//起用定时器3
 asm(" clrc INTM");//关总中断
 while(1)
  {
  asm(" nop");
  asm(" nop");
  asm(" nop");
  asm(" nop");
  asm(" nop");
  asm(" nop");
  asm(" nop");
  asm(" nop");
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -