2837xd 代码生成——StateFlow(1)

  在Command Window中键入sf可以进入,也可以通过Simulink库中的StateFlow子库进入.

  StateFlow有限状态机,再使用matlab时,可能有所感觉:一个简单的if语句或者++操作需要构建的过于复杂。但是引入状态机可以大大减少这种情况。

  进入库函数模块可以看到这三个元件都是状态机的模块,一个个学习:先看Chart模块。

在这里插入图片描述

1 Chart模块

创建一个新的Chart模块,打开后,右键进入Properties进行设置。

在这里插入图片描述

界面左侧是一些Chart中使用的组件:

在这里插入图片描述

其中,每个模块之间都只有互斥(只有一个能够执行)和并行的关系。并行关系下右上角会有执行顺序标识。

在这里插入图片描述

其中被模块分成了不同的级别,同属于一个模块下的内容是一个级别,如果需要设置并行和互斥关系。在需要设置的级别空白处右键选择Decomposition进行选择并行和互斥关系。

在这里插入图片描述

State模块有一些关键字可以进行定义进入和这些模块后执行的动作:

在这里插入图片描述

在这里插入图片描述

利用上面的知识可以搭建一个简单的模型,看一下流程图的概念。

在这里插入图片描述

首先搭建如上图所示的简单模型,s是条件,light是动作结果。这是模拟了开关灯的一个过程,开灯(s=1)很明显需要我们给定,light需要程序进行运行出来相关的结果。此时进入Model Explorer中进行相关的设置。

在这里插入图片描述

在这里插入图片描述

然后在Simulink中加入相关的外部模块,给定与显示输入输出。

在这里插入图片描述

仿真结果如下。改变s的值,可以相应的改变light的值。

在这里插入图片描述

将上述流程加以改造,加入事件。Open_switch(Close_Switch),b并在Model Exporer中进行定义。这里要注意定义的输入端口与demux输入应该保持一致。

在这里插入图片描述

然后搭建一下电路,Input3是用来激活模块。可以知道这时候,不仅仅要s=1,并且需要上升沿(Open_switch事件设置的触发的上升沿)才能触发light=1。类似数电中的上升沿才能锁存相应的信号。

在这里插入图片描述

为了可以更好的书写流程,StateFlow引入了连接节点的概念。点击Parretn可以设置出来以下的多种结构。

在这里插入图片描述

也可以自己为连线增加条件,鼠标放置在两个连接点的连线上会自动出来如下标识,默认一个节点多个分支的情况下,会优先执行有条件的那个分支。:

在这里插入图片描述

如图,搭建以下分支,等同于C代码:

if (x<0)
    y=abs(x);
else
    y=x;

在这里插入图片描述

在Model Explorer中设置相关的data的属性,给定输入和输出。这里输入给定的是1Hz的正弦波。

在这里插入图片描述

在这里插入图片描述

现在结合第一个开关灯的状态,若在开灯状态里面存在两个状态(A、B)代表亮度不同。那么我们若在设置了第一次亮度后,肯定不希望下一次开灯亮度又要再次调节。因此这里引入历史节点,即能够记忆最后一次退出的状态,尽管A是默认状态。但这时的状态由上一次退出时的状态决定:

在这里插入图片描述

2 模型实例搭建

2.1 汽车状态判断

构建如下的一个汽车状态判断逻辑电路,能够定义上面所产生的事件,进行运行,可以模拟换挡以及启停状态监测:

在这里插入图片描述

搭建完成后,可以直接点击运行,这时因为没有定义相关的data和event会弹出一个自动定义的界面,在上面进行相关修改即可快速添加:

在这里插入图片描述

构建外围电路,设置相关事件触发的装置运行时,将仿真时长改为inf(无限长),便可以操作观测实验现象:

在这里插入图片描述

2.2 媒体播放状态检测

 通过流程图可以进行观测媒体播放状态,这个例子引入了历史节点与状态检测,构建如下图所示的chart,可以看到在power_on中的状态转移流程图上有的没有触发条件(即表示任何事情都可以触发)。例如,若现在处于USB状态,若发送Open_CD(Open_Radio)之后都可以触发状态转移。

在这里插入图片描述

  在状态上右键进去属性(Properties),修改状态输出,便可以在输出端口观测状态情况(布尔变量输出,为1表示在次状态)。

在这里插入图片描述

  其中加入了历史节点,代表下一次进入power_on模块时,会重新直接进入上一次退出的那个状态。

 搭建外部电路如下图所示:

在这里插入图片描述

2.3 2837xd流水灯联机调试

  首先搭建以下的chart,这里led1和led2都是输出量。直接连接GPIO接口就可。

在这里插入图片描述

  下图是led1和led2的输出波形图,图中标识的1.2.3.4与上图的执行流程对应。就这样循环3次之后,出循环,然后熄灭等,进入下一个循环。这里测试发现,在状态中会持续一个步长,在节点进行动作(3、4)又会花费一个步长。[步长设置为0.5s],相关参数的设置,请参照博客前面的文章叙述。

在这里插入图片描述

  程序外围电路图:

在这里插入图片描述

  这是将一个调试的技巧,下图中SIMULATION和HARDWARE中各自有一个RUN,SIMULINK中的RUN可以不连接硬件,直接跑软件运行结果,也就是也可以方便的调试chart模块输出。HARDWARE中的RUN是生成DSP的代码烧录进入DSP然后运行。

在这里插入图片描述

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quikk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值