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 vues (au cours des 30 derniers jours)
#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

Réponses (1)

Mark McBroom
Mark McBroom le 18 Fév 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#

Catégories

En savoir plus sur Block Libraries dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by