?? clarke.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調(diào)節(jié)器的輸出
extern unsinged VT;
extern unsinged theta=0; //轉子磁鏈位置(用于參與PARK變換和PARK逆變換)
extern unsinged Rr; //轉子電阻
extern unsinged Lr; //轉子電感
extern unsinged Wn; //額定電角頻率 Wn=2π*50
extern unsinged Kt; //常數(shù) 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調(diào)節(jié)器的)以下各變量無須定義為外部變量,因為只在本程序內(nèi)部使用
float Kp; //PI調(diào)節(jié)的比例常數(shù)
float Ti; //PI調(diào)節(jié)的積分常數(shù)
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; //調(diào)節(jié)器輸出調(diào)整量
unsigned VT_ref,VM_ref;
unsigned IT_ref,IM_ref=0,N_ref=1500,N=1000,VMAX,VMIN; //IT=100,IM=100
//PI調(diào)節(jié)器各變量賦初值
void init(void)
{
Kp=4.0;
Ti=0.005;
T=0.001;
Ki=Kp*T/Ti; //Ki=0.8
// Ki=KpT/Ti=0.8,根據(jù)實驗調(diào)得的結果確定這些參數(shù)
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;
}
//////////////////////////////////////////////////////////////////////////////////////
//以下是轉速調(diào)節(jié)
//轉速PI調(diào)節(jié)
int Speed_piadjust(float ek) //轉速PI調(diào)節(jié)算法
{
// 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;
}
//以下是雙閉環(huán)電流調(diào)節(jié) 即PI控制器的設計
//T軸PI調(diào)節(jié)
int Tpiadjust(float ek) //T軸PI調(diào)節(jié)算法
{
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軸電流調(diào)節(jié)
int Mpiadjust(float ek) //M軸PI調(diào)節(jié)算法
{
// 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調(diào)節(jié)器將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 + -