FLProg – Урок второй: Работа с аналоговыми сигналами
В предыдущем уроке, были рассказаны основные принципы работы с программой FLProg, а так же работы с дискретными сигналами. В этом уроке будет рассмотрены возможности FLProg в работе с аналоговыми сигналами.
В процессе урока будет создана программа управления светодиодным индикатором уровня и показана регулировка яркости светодиода с помощью выхода ШИМ.
Схема тестового стенда.
Как и в прошлом уроке, проект будем создавать на двух языках FBD и LAD. Только теперь это будет делаться параллельно.
Создаём новый проект.
Для языка LAD
- Первый путь — перетаскиваем на схему аналоговый вход A0 из дерева установленного оборудования
- Второй путь — перетаскиваем блок «Аналоговый вход контроллера» из библиотеки элементов, после чего сделав на новом блоке двойной клик, привязываем его к нулевому аналоговому входу платы
Для языка FBD создаём новый аналоговый вход, дважды кликнув на пункте «Добавить вход» дерева тэгов или нажав соответствующую кнопку
В открывшемся окне свойств входа ввести имя входа, выбрать аналоговый тип и номер контакта 0
После чего перетащить новый вход из дерева тэгов в область схемы.
Блоки аналогового входа в FLProg на своём выходе выдают величину пропорциональную напряжению на привязанном к ним реальном входе платы. При 0В на входе платы, на выходе блока будет значение 0, а при 5V на входе платы, на выходе блока будет значение 1023.
Затем создаём аналоговый выход.
Для языка LAD перетаскиваем блок «Аналоговый выход контроллера» из библиотеки блоков, и в редакторе свойств, блока (двойной клик на блоке) привязываем его к выходу платы D3
В языке FBD для создания аналогового выхода необходимо дважды кликнуть на пункте «Добавить выход» дерева тэгов или нажать соответствующую кнопку.
В открывшемся окне свойств выхода заполняем имя выхода, выбираем тип ШИМ, и номер выхода D3
После чего перетаскиваем новый выход в рабочую область схемы.
Вообще-то у плат Arduino настоящих аналоговых выходов не (не считая Arduino Duo, но пока эти платы программой FLProg не поддерживаются). Аналоговые выходы платы работают в режиме ШИМ
Частота, это количество периодов за одну секунду. Скважность — отношение длительности импульса к длительности периода. Можно изменять и то и другое, но для управления светодиодами достаточно управлять скважностью. На картинке выше мы видим ШИМ сигнал со скважностью 50%, так как длительность импульса (ширина импульса) ровно половина от периода. Соответственно светодиод будет ровно половину времени во включенном состоянии и половину в выключенном. Частота ШИМ очень большая и глаз не заметит мерцания светодиода из-за инерционности нашего зрения, поэтому нам будет казаться, что светодиод светится на половину яркости. Если мы изменим скважность на 75%, то яркость светодиода будет на 3 четверти от полной, а график будет выглядеть так:
Получается, что мы можем регулировать яркость светодиода от 0 до 100%. А теперь поговорим о таком параметре ШИМ, как разрешение. Разрешение — это количество градаций (шагов) регулировки скважности. В платах Arduino разрешение составляет 256 шагов.
В программе FLProg блок аналогового выхода управляет скважностью ШИМ привязанного к нему выхода. При подаче на вход бока значения 0 на выходе паты скважность будет составлять 0%, а при подаче значения 255 — 100%.
Исходя из того что пределы сигнала на выходе блока аналогового входа контроллера составляет 0 — 1023, а пределы допустимого сигнала на входе блока аналогового выхода контроллера составляют 0 — 255 встает вопрос о необходимости приведения их к одним значениям. В этом поможет блок масштабирования.
В языке LAD он находится в папке «Аналоговые блоки» библиотеки элементов.
В языке FBD тот же блок находится в папке «Специальные блоки» библиотеки элементов.
Блок масштабирования пропорционально переносит значение, получаемое на вход, в другой диапазон значений и выдает это значение на выход. Параметры входного и выходного диапазонов значений задаются в свойствах блока. Дважды кликнув на блок, мы можем открыть редактор параметров блока и задать эти значения.
Расчет в блоке производится по следующей формуле
Q = (I — I_min)*(Q_max — Q_min)/(I_max — I_min)+Q_min
Где:
- Q — значение на выходе блока
- I — значение на входе блока
- I_max — верхний предел входного значения
- I_min — нижний предел входного значения
- Q_max — верхний предел выходного значения
- Q_min — нижний предел выходного значения
В результате показанной на скриншоте настройки блока при изменении значения на входе блока от 0 до 1023 значение на выходе будет пропорционально изменяться от 0 до 255, что и требуется. Теперь необходимо соединить все блоки в соответствии со схемой.
LAD
FBD
Первая плата практически готова. Назовём её «Управление яркостью» и создадим новую, сразу назвав её «Индикатор уровня»
Во второй плате нам так же нужно значение с входа контроллера. В принципе можно ещё раз вытащить вход блока на вторую плату, и использовать его. Но это приведёт к тому, что в процессе выполнения программы в контроллере будет повторно считываться значение с входа. А процедура считывания аналогового сигнала с входа достаточно ресурсоёмкая и длительная. Поэтому мы используем в случае LAD аналоговый соединитель, а в случае FBD — переменную.
В FLProg переменные и аналоговые соединители можно представить как клеммные соединения на плате. С помощью них платы обмениваются значениями и соединятся между собой.
В проекте на языке LAD перетащим блок «Вход аналогового соединителя» на ПЕРВУЮ плату проекта.
Ему автоматически присвоится имя АС1. После чего соединим его вход с выходом блока аналогового входа.
А на вторую плату перетащим блок «Выход аналогового соединителя».
Сделаем на нём двойной клик и в редакторе блока привяжем его к соединителю AC1
В проекте на языке FBD создадим новую переменную, нажав на соответствующую кнопку или сделав двойной клик на пункте «Добавить переменную» в дереве тэгов.
В открывшемся окне редактора блока заполним имя переменной, выберем тип (Integer), и установим значение по умолчанию — 0
После чего перетащим новую переменную сначала в одну плату, а затем в другую. Так же соединим в первой плате вход переменный с выходом блока аналогового входа контроллера.
Поскольку индикатор уровня на 10 значений необходимо чтобы при изменении значения от нуля до максимума, управляющее значение изменялось от нуля до 10. В этом опять поможет блок масштабирования. Вытащим его на вторую плату и настроим следующим образом.
Теперь подключим его вход в случае LAD-а к блоку выхода аналогового соединителя, а в случае FBD к выходу переменной.
LAD
FBD
Рассмотрим логику работы индикатора уровня.
- Светодиод «Уровень 1» должен загореться, если значение сигнала больше 0
- Светодиод «Уровень 2» должен загореться, если значение сигнала больше 1
- Светодиод «Уровень 3» должен загореться, если значение сигнала больше 2
- Светодиод «Уровень 4» должен загореться, если значение сигнала больше 3
- Светодиод «Уровень 5» должен загореться, если значение сигнала больше 4
- Светодиод «Уровень 6» должен загореться, если значение сигнала больше 5
- Светодиод «Уровень 7» должен загореться, если значение сигнала больше 6
- Светодиод «Уровень 8» должен загореться, если значение сигнала больше 7
- Светодиод «Уровень 9» должен загореться, если значение сигнала больше 8
- Светодиод «Уровень 10» должен загореться, если значение сигнала больше 9
Для реализации данной логики мы используем в случае языка LAD реле сравнения, в случае языка FBD — компаратор.
LAD
FBD
В проекте на языке LAD вытащим на вторую плату 10 реле сравнения и привяжем их выходам, к которым подключён измеритель уровня (смотри первый урок) и выставим тип сравнения «Больше».
Кликнув правой кнопкой на входе «В» каждого блока реле сравнения вызовем контекстное меню и выберем пункт «Вставить константу». В открывшемся окне редактирования константы оставим тип «Integer» и введём для каждого выхода значение соответствующее логике работы индикатора.
Входы «А» всех блоков реле сравнения соединим с выходом блока масштабирования. Должна получится такая схема.
В проекте на языке FBD вытащим на вторую плату 10 блоков «Comparator» так же настроим на вид сравнения «Больше» (двойной клик на блоке для вызова редактора блоков). Так же как и в LAD-e вставим константы на входы I2 блоков, а входы I1 соединим с выходом блока масштабирования.
После этого создадим 10 цифровых выходов привязанных к выходам платы, к которым подключён измеритель уровня (смотри первый урок) и вытащим их на вторую плату. И соединим каждый со своим компаратором.
Всё — программы готовы, можно компилировать и заливать в контроллер (смотри первый урок)