📄 motorolx.c
字号:
/*
* File : motorolx.c
* Abstract:
* An example C-file S-function for linking PID System,
* output = digital_pid(en, xn)
*
* See simulink/src/sfuntmpl_doc.c
*
* Copyright 1990-2000 The MathWorks, Inc.
* $Revision: 1.7 $
* Written by Chou, Penchen, Aug. 23,2001
* EE Dept., Da-Yeh University.
* Execute mex flc_invp.c to get flc_invp.dll before Simulink simulation.
*/
#define S_FUNCTION_NAME motorolx
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
/*================*
* Build checking *
*================*/
#if !defined(MATLAB_MEX_FILE)
/*
* This file cannot be used directly with the Real-Time Workshop. However,
* this S-function does work with the Real-Time Workshop via
* the Target Language Compiler technology. See
* matlabroot/toolbox/simulink/blocks/tlc_c/timestwo.tlc for the C version
* matlabroot/toolbox/simulink/blocks/tlc_ada/timestwo.tlc for the Ada version
*/
# error This_file_can_be_used_only_during_simulation_inside_Simulink
#endif
double digital_pid(double, double);
#include<dos.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX(i,j) (i>=j)?i:j
#define MIN(i,j) (i<=j)?i:j
/***************************************************************
** ==> USER CAN MODIFY THE FOLLOWING: *********
****************************************************************/
/* In order to save computational time the coefficients
must be calculated in hand with formulae as
Ts=488e-6;
co_e=Kp+Ts*Ki;
co_x=-0.5*Kd/Ts;
co_i=Ts*Ki; */
#define co_e 0.1624
#define co_x -1.0246
#define co_i 0.0024
#define OUT_min -10
#define OUT_max 10
/* Function: mdlInitializeSizes ==============================
* Abstract:
* Setup sizes of the various vectors.
*/
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S, 0);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return; /* Parameter mismatch will be reported by Simulink */
}
if (!ssSetNumInputPorts(S, 2)) return; /* 2-input */
ssSetInputPortWidth(S, 0, DYNAMICALLY_SIZED);
ssSetInputPortDirectFeedThrough(S, 0, 1);
ssSetInputPortWidth(S, 1, DYNAMICALLY_SIZED);
ssSetInputPortDirectFeedThrough(S, 1, 1);
if (!ssSetNumOutputPorts(S,1)) return;
ssSetOutputPortWidth(S, 0, DYNAMICALLY_SIZED);
ssSetNumSampleTimes(S, 1);
/* Take care when specifying exception free code - see sfuntmpl_doc.c */
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE |
SS_OPTION_USE_TLC_WITH_ACCELERATOR);
}
/* Function: mdlInitializeSampleTimes =========================================
* Abstract:
* Specifiy that we inherit our sample time from the driving block.
*/
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S, 0, 0.0);
}
/* Function: mdlOutputs =======================================================
* Abstract:
* y = digital_pid(u1,u2)
*/
static void mdlOutputs(SimStruct *S, int_T tid)
{
int_T i;
InputRealPtrsType uPtrs1 = ssGetInputPortRealSignalPtrs(S,0); /* input #1 */
InputRealPtrsType uPtrs2 = ssGetInputPortRealSignalPtrs(S,1); /* input #2 */
real_T *y = ssGetOutputPortRealSignal(S,0);
int_T width = ssGetOutputPortWidth(S,0);
for (i=0; i<width; i++) {
/*
* This example does not implement complex signal handling.
* To find out see an example about how to handle complex signal in
* S-function, see sdotproduct.c for details.
*/
*y++ = digital_pid(*uPtrs1[i], *uPtrs2[i]);
}
}
/* Function: mdlTerminate =====================================================
* Abstract:
* No termination needed, but we are required to have this routine.
*/
static void mdlTerminate(SimStruct *S)
{
}
#if defined(MATLAB_MEX_FILE)
#define MDL_RTW
/* Function: mdlRTW ===========================================================
* Abstract:
* Since we've declared all are parameters as non-tunable, we need
* only provide this routine so that they aren't written to the model.rtw
* file. The values of the parameters are implicitly encoded in the
* sample times.
*/
static void mdlRTW(SimStruct *S)
{
}
#endif /* MDL_RTW */
#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
/*****************************************************************
** FUNCTIONS DEFINITIONS **
****************************************************************/
double digital_pid(double en, double xn)
{
float In,Inm1=0,xnm1=0,xnm2=0, output;
In=Inm1+co_i*en;
output=co_e*en+1*Inm1+0*co_x*(xn-xnm2);
output=MIN(output, OUT_max); /* BOUNDED OUTPUT CHECK POINTS */
output=MAX(output, OUT_min);
/* Update variables */
Inm1=In;
xnm2=xnm1; xnm1=xn;
return (output);
}/************************************************************************
END of FUNCTIONS in this file.
*************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -