利用Embedded Coder工具箱生成c代码
关于Embedded Coder工具箱
Embedded Coder 工具箱可以生成可读、紧凑且快速的 C 和 C++ 代码,以便用于嵌入式处理器。另外, Embedded Coder 提供了 MATLAB Coder 和Simulink Coder 配置选项和高级优化功能,以便对所生成代码的函数、文件和数据进行精细控制。 这些优化可提高代码效率,并有助于与生产中使用的已有代码、数据类型和校准参数集成。 可以将第三方开发环境并入构建过程,以便为嵌入式系统上的全套部署生成可执行文件。
主要特性
- 扩展 MATLAB Coder 和 Simulink Coder 的优化和代码配置选项
- 使用 Simulink ? 数据字典功能的存储类、类型和别名定义
- 特定于处理器的代码优化
- 使用或不使用 RTOS 的多速率、多任务和多核代码执行
- 代码验证,包括 SIL 和 PIL 测试、自定义注释以及代码报告(从模型追踪到代码和要求以及从代码和要
求追踪模型) - 集成了 Texas Instruments 的 Code Composer Studio 、 Analog Devices VisualDSP++ 和其他
第三方嵌入式开发环境 - Simulink 中的标准支持,包括 ASAP2 、AUTOSAR 、DO-178 、IEC 61508 、ISO 26262 和 MISRA C 一个定点模型,具有生成的代码及其针对 SIL 执行的仿真模式设置。 Embedded Coder 使您可以为生产嵌入式系统
快速生成、记录和测试代码。
生成目标
将PID控制器生成c代码
PID控制器的特点
- PID公式: P + I ∗ T s 1 z − 1 + D ∗ 1 T s z − 1 z P + I*{T_s}\frac{1}{{z - 1}}{\rm{ + D*}}\frac{1}{{{T_s}}}\frac{{z - 1}}{z} P+I∗Tsz−11+D∗Ts1zz−1
- 带限制输出:输出幅值为0v到5v
- 数据类型均是double性
使用步骤
- 在“APPS”里面找到Embedded Coder工具箱:
- 打开Embedded Coder使用“quick start”。这样可以更加精准的生成c代码。
-
打开“quick start”界面
-
选择用于代码生成的模型或所选子系统。我选择生成c_code整个模型的代码
- 选择代码类型和生成代码您生成的实例数
- 选择硬件,数据类型
-
选择最重要的代码生成目标。使用RAM
-
配置参数修改
对生成的代码分析
报告列表
主代码分析
备注:P=0.0552;
I=0.1264;
D=0.000034389;
.h文件
typedef struct {
real_T Integrator_DSTATE; /* '<S31>/Integrator' */
real_T UD_DSTATE; /* '<S26>/UD' */
} DW;
/* External inputs (root inport signals with default storage) */
typedef struct {
real_T OUT; /* '<Root>/In1' */
} ExtU;
/* External outputs (root outports fed by signals with default storage) */
typedef struct {
real_T Out1; /* '<Root>/Out1' */
} ExtY;
/* Block signals and states (default storage) */
extern DW rtDW;
/* External inputs (root inport signals with default storage) */
extern ExtU rtU;
/* External outputs (root outports fed by signals with default storage) */
extern ExtY rtY;
/* Model entry point functions */
extern void c_code_initialize(void);
extern void c_code_step(void);
主要.c文件
/*************************
**************************/
void c_code_step(void)
{
real_T rtb_TSamp;
/*
* y = u * K where K = 1 / ( w * Ts )
*/
rtb_TSamp = 3.4389E-5 * rtU.OUT * 50.0;
rtY.Out1 = (0.0552 * rtU.OUT + rtDW.Integrator_DSTATE) + (rtb_TSamp -
rtDW.UD_DSTATE);
if (rtY.Out1 > 5.0)
{
rtY.Out1 = 5.0;
}
else
{
if (rtY.Out1 < 0.0)
{
rtY.Out1 = 0.0;
}
}
rtDW.Integrator_DSTATE += 0.1264 * rtU.OUT * 0.02;
rtDW.UD_DSTATE = rtb_TSamp;
}
.Out1 < 0.0)
{
rtY.Out1 = 0.0;
}
}
rtDW.Integrator_DSTATE += 0.1264 * rtU.OUT * 0.02;
rtDW.UD_DSTATE = rtb_TSamp;
}