Simulink仿真入门到精通(十九) 总结回顾&自我练习
从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天。
学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结:
- Simulink的基础模块已基本掌握,对不熟悉的模块可以借助帮助文档了解其功能;
- Simulink信号基本掌握,了解了各种信号的外观及意义的不同;
- 对Simulink子系统的认识有待深入,对原子子系统需要进一步熟悉;
- 对仿真过程及参数配置有所了解,对Debugger的应用不太熟悉;
- 对回调函数有所认识,能够简单应用到参数预加载等场合;
- 关于M语言对Simulink的操作有待进一步熟悉;
- Simulink流控制有待进一步熟悉;
- S函数掌握得不好;
- 对模块的封装有所认识,能够应用到子系统外观绘制等场合;
- 自定义库、自定义环境估计暂且用不到;
- 对代码生成前的配置有了一定的认识,对各种优化代码生成的技巧需要进一步练习;
- 对TLC语言有初步的入门。
在学习过程中一直采用打字记录的方法,其间一周由QQ拼音统计的结果如下,好处在于在仔细地输入过程中对书中内容有了更多的思考时间,对参数配置都过了一遍,而不是走马观花,以后用到之时即使记不起具体内容,应该也会记得我在哪里曾经输入过,方便回来查找。坏处在于花费了较多时间,且博客照搬书中文字,缺少自己的思考和创新,在以后的学习中,应该简要记录重点内容,加之自己的思考和描述。
全书共19章,最后一章由于没有下载到相应的库和工具,暂且放过。其他1~18章链接如下。在打字过程中难免疏漏,存在一些错误,希望日后查阅时能够逐步改正,如果这些博客有幸为其他小伙伴所浏览,也欢迎评论指出错误之处。
Simulink仿真入门到精通(一) Simulink界面介绍
Simulink仿真入门到精通(四) Simulink子系统
Simulink仿真入门到精通(五) Simulink模型的仿真
Simulink仿真入门到精通(六) Simulink模型保存为图片
Simulink仿真入门到精通(七) Simulink的回调函数
Simulink仿真入门到精通(八) M语言对Simulink模型的自动化操作及配置
Simulink仿真入门到精通(九) Simulink的流控制
Simulink仿真入门到精通(十二) Publish发布M文件
Simulink仿真入门到精通(十三) Simulink创建自定义库
Simulink仿真入门到精通(十四) Simulink自定义环境
Simulink仿真入门到精通(十五) Simulink在流程工业中的仿真应用
Simulink仿真入门到精通(十六) Simulink基于模型设计的工业应用概述
Simulink仿真入门到精通(十七) Simulink代码生成技术详解
学完本书,决定完成一个代码生成的练习,以低通滤波器为例,以C51做载体,原因在于C51比较简单,资源较少,我比较熟悉,另外C51可以借助Keil、Proteus等工具方便地进行仿真,验证其正确性。
下面将介绍我的练习过程。
注:MATLAB版本2018a,Keil V5.24,Proteus8.6。
1. Simulink模型
1.1 模型外观
说明:
- 为了配合C51的数据类型,输入输出均设置为uint16,故需要进行数据类型转换;
- LPF(Low Pass Filter)内部结构及输出表达式如图所示;
- 增益参数设为g,并在Model Properties→Callbacks→PreLoadFcn中设置回调函数为g=0.05;以便与在生成的代码中对增益进行修改;
- 在Mask Editor的Icon drawing commands中添加一下绘图命令,绘制低通滤波器的大致形状,使模块美观。
num=1;
den=[1,1];
ts=tf(num,den);
P=bodeoptions;
[mag,~,w]=bode(ts,P);
w=reshape(w,1,length(w));
mag=reshape(mag,1,length(w));
dB=20*log10(mag);
w=log10(w);
plot(w,dB);
传递函数G(s)=1/(s+1),使用bode获取幅频特性并绘图。
补:本想选用DSP System Toolbox→Filtering→Filter Implementations中的Analog Filter Design作为低通滤波器。但此模块阶数(Order)较高时,计算比较复杂,可能导致C51的RAM空间不足,此处只是为了验证代码生成的过程,故选用比较简单的模型。
1.2 模型配置
Solver Type:Fixed-step
Solver:discrete(no continuous states)
生成嵌入式代码必须采用固定步长,由于没有连续环节,故可选用离散解算器。
Device:Intel
Device type:8051 Compatible
注:MATLAB2018a中没有此选项,但可以在低版本MATLAB中建立模型,选择此项,再将模型在2018a中打开即可。
System target file:ert.tlc
Language:C
Generate code only:√
Default parameter behavior:Tunable
Create code generation report:√
Open report automatically:√
生成报告并自动打开。
Generate an example main program:□
自己编写main主函数,不需生成示例。
其他参数保持默认。
1.3 模型仿真
在Simulink中建立如下模型。
输入信号由正弦信号和正态随机数叠加构成。
仿真时长30s,步长0.01s,得到仿真结果如下图所示。
可以看到,模型具有较好的滤波效果。
1.4 代码生成
配置好模型参数后,选定好工作目录,按下Ctrl+B,启动代码生成。
得到Report如下图。
在LPF_data中可以看到g的定义,在此处可进行修改。
LPF_step函数为核心函数。
void LPF_step(void)
{
real_T rtb_Add1;
real_T tmp; /* Sum: '<S1>/Add1' incorporates:
* DataTypeConversion: '<Root>/Data Type Conversion'
* Gain: '<S1>/Gain'
* Inport: '<Root>/In1'
* Sum: '<S1>/Add'
* UnitDelay: '<S1>/Unit Delay'
*/
rtb_Add1 = ((real_T)LPF_U.In1 - LPF_DW.UnitDelay_DSTATE) * LPF_P.g +
LPF_DW.UnitDelay_DSTATE; /* DataTypeConversion: '<Root>/Data Type Conversion1' */
tmp = floor(rtb_Add1);
if (rtIsNaN(tmp) || rtIsInf(tmp)) {
tmp = 0.0;
} else {
tmp = fmod(tmp, 65536.0);
} /* Outport: '<Root>/Out1' incorporates:
* DataTypeConversion: '<Root>/Data Type Conversion1'
*/
LPF_Y.Out1 = tmp < 0.0 ? (uint16_T)-(int16_T)(uint16_T)-tmp : (uint16_T)tmp; /* Update for UnitDelay: '<S1>/Unit Delay' */
LPF_DW.UnitDelay_DSTATE = rtb_Add1;
}
2. Proteus硬件连接
2.1 带噪声的正弦信号发生器
由于Proteus中没有直接产生白噪声的元件,在这里采用基于EPROM的波形发生方式。首先采用外部函数将白噪声数据写入txt文件,在转换为二进制数据加载到27256中,得到噪声信号。
比如我采用R语言生成这些数据,R代码如下。
#生成波形数据部分
noise<-rnorm(500,mean=36*3.5,sd=36)
noise<-round(noise)
noise_H<-as.character(as.hexmode(noise))
#写入文件部分
write.table(noise_H,file='C:/Users/lenovo/Desktop/noise_H.txt', row.names =FALSE,col.names =FALSE, quote =FALSE)
由于正态分布在3倍标准差范围内的概率已经达到99.74%,因此此处选3.5足够。得到数据文件如下:
利用从网上下载的转换工具进行转换:(感谢这位博主)
https://download.csdn.net/download/mouseleoz/10905646
即得到可加载的bin文件。
555定时器产生周期性信号,74LS161构成16进制计数器,噪声数据即在27256的D0到D7端口输出。
2.2 A/D转换
将上面的输入信号封装为子电路图,总电路图如下。
利用11通道12位串行A/D转换芯片TLC2543进行A/D转换,TLC2543引脚说明如下。
2.3 D/A转换
利用DAC0832进行D/A转化,由于0832是8位D/A转换器,因此损失了部分精度。

