1. Stateflow实现车窗一键升降控制

任务目标

在Simulink中创建一个包含两个状态的Stateflow图,实现当输入信号满足上升沿条件时,状态从ON切换到OFF(或反之),并通过Scope观察状态变化及输出信号。

环境依赖

  • MATLAB R2020b或更高版本(含Stateflow许可证)
  • Simulink与Stateflow工具箱

实现步骤

  1. 在MATLAB命令窗口输入sf_new,创建新的Stateflow图(或通过Simulink库拖入Stateflow Chart模块)。
  2. 在图表编辑区添加两个互斥状态:ON和OFF。
  3. 定义输入事件toggle(上升沿触发)和输出数据state_out(double类型)。
  4. 建立状态转移:ON→OFF和OFF→ON,转移条件均为事件toggle。
  5. 在每个状态的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输出

运行与验证

  1. 在Simulink模型中添加Pulse Generator(周期2秒,脉宽50%),连接到Chart的toggle事件输入端口。
  2. Chart的state_out输出连接到Scope模块。
  3. 点击Run运行仿真,仿真时长设为10秒。
  4. 观察Scope波形:state_out应为方波,高电平持续1秒(ON状态),低电平持续1秒(OFF状态),周期2秒。

通过条件

  • Scope中state_out波形呈现周期为2秒的方波,占空比50%。
  • 波形上升沿与Pulse Generator的上升沿同步,无延迟或毛刺。
  • 状态切换逻辑正确:每个上升沿触发一次状态翻转。

常见问题

  • 事件未触发:确认Chart模块的输入端口已勾选"Trigger"类型为"Rising edge"。
  • 输出无变化:检查状态entry动作是否正确赋值,且Chart输出端口已连接。
  • 仿真报错:确认Stateflow图中所有状态转移都有明确事件条件,无悬空转移。
ON entry: state_out=1 OFF entry: state_out=0 toggle toggle 输入: toggle 输出: state_out

上图展示了Stateflow图的状态结构与转移关系。仿真时,每个toggle上升沿触发一次状态切换,输出信号随之在高电平与低电平之间交替,形成周期方波。