基于PARK-Clark的双闭环PI的永磁同步电机SVPVM控制系统simulink仿真

目录

一、理论基础

1.1 系统概述

1.2 PARK变换

1.3 CLARK变换

二、核心程序

三、仿真测试结果


一、理论基础

      SVPWM算法很适合在数字系统中使用,有很高的直流电压利用率,而且可以有效降低电机的转矩脉振和噪音,其基本结构如下:

      

      三相静止ABC坐标系下的交流信号跟踪问题,在经过Clark变换和Park变换后,转换为两相旋转坐标系下的直流信号跟踪问题,于是,同志们又可以愉快的使用PID控制了。

      瞬时空间磁链矢量圆轨迹法(SVPWM)就是在很短的一段时间间隔内,通过对电压型逆变器的开关状态的线性组合,得到磁链矢量轨迹为圆形的PWM方式。SVPWM控制算法的思想是:运用定子磁链空间矢量跟踪的思想,在正弦波永磁同步电机内部空间产生旋转的圆形磁场,从而产生稳定的电磁转矩。

      三相逆变器对PMSM供电时,SVPWM技术产生的PWM波控制着三相逆变器的六个开关管的开通与关闭。逆变器结构如图1所示,逆变器由三个桥臂六个开关管组成,为避免短路,逆变器同一个桥臂上的两个电子开关交替导通。

1.1 系统概述

        基于PARK-Clark变换和双闭环PI调节器的永磁同步电机PMSM空间矢量脉宽调制SVPWM控制系统是一种高效的电机控制策略,它通过对电机电流和电压的精准控制,实现了对电机转矩和速度的精确控制。

一、基本原理

  1. PARK-Clark变换:PARK-Clark变换是一种数学变换,它将三相电系统(如电机或发电机)的三个正交矢量转换为两个正交矢量和一个直流分量。在PMSM控制中,PARK-Clark变换用于将电机的三相电流(或电压)转换为旋转坐标系下的两个正交矢量和一个直流分量,使得电机的控制更加直观和方便。
  2. 双闭环PI调节器:双闭环PI调节器是一种控制系统,它由两个调节器组成:速度调节器和电流调节器。速度调节器根据设定的速度和实际的速度差值,计算出需要的转矩;电流调节器根据设定的电流和实际电流的差值,计算出需要的电压。双闭环PI调节器通过对电压和电流的精确控制,实现了对电机速度和转矩的精确控制。
  3. SVPWM:SVPWM是一种脉宽调制技术,它通过调节脉冲的宽度和相位,实现对电机电压和电流的精确控制。SVPWM通过对电机电压和电流的控制,实现了对电机转矩和速度的精确控制。

二、数学模型

PARK-Clark变换:对于电机的三相电流ia、ib、ic,PARK-Clark变换的数学公式为:

id = (2/3) * (ia + ib/sqrt(3) + ic/sqrt(3))

iq = (2/3) * (ia + tauib/sqrt(3) + tau^2ic/sqrt(3))

其中,id、iq为旋转坐标系下的直交电流分量,tau = exp(j2pi/3),j为虚数单位。

双闭环PI调节器:速度调节器和电流调节器的数学公式为:

速度调节器:Te = Kp_speed * (n_ref - n) + Ki_speed * int((n_ref - n) dt)

电流调节器:U = Kp_current * (I_ref - I) + Ki_current * int((I_ref - I) dt)

       其中,Te为需要的电磁转矩,n_ref、n分别为设定的速度和实际的速度,Kp_speed、Ki_speed分别为速度调节器的比例和积分系数,I_ref、I分别为设定的电流和实际电流,Kp_current、Ki_current分别为电流调节器的比例和积分系数。

SVPWM:SVPWM的数学模型比较复杂,它涉及到电机的电压、电流、磁链等物理量的计算和控制。具体的SVPWM数学模型需要根据电机的具体参数和控制要求进行详细设计。

