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

📄 spwm.c

📁 在采样的基础上实现数码管显示和利用TI公司的FFT算法进行运算
💻 C
字号:
#include "spwm.h"
#include "qmath.h"
SPWM  spwm_moudle;
int   PWM_Pulse[MaxPulsNum] ;  //存放脉宽数据
int   PWM_Buf[MaxPulsNum];     //数据缓冲区
int   *pPWMData=PWM_Pulse;
int   PWM_Calcu_Buf[PWMNum];
int   OpenAngle[ControlHamanic];
int   OpenAmple[ControlHamanic];
const AngleShif[3]={0,21845,-21845};  //正负120度
void spwm_init(SPWM_Handle p)
{
  p->Ample[0]=16384;       //3
 // p->Ample[0]=0;         //3
//  p->Ample[1]=16384;     //5
  p->Ample[1]=0;           //5
  p->Ample[2]=16384;      //幅值调制度0.5,Q15
 // p->Ample[2]=0; 
 
  p->Angle[0]=16384;
  p->Angle[1]=0;
  p->Angle[2]=0;  //相位
  
  p->Kp=16384;
  p->Ki=16384;
  p->Kd=16384;
  
  p->PulseA=0x10;
  p->PulseB=0x50;
  p->PulseC=0xff;
  
 // p->MaudleK=32767;           //调制度为1
  p->MaudleK=31129;            //最大调制系数为0.95
  p->VoutToMaudleK=82;        // 1/400
  p->T=0x0619;                //  T0/2
  p->ControlMode=OpenControl;
  
}

void spwm_calc(SPWM_Handle p)
{ 
   long Sumtemp=0; 
   int  i,j,temp,MaxPWMOut;
   int  K;       //比例系数,默认为1
   int  AngleAdd[ControlHamanic]={0,0,0};  //各次谐波
 
   for(j=0;j<3;j++)
   {
      AngleAdd[0]=p->Angle[0]+AngleShif[j];
      AngleAdd[1]=p->Angle[1]+AngleShif[j];
      AngleAdd[2]=p->Angle[2]+AngleShif[j];
      K=32767;
      MaxPWMOut=0;
      
      for(i=0;i<PWMNum;i++)                              //计算各相128点
      {
        Sumtemp=0;
        Sumtemp+=(((long)p->Ample[0]*qsinlt(AngleAdd[0])<<1)>>2); //Q29  
        Sumtemp+=(((long)p->Ample[1]*qsinlt(AngleAdd[1])<<1)>>2);
        Sumtemp+=(((long)p->Ample[2]*qsinlt(AngleAdd[2])<<1)>>2);  
        temp=(Sumtemp>>16);                 //Q13,为防止溢出
        PWM_Calcu_Buf[i]=temp;
        if (abs(temp)>MaxPWMOut) 
            MaxPWMOut=abs(temp);
            
       AngleAdd[0]+=ThirdAngleAdd;
       AngleAdd[1]+=FifthAngleAdd;
       AngleAdd[2]+=SevenAngleAdd;
      }
   
      temp=p->MaudleK>>2;                 //Q15-->Q13,限幅处理
      if(MaxPWMOut>temp)                  //K=temp/MaxPWMOut;
      {
         Sumtemp=qinv1(MaxPWMOut);            //((Q18-->Q15)*Q15)--->Q15
         K=((Sumtemp>>3)*p->MaudleK)>>15;
      }
   
      for(i=0;i<PWMNum;i++)
      {
      //  temp=(long)PWM_Calcu_Buf[i]*K>>13;  //Q13*Q15--->Q15
      //  temp+=32768;
      //  PWM_Buf[i+j]=(long)temp*p->T>>15;
      
      temp=(32768+((long)PWM_Calcu_Buf[i]*K>>13))>>1;
      PWM_Buf[i*3+j]=(long)temp*p->T>>14;        //C相
      }
      
   }
   
   //21845
}

⌨️ 快捷键说明

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