خامسا: المتحكم Hysteresis


0030

0031 0032 0033 0034 0035 0036 0037

خامسا المتحكم Hysteresis

يتم استخدام هذا المتحكم في جعل استجابة الموضع للمحرك أكثر استقرارا، حيث يقوم بتقليص هامش الاهتزاز الذي لابد أن يظهر في المحرك في الحياة العملية. يجب أن يكون دخل هذا النظام هي إشارة التيار، لكن خرج المتحكم PI هو إشارة جهد ولذلك نضيف ربح (1/11.92) التي تمثل ممانعة القسم الثابت للمحرك لنحصل على تيار القسم الثابت أيضا، ثم نأخذ هذه الإشارة على المتحكم Hysteresis الذي يعطي بدوره على الخرج إشارة تحكم بالجهد +1 أو -1، ثم نضيف ربح قيمته 220 بمثابة دارة قيادة يمكن وصلها مباشرة مع المحرك. نستخدم الـ S-Function في كتابة برنامج بالـ C-Code يقوم بعمل متحكم الـ Hysteresis. حيث نقوم أولا بتصميم الدارة التالية:

ثم نقوم بكتابة الـ C-Code التالي ضمن متحكم الـ Hysteresis:

/*

 * DC-Servo Motor Modelling

 * Copyright (c) 2006 by University of Aleppo

 *  All Rights Reserved

 */

#define S_FUNCTION_NAME Hys

#include <stddef.h>

#include <stdlib.h>

#include <math.h>

#include “simstruc.h”

#ifdef MATLAB_MEX_FILE

#include “mex.h”

#endif

#define SAMPLE_TIME_ARG         ssGetArg(S,0)

#define H_ARG                  ssGetArg(S,1)

#define NUMBER_OF_ARGS          (2)

#define NSAMPLE_TIMES           (1)

#define NUMBER_OF_INPUTS        (1)  //U

#define NUMBER_OF_OUTPUTS       (1) // x=[] state vector

/*variables */

float Uc_k, Uc_k_1, e_k, e_k_1;

float H, ts;

static void mdlInitializeSizes(SimStruct *S)

{

    if (ssGetNumArgs(S) != NUMBER_OF_ARGS) {

#ifdef MATLAB_MEX_FILE

    mexErrMsgTxt(“Wrong number of input arguments passed.\nThree arguments are expected\n”);

#endif

    }

    /* Set up size information */

    ssSetNumContStates(    S, 0);                       /* number of continuous states */

    ssSetNumDiscStates(    S, 5);                       /* number of discrete states */

    ssSetNumInputs(        S, NUMBER_OF_INPUTS);        /* number of inputs */

    ssSetNumOutputs(       S, NUMBER_OF_OUTPUTS);       /* number of outputs */

    ssSetDirectFeedThrough(S, 0);                       /* direct feedthrough flag */

    ssSetNumSampleTimes(   S, NSAMPLE_TIMES);           /* number of sample times */

    ssSetNumInputArgs(     S, NUMBER_OF_ARGS);          /* number of input arguments */

    ssSetNumRWork(         S, 0);                       /* number of real work vector elements */

    ssSetNumIWork(         S, 0);                       /* NUMBER_OF_IWORKS);      /* number of integer work vector elements */

    ssSetNumPWork(         S, 0);                       /* number of pointer work vector elements */

}

static void mdlInitializeSampleTimes(SimStruct *S)

{

    ssSetSampleTimeEvent(S, 0, mxGetPr(SAMPLE_TIME_ARG)[0]);

    ssSetOffsetTimeEvent(S, 0, 0.0);

}

static void mdlInitializeConditions(double *x0, SimStruct *S)

{

/*Sampling Time*/

    ts  = mxGetPr(SAMPLE_TIME_ARG)[0];

    H    = mxGetPr(H_ARG)[0];

/* States initialization*/

Uc_k_1=0;

e_k_1=0;

}

static void mdlOutputs(double *y, double *x, double *u, SimStruct *S, int tid)

{

/*Vo*/

y[0]=Uc_k_1;

}

static void mdlUpdate(double *x, double *u, SimStruct *S, int tid)

{

//Model Update

    e_k= u[0];

    if(e_k > H)

    {

        Uc_k = 1;

    }

    else if(e_k < -H)

    {

        Uc_k = -1;

    }

    else

    {

        Uc_k = Uc_k_1;

    }

//update value

    e_k_1=e_k;

    Uc_k_1=Uc_k;

/*

 * mdlDerivatives – compute the derivatives

 *

 * In this function, you compute the S-function block’s derivatives.

 * The derivatives are placed in the dx variable.

 */

}

static void mdlDerivatives(double *dx, double *x, double *u, SimStruct *S, int tid)

{

}

/*

 * mdlTerminate – called when the simulation is terminated.

 *

 * In this function, you should perform any actions that are necessary

 * at the termination of a simulation.  For example, if memory was allocated

 * in mdlInitializeConditions, this is the place to free it.

 */

static void mdlTerminate(SimStruct *S)

{

}

#ifdef  MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */

