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

📄 f2812_spwm.c

📁 2812的SPWM程序 基于2812的交流电机SPWM开环调速 以下代码为SPWM开环控制的核心代码
💻 C
字号:
#include "DSP28_Device.h"
#include "DSP28_Ev.h"
#include "math.h"
#include "stdio.h"

void init_eva(void);
void zkb(void);
void interrupt cmprz(void);

#define NX 32
#define PI 3.14
int h1=0;
int k0=0;
int h2;
int flag1;
float M=0.8;
double a[NX];


void main(void)
{   
    InitSysCtrl();
                                                                
    DINT;              //关全局中断
        IER = 0x0000;      //中断使能
        IFR = 0x0000;      //中断标志位
        
        /*初始化PIE控制寄存器*/
        InitPieCtrl();
        
        /*初始化PIE矢量表*/
        InitPieVectTable();        

    
    InitEv();
/*        EALLOW;
    GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6  pins
    EDIS;*/ 
    IER |= M_INT2;
    PieCtrl.PIEIER1.bit.INTx4=1;        
    init_eva();
         
        EINT;                      //开全局中断
        ERTM;             // Enable Global realtime interrupt DBGM
        
         
    while(1)
    { 
      if(flag1==0)
          return;
          else
      {
       void zkb();
       flag1=0;
          }        
        /*  if(k0<=32)
       {
       h1=(k0+11)%33;
       h2=(k0+22)%33;
       EvaRegs.CMPR1=a[k0];
       EvaRegs.CMPR2=a[h1];                                                                                                                                                                            
       EvaRegs.CMPR3=a[h2];
       flag1=1; 
       k0=k0+1;
           }
      else 
       {
        k0=0; 
           }*/
    }
   
}         
        

void init_eva(void)
{  
   EvaRegs.T1PR = 1250;       // Timer1 period PWM载波周期为 65536个定标的定时器时钟周期 
  
   EvaRegs.T1CNT = 0x0000;      // Timer1 counter 

   EvaRegs.T1CON.all = 0x1042;  // 选择模式产生PWM波10

   EvaRegs.GPTCONA.bit.TCOMPOE = 1;  
   EvaRegs.GPTCONA.bit.T1PIN = 1;
   EvaRegs.GPTCONA.bit.T2PIN = 2;

   EvaRegs.EVAIFRA.all=0xffff;
   EvaRegs.EVAIMRA.all=0xffff;

/*EvaRegs.CMPR1 = 0x0c00;  //20%
   EvaRegs.CMPR2 = 0x0780;  //50%
   EvaRegs.CMPR3 = 0x0300;  //80% */
  
   EvaRegs.ACTRA.all = 0x0666;    // 输出PWM的1/3/5为高有效;2/4/6为低有效
   EvaRegs.DBTCONA.all = 0x0000;  // Disable deadband
   EvaRegs.COMCONA.all = 0xAe00;  //使能比较操作
   
   return; 
}


void zkb()
{
  unsigned int n=0;        
  double q,l,j;
  while (n<=NX)         
  {
    q=(n+0.75); 
    q=q*6.28;
    q/=33; 
    j=sin(q);
    l=188*(1+M*j);//M为调制比  
    if(l>=21&l<=353)
    a[n]=l;  
    else
        {
        if(l>353)
         a[n]=375;
        else
         a[n]=26;
        }  
     
    n=n+1;
  }
}


void interrupt cmprz()
{ 
  int h2;
  int flag;
  PieCtrl.PIEACK.bit.ACK6=1;
  asm(" clrc  SXM");
  flag=(EvaRegs.EVAIFRA.all)&&0x0200;      
        if(flag!=0x0200) 
            {
           EINT;
           return;
      } 
        else
     {
      if(k0<=32)
       {
       h1=(k0+11)%33;
       h2=(k0+22)%33;
       EvaRegs.CMPR1=a[k0];
       EvaRegs.CMPR2=a[h1];                                                                                                                                                                            
       EvaRegs.CMPR3=a[h2];
       flag1=1; 
       k0=k0+1;
           }
      else 
       {
        k0=0; 
           }
      }
   EvaRegs.EVAIFRA.all=(EvaRegs.EVAIFRA.all)&&0x0200; // 清除定时器1 下溢中断标志
   EINT;             // 允许总中断,因一进中断服务程序后总中断就自动关闭了
   return; 
    
}

//===========================================================================
// No more.
 

⌨️ 快捷键说明

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