pid.c
00001 #pragma warning(disable:4001)
00002
00003 #include "../GeneralInclude/CompilerSwitches.h"
00004
00005 #ifndef HAVE_SIMULINK
00006
00007
00008
00009
00010
00011
00012
00013 void PID_dummy(void) {
00014 return;
00015 }
00016
00017 #else
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "PID.h"
00030 #include "PID_private.h"
00031
00032
00033 real_T Output;
00034 real_T Input;
00035
00036
00037 real_T Kd = 1.0;
00038 real_T Ki = 1.0;
00039 real_T Kp = -1.0;
00040
00041
00042 BlockIO_PID PID_B;
00043
00044
00045 D_Work_PID PID_DWork;
00046
00047
00048 RT_MODEL_PID PID_M_;
00049 RT_MODEL_PID *PID_M = &PID_M_;
00050
00051
00052 void PID_step(void)
00053 {
00054
00055 real_T rtb_I_Gain;
00056 real_T rtb_D_Gain;
00057 real_T rtb_Discrete_Transfer_Fcn;
00058
00059
00060
00061
00062
00063
00064
00065 rtb_I_Gain = Input * Ki;
00066
00067
00068
00069
00070
00071
00072
00073 if ( PID_DWork.Discrete_Time_Int_SYSTEM_ENABLE) {
00074 PID_DWork.Discrete_Time_Int_SYSTEM_ENABLE = false;
00075 PID_B.Discrete_Time_Int = PID_DWork.Discrete_Time_Int_DSTATE;
00076 } else {
00077 PID_B.Discrete_Time_Int = PID_DWork.Discrete_Time_Int_DSTATE + 0.125 *
00078 rtb_I_Gain;
00079 }
00080
00081
00082
00083
00084
00085
00086
00087 rtb_D_Gain = Input * Kd;
00088
00089
00090 rtb_Discrete_Transfer_Fcn = 4.0*rtb_D_Gain;
00091 rtb_Discrete_Transfer_Fcn += -4.0*PID_DWork.Discrete_Transfer_Fcn_DSTATE;
00092
00093
00094
00095
00096
00097
00098
00099
00100 Output = (Input * Kp) + PID_B.Discrete_Time_Int + rtb_Discrete_Transfer_Fcn;
00101
00102
00103 PID_DWork.Discrete_Time_Int_DSTATE = PID_B.Discrete_Time_Int + 0.125 *
00104 rtb_I_Gain;
00105
00106
00107 {
00108 PID_DWork.Discrete_Transfer_Fcn_DSTATE = rtb_D_Gain +
00109 (0.0)*PID_DWork.Discrete_Transfer_Fcn_DSTATE;
00110 }
00111 }
00112
00113
00114 void PID_initialize(boolean_T firstTime)
00115 {
00116 if (firstTime) {
00117
00118 rtmSetErrorStatus(PID_M, (const char_T *)0);
00119
00120
00121 {
00122 void *b = (void *) &PID_B;
00123 {
00124 int_T i;
00125
00126 b =&PID_B.Discrete_Time_Int;
00127 for (i = 0; i < 1; i++) {
00128 ((real_T*)b)[i] = 0.0;
00129 }
00130 }
00131
00132
00133 Output = 0.0;
00134 }
00135
00136
00137 (void)memset((char_T *) &PID_DWork, 0, sizeof(D_Work_PID));
00138 {
00139 int_T i;
00140 real_T *dwork_ptr = (real_T *) &PID_DWork.Discrete_Time_Int_DSTATE;
00141
00142 for (i = 0; i < 2; i++) {
00143 dwork_ptr[i] = 0.0;
00144 }
00145 }
00146
00147
00148 Input = 0.0;
00149
00150
00151 Output = 0.0;
00152 }
00153
00154
00155 PID_DWork.Discrete_Time_Int_SYSTEM_ENABLE = true;
00156 }
00157
00158
00159 void PID_terminate(void)
00160 {
00161
00162 }
00163
00164 #endif
Copyright 2003 P&P Software GmbH - All Rights Reserved