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

📄 spwm.c

📁 本文件提供了SWWP的DSP2812解决方案源程序
💻 C
字号:
#include "IQmathLib.h"
#include "DSP281x_Device.h"
#include <math.h>
#include "parameter.h"
//#define CPU_CLOCK_SPEED      6.6667L   // for a 150MHz CPU clock speed
#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L)

#define ADC_usDELAY  5000L
#define ADC_usDELAY2 20L

#define PI 3.14159265358979
#define PI23 2.094395102
#define PI43 4.188790204

// 定义指示灯控制寄存器地址和寄存器类型
#define LBDS (*((unsigned int *)0xc0000))
// 定义拨码开关控制寄存器地址和寄存器类型
#define DIPS (*(unsigned int *)0xc0001)

//global variable definition
int k = 0;
_iq F2M=_IQ(0.018);  //调制度对调制波频率的比例系数0.9/50
_iq21 PITC = _IQ21(0.0001*PI); //PI倍载波周期,original value is"0.0001*PI"
int T_QUA = 1875;  //Tc/4的定时器计数脉冲个数,定时周期为100us(7500个脉冲)
_iq16 F_CARR =  _IQ16(10000); //载波频率,10KHz,original value is"10000"
_iq16 F_MODU = _IQ16(50); //调制波频率
int PMIN = 600;  //最小正脉宽(脉冲个数)。
int PMAX = 6900; //最小负脉宽时的最大正脉宽(脉冲个数)。 
int Pperiod = 7500; //一个周期的脉冲数
int N,KMAX;  //载波比N,K循环次数KMAX
_iq M;  //调制度
_iq TEMP1,TEMP2,TEMP3,TEMP4,TEMP5,TEMP6;
_iq16 Q16TEMP1,Q16TEMP2,Q16TEMP3,Q16TEMP4,Q16TEMP5,Q16TEMP6;
int PULSE1 = 0;
int PULSE2,PULSE3;


//main function 
void main(void)
{
//system initialization
  InitSysCtrl();

//Disable and clear all of the cpu interrupts:
  DINT;
  IER = 0x0000;
  IFR &= 0x0000;

//Initialize PIE to the default status:
  InitPieCtrl();

//Initialize PIE vector table:
  InitPieVectTable();

// Enable PIE group 2 interrupt 6 for T1UFINT
    PieCtrlRegs.PIEIER2.all = M_INT6;
// Enable CPU INT2 for ADCINT:
	IER |= M_INT2;

	EINT;
	ERTM;



 //F_MODU = _IQ16(50);  //调制波频率
 N = _IQ16int(_IQ16div(F_CARR,F_MODU)); 
 KMAX = 2*N;
 M = _IQmpy(F2M,_IQ16toIQ(F_MODU));


//Initialize EVA:  HSPCLK=7.5 MHz(0.133333333us)
  EvaRegs.COMCONA.all=0x06E0;  //禁止比较操作;不使能空间矢量PWM方式;T3CNT下溢或周期匹配时重装载ACTRA
                               //PWM1-6输出由相应比较逻辑驱动。
  EvaRegs.ACTRA.all = 0x0999;    //;CMP1,3,5高有效,CMP2,4,6低有效
  EvaRegs.T1CON.all = 0x0802;  //一旦仿真挂起,立即停。连续增/减计数模式。
                             //输入时钟预定标系数X/1。使用内部CPU时钟,禁止定时器操作
  EvaRegs.COMCONA.all = 0x8200;
  EvaRegs.EVAIMRA.bit.T1UFINT = 1;//使能定时器1下溢中断

  EvaRegs.T1PR = 0x0EA6;     //Time1周期寄存器写入3750,定时100us。
  EvaRegs.DBTCONA.all = 0x0CFC;  //定时PWM死区时间5 us
  EvaRegs.CMPR1 = 0x1D4C;    //占空比初值0%
  EvaRegs.CMPR2 = 0x1D4C;
  EvaRegs.CMPR3 = 0x1D4C;
  EvaRegs.T1CON.bit.TENABLE = 1; //使能定时器1


//Initialize GPIO:
  EALLOW;
  GpioMuxRegs.GPAMUX.all = 0x003F; //将GPIOA0-GPINA5(PWM1-PWM6)配置为外设I/O端口
  GpioMuxRegs.GPADIR.all = 0x007F; //将GPIOA0-GPINA5(PWM1-PWM6)配置为输出,T1PWM作为run输出信号
  GpioMuxRegs.GPDMUX.all = 0x0001; //将GPIOD0(PDPINTA)配置为外设I/O端口
  GpioMuxRegs.GPDDIR.all = 0x0000; //将GPIOD0(PDPINTA)配置为输入
  EDIS;


  PieVectTable.T1UFINT = & T1UFINT_ISR;


//Loop and wait
  //for(;;);
  while ( 1 )
	{
		LBDS=DIPS;	// 读取拨码开关状态直接送指示灯显示
		GpioDataRegs.GPADAT.all = DIPS<<6;
	}
}

