S函数编写buck电路的电阻状态观测器代码
时间: 2024-05-01 15:22:05 浏览: 108
以下是一个简单的S函数代码,用于模拟buck电路的电阻状态观测器:
```
#define S_FUNCTION_NAME Buck_Res_Observer
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
#define R1 1.0
#define R2 2.0
#define R3 3.0
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S, 0);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
return; /* Parameter mismatch reported by the Simulink engine*/
}
ssSetNumContStates(S, 1);
ssSetNumDiscStates(S, 0);
if (!ssSetNumInputPorts(S, 1)) return;
ssSetInputPortWidth(S, 0, 1);
ssSetInputPortDirectFeedThrough(S, 0, 1);
if (!ssSetNumOutputPorts(S, 1)) return;
ssSetOutputPortWidth(S, 0, 1);
ssSetNumSampleTimes(S, 1);
ssSetOptions(S, 0);
}
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S, 0, 0.1);
ssSetOffsetTime(S, 0, 0.0);
}
static void mdlOutputs(SimStruct *S, int_T tid)
{
real_T *y = ssGetOutputPortRealSignal(S, 0);
real_T *x = ssGetContStates(S);
InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);
real_T Vout = *uPtrs[0];
real_T Iout = Vout / R3;
real_T Vr1 = Vout * R1 / (R1 + R2 + R3);
real_T Vr2 = Vout * R2 / (R1 + R2 + R3);
real_T Ir1 = Vr1 / R1;
real_T Ir2 = Vr2 / R2;
x[0] = (Ir1 - Ir2) / Iout;
y[0] = x[0];
}
static void mdlUpdate(SimStruct *S, int_T tid)
{
}
static void mdlTerminate(SimStruct *S)
{
}
#ifdef MATLAB_MEX_FILE
#include "simulink.c"
#else
#include "cg_sfun.h"
#endif
```
该代码定义了一个S函数,它具有一个输入和一个输出端口,以及一个连续状态。输入是电路的输出电压,输出是电阻状态观测器的测量值。在 `mdlOutputs` 函数中,我们计算了输入电压的输出电流,以及通过电阻 R1 和 R2 测量的电压。然后,我们计算了通过每个电阻的电流,并使用这些值计算出电阻状态观测器的测量值。最后,我们将该值存储在连续状态中,并将其输出到输出端口。
阅读全文