📄 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调节器的输出
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 + -