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

📄 v_nd_spwm.c

📁 本程序通过F2812实现SPWM,开发平台CCS
💻 C
字号:
#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File
#include "float.h"
#include "math.h"
#define PI 3.1415926
//发送数据包括:f_s=1~400(0x0001~0x0190需要两个字节)调制度N=0~99(放大100倍0x00~0x63需要1个字节)
//串口中断变量
volatile unsigned char ReceiveData[3]={0x00,0x00,0x00};//一次接收三个数据,以发送16进制发送,但是认为是10进制数.

//定时器变量
volatile unsigned int f_s=50,N,i;/*f_s:信号频率,N:调制比*/
volatile float M=0.5,sindata,Tz,M_new=0;
volatile float *pa,*Dataram;
volatile long int ftime=15000;//CPU频率为150M=150 00*10000
volatile unsigned int f_s_new=0;
//子程序声明
void scia_fifo_init(void);
void sci_check(void);
//中断声明
interrupt void T1P_PWMISR(void); 
interrupt void sciaRxFifoIsr(void);
//********************定时器周期中断********************************

#pragma CODE_SECTION(T1P_PWMISR, "ramfuncs");
#pragma CODE_SECTION(sciaRxFifoIsr, "ramfuncs");
interrupt void T1P_PWMISR(void)    // EV-A
{
  // Insert ISR Code here

  // To receive more interrupts from this PIE group, acknowledge this interrupt 
  // PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
  
  // Next two lines for debug only to halt the processor here
  // Remove after inserting ISR Code
  if(EvaRegs.EVAIFRA.all&&0x0080)
    {
      if(i>=N)
        i=0;
        EvaRegs.CMPR1=(EvaRegs.T1PR>>1)*(1-M*(*(pa+i)));
    }
   i++;
   EvaRegs.EVAIFRA.bit.T1PINT=1; 	// Clear Interrupt flag
   PieCtrlRegs.PIEACK.all|= PIEACK_GROUP2;  // Issue PIE ack
  asm(" clrc INTM");  
}


//*******************SCI-A receive interrupt****************
interrupt void sciaRxFifoIsr(void)
{   
    unsigned char k;
    unsigned long j;
	unsigned char ReceiveData_hold=0;
   for(k=0;k<3;k++)
	  {
	    ReceiveData[k]=SciaRegs.SCIRXBUF.all;	 // Read data
   for(j=0;j<2000;j++)
        {asm("	NOP");}
	  }
   
    f_s_new=(ReceiveData[0]&&0x0f)*100;
    ReceiveData_hold=ReceiveData[1];
    f_s_new=(ReceiveData_hold&&0x0f)*1+f_s_new;
    ReceiveData_hold=((ReceiveData_hold&&0x0f0)>>4);
    f_s_new+=((ReceiveData_hold&&0x0f)*10);
    
    ReceiveData_hold=ReceiveData[2];
    M_new=(ReceiveData_hold&&0x0f);
    ReceiveData_hold=((ReceiveData_hold&&0x0f0)>>4);
    M_new+=(ReceiveData_hold&&0x0f)*10;
    M_new=M_new/100.0;
	  	
    EINT;
    EnableInterrupts();                      
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|= PIEACK_GROUP9;       // Issue PIE ack
}

//*******************************************************************
void Init_spwm(void)
{
// f_s=1;
// M=0.9;
 N=99;//对应于f_s=400,fc=39.6k
 while((N*f_s)<=40000)
      N+=3;
 Tz=10000*1.0/(f_s*N);
}

//Gpio 初始化
void Init_Gpio(void)
{EALLOW;
 GpioMuxRegs.GPAMUX.all=0x0003;//pwm0 1
 GpioMuxRegs.GPADIR.all=0x0003;//OUT
 GpioMuxRegs.GPDMUX.all=0x0000;//state
 GpioMuxRegs.GPADIR.all=0x0000;
 //scia
 GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
 GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
 EDIS;
}


//EVA 初始化
void Init_EVA(void)
{/*T1 time 比较输出*/
 EvaRegs.GPTCONA.all=0xe065;
 EvaRegs.ACTRA.all=0x0666;//比较方式控制
 EvaRegs.T1PR=Tz*ftime/2;
 EvaRegs.CMPR1=(EvaRegs.T1PR>>1)*(1-M*(*(pa+i)));
 EvaRegs.DBTCONA.all=0x0f35;//死区1us
 EvaRegs.T1CNT=0x0000;
 EvaRegs.COMCONA.all=0x4b00;
 EvaRegs.COMCONA.all=0xcb00;//使能比较
 EvaRegs.T1CON.all=0xc80c;
 EvaRegs.T1CON.all=0xc84c;
}



