How do you generate a PWM signal through S function in C.I am facing a build error while building.Could anyone help me in this issue.

16 views (last 30 days)
#define S_FUNCTION_NAME pwm_sfunction
#define S_FUNCTION_LEVEL 2
#include "simstruc.h"
#define PARAM_FREQUENCY 0
#define PARAM_DUTY_CYCLE 1
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S,2);
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S))
{
return;
}
ssSetNumContStates(S,0);
ssSetNumDiscStates(S,0);
if (!ssSetNumInputPorts(S,0)) return;
if (!ssSetNumOutputPorts(S,1)) return;
ssSetOutputPortWidth(S,0,1);
ssSetNumSampleTimes(S,1);
ssSetSimStateCompliance(S,USE_DEFAULT_SIM_STATE);
ssSetOptions(S,0);
}
static void mdlInitializeSampleTimes(SimStruct *S)
{
ssSetSampleTime(S,0,INHERITED_SAMPLE_TIME);
ssSetOffsetTime(S,0,0.0);
}
static void mdlStart(SimStruct *S)
{
}
static void mdlOutputs(SimStruct *S,int_T tid)
{
real_T *y=ssGetOutputPortRealSignal(S,0);
real_T frequency = *mxGetPr(ssGetSFcnParam(S,PARAM_FREQUENCY));
real_T duty_cycle = *mxGetPr(ssGetSFcnParam(S,PARAM_DUTY_CYCLE));
double T_pwm =1.0/frequency;
double time = fmod(ssGetT(S),T_pwm);
*y =(time < T_pwm * duty_cycle)? 1.0:0.0;
}
static void mdlTerminate(SimStruct *S)
{
}
#ifdef MATLAB_MEX_FILE
#include "simulink.c"
#else
#include "cg_sfun.h"
#endif

Answers (1)

Mark McBroom
Mark McBroom on 18 Feb 2024
Why are you writing an S-Function for this simple C algorithm. If you must write this in C, I suggest using the C Function block. https://www.mathworks.com/help/simulink/slref/cfunction.html
Or even easier, just write this code in MATLAB using a MATLAB Function Block: https://www.mathworks.com/help/simulink/ug/what-is-a-matlab-function-block.html#

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!