デバウンス ロジックを使用した過渡信号の削減
スイッチが開閉すると、完全にオンまたはオフのステートに遷移する前に、そのスイッチの接点では相互にバウンス オフが発生する可能性があります。バウンス アクションにより、ステートの実際の変化を表さない過渡信号が生成される可能性があります。このため、スイッチ ロジックをモデル化する場合は、"デバウンス" アルゴリズムを使用して過渡信号を除外することが重要になります。
Stateflow® チャートのコントローラーをモデル化する場合は、コントローラーが過渡信号を受信するたびに、スイッチ ロジックによってコントローラーのオン/オフが切り替えられ、コントローラーの過負荷が発生するというような状況は回避する必要があります。これを回避するには、時相論理を使用する Stateflow コントローラーを設計し、入力信号をデバウンスして、スイッチが実際にオンかオフかを判定します。
信号のデバウンス方法
Stateflow を使用して信号をデバウンスする方法には、次の 2 通りがあります。
duration時相演算子を使用した、過渡信号の除外。メモ
duration演算子は、Simulink® モデルの Stateflow チャートでのみサポートされます。中間のグラフィカル ステートを使用した、過渡信号の除外。故障検出などの高度なフィルター処理手法には中間のグラフィカル ステートを使用します。
duration 演算子を使用した信号のデバウンス
この例は、duration 演算子を使用して過渡信号を除外する設計パターンを示しています。

Debouncer チャートには Off と On のステートがあります。

ステート ロジック
このモデルの初期状態は Off です。duration 演算子を使用すると、スイッチ信号 sw が負または非負であった時間の長さに基づいて、どのステートをアクティブにするかを制御できます。
swが 0.01 秒より長い間非負になると、スイッチはステートOffからステートOnに移行します。swが 0.01 秒より長い間負になると、スイッチはステートOnからステートOffに移行します。
デバウンサーの実行
モデルを開きます。
Scope ブロックを開きます。
Stateflow チャート Debouncer を開きます。
モデルのシミュレーションを実行します。ノイズを含む入力信号から過渡信号を分離するデバウンサーの処理がスコープに表示されます。

故障検出を使用した信号のデバウンス
この例は、中間ステートを使用して過渡信号を分離する設計パターンを示しています。デバウンサーの設計では、after演算子を使用して、絶対時間の時相論理を実装します。この設計パターンを使用すると、故障を検出し、システムが回復するまでの時間を与えることもできます。

Debouncer チャートには Off、Debounce、On のステートがあります。

ステート ロジック
Debouncer チャートには、Debounce という名前の中間ステートが含まれています。このステートは、信号 sw が正と負のどちらになっているか、または一定期間でゼロクロッシングの変動を示しているかをチェックして、過渡入力を分離します。
swが 0.1 秒より長い時間正である場合、スイッチはステートOnに移行します。swが 0.1 秒より長い時間負である場合、スイッチはステートOffに移行します。swが 0.3 秒より長い時間ゼロクロッシングの変動を示した場合、スイッチはステートOff.Faultに移行し、swを過渡信号として分離して回復のための時間を与えます。
デバウンサーの実行
モデルを開きます。
Scope ブロックを開きます。
Stateflow チャート Debouncer を開きます。
モデルのシミュレーションを実行します。ノイズを含む入力信号から過渡信号を分離するデバウンサーの処理がスコープに表示されます。

イベントベースの時相論理の使用
絶対時間の時相論理の代わりに、イベントベースの時相論理を適用し、after 演算子を使用することで、Debouncer チャートの実際のステートを判別できます。キーワード tick はローカル イベントを規定し、チャートが起動したときにそのローカル イベントを暗黙的に生成します。
sf_debouncer モデルの Error Generator ブロックは、0.001 秒間隔でパルス信号を生成します。このため、Debouncer チャートで指定された絶対時間の時相論理をイベントベースの論理に変換するには、以下の表に示すように after 演算子の引数を 1000 で乗算します。
| 絶対時間ベースのロジック | イベントベースのロジック |
|---|---|
after(0.1,sec) | after(100,tick) |
after(0.3,sec) | after(300,tick) |
after(1,sec) | after(1000,tick) |