Когда переключатель открывается и закрывается, контакты переключателя могут возвратиться друг от друга перед переключателем полностью переходы к на или от состояния. Возвращаемое действие может произвести переходные сигналы, которые не представляют истинное изменение состояния. Поэтому при моделировании логика переключения, важно отфильтровать переходные сигналы при помощи debouncing алгоритмов.
Если вы моделируете контроллер в Stateflow® стройте диаграмму, вы не хотите, чтобы ваш логик переключения переутомил контроллер путем включения и выключения его в ответ на каждый переходный сигнал, который это получает. Чтобы избежать этого, спроектируйте контроллер Stateflow, который использует временную логику для debounce ваши входные сигналы, и определите, включен ли переключатель на самом деле или выключен.
Существует два пути к debounce сигнал при помощи Stateflow:
Отфильтруйте переходные сигналы при помощи duration
темпоральный оператор.
Отфильтруйте переходные сигналы при помощи промежуточного графического состояния. Используйте промежуточное графическое состояние для усовершенствованных методов фильтрации, таких как обнаружение отказа.
duration
оператор поддерживается только в диаграммах Stateflow в Simulink® модель.
duration
ОператорЭтот пример иллюстрирует шаблон разработки, который использует duration
оператор, чтобы отфильтровать переходные сигналы.
График Debouncer содержит эту логику.
Логика состояния
Начальным состоянием для этой модели является Off
. При помощи duration
оператор, можно управлять, какое состояние активно на основе сколько времени сигнал переключателя, sw
, было отрицательным или неотрицательным.
Когда sw
было неотрицательным для дольше, чем 0,01 секунды, перемещения переключателя от Off
состояния утверждать
On
.
Когда sw
было отрицательно для дольше, чем 0,01 секунды, перемещения переключателя от On
состояния утверждать
Off
.
Запустите Debouncer
Откройте модель.
Откройте блок Scope.
Откройте диаграмму Stateflow Debouncer.
Симулируйте модель. Осциллограф показывает, как debouncer изолирует переходные сигналы от шумного входного сигнала.
Этот пример иллюстрирует шаблон разработки, который использует промежуточное состояние, чтобы изолировать переходные сигналы. Проект debouncer использует after
оператор, чтобы реализовать абсолютно-разовую временную логику. С этим шаблоном разработки можно также обнаружить отказы и позволить системному времени восстанавливаться.
График Debouncer содержит эту логику.
Логика состояния
График Debouncer содержит промежуточное состояние под названием Debounce
. Это состояние изолирует переходные входные параметры путем проверки если sw
сигнала остается положительным или отрицательным, или если это колеблется между нулевыми пересечениями за предписанный период.
Когда sw
было положительно для дольше, чем 0,1 секунды, переключатель перемещается, чтобы утвердить On
.
Когда sw
было отрицательно для дольше, чем 0,1 секунды, переключатель перемещается, чтобы утвердить Off
.
Когда sw
колеблется между нулевыми пересечениями для дольше, чем 0,3 секунды, переключатель перемещается, чтобы утвердить Off.Fault
, изоляция sw
как переходный сигнал и предоставление его время, чтобы восстановиться.
Запустите Debouncer
Откройте модель.
Откройте блок Scope.
Откройте диаграмму Stateflow Debouncer.
Симулируйте модель. Осциллограф показывает, как debouncer изолирует переходные сигналы от шумного входного сигнала.
Как альтернатива абсолютно-разовой временной логике, можно применить основанную на событии временную логику, чтобы определить истинное состояние в графике Debouncer при помощи after
оператор. Ключевое слово tick
задает и неявно генерирует локальное событие, когда график просыпается.
Блок Error Generator в sf_debouncer
модель генерирует сигнал импульса каждые 0,001 секунды. Поэтому, чтобы преобразовать абсолютно-разовую временную логику, заданную в графике Debouncer к основанной на событии логике, умножьте аргумент after
оператор 1 000, как обозначено этой таблицей.
Абсолютная основанная на времени логика | Основанная на событии логика |
---|---|
after(0.1,sec) | after(100,tick) |
after(0.3,sec) | after(300,tick) |
after(1,sec) | after(1000,tick) |