//sin值
void Init_sindata(void)
{ sindata=0;
  Dataram=(float*)0x100000;
 for(i=1;i<=N;i++)
  {sindata=2*PI;
   sindata=sindata*f_s;
   sindata=sindata*i*Tz/10000;
   sindata=sin(sindata);
   *Dataram++=sindata;
  }
}

//*****************************************scia init*****************
void scia_fifo_init(void)										
{
   SciaRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback 
                                  // parity:EVEN, 8 char bits,
                                  // async mode, idle-line protocol
   SciaRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK, 
                                  // Disable RX ERR, SLEEP, TXWAKE
   SciaRegs.SCICTL2.bit.TXINTENA =1; //enable TX interrupt
   SciaRegs.SCICTL2.bit.RXBKINTENA =1;  //enable RX interrupt
   SciaRegs.SCIHBAUD = 0x0001;//0x000f;//0x0007;//0x0000;//0x0001;//1200/2400/4800/9600/
   SciaRegs.SCILBAUD = 0x00E7;//0x0041;//0x00a0;//0x0079;//0x00E7;
   SciaRegs.SCICCR.bit.LOOPBKENA =0; // Disable loop back  
   SciaRegs.SCIFFTX.all=0xC027;//0xE040; 1100 0000 0010 0111
   SciaRegs.SCIFFRX.all=0x2023;//0x204F;
   SciaRegs.SCIFFCT.all=0x00;

   SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset 
   SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;  //Relinquish TXFIFO from Reset
   SciaRegs.SCIFFRX.bit.RXFIFORESET=1;	 //Relinquish RXFIFO from Reset
     									     									    									    									
}


/*void sci_check(void)
{   
    unsigned char i;
    unsigned long j;
	
   for(i=0;i<3;i++)
 {
	ReceiveData[i]=SciaRegs.SCIRXBUF.all;	 // Read data
     for(j=0;j<2000;j++)
        {asm("	NOP");}
 }
    f_s_new=(ReceiveData[0]&&0x0f)*100;
    f_s_new+=(((ReceiveData[1]&&0x0f0)>>4)*10+ReceiveData[1]&&0x0f);
    M_new=((ReceiveData[2]&&0x0f0)>>4)*10+ReceiveData[2]&&0x0f;
    M_new=M_new/100;	  	
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
}
*/
void vvvf_change(void)
{ unsigned long j;  
 if((f_s!=f_s_new||M!=M_new)&&i==0)
   {
    f_s=f_s_new;
    M=M_new;
    Init_spwm();
    Init_sindata();//重新计算查表值
  for(j=0;j<2000;j++)
    { asm("   NOP");}
    
   }
}     
     
void main(void)
{  unsigned long j;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP281x_SysCtrl.c file.
   InitSysCtrl();
 for(j=0;j<2000;j++)
   { asm("   NOP");}
   EALLOW;
   SysCtrlRegs.HISPCP.all = 0x0000;
   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
   EDIS;
   
   Init_Gpio();
   
   Init_spwm();
   
   Init_sindata();
   i=0;
   pa=(float*)0x100000;
   
   scia_fifo_init();  // Init SCI-A
      
   Init_EVA();
   
   DINT;
// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;//开INT2 CPU 中断
   IFR = 0x0000;
   
   InitPieCtrl();
   
   InitPieVectTable();
   
   EALLOW;										// This is needed to write to EALLOW protected registers
   PieVectTable.T1PINT = &T1P_PWMISR;
   PieVectTable.RXAINT = &sciaRxFifoIsr; //scia receive
   EDIS;   
   
   PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   // Enable the PIE block   
   PieCtrlRegs.PIEIER2.bit.INTx4 = 1;
   PieCtrlRegs.PIEIER9.bit.INTx1 = 1;   //scia
   EvaRegs.EVAIMRA.all=0x0080;//开T1周期中断
   EvaRegs.EVAIFRA.all=0x0080;//清T1周期中断   
  // Enable all SCIA RXINT interrupt
   
   IER|= M_INT2;//开INT2 CPU 中断
   IER |= 0x0100;  // enable PIEIER9, and INT9
   
   EnableInterrupts();
   pa=(float*)0x100000;
   
  for(j=0;j<20000;j++)
   { asm("   NOP");}
  
  while(1)
 {
  vvvf_change();
 }

}

⌨️ 快捷键说明

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