基于simulink的s-function的PWM生成 simulink真是无所不能,不仅可以仿真电路,生成代码,还可以将自己的代码放在仿真里运行,这里基于sfun写一个PWM生成器,便于sfun的学习 设置sfun的函数名和参数,其中有两个参数和两个输入信号, 仿真结果如下:模型
 两个参数分别是输出波形的幅值和模型运行的分辨率,这里设置幅值为5,分辨率为10k
 两个输入信号分别是占空比和周期值,这里设置占空比为50%,周期为40ms(25hz)
 注:分辨率要大于PWM的周期值
 
 

代码
/*   * File     : sfun_pwm.c  * Abstract:  *     *   This file represents an S-function example which demonstrates the S-function macros for using a  *   controllable sample time. This S-function generates PWM (Pulse-width modulation) signals based  *   on the input period and duty cycle signals.  *  *   This S-function registers a controllable sample time with which the S-function can schedule the  *   next hit when changing the output value. The S-function has two input ports and one output  *   port. The first input port is the duty cycle signal and the second is the period signal. The  *   S-function has two block parameters: the amplitude of the generated PWM signal and the  *   resolution of the controllable sample time.  *   *   This S-function illustrates the use of the S-function macro:  *         *        ssSetControllableSampleTime(S, 0, resolution)  *  *   to register a controllable sample time in mdlInitializeSampleTimes(). The resolution must be a  *   positive finite number that defines the fundamental step size that the S-function can schedule  *   the next hit for this sample time.  *  *   This S-function illustrates the use of the S-function macro:  *  *       ssSetNumTicksToNextHitForControllableSampleTime(S, 0, numTick)  *    *   to schedule the next hit of the controllable sample time. The next hit happens after t =  *   t_current + numTick * resolution. numTick must be a positive integer. The S-function must use  *   this macro to schedule the execution of the controllable sample time in  *   mdlInitializeConditions() and mdlOutputs().  *  * Copyright 2017 The MathWorks, Inc.  */  #define S_FUNCTION_NAME mysfun_generate                          //函数名 #define S_FUNCTION_LEVEL 2                                       //sfun的深度  #include "simstruc.h" #include "assert.h"  /* Function: mdlInitializeSizes ================================================  * Abstract:  *  *   Register an S-function with two input ports, one output port, and three DWorks. Specify the  *   number of sample times to 1.  *  */ static void mdlInitializeSizes(SimStruct* S) {     //这个函数用来初始化的,主要是设置输入、输出和参数的。          if (!ssSetNumInputPorts(S, 2)) return;//设置输入信号2个     ssSetInputPortWidth(S, 0, 1);//设置输入变量0的维数为1     ssSetInputPortDirectFeedThrough(S, 0, 1);// 设置输入端口的信号是否mdlOutputs函数中使用,这儿设置为true     ssSetInputPortWidth(S, 1, 1);//设置输入变量1的维数为1     ssSetInputPortDirectFeedThrough(S, 1, 1);// 设置输入端口的信号是否mdlOutputs函数中使用,这儿设置为true          if (!ssSetNumOutputPorts(S, 1)) return;//设置输出变量的个数     ssSetOutputPortWidth(S, 0, 1);//设置输出变量0的维数为1维      ssSetNumSFcnParams(S, 2);//设置参数2个     if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {         return;     }          ssSetNumContStates(S, 0);//设置连续状态变量的     ssSetNumDiscStates(S, 0);     ssSetNumDWork(S, 3);     ssSetDWorkWidth(S, 0, 1);//设置离散状态变量的     ssSetDWorkDataType(S, 0, SS_BOOLEAN);     ssSetDWorkWidth(S, 1, 1);     ssSetDWorkDataType(S, 1, SS_DOUBLE);     ssSetDWorkWidth(S, 2, 1);     ssSetDWorkDataType(S, 2, SS_UINT32);          ssSetNumSampleTimes(S, 1);//设置采样时间,此处为1s,后面有修改      ssSetOperatingPointCompliance(S, USE_DEFAULT_OPERATING_POINT);          ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE |                     SS_OPTION_USE_TLC_WITH_ACCELERATOR);//默认 }  /* Function: mdlInitializeSampleTimes ==========================================   * Abstract:   *   Register a controllable sample time with the specified resolution.  */ static void mdlInitializeSampleTimes(SimStruct* S) {     real_T resolution = (real_T) *mxGetPr(ssGetSFcnParam(S,1));//设置采样时间     ssSetControllableSampleTime(S, 0, resolution);//将参数分辨率设置成采样时间 }  /* Function: mdlInitializeConditions============================================  * Abstract:  *   Initialize the DWorks related to the generation of the PWM signals. Force a hit for the  *   controllable sample time.  */ #define MDL_INITIALIZE_CONDITIONS static void mdlInitializeConditions(SimStruct *S) {     //初始化离散状态变量的值     /*      * Force a sample hit whenever the system is initialized.      */     ssSetNumTicksToNextHitForControllableSampleTime(S, 0, 1);      boolean_T * x1  = (boolean_T*)ssGetDWork(S,0);         real_T *x2 = (real_T*)ssGetDWork(S,1);     uint32_T *x3 = (uint32_T*)ssGetDWork(S,2);         *x1 = true;     *x2 = 0.0;     *x3 = 0;      }  /* Function: mdlOutputs ========================================================  * Abstract:  *   Generate the PWM signals based on the input duty cycle and period signals.  */ static void mdlOutputs(SimStruct* S, int_T tid) {     //这个函数就是输出的函数,所有的代码动作在这里执行          real_T* y = ssGetOutputPortRealSignal(S, 0);//获取输出端口     boolean_T* x1 = (boolean_T*)ssGetDWork(S,0);//获取离散变量端口     real_T *x2 = (real_T*)ssGetDWork(S,1);//获取离散变量端口     uint32_T *x3 = (uint32_T*)ssGetDWork(S,2);    //获取离散变量端口                size_t numTicksToNextHit = 0;//设置值     real_T yout_value = 0.0;             if (*x1) {         real_T amplitude_prm = (real_T) *mxGetPr(ssGetSFcnParam(S,0));         real_T period_prm = (real_T) *mxGetPr(ssGetSFcnParam(S,1));          InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);         real_T duty = *uPtrs[0];                  real_T p = *uPtrs[1];         size_t numSamples = (size_t) (p/period_prm);         numTicksToNextHit = (size_t) (duty*numSamples);                                  if (numTicksToNextHit == 0) {             numTicksToNextHit = numSamples;             yout_value = 0;         } else if (numTicksToNextHit == numSamples) {             numTicksToNextHit = numSamples;             yout_value = amplitude_prm;         } else {             *x1 = false;             *x2 = duty;             *x3 = (uint32_T)(numSamples - numTicksToNextHit);             yout_value = amplitude_prm;         }     } else {         *x1 = true;         numTicksToNextHit = (size_t) *x3;         yout_value = 0;     }              *y = yout_value;//输出     ssSetNumTicksToNextHitForControllableSampleTime(S, 0, numTicksToNextHit);    //更新下一次的采样时间      } /* mdlOutputs */  static void mdlTerminate(SimStruct *S) { }  /* Required S-Function trailer */  #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  
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
 官方软件产品操作指南 (170)
官方软件产品操作指南 (170)