FLProg – Урок второй: Работа с аналоговыми сигналами

e60851375fb543269dd75a4524200db9.jpg
В предыдущем уроке, были рассказаны основные принципы работы с программой FLProg, а так же работы с дискретными сигналами. В этом уроке будет рассмотрены возможности FLProg в работе с аналоговыми сигналами.
В процессе урока будет создана программа управления светодиодным индикатором уровня и показана регулировка яркости светодиода с помощью выхода ШИМ.
Схема тестового стенда.

2669d30ebf05496cb635a209c7a4eab3.PNG

Как и в прошлом уроке, проект будем создавать на двух языках FBD и LAD. Только теперь это будет делаться параллельно.

Создаём новый проект.

Для языка LAD

  • Первый путь — перетаскиваем на схему аналоговый вход A0 из дерева установленного оборудования
    4d0240b4be5847d79bc6f588a86a5a40.PNG
  • Второй путь — перетаскиваем блок «Аналоговый вход контроллера» из библиотеки элементов, после чего сделав на новом блоке двойной клик, привязываем его к нулевому аналоговому входу платы
    d6ff963aa14c488a96ff6ebc6207773d.PNG

Для языка FBD создаём новый аналоговый вход, дважды кликнув на пункте «Добавить вход» дерева тэгов или нажав соответствующую кнопку

55096bb2dc0d413cb1e2659087928cdd.PNG

В открывшемся окне свойств входа ввести имя входа, выбрать аналоговый тип и номер контакта 0

a1f706edb74e49449eaa09ea809af721.PNG

После чего перетащить новый вход из дерева тэгов в область схемы.

Блоки аналогового входа в FLProg на своём выходе выдают величину пропорциональную напряжению на привязанном к ним реальном входе платы. При 0В на входе платы, на выходе блока будет значение 0, а при 5V на входе платы, на выходе блока будет значение 1023.

Затем создаём аналоговый выход.

Для языка LAD перетаскиваем блок «Аналоговый выход контроллера» из библиотеки блоков, и в редакторе свойств, блока (двойной клик на блоке) привязываем его к выходу платы D3

122847f5a6bb4f579d0410de06cf4677.PNG

В языке FBD для создания аналогового выхода необходимо дважды кликнуть на пункте «Добавить выход» дерева тэгов или нажать соответствующую кнопку.

6ad82c150d694984a05ebda9aec3a013.PNG

В открывшемся окне свойств выхода заполняем имя выхода, выбираем тип ШИМ, и номер выхода D3

da70e841305e4a84aa059a89dd79b893.PNG

После чего перетаскиваем новый выход в рабочую область схемы.

Вообще-то у плат Arduino настоящих аналоговых выходов не (не считая Arduino Duo, но пока эти платы программой FLProg не поддерживаются). Аналоговые выходы платы работают в режиме ШИМ

