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

📄 clarke.c

📁 CLARKE变换 非常简单实用的DSP三相交流异步电机控制程序
💻 C
字号:
//本程序完成三个矢量变换,磁链位置计算,以及三个PI控制器的设计
extern unsinged IA;       //A相电流   A/D转换后的电流
extern unsinged IB;        //B相电流
extern unsinged IC;          //C相电流
extern unsinged I_alfa;     //α轴电流   (CLARKE变换后的输出)
extern unsinged I_beta;        //β轴电流
extern unsinged V_alfa;        //α轴电压   (PARK逆变换的输出)
extern unsinged V_beta;        //α轴电压
extern unsinged IM;           //M轴电流  (PARK变换的输出)
extern unsinged IT;          //T轴电流 
extern unsinged VM;          	//电流PI调节器的输出
extern unsinged VT;
extern unsinged theta=0;            //转子磁链位置(用于参与PARK变换和PARK逆变换)
extern unsinged Rr;           //转子电阻
extern unsinged Lr;         //转子电感
extern unsinged Wn;       //额定电角频率 Wn=2π*50
extern unsinged Kt;       //常数  Kt=Rr/Lr*Wn
extern unsinged Kr;        //Kr=T*Rr/Lr   T为采样周期
extern unsinged N;      //反馈速度 由传感器测得
extern unsinged IDK;      //转子d轴k时刻电流
extern unsinged FS;         //转子磁链角频率与额定角频率之比
extern unsinged K=327.68;         //采样周期T为100us的前提下 算得
//////////////////////////////////////////////
//定义变量(PI调节器的)以下各变量无须定义为外部变量,因为只在本程序内部使用
float Kp;                       //PI调节的比例常数
float Ti;                       //PI调节的积分常数
float T;                        //采样周期
float Ki;
float ek;                       //偏差ek
float ek1;                      //偏差e[k-1]
float ek2;                      //偏差e[k-2]
float uk;                       //uk
signed int uk1;                 //对uk四舍五入取整
signed int adjust;              //调节器输出调整量
unsigned VT_ref,VM_ref;
unsigned IT_ref,IM_ref=0,N_ref=1500,N=1000,VMAX,VMIN; //IT=100,IM=100


//PI调节器各变量赋初值
void init(void)
{
    Kp=4.0;
    Ti=0.005;
    T=0.001;
    Ki=Kp*T/Ti;  //Ki=0.8
// Ki=KpT/Ti=0.8,根据实验调得的结果确定这些参数
    ek=0;
    ek1=0;
    ek2=0;
    uk=0;
    uk1=0;
    adjust=0;
}

void clarke_calc(void)         //clarke变换
{ I_alfa=sqrt(3/2)*IA;
  I_beta=sqrt(2)/2*IA+sqrt(2)*IB;
}


//磁链位置计算
postion_calc(void)
 {
    Kt=Rr/(Lr*Wn);
    Kr=T*Rr/Lr;
    IDK=IDK+KR*(IM-IDK);
    FS=N+Kt*IT/IDK;
    theta=theta+K*FS;
    

  
void park_calc(void)              //park变换
{
    IT=(-qcoslt)(theta)*I_alfa+qsinlt(theta)*I_beta; //theta就是磁链位置计算得到的值
    IM=qcoslt(theta)*I_alfa+qsinlt(theta)*I_beta;  
   
}


//////////////////////////////////////////////////////////////////////////////////////
//以下是转速调节
//转速PI调节
int Speed_piadjust(float ek)  //转速PI调节算法
{
//    for(k=1;k<10000;k++)
        ek=N_ref-N;
    if( gabs(ek)<0.1 )
    {
       adjust=0;
    }
    else 
    {     
       uk=Kp*(ek-ek1)+Ki*ek;  //计算控制增量
       ek1=ek; 
       
       uk1=(signed int)uk;   //对uk作一个四舍五入取整
       if(uk>0)
       {
          if(uk-uk1>=0.5)
          {
             uk1=uk1+1;
          }
       }
       if(uk<0)
       {
          if(uk1-uk>=0.5)
          {
             uk1=uk1-1;
          }
       }
       adjust=uk1;  
       IT_ref=adjust;  
    }        
  //  k=1;
    return IT_ref;
}


//以下是双闭环电流调节 即PI控制器的设计
//T轴PI调节
int Tpiadjust(float ek)  //T轴PI调节算法
{
   
        ek=IT_ref-IT;
    if( gabs(ek)<0.1 )
    {
       adjust=0;
    }
    else 
    {     
       uk=Kp*(ek-ek1)+Ki*ek;  //计算控制增量
       ek1=ek; 
       
       uk1=(signed int)uk;
       if(uk>0)
       {
          if(uk-uk1>=0.5)
          {
             uk1=uk1+1;
          }
       }
       if(uk<0)
       {
          if(uk1-uk>=0.5)
          {
             uk1=uk1-1;
          }
       }
       adjust=uk1;  
       VT_ref=adjust;  
    }        
    //k=1;
       if(VT_ref>VMAX)      //电压保护
         {
           VT_ref=VMAX;
          }
       if(VT_ref<VMIN)
         {
           VT_ref=VMIN;
         }
    return VT_ref;
}


//M轴电流调节
int Mpiadjust(float ek)  //M轴PI调节算法
{
   // for(k=1;k<10000;k++)
        ek=IM_ref-IM;
    if( gabs(ek)<0.1 )
    {
       adjust=0;
    }
    else 
    {     
       uk=Kp*(ek-ek1)+Ki*ek;  //计算控制增量
       ek1=ek; 
       
       uk1=(signed int)uk;
       if(uk>0)
       {
          if(uk-uk1>=0.5)
          {
             uk1=uk1+1;
          }
       }
       if(uk<0)
       {
          if(uk1-uk>=0.5)
          {
             uk1=uk1-1;
          }
       }
       adjust=uk1;  
       VM_ref=adjust; 
        
    }        
   // k=1;
    if(VM_ref>VMAX)      //电压保护
         {
           VM_ref=VMAX;
          }
       if(VM_ref<VMIN)
         {
           VM_ref=VMIN;
         }
      return VM_ref;
}

void ipark_calc(void)
{
   V_alfa=qcoslt(theta)*VM+qsinlt(theta)*VT;   //VT,VM由PI调节器将IM,IT变换而来
   V_beta=qsinlt(theta)*VM+qcoslt(theta)*VT;
   
   //得到的V_alfa,V_beta将拿去SVPWM程序生成波
}






//AD转换


   


⌨️ 快捷键说明

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