三、控制流程

基于PARK-Clark变换和双闭环PI调节器的PMSM SVPWM控制系统的控制流程如下:

  1. 通过传感器采集电机的三相电流ia、ib、ic和转速n;
  2. 通过PARK-Clark变换将三相电流转换为旋转坐标系下的直交电流分量id、iq;
  3. 速度调节器根据设定的速度和实际的速度差值,计算出需要的电磁转矩Te;
  4. 电流调节器根据设定的电流和实际电流的差值,计算出需要的电压U;
  5. SVPWM根据计算出的电压U,生成脉冲信号控制电机的运行。

1.2 PARK变换

1.3 CLARK变换

二、核心程序

function [sys,x0,str,ts] = func_N_calculation(t,x,u,flag)
%A=0;B=0;
%C=0;N=0;


global A B C N;
switch flag,
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
  case 1,
    sys=[];
  case 2,
    sys=[];
  case 3,
    sys=mdlOutputs(t,x,u,A,B,C,N);
  case 4,
    sys=[];
  case 9,
    sys=[];
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end


function [sys,x0,str,ts]=mdlInitializeSizes

sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 3;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed

sys = simsizes(sizes);
x0  = [0 0 0];
str = [];
ts  = [0 0];

%u(1)=Uafa;u(2)=Ubta
function sys=mdlOutputs(t,x,u,A,B,C,N)
x(1)=u(2);                         %x(1)=Ua
x(2)=1/2*(sqrt(3)*u(1)-u(2));      %x(2)=Ub
x(3)=1/2*(-sqrt(3)*u(1)-u(2));    %x(3)=Uc

if (x(1)>0);    %A
   A=1;
else
   A=0; 
end
if (x(2)>0);     %B
   B=1;
else
   B=0; 
end
if (x(3)>0);
   C=1;          %C
else
   C=0; 
end
N=4*C+2*B+A;   %N
sys=N;
function [sys,x0,str,ts] = func_T1T2_cal(t,x,u,flag)

switch flag,
    
  case 0,
    [sys,x0,str,ts]=mdlInitializeSizes;
  case 1,
    sys=[];
  case 2,
    sys=[];
  case 3,
    sys=mdlOutputs(t,x,u);
  case 4,
    sys=[];
  case 9,
    sys=[];
  otherwise
    error(['Unhandled flag = ',num2str(flag)]);
end


function [sys,x0,str,ts]=mdlInitializeSizes

sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 2;
sizes.NumInputs      = 5;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed

sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [0 0];

%u(1)=N;u(2)=Uafa;u(3)=Ubta;u(4)=Udc;u(5)=Ts
function sys=mdlOutputs(t,x,u)
global T1 T2 Ts
Ts=u(5);
switch u(1)
    case 1
        T1=-1*u(2)+3^0.5/3*u(3);
        T2=1*u(2)+3^0.5/3*u(3);
    case 2
        T1=1*u(2)+3^0.5/3*u(3);
        T2=0*u(2)-2*3^0.5/3*u(3);
    case 3
        T1=1*u(2)-3^0.5/3*u(3);
        T2=2*3^0.5/3*u(3);
    case 4
        T1=-2*3^0.5/3*u(3);
        T2=-1*u(2)+3^0.5/3*u(3);
    case 5
        T1=2*3^0.5/3*u(3);
        T2=-1*u(2)-3^0.5/3*u(3);
    case 6
        T1=-1*u(2)-3^0.5/3*u(3);
        T2=1*u(2)-3^0.5/3*u(3);
end 
T1=T1*u(5)/u(4)/2*3;
T2=T2*u(5)/u(4)/2*3;

if (T1+T2<=Ts);
    sys(1)=T1;
    sys(2)=T2;   
else
    sys(1)=T1*Ts/(T1+T2);
    sys(2)=T2*Ts/(T1+T2);
end





三、仿真测试结果

 A22-04

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值