interrupt void  T1UFINT_ISR(void)     
{
  TEMP1 = _IQ21toIQ(_IQ21mpy(_IQ21(k),PITC));
  TEMP1 = _IQmpy(TEMP1,_IQ16toIQ(F_MODU));
  TEMP2 = TEMP1+_IQ(PI23);
  if((TEMP2-_IQmpy(_IQ(2),_IQ(PI))) > _IQ(0))
      TEMP2 = TEMP2-_IQmpy(_IQ(2),_IQ(PI));
  TEMP3 = TEMP1+_IQ(PI43);
  if((TEMP3-_IQmpy(_IQ(2),_IQ(PI))) > _IQ(0))
      TEMP3 =TEMP3-_IQmpy(_IQ(2),_IQ(PI));
  TEMP1 = _IQmpy(M,_IQsin(TEMP1));
  TEMP2 = _IQmpy(M,_IQsin(TEMP2));
  TEMP3 = _IQmpy(M,_IQsin(TEMP3));
  TEMP1 = _IQ(1)+TEMP1;
  TEMP2 = _IQ(1)+TEMP2;
  TEMP3 = _IQ(1)+TEMP3;
  Q16TEMP1 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP1));
  Q16TEMP2 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP2));
  Q16TEMP3 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP3));
  k=k+1;
  TEMP4 = _IQ21toIQ(_IQ21mpy(_IQ21(k),PITC));
  TEMP4 = _IQmpy(TEMP4,_IQ16toIQ(F_MODU));
  TEMP5 = TEMP4+_IQ(PI23);
  if((TEMP5-_IQmpy(_IQ(2),_IQ(PI))) > _IQ(0))
      TEMP5 = TEMP5-_IQmpy(_IQ(2),_IQ(PI));
  TEMP6 = TEMP4+_IQ(PI43);
  if((TEMP6-_IQmpy(_IQ(2),_IQ(PI))) > _IQ(0))
      TEMP6 = TEMP6-_IQmpy(_IQ(2),_IQ(PI));
  TEMP4 = _IQmpy(M,_IQsin(TEMP4));
  TEMP5 = _IQmpy(M,_IQsin(TEMP5));
  TEMP6 = _IQmpy(M,_IQsin(TEMP6));
  TEMP4 = _IQ(1)+TEMP4;
  TEMP5 = _IQ(1)+TEMP5;
  TEMP6 = _IQ(1)+TEMP6;
  Q16TEMP4 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP4));
  Q16TEMP5 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP5));
  Q16TEMP6 = _IQ16mpy(_IQ16(T_QUA),_IQtoIQ16(TEMP6));

  Q16TEMP1=Q16TEMP1+Q16TEMP4;
  Q16TEMP2=Q16TEMP2+Q16TEMP5;
  Q16TEMP3=Q16TEMP3+Q16TEMP6;
  PULSE1 = _IQ16int(Q16TEMP1); //C相脉宽(脉冲数)
  PULSE2 = _IQ16int(Q16TEMP2); //B相脉宽(脉冲数)
  PULSE3 = _IQ16int(Q16TEMP3); //A相脉宽(脉冲数)
  
  if(PULSE1<PMIN)
     PULSE1 = 0;
  else if(PULSE1>PMAX)
     PULSE1 = Pperiod;
  if(PULSE2<PMIN)
     PULSE2 =0;
  else if(PULSE2>PMAX)
     PULSE2 = Pperiod;
  if(PULSE3<PMIN)
     PULSE3 =0;
  else if(PULSE3>PMAX)
     PULSE3 = Pperiod;
  
  PULSE1 = (Pperiod-PULSE1)/2;
  PULSE2 = (Pperiod-PULSE2)/2;
  PULSE3 = (Pperiod-PULSE3)/2;

  EvaRegs.CMPR1 = PULSE1;
  EvaRegs.CMPR2 = PULSE2;
  EvaRegs.CMPR3 = PULSE3;
  k=k+1;
  if(k>KMAX)
    k = 0;



//清除中断标志
  EvaRegs.EVAIFRA.bit.T1UFINT = 1;
  PieCtrlRegs.PIEACK.bit.ACK2 = 1;
  IER |= M_INT2;
  EINT;
   

}

⌨️ 快捷键说明

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