• 【电力】永磁同步电机-自抗扰控制PMSM ADRC附matlab代码


    1 内容介绍

    纹波推力扰动,负载扰动,摩擦力扰动和其他不确定性扰动严重影响永磁直线同步电机(PMLSM)控制系统的性能,对控制系统的抗干扰能力提出了更高的要求.本文采用自抗扰控制(ADRC)方法,利用扩张状态观测器估计所有未知扰动作用量并给予实时动态补偿,从而抑制未知扰动实现"自抗扰"控制,同时估计出速度及其微分;跟踪微分器给出了一种计算微分的有效方法,并根据PMLSM的承受能力安排速度指令过渡过程;采用更合适的非线性PD误差反馈率计算控制量.利用基于Matlab/Simulink的xPC Target构建控制系统实验平台,实验结果表明,采用ADRC的PMLSM控制系统具有很强的抗扰性和静动态特性.

    2 部分代码

    function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)

    %SFUNTMPL General MATLAB S-Function Template

    %   With MATLAB S-functions, you can define you own ordinary differential

    %   equations (ODEs), discrete system equations, and/or just about

    %   any type of algorithm to be used within a Simulink block diagram.

    %

    %   The general form of an MATLAB S-function syntax is:

    %       [SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn)

    %

    %   What is returned by SFUNC at a given point in time, T, depends on the

    %   value of the FLAG, the current state vector, X, and the current

    %   input vector, U.

    %

    %   FLAG   RESULT             DESCRIPTION

    %   -----  ------             --------------------------------------------

    %   0      [SIZES,X0,STR,TS]  Initialization, return system sizes in SYS,

    %                             initial state in X0, state ordering strings

    %                             in STR, and sample times in TS.

    %   1      DX                 Return continuous state derivatives in SYS.

    %   2      DS                 Update discrete states SYS = X(n+1)

    %   3      Y                  Return outputs in SYS.

    %   4      TNEXT              Return next time hit for variable step sample

    %                             time in SYS.

    %   5                         Reserved for future (root finding).

    %   9      []                 Termination, perform any cleanup SYS=[].

    %

    %

    %   The state vectors, X and X0 consists of continuous states followed

    %   by discrete states.

    %

    %   Optional parameters, P1,...,Pn can be provided to the S-function and

    %   used during any FLAG operation.

    %

    %   When SFUNC is called with FLAG = 0, the following information

    %   should be returned:

    %

    %      SYS(1) = Number of continuous states.

    %      SYS(2) = Number of discrete states.

    %      SYS(3) = Number of outputs.

    %      SYS(4) = Number of inputs.

    %               Any of the first four elements in SYS can be specified

    %               as -1 indicating that they are dynamically sized. The

    %               actual length for all other flags will be equal to the

    %               length of the input, U.

    %      SYS(5) = Reserved for root finding. Must be zero.

    %      SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function

    %               has direct feedthrough if U is used during the FLAG=3

    %               call. Setting this to 0 is akin to making a promise that

    %               U will not be used during FLAG=3. If you break the promise

    %               then unpredictable results will occur.

    %      SYS(7) = Number of sample times. This is the number of rows in TS.

    %

    %

    %      X0     = Initial state conditions or [] if no states.

    %

    %      STR    = State ordering strings which is generally specified as [].

    %

    %      TS     = An m-by-2 matrix containing the sample time

    %               (period, offset) information. Where m = number of sample

    %               times. The ordering of the sample times must be:

    %

    %               TS = [0      0,      : Continuous sample time.

    %                     0      1,      : Continuous, but fixed in minor step

    %                                      sample time.

    %                     PERIOD OFFSET, : Discrete sample time where

    %                                      PERIOD > 0 & OFFSET < PERIOD.

    %                     -2     0];     : Variable step discrete sample time

    %                                      where FLAG=4 is used to get time of

    %                                      next hit.

    %

    %               There can be more than one sample time providing

    %               they are ordered such that they are monotonically

    %               increasing. Only the needed sample times should be

    %               specified in TS. When specifying more than one

    %               sample time, you must check for sample hits explicitly by

    %               seeing if

    %                  abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD)

    %               is within a specified tolerance, generally 1e-8. This

    %               tolerance is dependent upon your model's sampling times

    %               and simulation time.

    %

    %               You can also specify that the sample time of the S-function

    %               is inherited from the driving block. For functions which

    %               change during minor steps, this is done by

    %               specifying SYS(7) = 1 and TS = [-1 0]. For functions which

    %               are held during minor steps, this is done by specifying

    %               SYS(7) = 1 and TS = [-1 1].

    %

    %      SIMSTATECOMPLIANCE = Specifices how to handle this block when saving and

    %                           restoring the complete simulation state of the

    %                           model. The allowed values are: 'DefaultSimState',

    %                           'HasNoSimState' or 'DisallowSimState'. If this value

    %                           is not speficified, then the block's compliance with

    %                           simState feature is set to 'UknownSimState'.

    %   Copyright 1990-2010 The MathWorks, Inc.

    %

    % The following outlines the general structure of an S-function.

    %

    switch flag,

      %%%%%%%%%%%%%%%%%%

      % Initialization %

      %%%%%%%%%%%%%%%%%%

      case 0,

        [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;

      %%%%%%%%%%%%%%%

      % Derivatives %

      %%%%%%%%%%%%%%%

      case 1,

        sys=mdlDerivatives(t,x,u);

      %%%%%%%%%%

      % Update %

      %%%%%%%%%%

      case 2,

        sys=mdlUpdate(t,x,u);

      %%%%%%%%%%%

      % Outputs %

      %%%%%%%%%%%

      case 3,

        sys=mdlOutputs(t,x,u);

      %%%%%%%%%%%%%%%%%%%%%%%

      % GetTimeOfNextVarHit %

      %%%%%%%%%%%%%%%%%%%%%%%

      case 4,

        sys=mdlGetTimeOfNextVarHit(t,x,u);

      %%%%%%%%%%%%%

      % Terminate %

      %%%%%%%%%%%%%

      case 9,

        sys=mdlTerminate(t,x,u);

      %%%%%%%%%%%%%%%%%%%%

      % Unexpected flags %

      %%%%%%%%%%%%%%%%%%%%

      otherwise

        DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));

    end

    % end sfuntmpl

    %

    %=============================================================================

    % mdlInitializeSizes

    % Return the sizes, initial conditions, and sample times for the S-function.

    %=============================================================================

    %

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

    %

    % call simsizes for a sizes structure, fill it in and convert it to a

    % sizes array.

    %

    % Note that in this example, the values are hard coded.  This is not a

    % recommended practice as the characteristics of the block are typically

    % defined by the S-function parameters.

    %

    sizes = simsizes;

    sizes.NumContStates  = 0;

    sizes.NumDiscStates  = 2;

    sizes.NumOutputs     = 1;

    sizes.NumInputs      = 1;

    sizes.DirFeedthrough = 0;

    sizes.NumSampleTimes = 1;   % at least one sample time is needed

    sys = simsizes(sizes);

    %

    % initialize the initial conditions

    %

    x0  = [];

    %

    % str is always an empty matrix

    %

    str = [];

    %

    % initialize the array of sample times

    %

    ts  = [0 0];

    % Specify the block simStateCompliance. The allowed values are:

    %    'UnknownSimState', < The default setting; warn and assume DefaultSimState

    %    'DefaultSimState', < Same sim state as a built-in block

    %    'HasNoSimState',   < No sim state

    %    'DisallowSimState' < Error out when saving or restoring the model sim state

    simStateCompliance = 'UnknownSimState';

    % end mdlInitializeSizes

    %

    %=============================================================================

    % mdlDerivatives

    % Return the derivatives for the continuous states.

    %=============================================================================

    %

    function sys=mdlDerivatives(t,x,u)

    sys = [];

    % end mdlDerivatives

    %

    %=============================================================================

    % mdlUpdate

    % Handle discrete state updates, sample time hits, and major time step

    % requirements.

    %=============================================================================

    %

    function sys=mdlUpdate(t,x,u)

    sys = [];

    % end mdlUpdate

    %

    %=============================================================================

    % mdlOutputs

    % Return the block outputs.

    %=============================================================================

    %

    function sys=mdlOutputs(t,x,u)

    sys = [];

    % end mdlOutputs

    %

    %=============================================================================

    % mdlGetTimeOfNextVarHit

    % Return the time of the next hit for this block.  Note that the result is

    % absolute time.  Note that this function is only used when you specify a

    % variable discrete-time sample time [-2 0] in the sample time array in

    % mdlInitializeSizes.

    %=============================================================================

    %

    function sys=mdlGetTimeOfNextVarHit(t,x,u)

    sampleTime = 1;    %  Example, set the next hit to be one second later.

    sys = t + sampleTime;

    % end mdlGetTimeOfNextVarHit

    %

    %=============================================================================

    % mdlTerminate

    % Perform any end of simulation tasks.

    %=============================================================================

    %

    function sys=mdlTerminate(t,x,u)

    sys = [];

    % end mdlTerminate

    3 运行结果

    4 参考文献

    [1]龙晓军. 基于自抗扰技术的永磁同步电机调速方法研究[D]. 大连海事大学, 2011.

    博主简介:擅长智能优化算法神经网络预测信号处理元胞自动机图像处理路径规划无人机雷达通信无线传感器等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

    部分理论引用网络文献,若有侵权联系博主删除。

     

  • 相关阅读:
    老杨说运维 | 农信行业运维数字化和智能化转型实践分享
    【linux】nmon 工具使用
    E4A安卓app制作——初识易安卓(一)
    道路标识检测模型更新
    CSS基础教程
    Git操作命令
    HFish蜜罐实践:网络安全防御的主动出击
    SQL力扣刷题七
    【Node.js】中间件
    Milk Scheduling S——拓扑排序
  • 原文地址:https://blog.csdn.net/qq_59747472/article/details/126755698