3. Keil工程
3.1 main函数
#include<reg52.h>
#include "LPF.h"
#include "LPF_private.h"
#define uint unsigned int
#define uchar unsigned char
#define y P2
uint volt;
uchar addr;
sbit CLK=P1^;//定义时钟信号口
sbit DIN=P1^;//定义2543数据写入口
sbit DOUT=P1^;//定义2543数据读取口
sbit CS=P1^;//定义2543片选信号口
sbit P2_5=P2^; void read2543(uchar addr)
{
uint ad=;
uchar i;
CLK=;
CS=;//片选段,启动2543
addr<<=;//对地址位预处理
for(i=;i<;i++) //12个时钟走完,完成一次读取测量
{
if(DOUT==)
ad=ad|0x01;//单片机读取ad数据
DIN=addr&0x80;//2543读取测量地址位
CLK=;
;;;//很短的延时
CLK=;//产生下降沿,产生时钟信号
;;;
addr<<=;
ad<<=;//将数据移位准备下一位的读写
}
CS=;//关2543
ad>>=;
volt=ad;//取走转换结果
} void main()
{
addr=;
LPF_initialize();
TMOD=0x01;
TH0=0xD8;
TL0=0xF0;
TR0=;
EA=;
ET0=;
while()
{
read2543(addr);
}
}
void Timer0_ISR(void) interrupt
{
TH0=0xD8;
TL0=0xF0;
LPF_U.In1=volt;
LPF_step();
y=LPF_Y.Out1/; }
在while(1)中不断读取A/D转换结果,在定时器中固定步长执行LPF_step函数。定时器初值D8F0=55536=2^12-10000,故步长为0.01s。
由于读取的转换结果是12位数据,因此除以16转换为8位,同时损失了精度。
3.2 编译方法
将Simulink生成的.c和.h文件加入到工程下,启动编译。
编译无误即可得到hex文件,将其加载到单片机中,启动仿真,得到示波器结果如下所示。
可以看到,该电路完成了滤波任务。
4. 模型评价总结
该实例仅是为了练习Simulink生成代码的过程,实际效果并不理想,主要缺点有:
- 中间经过A/D和D/A转换,损失了精度,得到的结果是离散的;
- 算法导致输出比输入有一定的相位滞后。
如图,放大后即可看到其离散性,实际效果甚至不如一阶RC滤波器(有源或无源)。
在这个过程中对Proteus的总线创建、标号添加及子电路图绘制方法进行了回顾。
对C51的端口赋值方法进行了复习,#define y P2。
在建模过程中参考了以下网页,对这些博主表示感谢。
Simulink生成代码在C51中的用法:https://blog.csdn.net/weixin_41911709/article/details/90648818
TLC2543的用法:https://blog.csdn.net/nanfeibuyi/article/details/80564741
通过此练习,起码简单验证了Simulink生成C代码的可行性,其他学习有待以后深入。
总之,本书由浅入深,还是非常值得一读,错误也比较少,即使偶尔有拼写错误也不影响阅读。
我的模型文件打包如下:
链接:https://pan.baidu.com/s/1iedYzuQbcezU4_-fW2s6tw
提取码:k3fj
Simulink仿真入门到精通(十九) 总结回顾&自我练习的更多相关文章
- Simulink仿真入门到精通(九) Simulink的流控制
9.1 Simulink流控制分类 simulink中流控制时通过自带的模块实现的,包括If else.Switch.For和While4个种类. 9.2 While流控制 while 如果条件为真, ...
- Simulink仿真入门到精通(五) Simulink模型的仿真
5.1 模型的配置仿真 由各种模块所构建的可视化逻辑连接,只是模型的外在表现,模型仿真的核心驱动器是被称作解算器(Solver)的组件,相当于Simulink仿真过程的心脏,驱动着模型仿真,它在每一个 ...
- Simulink仿真入门到精通(三) Simulink信号
3.1 Simulink信号概述 所谓信号,表示一种随着时间而变化的量,在时间轴上的采样时刻都对应有数值. 信号在Simulink中是相当重要的组成部分,有线(line)表示,在模型中穿针引线地将各模 ...
- Simulink仿真入门到精通(十八) TLC语言
TLC(Target Language Compiler)是一种为转换为目标语言而存在的额解释性语言,其目的就是将模型中编译出来的rtw文件转换为目标代码(C/C++等).与M语言类似,既可以写成脚本 ...
- Simulink仿真入门到精通(十六) Simulink基于模型设计的工业应用概述
16.1 Simulink用途概述 在基于模型设计广泛应用于汽车电子嵌入式开发的今天,MBD(Model Besed Design)技术也逐步推广到各种嵌入式控制方面.与传统的嵌入式开发相比,BMD以 ...
- Simulink仿真入门到精通(十五) Simulink在流程工业中的仿真应用
15.1 工业乙醇生产与计算机仿真 乙醇作为可再生清洁能源不仅可以代替四乙基铅作为汽油的防爆剂,还可以制造汽油醇.这一巨大的潜在需求促使人们去寻找提高乙醇工业生产率的途径,使人们着手于发酵工程的研究. ...
- Simulink仿真入门到精通(十四) Simulink自定义环境
14.1 Simulink环境自定义功能 sl_sustomization.m函数是Simulink提供给用户使用MATLAB语言自定义Simulink标准人机界面的函数机制.若sl_sustomiz ...
- Simulink仿真入门到精通(十) S函数
10.1 S函数概述 S函数也称为Simulink中的系统函数,是用来描述模块的Simulink宏函数,支持M.C等多种语言.当Simulink默认的模块不能满足用户的需求时,用户可以通过S函数自己打 ...
- Simulink仿真入门到精通(十二) Publish发布M文件
12.1 M文件的注释 使用%进行注释. 连续多行注释Ctrl+R,取消注释Ctrl+T. 12.2 Cell模式 在MATLAB脚本文件中使用连续两个注释符,开启一个新的Cell块,%%后空一格追加 ...
随机推荐
- django框架进阶-form组件-长期维护
################## form组件做了什么事情? ####################### 之前web开发的模式,以注册为例 1,要有一个注册页面,然后有一个f ...
- MOOC(7)- case依赖、读取json配置文件进行多个接口请求-模拟接口响应数据(18)
这里是把传入的请求数据作为响应值返回 # -*- coding: utf-8 -*- # @Time : 2020/2/15 9:47 # @File : do_mock_18.py # @Autho ...
- CSS面试题&知识点汇总
问题&答案 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? 有两种, IE 盒子模型.W3C 盒子模型: 盒模型: 内容(content).填充(padding).边界(m ...
- Redhat7 配置https
Redhat7 配置https 分为自签名证书和第3方证书(此时实验为第3方,自签名略) 安装: # yum install httpd mod_ssl 生成key: # openssl genrsa ...
- 吴裕雄--python学习笔记:sqlite3 模块的使用与学生信息管理系统
import sqlite3 cx = sqlite3.connect('E:\\student3.db') cx.execute( '''CREATE TABLE StudentTable( ID ...
- js 实现排序算法 -- 冒泡排序(Bubble Sort)
原文: 十大经典排序算法(动图演示) 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作 ...
- Python---14面向对象高级编程(__slots__&@property)
一.使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Stude ...
- 数据库中慎用float数据类型(转载)
数据库中慎用float数据类型 大多数编程语言都支持float或者double的数据类型.而数据库中也有相同关键字的数据类型,因此很多开发人员也自然而然地在需要浮点数的地方使用float作为字段类 ...
- 网站log记录
记录网站日志可以清晰的把控网站运行状态. 程序中对外部系统和模块的调用前后都需要记日志,方便接口调试. 数据库操作处需要记日志.
- HTTP 协议的基本知识,包括请求流程、请求方法等
一.什么是http协议? HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Int ...