#include “simulink.c”      /* MEX-file interface mechanism */

#else

#include “cg_sfun.h”       /* Code generation registration function */

#endif

علما أننا قمنا بإضافة ميزة Rate limiter على متحكم PD في هذه المرحلة، ليصبح الـ C-Code له بالشكل التالي:

/*

 * DC-Servo Motor Modelling

 * Copyright (c) 2006 by University of Aleppo

 *  All Rights Reserved

 */

#define S_FUNCTION_NAME PD

#include <stddef.h>

#include <stdlib.h>

#include <math.h>

#include “simstruc.h”

#ifdef MATLAB_MEX_FILE

#include “mex.h”

#endif

#define SAMPLE_TIME_ARG         ssGetArg(S,0)

#define KD_ARG                  ssGetArg(S,1)

#define KP_ARG                  ssGetArg(S,2)

#define NUMBER_OF_ARGS          (3)

#define NSAMPLE_TIMES           (1)

#define NUMBER_OF_INPUTS        (1)  //U

#define NUMBER_OF_OUTPUTS       (1) // x=[] state vector

/*variables */

float tsam, e_K, e_K_1, UPD_K, UPD_K_1, KD, KP, y_i, y_i_1, u_i, rate;

static void mdlInitializeSizes(SimStruct *S)

{

    if (ssGetNumArgs(S) != NUMBER_OF_ARGS) {

#ifdef MATLAB_MEX_FILE

    mexErrMsgTxt(“Wrong number of input arguments passed.\nThree arguments are expected\n”);

#endif

    }

    /* Set up size information */

    ssSetNumContStates(    S, 0);                       /* number of continuous states */

    ssSetNumDiscStates(    S, 5);                       /* number of discrete states */

    ssSetNumInputs(        S, NUMBER_OF_INPUTS);        /* number of inputs */

    ssSetNumOutputs(       S, NUMBER_OF_OUTPUTS);       /* number of outputs */

    ssSetDirectFeedThrough(S, 0);                       /* direct feedthrough flag */

    ssSetNumSampleTimes(   S, NSAMPLE_TIMES);           /* number of sample times */

    ssSetNumInputArgs(     S, NUMBER_OF_ARGS);          /* number of input arguments */

    ssSetNumRWork(         S, 0);                       /* number of real work vector elements */

    ssSetNumIWork(         S, 0);                       /* NUMBER_OF_IWORKS);      /* number of integer work vector elements */

    ssSetNumPWork(         S, 0);                       /* number of pointer work vector elements */

}

static void mdlInitializeSampleTimes(SimStruct *S)

{

    ssSetSampleTimeEvent(S, 0, mxGetPr(SAMPLE_TIME_ARG)[0]);

    ssSetOffsetTimeEvent(S, 0, 0.0);

}

static void mdlInitializeConditions(double *x0, SimStruct *S)

{

/*Sampling Time*/

    tsam  = mxGetPr(SAMPLE_TIME_ARG)[0];

    KD    = mxGetPr(KD_ARG)[0];

    KP    = mxGetPr(KP_ARG)[0];

/* States initialization*/

UPD_K_1=0;

e_K_1=0;

y_i_1=0;

}

static void mdlOutputs(double *y, double *x, double *u, SimStruct *S, int tid)

{

/*Vo*/

y[0]=UPD_K_1;

}

static void mdlUpdate(double *x, double *u, SimStruct *S, int tid)

{

//Model Update

    e_K= u[0];

//UPD_K=(KP+KD/tsam)*e_K-(KD/tsam)*e_K_1;

    u_i = (KD/tsam)*(e_K-e_K_1);

    rate = (u_i – y_i_1) / tsam;

    if (rate>1000)

    {

        y_i=(1000*tsam) + y_i_1;

    }

    else if (rate <-1000)

    {

        y_i=(-1000*tsam) + y_i_1;

    }

    else

    {

        y_i = u_i;

    }

    UPD_K = (KP * e_K) + y_i;

    y_i_1=y_i;

//update value

    e_K_1=e_K;

    UPD_K_1=UPD_K;

/*

 * mdlDerivatives – compute the derivatives

 *

 * In this function, you compute the S-function block’s derivatives.

 * The derivatives are placed in the dx variable.

 */

}

static void mdlDerivatives(double *dx, double *x, double *u, SimStruct *S, int tid)

{

}

/*

 * mdlTerminate – called when the simulation is terminated.

 *

 * In this function, you should perform any actions that are necessary

 * at the termination of a simulation.  For example, if memory was allocated

 * in mdlInitializeConditions, this is the place to free it.

 */

static void mdlTerminate(SimStruct *S)

{

}

#ifdef  MATLAB_MEX_FILE    /* Is this file being compiled as a MEX-file? */

#include “simulink.c”      /* MEX-file interface mechanism */

#else

#include “cg_sfun.h”       /* Code generation registration function */

#endif

وعند تشغيل الدارة نحصل على النتائج التالية على الخرج:

ولتوضيح النتائج بشكل أفضل نكبر شكل الإشارة عند لحظة تطبيق الحمل (أي عند الثانية 3):

Advertisements

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s