stateflow历史节点使用及案例剖析
目录
前言
? ? ? ?之前总是认为stateflow有啥用,好像它可以做的switch和if等模块都能做到,也是带着这些不解去接触,后来发现switch能把逻辑思路大大简化和清晰,且由于带触发和持续动作的缘由,其它模块并非简易能够做到替代,目前仍是一名小白,写下博客首先要感激b站的:Hyowinner校长
Hyowinner校长的个人空间-Hyowinner校长个人主页-哔哩哔哩视频
遇到了问题抱着试试的态度,感谢百忙抽空做到开会议解答!往后您的作品持续支持!
视频学习链接:
【入门篇】Stateflow历史节点的使用_哔哩哔哩_bilibili
?下面将分为案例需求、案例stateflow模型、问题缘由及问题解决方案三部分创作,由于博客完全根据校长视频记录,如有侵权,请联系删除,谢谢校长!
1. 案例需求
注:截图来自上述视频链接。?
2.案例stateflow模型
3.问题缘由及问题解决方案
3.1问题
按照上述按键+防抖需求,出现连续的5个电平应该能够执行相应的动作,我这里给了6个低电平,应该在0.05s时候就要执行value+1操作,即0.05s输出为1(求解器采样时间0.01s)。
3.2问题产生缘由
注:上述模型中的cnt为局部变量,视频中按照人为习惯理解设为0,我这里改为了1本以为能解决问题,但实际不行,问题由两个因素导致,随我娓娓道来,可能较为啰嗦,水平能力有限,请多多指教!
采用断点调试可以发现在0s时刻停留在默认转移状态,或者说在IDLE chart的外围,还未进入该chart,更未执行chart中的动作。
这里注意断点调试时间显示是在0.000s暂停,但实际上已经在0-0.01s之间,即第一个步长运行,通过IDLE的高亮状态也可看出。
可以看到在0.01s时刻,此时只是在第二个chart PRESS_DOWN的外围,高亮墨绿色,但此时已“浪费一个步长在第一个chart中”,且cnt的值没有增加,问题出现在这里,实际上inLevel输入电平到了第二个电平元素?。
第二个步长0.01-0.02s之间执行cnt+1第一个操作?
0.05s执行完5个步长,但此时的inLevel是第6个元素
仿真结果如下,可以看到此时达到我们的想法在0.05s,即连续6个元素输入确认不是按键抖动,value+1。那该如何做到第5个元素value加1呢?
?个人解决方案,利用状态自转移,同时设置cnt计算初值为1,但是仍实际上未能解决0时刻便读取第一个电平元素的小问题。
结合c代码生成
注:外部自转移优先级顺序>内部自转移>en、du和ext?
4. 历史节点作用
最后来简单介绍以下历史节点History作用,以这个消抖问题作为案例,历史节点能够在cnt<100时间内时刻,此时需要不断进行消抖判断,即PRESSED和RELEASE 两个chart的往复交互,历史节点History使其能在判断完消抖后保留判断前的数据,以便做好储存工作。
啰里啰唆,不知道有没描述清楚我的问题及解决问题,如有更好的解决方案欢迎评论留言交流!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!