m基于SVPWM控制器的三轴直交机械臂轨迹控制simulink仿真

305 阅读4分钟

1.算法仿真效果

matlab2022a仿真结果如下:

1.png

2.png

3.png

4.png

5.png

6.png  

2.算法涉及理论知识概要

      对于PMSM,使用MATLAB内部自带的模型进行建模,在simulink中选择Permanent Magnet Synchronous Machine,如图3.1所示。

 

65c5e7ac18d69c4aff33f3eabb352579_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

        永磁同步电机模型PMSM如图1 所示,可以通过双击组件设定同步电机的各个参数,如磁极数Pn,定子电阻Rs,定子电感L等等。

 

       SVPWM模块负责将矢量控制系统输出的控制量Uα、Uβ转换为用于控制IGBT逆变器的PWM形式的门极信号。如图2所示,本文设计的SVPWM模块仿真模型由五部分组成,分别是电压矢量所在扇区的计算、中间参数X、Y、Z的计算、相邻基本电压矢量作用时间T1和T2的计算、三相逆变器开关时刻Ta、Tb、Tc的计算和PWM波形的产生。

 

2b9b91bc7a8955962c819e02c5c63e65_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

        这里SVPMW的五个主要模块均使用S-function在simulink中构建。

 

    本系统用到的坐标变换模块由2部分组成:其一为A-B-C坐标系下电流ia、ib、ic到α-β坐标系下电流iα、iβ的变换,即Clarke变换;其二为iα、iβ到id、iq的变换,即Park变换。具体的变化公式已经在本文的第二章中作了详细的叙述,构建后的模型如下图所示:Park变换如下所示(Park变换是从 坐标系到dq坐标系的变化过程):

 

 

 

Clarke变换如下所示(这里Clarke变换是从A-B-C坐标系到 坐标系的变化过程):

 

9ac1ca77c6c7b7e8fd706fcb87408b19_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

 

 

 

 Simulink模块中的fcn模块就是上面公式中的将矩阵展开后得到的数学计算公式。

 

        机械手臂是机械人技术领域中得到最广泛实际应用的自动化机械装置,在工业制造、医学治疗、娱乐服务、军事、半导体制造以及太空探索等领域都能见到它的身影。机械手臂主要由执行机构、驱动机构和控制系统三大部分组成。

 

        手部是用来抓持工件(或工具)的部件,根据被抓持物件的形状、尺寸、重量、材料和作业要求而有多种结构形式,如夹持型、托持型和吸附型等。运动机构,使手部完成各种转动(摆动)、移动或复合运动来实现规定的动作,改变被抓持物件的位置和姿势。

 

        运动机构的升降、伸缩、旋转等独立运动方式,称为机械手的自由度。为了抓取空间中任意位置和方位的物体,需有6个自由度。

 

       自由度是机械手臂设计的关键参数。自由度越多,机械手臂的灵活性越大,通用性越广,其结构也越复杂。一般专用机械手有2~3个自由度。

 

      机械手臂所用的驱动机构主要有4种:液压驱动、气压驱动、电气驱动和机械驱动。其中以液压驱动、气压驱动用得最多。

 

        控制系统是通过对机械手每个自由度的电机的控制,来完成特定动作。同时接收传感器反馈的信息,形成稳定的闭环控制。

 

        控制系统的核心通常是由单片机或dsp等微控制芯片构成,通过对其编程实现所要功能。

 

3. MATLAB核心程序

 

e140cf2955f9b3e8b533f96711db424c_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

`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=4C+2B+A;   %N

sys=N;`