1. Stateflow实现车窗一键升降控制
任务目标
在Simulink中创建一个包含两个状态的Stateflow图,实现当输入信号满足上升沿条件时,状态从ON切换到OFF(或反之),并通过Scope观察状态变化及输出信号。
环境依赖
- MATLAB R2020b或更高版本(含Stateflow许可证)
- Simulink与Stateflow工具箱
实现步骤
- 在MATLAB命令窗口输入
sf_new,创建新的Stateflow图(或通过Simulink库拖入Stateflow Chart模块)。 - 在图表编辑区添加两个互斥状态:
ON和OFF。 - 定义输入事件
toggle(上升沿触发)和输出数据state_out(double类型)。 - 建立状态转移:
ON→OFF和OFF→ON,转移条件均为事件toggle。 - 在每个状态的
entry动作中,为state_out赋不同的值(如ON=1,OFF=0)。
关键完整代码
以下为Stateflow图的完整定义代码(在MATLAB中通过sf命令打开图形化编辑界面后,对应的底层数据结构描述):
% Stateflow图定义(在Stateflow编辑器中实现)
% 状态: ON
% entry: state_out = 1;
% 状态: OFF
% entry: state_out = 0;
% 转移: ON --{toggle}--> OFF
% 转移: OFF --{toggle}--> ON
% 输入: toggle (事件, 上升沿触发)
% 输出: state_out (double)
% Simulink模型驱动信号(在模型层添加):
% 1. Pulse Generator模块: 周期2s, 脉宽50%, 幅值1
% 2. Chart模块: 勾选"Enable zero-crossing detection"
% 3. Scope模块连接state_out输出
运行与验证
- 在Simulink模型中添加Pulse Generator(周期2秒,脉宽50%),连接到Chart的
toggle事件输入端口。 - Chart的
state_out输出连接到Scope模块。 - 点击Run运行仿真,仿真时长设为10秒。
- 观察Scope波形:
state_out应为方波,高电平持续1秒(ON状态),低电平持续1秒(OFF状态),周期2秒。
通过条件
- Scope中
state_out波形呈现周期为2秒的方波,占空比50%。 - 波形上升沿与Pulse Generator的上升沿同步,无延迟或毛刺。
- 状态切换逻辑正确:每个上升沿触发一次状态翻转。
常见问题
- 事件未触发:确认Chart模块的输入端口已勾选"Trigger"类型为"Rising edge"。
- 输出无变化:检查状态entry动作是否正确赋值,且Chart输出端口已连接。
- 仿真报错:确认Stateflow图中所有状态转移都有明确事件条件,无悬空转移。
上图展示了Stateflow图的状态结构与转移关系。仿真时,每个toggle上升沿触发一次状态切换,输出信号随之在高电平与低电平之间交替,形成周期方波。