龙空技术网

使用Simulink学习STM32-(4)状态机(Stateflow)实现按键控制LED

想啥做啥E 489

前言:

此刻咱们对“c语言实现状态机”大约比较关心,咱们都需要了解一些“c语言实现状态机”的相关内容。那么小编也在网上搜集了一些有关“c语言实现状态机””的相关文章,希望小伙伴们能喜欢,同学们一起来学习一下吧!

实验环境

Matlab版本:2021b

操作系统:Win10专业版

硬件平台:YF-STM32-ALPHA 1R4

模型与原理图

本次实验所用到的Simulink模型如图5.1所示,状态机(Stateflow)内部模型如图5.2所示。

实验现象: 按键按下、松开LED实现亮灭翻转效果,当按键按下时会产生上升下降沿脉冲,通过状态机来控制LED灯状态,当LED状态为0时,LED点亮,当LED状态为1时,LED熄灭。

按键电路采用对电源负极外部上拉连接方式,如图5.3所示,按键松开状态为高电平H,即逻辑1,按键按下状态为低电平L,即逻辑0,按键在实际电路板中的位置如图5.4所示。

温馨提示:图5.3中的电路接了上拉,而在之前的文章中介绍的按键没有接上拉,经过仔细研究发现官方的支持包默认是浮空输入,容易受外部信号干扰,这也是为什么之前文章中测得的波形跳动比较大,出现很多跳变波形。


图5.1 按键控制LED亮灭simulink模型

图5.2 按键控制状态机(Stateflow)模型

5.3 按键控制LED亮灭原理图

图5.4 按键在开发板中的位置

基础模型介绍与分析

温馨提示:本篇介绍的操作方式适用于2021b版本matlab,其他版本在使用上会有略微差异。


关于输入输出的模型前面有介绍,本篇就不再赘述,这里重点介绍“chart”模型部分,本次实验用到的模型整体外观如图5.5所示,simulink中“chart”模型位置位于“建模”栏中的“插入图”处,如图5.6所示,整个模型外观包含一个两个事件输入和两个状态量输出。

图5.5 按键模型中的“chart”模型

图5.6 “chart”模型在simulink中位置

双击“chart”模型打开该模型内部如图5.7所示,在simulink“建模”栏处找到“模型资源管理器”单击打开,然后再点击“chart”处,可以看到整个状态机所包含的信息。

按键状态模型中总共包含四个状态(初始状态,按下状态、松开状态、复位状态)、两个事件(Event)输入(上升、下降沿输入)和两个数据(Data)状态量输出(LED状态、按键状态)以及四个状态传输线(Transition)。

图5.7 “char”打开模型内部

如何搭建该模型?首先选中“建模”栏点击“插入”四个状态,如图5.8所示,然后填写相应的信息,如图5.9所示,这里需要特别注意中间的格式,至于格式为什么是这样的,这是规定,就像C语言的语法规则一样,读者朋友暂且按照这种方式填写,后面熟练了再灵活去修改。细心的朋友可能注意到有个其中有一个状态有一条连接线跟其他几个不一样,单向的还带有一个点,这是整个状态机的入口位置,当模型运行时,首先运行到该处,然后有相应的输入实际或数据输入时才会做状态转移。

图5.8 状态插入

图5.9 状态中填入的信息

在状态转换中填入信息后,需要在“模型资源管理器”中添加与这些信息同名的事件和数据,如图5.10所示,点击上面有很多“1010”的图标来添加数据量,点击“闪电”图标添加事件,时间,事件有四种触发方式,根据实际的用途进行修改,例如我们需要实现“TIC_UP”上升沿时触发事件则将“Trigger”处改为“Rising”,由于该事件为输入所以还需要在该事件中将“Scope”处改为“Input”,“LED_State”和"Key_State"可以保持默认,将“Scope”处改为“Output”即可,模型中出现的after(20,msec)表示此处延时20ms进入下一个状态,前提是整个模型的采样需要设置为20ms的整数倍,本实验模型设置的采样周期为10ms。

温馨提示:这里需要特别注意,事件或数据量一定要与状态模型中的名字保持一致,例如:在状态模型中出现LED_State=1;数据量则在添加数据量时也需要将其命名为“LED_State”

图5.10 添加事件和状态数据

图5.11 事件触发方式修改

所有模型设置完成进入到主模型中会出现一个事件输入端口和两个数据输出端口,如图5.12所示,由于时间输入端口包含连个事件,而实际输入端口只有一个,所以这里需要添加一个“Mux”模型用于将按键输入的状态通过两路信号合成为一路信号输入。

图5.12 模型上的输入输出端口

图5.13 "Mux"模型


✏️总结

本实验中使用Statflow模型实现按键状态输入控制LED状态变化,对于很多熟悉使用C语言的读者而言,状态机的灵活性无疑是非常方便的,状态机编程思想无论是使用传统C编程方式还是基于模型方式都是非常重要且实用的,甚至还有专门开发基于状态机嵌入式框架的,例如QM,,如图5.14所示为QM状态机官方宣传图片。其实当你深入研究系统中的每个任务时会发现,每个任务或事件的运行它都是在等待一些条件,有可能是延时条件,有可能是资源占用信号量或其它影响该任务运行的量,而一旦该任务或事件运行完毕就会切入到其它状态并进行标记,这里就不展示讨论了,感谢兴趣的读者朋友可以深入去研究下这种编程思想。

图5.14 QM官方宣传图

标签: #c语言实现状态机 #状态机三部分 #c语言状态机 #stm32开关控制led #stm32按键控制led灯仿真图