Широтно-импульсная модуляция
Широтно-импульсная модуляция (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте. Для примера можно в качестве нагрузки использовать светодиод.
3befb48c061146bab8565e0fa18d3cab.png
Частота, это количество периодов за одну секунду. Скважность — отношение длительности импульса к длительности периода. Можно изменять и то и другое, но для управления светодиодами достаточно управлять скважностью. На картинке выше мы видим ШИМ сигнал со скважностью 50%, так как длительность импульса (ширина импульса) ровно половина от периода. Соответственно светодиод будет ровно половину времени во включенном состоянии и половину в выключенном. Частота ШИМ очень большая и глаз не заметит мерцания светодиода из-за инерционности нашего зрения, поэтому нам будет казаться, что светодиод светится на половину яркости. Если мы изменим скважность на 75%, то яркость светодиода будет на 3 четверти от полной, а график будет выглядеть так:
10f55c930f4c4767a12908bae3e8f60d.png
Получается, что мы можем регулировать яркость светодиода от 0 до 100%. А теперь поговорим о таком параметре ШИМ, как разрешение. Разрешение — это количество градаций (шагов) регулировки скважности. В платах Arduino разрешение составляет 256 шагов.


В программе FLProg блок аналогового выхода управляет скважностью ШИМ привязанного к нему выхода. При подаче на вход бока значения 0 на выходе паты скважность будет составлять 0%, а при подаче значения 255 — 100%.
Исходя из того что пределы сигнала на выходе блока аналогового входа контроллера составляет 0 — 1023, а пределы допустимого сигнала на входе блока аналогового выхода контроллера составляют 0 — 255 встает вопрос о необходимости приведения их к одним значениям. В этом поможет блок масштабирования.
В языке LAD он находится в папке «Аналоговые блоки» библиотеки элементов.

c55653b5d83c4fd5b6206ea463ee811f.PNG

В языке FBD тот же блок находится в папке «Специальные блоки» библиотеки элементов.

3cf8300179c6480ebf821c9c2a54fcbf.PNG

Блок масштабирования пропорционально переносит значение, получаемое на вход, в другой диапазон значений и выдает это значение на выход. Параметры входного и выходного диапазонов значений задаются в свойствах блока. Дважды кликнув на блок, мы можем открыть редактор параметров блока и задать эти значения.

6a10662de1774174ad934ac59d29f61a.PNG

Расчет в блоке производится по следующей формуле
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
e0072fab3d5241a386e866316aedeb99.PNG

FBD
f327816e91e149a091be7bb592a79c43.PNG

Первая плата практически готова. Назовём её «Управление яркостью» и создадим новую, сразу назвав её «Индикатор уровня»
Во второй плате нам так же нужно значение с входа контроллера. В принципе можно ещё раз вытащить вход блока на вторую плату, и использовать его. Но это приведёт к тому, что в процессе выполнения программы в контроллере будет повторно считываться значение с входа. А процедура считывания аналогового сигнала с входа достаточно ресурсоёмкая и длительная. Поэтому мы используем в случае LAD аналоговый соединитель, а в случае FBD — переменную.

В FLProg переменные и аналоговые соединители можно представить как клеммные соединения на плате. С помощью них платы обмениваются значениями и соединятся между собой.


В проекте на языке LAD перетащим блок «Вход аналогового соединителя» на ПЕРВУЮ плату проекта.

098ecfea26f44b6c8ec7db596a4af476.PNG

Ему автоматически присвоится имя АС1. После чего соединим его вход с выходом блока аналогового входа.

416384ade1834eee8a1b4484d0e524cc.PNG

А на вторую плату перетащим блок «Выход аналогового соединителя».

ba5b7ced2b854b239b6bf43df1b8a809.PNG

Сделаем на нём двойной клик и в редакторе блока привяжем его к соединителю AC1

В проекте на языке FBD создадим новую переменную, нажав на соответствующую кнопку или сделав двойной клик на пункте «Добавить переменную» в дереве тэгов.

1f1354310e144cc3a1efd8192227de60.PNG

В открывшемся окне редактора блока заполним имя переменной, выберем тип (Integer), и установим значение по умолчанию — 0

fb3ca44d21a248eb93c02866f590869d.PNG

После чего перетащим новую переменную сначала в одну плату, а затем в другую. Так же соединим в первой плате вход переменный с выходом блока аналогового входа контроллера.

84b2a7524cf34d8db45efbc7c1add69f.PNG

Поскольку индикатор уровня на 10 значений необходимо чтобы при изменении значения от нуля до максимума, управляющее значение изменялось от нуля до 10. В этом опять поможет блок масштабирования. Вытащим его на вторую плату и настроим следующим образом.

1d84c4e30bc7497da53d3e62276ebb80.PNG

Теперь подключим его вход в случае LAD-а к блоку выхода аналогового соединителя, а в случае FBD к выходу переменной.

LAD
d7c831513aaa42859ea712930dee3c48.PNG

FBD
8466e45ea78e478492cea9292364f5d4.PNG

Рассмотрим логику работы индикатора уровня.

  • Светодиод «Уровень 1» должен загореться, если значение сигнала больше 0
  • Светодиод «Уровень 2» должен загореться, если значение сигнала больше 1
  • Светодиод «Уровень 3» должен загореться, если значение сигнала больше 2
  • Светодиод «Уровень 4» должен загореться, если значение сигнала больше 3
  • Светодиод «Уровень 5» должен загореться, если значение сигнала больше 4
  • Светодиод «Уровень 6» должен загореться, если значение сигнала больше 5
  • Светодиод «Уровень 7» должен загореться, если значение сигнала больше 6
  • Светодиод «Уровень 8» должен загореться, если значение сигнала больше 7
  • Светодиод «Уровень 9» должен загореться, если значение сигнала больше 8
  • Светодиод «Уровень 10» должен загореться, если значение сигнала больше 9


Для реализации данной логики мы используем в случае языка LAD реле сравнения, в случае языка FBD — компаратор.

LAD
c218cf1fc9cc44a284113cd08e6fb520.PNG

FBD
6f3352bf90f64932920a0fe0f3a5d894.PNG

В проекте на языке LAD вытащим на вторую плату 10 реле сравнения и привяжем их выходам, к которым подключён измеритель уровня (смотри первый урок) и выставим тип сравнения «Больше».

9cb7b4183b314243baaa72e555a07f8d.PNG

Кликнув правой кнопкой на входе «В» каждого блока реле сравнения вызовем контекстное меню и выберем пункт «Вставить константу». В открывшемся окне редактирования константы оставим тип «Integer» и введём для каждого выхода значение соответствующее логике работы индикатора.

892ac57bc78e49239b3c9595a663c0b8.PNG

Входы «А» всех блоков реле сравнения соединим с выходом блока масштабирования. Должна получится такая схема.

2f6b6b4dd2dc4a5c8dc306fb423ca7f3.PNG

В проекте на языке FBD вытащим на вторую плату 10 блоков «Comparator» так же настроим на вид сравнения «Больше» (двойной клик на блоке для вызова редактора блоков). Так же как и в LAD-e вставим константы на входы I2 блоков, а входы I1 соединим с выходом блока масштабирования.

d4e68f7ef5684afa875535855753b2cf.PNG

После этого создадим 10 цифровых выходов привязанных к выходам платы, к которым подключён измеритель уровня (смотри первый урок) и вытащим их на вторую плату. И соединим каждый со своим компаратором.

9e4212fdb04d4b48a45b12d3f1a3addd.PNG

Всё — программы готовы, можно компилировать и заливать в контроллер (смотри первый урок)

© Geektimes