Семь секунд из жизни ПИД регулятора.

Пид – регулятор довольно древняя разработка, когда о транзисторах еще ничего не знали, не то, что о контролерах. На кафедре автоматики видел механический ПИД — регулятор, в котором вместо, электрических сигналов использовался воздух.
Сам принцип работы регулятора очень простой и реализовать программно его тоже не сложно, вот несколько ссылок, где обсуждается эта тема.
ПИД — регулятор описывается выражением:
pid_1
К – коэффициент пропорциональности,
Ti – постоянная интегрирования,
Td – постоянная дифференцирования, t – время,
е – сигнал рассогласования (ошибка),
U(t) – выходная переменная с регулятора на исполнительный механизм.
Рассмотрим  принцип его работы. Так как у нас микроконтроллерная система, то программа ПИД – регулятора у нас выполняется  циклически, пусть один цикл равен одной секунде.
Перейдем к практике, на рисунке представлена простейшая схема использования ПИД – регулятора в регулировании оборотов двигателя
pid_2
Разберем его по порядку.
Задание —  это, какое- то число вами заданное, которое означает, сколько оборотов должен делать двигатель в секунду. Назовем её SP.
Сравнивающее устройство – это устройство, которое сравнивает заданное вами количество оборотов, которые должен делать двигатель, с количеством оборотов которые делает двигатель в текущий момент,  и выдает разницу. Количество оборотов мы получаем от датчика, это в регулировании называется обратная связь.
Через уравнение сравнения находим ошибку рассогласования E.   
E = SP – V
Где V – сколько делает двигатель оборотов в секунду.
 
Пример: 
если здание SP = 70 об./сек., а  текущий момент двигатель делает  V =  50 об./мин., то получаем на выходе сравнивающего устройства  E = 70 – 50 = 20. Число 20 – будет ошибкой рассогласования E. 
 
Базовые регуляторы (ЗВЕНЬЯ). 
 
ПИД – регулятор состоит из трех базовых регуляторов(звеньев) включенных параллельно, это пропорциональный, интегральный, дифференциальный регулятор. Из начальных букв названия регуляторов получается ПИД. 
Каждый регулятор можно настроить или совсем выключить из процесса регулирования, соответствующим коэффициентом. 
Встречаются разные регуляторы различной комбинацией базовых регуляторов, это ПД, ПИ, П. 
 
Пропорциональный регулятор  — это обычный усилитель у которого вход связан с выходом обычным линейным уравнением Y=KЕ,  где Y – выходная переменная с этого регулятора, K – коэффициент пропорциональности ( усиления), а Е  — ошибка рассогласования, входная переменная. 
В таблице приведены результаты решения этого уравнения при различных значениях переменных Е, K. 
tab_1

 

pid_3

Обратите внимание, выходная переменная с этого регулятора пропорциональна входной переменной.
Рассмотрим на примере:
Для этого возьмем кусок времени (момент) равный семи секундам и заполним таблицу.
Задает задание регулятору переменная Sp равная 30 об./сек..
K, коэффициент пропорциональности пусть будет равен 2.
Входная переменная V – количество оборотов в секунду.
Через сравнение находим ошибку рассогласования.
     E = SP — V
     Sp = 30 об./сек.
     К = 2
tab_2
В нулевую секунду двигатель вращался со скоростью 20 об./сек.,  задание регулятору  30 об./сек. ошибка рассогласования будет равна 10
E = Sp – 20 = 30 – 20 = 10
Так как коэффициент пропорциональности K  равен 2, то Y=K *Е = 2 * 10 = 20
K , коэффициент пропорциональности умножается на ошибку рассогласования  Е, и выход с регулятора будет 20.
В первую секунду количество оборотов увеличилось до 25 об./сек. 
Е – ошибка рассогласования равна 5. 
Также находим Y, умножив Е на K.
Y=K *Е = 2 * 5 = 10
И так с каждой секундой. Ниже представлены графики изменения переменной Y от E
pid_4
Зеленый график – как менялись обороты двигателя в течение семи секунд.
Черный график – как течение этого же времени менялась ошибка рассогласования.
Синий график —  как менялась  переменная Y на выходе пропорционального регулятора(звена).
Пропорциональный регулятор не может ошибку рассогласования вывести на ноль.
Интегральное регулятор – это регулятор, который не имеет установившегося режима и является астатическим. Выход с этого регулятора пропорционален ошибке рассогласования и времени.
Благодаря этому регулятору, регулируемый параметр, в нашем случае это обороты двигателя, выходит на задание, а ошибка рассогласования устанавливается в ноль.
Алгоритм интегрального регулятора.
S = 0 // включение регулятора.
Начало цикла:
S = S +E   // к переменной S прибавляется E ошибка рассогласования
Y=Ki * S   // Ki, коэффициент интегрирования умножается на переменную S
Конец цикла.
Рассмотрим алгоритм интегрального регулятора. S – интегральная сумма.
При включении регулятора, переменная S = 0, далее к ней при каждом цикле, раз в секунду прибавляется переменная Е – ошибка рассогласования и умножается на Ki, коэффициент интегрирования и в итоге получаем выходную переменную Y, которая растет если Е положительная и убывает если отрицательная.
pid_5
Выход с интегрального регулятора зависит от времени и Е — ошибки рассогласования.
Рассмотрим на примере:
Для этого, как и в предыдущем примере с пропорциональным звеном, возьмем кусок времени (момент) равный семи секундам и заполним таблицу.
Задание регулятору тоже  Sp = 30. Ki — коэффициент интегрирования пусть будет равен 2. Входная переменная V – количество оборотов в секунду.
Также, через сравнение находим ошибку рассогласования.
E = SP — V
Sp = 30 об./сек.
Ki =2  //  коэффициент интегрирования
tab_3
В нулевую секунду двигатель вращался со скоростью 20 об./сек.,
задание регулятору  30 об./сек. ошибка рассогласования будет равна 10
E = Sp – 20 = 30 – 20 = 10
Интегральная сумма стала равна 10.
S = 0 // включение регулятора.
S = S +E = 0 + 10 = 10   // к переменной S прибавляется E ошибка рассогласования
Так как коэффициент интегрирования Ki равен 2, то выход с регулятора будет 20.
Y=Ki * S = 2 * 10 = 20   // Ki, коэффициент интегрирования умножается на переменную S
В первую секунду количество оборотов увеличилось до 25 об./сек.
Е – ошибка рассогласования равна 5. Прибавляем её к переменной S = 10.
S = S + E = 10 + 5 = 15
Находим Y, умножив интегральную сумму на Ki.
Y=Ki * S = 2 * 15 = 30
И так с каждой секундой. Ниже представлены графики изменения переменных: V, E, S, Y.
pid_6
Зеленый график – как менялись обороты двигателя в течении семи секунд.
Черный график – как течение этого же времени менялась ошибка рассогласования.
Сиреневый график — как менялась интегральная сумма S.
Синий график —  как менялась  переменная Y на выходе интегрального регулятора.
На сиреневом графике видно как меняется интегральная сумма.
Пока обороты двигателя были ниже Sp – задания, сумма росла, только обороты превысили Sp, сумма стала убывать.
Выход с интегрального регулятора есть интегральная сумма, умноженная на коэффициент Ki.
 Дифференциальный регулятор – представляет собой устройство, которое отслеживает, резкие изменения ошибки рассогласования и
компенсирует выходной сигнал на выходе регулятора.
Математически – она является производной от ошибки, то есть показывает скорость изменения ошибки рассогласования.
Более подробно как оно работает, рассмотрим дальше.
Алгоритм дифференциального звена:
En = E // включение регулятора.
Начало цикла:
Y=Kd * (E — En)   // Kd, коэффициент дифференцирования умножается на разность E ,En.
En = E
Конец цикла.
Рассмотрим алгоритм дифференциального регулятора.
En – ошибка рассогласования секунду назад. При включении регулятора, в переменную En записываем переменную
Е – ошибка рассогласования. Далее в каждом цикле из Е – ошибки рассогласования вычитаем переменную En и умножаем на Kd, коэффициент дифференцирования  и получаем выходную переменную Y.
pid_7
Выход с дифференциального регулятора зависит от скорости изменения Е — ошибки рассогласования.
Рассмотрим на примере:
Для этого, как и в предыдущих примерах,  возьмем момент времени равный семи секундам и заполним таблицу.
Задание регулятору тоже  Sp = 30.
Kd – коэффициент дифференцирования пусть будет равен 2.
V – количество оборотов в секунду(входная переменная).
Также, через сравнение находим ошибку рассогласования.
E = SP — V
Sp = 30 об./сек.
Kd =2  // коэффициент дифференцирования
tab_4
En повторяет  E со смещением во времени в одну секунду.
1. Нулевая секунда Y= Kd * (E — En) = 2*(10 – 10) = 0
2. Первая секунда   Y= 2 * (5 – 10 ) = -10
3. Вторая секунда    Y= 2 * (- 2 – 5 ) = — 14
4. Третья секунда    Y= 2 * (-15 –(-2)) = -26
И так далее.
Ниже представлены графики изменения переменных: V, E, En, Y.
pid_8
Зеленый график – как менялись обороты двигателя в течение семи секунд.
Черный график – как течение этого же времени менялась ошибка рассогласования.
Малиновый график  – как менялась ошибка рассогласования секунду назад.
Синий график —  как менялась  переменная Y на выходе дифференциального регулятора.
На синем графике видно как менялся выход с дифференциального регулятора в зависимости от оборотов двигателя. Как только обороты двигателя начали расти, выходная переменная Y стала резко падать, и наоборот, когда обороты упали, Y выросла.
ПИД
 
Как говорилось выше, ПИД – регулятор состоит из трех регуляторов(звеньев) включенных параллельно, это пропорциональный, интегральный, дифференциальный регуляторы.
То есть сумма выходов этих регуляторов Y и будет выходом с ПИД – регулятора.
Составим таблицу.

tab_5

Построим по ней графики.
pid_9
Работу ПИД – регулятора можно изучить с помощью программы « Регулятор Fuzzy PID».
pid_10
Программа использовалась для управления реальной лабораторной установкой « Калорифер», и переделана в математическую модель
для изучения свойств регуляторов. Установка «Калорифер» представляет из себя нагреватель с датчиком температуры, подключенными к компьютеру, и программы, которая с помощью ШИМ  поддерживаем нужную температуру, подробно в статье «Калорифер». Эта аппаратная часть установки заменена звеном запаздывания, регулятор запаздывания выведен слева внизу, рядом в окне отображается его значение.
Ниже находиться кнопка «Очистка графиков» и кнопка «Новое измерение». Первая просто очищает графики без прерывания регулирование, вторая и очищает и прерывает регулирование.
Что бы начать снова, нажмите кнопку «Старт».  Выход с регулятора через звено запаздывания подключен к устройству сравнения, куда раньше подавалась температура. В программе не предусмотрены возмущающие воздействия, но какие то из них можно компенсировать изменением запаздывания. На графике видно, красный – выход с регулятора, а зеленый – это выход с регулятора пропущенный через звено запаздывания и фильтр низкой частоты.
Справа вверху добавился регулятор для изменения задания, и три графика с выходов звеньев регулятора. Все остальное осталось по старому, так что привожу выдержку из руководства на установку «Калорифер», с небольшими исправлениями. Система регуляторов
работает по приведенной схеме №1. Программа позволяет задействовать любой регулятор, установкой галочки в панели регулятора,
а также установкой соответствующих коэффициентов.
Чтобы выключить пропорциональное звено, нужно установить его в единицу, а интегральное и дифференциальное – в ноль.
pid_11
Схема №1. САР.
Описание интерфейса компьютера лабораторной установки
Программное обеспечение  лабораторной установки позволяет изучить принцип работы и настройку программных ПИД- и FUZZY – регуляторов.
На рис. 1 приведено главное окно САР температуры.
    Описание главного окна САР температуры
Главное окно (см. рис.1) состоит из меню (1), панелей « Регулятор №1»(2), «Регулятор №2» (3),  «текущие измерения» (4), «управление» (5),  «ШИМ» (6), «вых. регул. №1», «вых. регул. №2», «таймер» (7).
Внизу отображаются графики изменения текущего параметра (температуры) и ее заданного значения (8).
pid_12
Рис 1. Главное окно САР температуры
Панель (2) «Регулятор №1» содержит регулирующее устройство типа «Fuzzy – регулятор». Фаззификатор «Fuzzy – регулятора» переводит
четкие значения лингвистических переменных «Отклонение» и «Скорость» в нечеткие значения с помощью трех терм, соответственно,
графики которых показаны в панели (2.1) с указанием  степеней принадлежности к термам. Ниже слева находится база знаний  и
продукционных правил (панель 2.2), в которой задаются девять терм дефаззификатора. В панели (2.3) задаются коэффициенты пропорциональный и интегральной составляющей отклонения и дифференциальный составляющей (скорости) входа базы знаний (см. рис. 1) , там же отображается выход  каждой составляющей и находится включатель каждой составляющей, а также можно произвести сброс накопленной интегральной составляющей отклонения.
Панель (3) «Регулятор №2» содержит регулятор типа «ПИД – регулятор».
В панели задаются коэффициенты пропорциональный, интегральной и дифференциальный составляющей ПИД- регулятора, там же отображается выход с каждой составляющей и находится включатель каждой составляющей, а также можно выполнить сброс
накопленной интегральной составляющей регулятора.
Панель (4) «текущие измерения» отображает численные значения текущей температуры, отклонения текущего значения от задания и
выход раздельно с регуляторов №1 и №2 (управляющее воздействие, которое идет на нагреватель калорифера) в текущий  момент времени
в процентах.
На панели (5) находятся кнопки управления. Кнопка «старт» запускает в работу выбранный регулятор в системе. Кнопкой «вкл.»
в панели «нагрев» включается нагреватель только для снятия кривой разгона.
При этом на объект подается максимальная мощность.
В панели «задание» указывается заданное значение температуры.
Ниже в виде таблицы выдаются текущие значения температуры, ошибки регулирования и время отсчета через равные интервалы времени.
В панели (7) «вых. регул. №1», «вых. регул. №2» цифровые индикаторы показывают по желанию выход  каждого регулятора.
Там же находятся выключатели, позволяющие включить нужный регулятор в схему регулирования (см. рис.1).
 В панели «таймер» задается интервал времени для снятия отсчетов при записи заданного и текущего значений.
— в  меню (1) во вкладке «настройка» выбрать «термы» или два раза щелкните левой мышкой на графике (2.1) входных терм. Откроется окно «Термы», где задаются  термы фаззификатора и дефаззификатора и диапазон их отображения. Любые проведенные изменения
предыдущей информации  нужно подтвердить кнопкой «OK»;
— выбрать регулятор, который хотите использовать в панели (7)  «вых.регул. №1» или «вых.регул. №2» и  задать нужные коэффициенты;
— в меню (1) во вкладке «скорость» задать скорость измерения в миллисекундах (например, 1000мс=1с);
— нажать кнопку «старт».
После нажатия кнопки «старт» начнётся регулирование по заданному Вами закону.
На рис.2 приведена панель настройки термов.
pid_13
Рис. 2. Панель настройки термов
pid_14
Подобная программа, только с одним ПИД регулятором.
Проведем эксперимент по настройке ПИ — регулятора, так как у нас достаточно  инерционный объект( медленно реагирует на изменение задание(ступенчатое воздействие),  дифференциальное звено выключим.
Установим пропорциональный коэффициент четырем, интегральный выключим, дифференциальный выключим, звено запаздывания поставим 26. ФНЧ (фильтр низких частот)=9.
При скорости 100 миллисекунд звено запаздывания будет задерживать входной сигнал на две с половиной секунды. Включим ПИД – регулятор и нажмем кнопку старт. У вас запуститься регулирование, кнопками «min», «max» создается ступенчатое воздействие.
pid_15

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

Установим интегральный коэффициент единице и включим интеграл.

pid_16

Наблюдается колебательный процесс, уменьшив интеграл до 0.35, система стала быстро выходить на задание.

программа регулятора:

pid_fuzzi

Скачать статью в PDF по ссылке
Автор: Шакиров Марат Рифович.

MICROCHIP TCP/IP STACK

Для разработки и изучения устройств для управления через сеть, приобрел плату PICDEM.net 2 и два модуля Wi-Fi MRF24WB0MA, MRF24WG0MA. Попробую рассказать что мне удалось узнать интересного при изучении данного девайса.

Изначально плата уже прошита демо проектом. У меня была версия 3.75. Для запуска устройства достаточно подключить питание(рекомендовано 9вольт) до 12 вольт и подключить перекрестным кабелем (оранжевый в комплекте с платой) к сетевому разъему (RJ-45) компьютера,  к разъему на плате, который находиться ближе к дисплею. Он подключен к микроконтроллеру (PIC18F97J60). Второй разъем задействован через микросхему ENC28J60. После подключения питания на дисплее отобразиться версия ПО и IP адрес устройства. В адресной строке браузера нужно набрать этот IP, и попадем на веб сайт, который зашит в eeprom запаянной на плате ( 25LC256 ). Тут можно включить светодиоды, написать что-нибудь на дисплее, отправит сообщение на электронную почту, отобразить положение потенциометра и многое другое.

tcp_1

Версия прошитого ПО оказалась довольно старой, на сайте нашел версию v5.42.08    June 2013 (microchip_solutions_v2013-06-15), для 8 разрядных контроллеров она является последней.

Для работы с платой подходит программатор PicKit2, и PicKit3, ICD3 (на чем я тестировал). подключаем его к плате так

tcp_2

или можно сделать кабель по такой схеме

tcp_3

Для работы с ПО TCPIP Stack 5.42 я использовал Mplab 8.92 и С18 версии v3.47, также нужно установить  Java.

При установке TCPIP Stack 5.42 создается папка с:\ microchip_solutions_v2013-06-15\,   открываем проект из этой папки, который находиться по этому пути с:\ microchip_solutions_v2013-06-15\ Tcpip\ Demo App\ C18-PICDN2_ETH97.mcpподключаем линкер  на PIC18F97J60. Если плата уже подключена к программатору и все сделано правильно, то на экране вывода должен вывести ID микроконтроллера.

tcp_4

Компилируем проект и загружаем в микроконтроллер, процедура достаточно долгая.

После загрузки на дисплее отобразиться версия ПО и IP адрес устройства.

tcp_5

Зайдите в папку Utilities по используя путь с:\ microchip_solutions_v2013-06-15\ Microchip\ TCPIP Stack\ Utilities. Запустите программу  TCPIP Discoverer.jar ( она запустится если установлена JAVA). Появится такое окно в котором определиться IP и MAC адреса нашей платы.

Если на компьютере включено беспроводное подключение, его нужно отключить.

tcp_6

Далее нужно загрузить Веб-страницу на устройство, это можно сделать несколькими способами. Один из них это через COM порт на плате и приложение Hyper Terminal, но для этого нужен конвертор USB — RS232, так что рассматривать его не буду. Второй способ: в адресной строке браузера пишем http://169.254.9.4/mpfsupload, с IP платы.

tcp_7

У нас появиться такая страница. Выберем файл MPFSImg2.bin  из папки из которой открывали проект, и нажмем  кнопку Upload, как только сайт будет загружен в EEPROM, будет предложено перейти на сайт. Нажав эту ссылку перейдем на сайт демо платы.

tcp_8

Третий способ: запустить MPFS2.jar из папки Utilities, откроется такое приложение.

 

tcp_9

В первом пункте настройки нужно указать путь к папке WebPages2  которая находиться в папке с проектом. Во втором пункте настройки по умолчанию BIN Image.  В третьем,  путь к папке где лежит проект. В четвертом, в настройках указать IP платы или ее имя (по умолчанию MCHPBOARD). Ну и нажать кнопу сгенерировать и загрузить. Появиться сообщение о успешной загрузке.

Набрав в браузере IP платы попадем на сайт устройства.

tcp_10

На этой странице отображается состояние светодиодов, кнопок и значение с потенциометра. Слева находятся ссылки с демонстрацией других приложений: E-mail, идентификация и др. В этой версии TCPIP Stack, реализована технология AJAX  ( WEB страницу не нужно обновлять для получения текущих значений с платы, это происходит автоматически ).

Что бы задействовать микросхему ENC28J60, нужно выбрать проект C18-PICDN2_ENC28.mcp и переключить сетевой кабель в соседнее гнездо на плате.

Реализация WI-FI.

Реализовать связь по Wi Fi с модулем MRF24WB0MA у меня не получилось, DHCP сервер не давал модулю IP и на дисплее отображался установленный по умолчанию169.254.1.1. С модулем MRF24WG0MA  все сразу заработало.

tcp_11

Модуль MRF24WG0MA в отличие от PIC18F97J60 имеет уникальный MAC адрес.

Для реализации этого демо проекта, нужно открыть из той же папки, где лежат два предыдущих проекта, открыть  C18-PICDN2_MRF24WG.mcp, для модуляMRF24WG0MA.

По умолчанию проект настроен на открытую не защищенную сеть.

Первый вариант: настроить роутер под плату, для этого надо поменять в нем имя сети наMicrochipDemoAP  и установить открытую не защищенную сеть.

 

Второй вариант: настроить плату под вашу домашнюю сеть. Для этого нужно открыть файл WF_Config.h, и в 102 строке указать имя вашей домашней беспроводной сети, по умолчанию указана сеть MicrochipDemoAP:

#define MY_DEFAULT_SSID_NAME              «my» //»MicrochipDemoAP»

Также указать тип шифрования в 98 строке.

#define MY_DEFAULT_WIFI_SECURITY_MODE  WF_SECURITY_WPA2_WITH_PASS_PHRASE  // защищенная WPA2

  // WF_SECURITY_OPEN    // незащищенная сеть

tcp_12

А так же ключ доступа к сети в 206 строке

tcp_13

#define MY_DEFAULT_PSK_PHRASE              «1177889900»

                       // «Microchip 802.11 Secret PSK Password» //  по умолчанию

Компилируете и загружаете проект в микроконтроллер. После включения если у вас WPA2, где то через тридцать секунд  IP 169.254.1.1.    установленный по умолчанию сменится на полученный от DHCP сервера. Зайдите по этому IP адресу на веб сайт устройства.

 

Программное обеспечение.

Для создания своего проекта потребуются только изменить  MainDemo.c иCustomHTTPApp.c, а также настроить  файлы WF_Config.h — конфигурация сети, TCPIPMRF24W.h — включение модулей которые мы хотим использовать и др.  иHardwareProfile.h — какие входа/выхода  как будем использовать.

 

  Пример:

На демо плате имеется аналоговый температурный датчик, если поменять код процедурыHTTPPrint_pot  в файле CustomHTTPApp.c на такой

 

void HTTPPrint_pot(void)

{

char AN0String[8];

WORD ADval;

WORD temp;

 

// Wait until A/D conversion is done

 

ADCON0bits.CHS0 = 1;

ADCON0bits.CHS1 = 1;

ADCON0bits.CHS2 = 0;

ADCON0bits.CHS3 = 0;

 

ADCON0bits.GO = 1;

while(ADCON0bits.GO);

 

// Convert 10-bit value into ASCII string

ADval = (WORD)ADRES;

// Convert 10 Bit AD value to Celcius

temp = ((ADval — 151) * 340)>>10;

 

uitoa(temp, AN0String);

 

TCPPutArray(sktHTTP,(void *)AN0String, strlen((char*)AN0String));

return;

}

В место значения положения потенциометра будет отображаться значение температуры с этого датчика.

 

Создание проекта.

На примере начнем создание проекта с создания веб страницы.

 

1. Создание веб-страницы

Демо веб страница находиться в папке WebPages2,  она состоит из файлов с расширением HML,  CGI, XML, CSS, Js, Inc.

index.htm — главная страница,

header.inc — вставка заголовка во все HTM страницы.

mchp.js — реализована функция  AJAX которая осуществляет запрос к серверу без перезагрузки страницы.

status.xml — содержит динамические переменные

mchp.css — файл  стилей.

Для разработки веб лучше использовать редактор который не создает  избыточного кода, я пользуюсь NOTEPAD++

Динамические переменные.

При разработке веб приложения для устройства надо создать динамические переменные, которыми будет обмениваться веб с устройством в соответствующих методах.  Динамические переменные выделяется знаками тильда ~variable~.

 

Метод POST:

<form method=»post» action=»index.htm»>

<BR>

<input id=»znah_1″ size=»4″ name=»Perem_1″ value=»~Perem_1~» >

<colspan=»2″ align=»center»><input type=»submit» value=»ОК»  />

</form>

<!—  ————————————  —>

 

Метод GET:

<form method=»get» action=»index.htm»>

<input type=»radio» name=»Auto» value=»on» ~LED(1)~ /> On

<input type=»radio» name=»Auto» value=»off» ~LED(0)~ /> Off

<input type=»submit» class=»btn» value=»ОК»/>

</form>

 

Созданную веб страницу со всеми сопутствующими файлами помещают в отдельную папку в папку проекта. При помощи утилиты MPFS2 сгенерируйте файл с расширением.BIN , это сжатая веб страница, этот файл потом нужно будет загрузить в EEPROM, по размеру он не должен превышать объем вашей EEPROM. На демоплате PICDEM.net 2установлена микросхема  25LC256, соответственно этот файл не должен превышать 32 кб, если установлена микросхема 25LC1024, то размер файла должен быть больше 128 кб.

При генерации файла веб страницы утилита MPFS2 также индексирует динамические переменные обнаруженные на веб странице и корректирует HTTPPrint.h в связи с этими индексами.

 

Приложение в MPLAB.

HTTPPrint.h находиться в папке проекта.

Этот файл генерируется автоматически утилитой MPFS2. Он индексирует все динамические переменные и обеспечивает связь между переменными расположенными на веб страницах и устройством. Этот файл не требует модификации программиста.

В нем прописаны функции с названиями динамических переменных

 

void HTTPPrint(DWORD callbackID);

void HTTPPrint_Perem_1(void);

void HTTPPrint_LED(WORD);

 

void HTTPPrint(DWORD callbackID)

{

            switch(callbackID)

            {

        case 0x00000000:

                                   HTTPPrint_Perem_1();

                                   break;

        case 0x00000006:

                                   HTTPPrint_LED(1);

                                   break;

        case 0x00000007:

                                   HTTPPrint_LED(0);

                                   break;

 

Все сгенерированные функции в файле HTTPPrint  должны быть расписаны в файлеCustomHTTPApp.c, что с ними делать.

 

Ниже в примере код где эти переменные передаются с устройства на веб страницу.

 

void HTTPPrint_LED(WORD on)

{

            if(LED1_IO == on)

                        TCPPutROMString(sktHTTP, (ROM BYTE*)»checked»);

}

 

//**********************************/

 

void HTTPPrint_Perem_1(void)

{ char str[7];

    ultoa( out1, str );     // convert timer to string

            TCPPutString(sktHTTP, str);}

 

//**********************************/

 

Для приема переменных устройством с веб страницы в том же файле CustomHTTPApp.cиспользуются функции HTTP_IO_RESULT HTTPExecuteGet и HTTP_IO_RESULT HTTPExecutePost .

Когда код обработки этих функций написан, проект компилируется и загружается на микроконтроллер.

На PICDEM.NET 2 установлен символьный дисплей, и небольшая по объему памяти eeprom, что очень не удобно для разработки приложений с большим количеством динамических переменных.

Поэтому пришлось изготовить свою плату, с графическим дисплеем. В ней используется контроллер PIC18F87J60 и eeprom 25LC1024.

tcp_14

Схему и разводку платы в протеусе можно скачать в конце статьи.

фото платы.

?

Платы в сборе.

На этом графическом дисплее так же оказалось мало места, пришлость взять еще больше.

tcp_16

Прошивку HEX проекта с выводом данных на дисплей, также можно скачать в конце.

 

Это ip действующего проекта, находящегося в разработке http://78.159.233.204:7775/

 

Варианты удаленного доступа.

Аналогично настраиваются IP камеры.

1. вариант: У вас есть выделенный IP адрес.

В роутере отключаем DHCP.

tcp_17

Прописываем в приборе IP адрес по умолчанию, из диапазона указанного в роуторе ( выше на картинке ).

Отключаем модули в контроллере  STACK_USE_AUTO_IP, STACK_USE_DHCP_CLIENT,  STACK_USE_DHCP_SERVER.

На роутере делаем проброс портов.

tcp_18

Если работаем через модуль MRF24WG0A, то настраиваем безопасность.

tcp_19

2. вариант если у вас нет выделенного IP, то без проблем можно настроить подключение через DDNS.

Для этого нужно зарегистрироваться на сайте https://www.noip.com, и получить имя, по которому можно будет  управлять контроллером. В демо примере есть несколько вариантов, но они платные, кроме этого.

Хэлп по настройке этого сервиса, есть на сайте.

Вкратце, прибор регистрируем на сайте noip.com под каким ни будь именем ( например «Registrator_1».  Подключаем модуль STACK_USE_DYNAMICDNS_CLIENT в проекте» Demo App «.

Прибор начинает периодически отсылать свой IP адрес на этот сервис, и при запросе в браузере ( в адресной строке) под именем Registrator_1 вас этот сервис пере направляет на последний полученный IP адрес вашего устройства.

 

3. вариант: не проверен. Можно использовать роутер с возможностью подключения 3G/4G модема. То есть роутер настраиваем на работу с 3G/4G модемом, с прибором настраиваем связь с устройством либо по шнурку, либо через WIFI.

С оператором «Мегафон» связь по 3G наладить не удалось, не было доступа из внешней сети.

По информации полученной от операторов связи, индивидуальные IP адреса»Мегафон» дает только юридическим лицам. А Билайн и МТС, дают физическим лицам IP  за 100 — 150 руб. в месяц. Пока не проверил, надо ехать в центральные офисы, в павильонах ни чего  об этом не знают. Да, и еще у провайдера Dom.ru, что бы получить доступ из внешней  сети, надо в личном кабинете отключить функцию NAT.

После нехватки места на дисплее, также не хватает места и удобства для управления контроллером через его сайт который находиться на eeprom, и для того чтобы реализовать более удобный интерфейс пользователя, создать простейшую SCADA систему совместно с одной компанией пытаемся реализовать облачный сервис. У Микрочипа есть отладачная плата » Wi-Fi Client Module Development Kit (DM182020)» которая позволяет с легкостью создавать демонстрационное приложение, которое может подключаться и вести обмен данными с сервисом Amazon Elastic Compute Cloud (Amazon EC2) — веб-сервисом, предоставляющим вычислительные мощности в облаке.

 

Тут несколько переводов которые сделал при помощи Гугла, если захотеть, разобраться можно, может кому пригодиться.

AN833c

TCPIP_Stack_Help

библиотеки С18

c18_Libraries

описание платы PICDEM.NET2

PICDEM_NET_2

Лабораторные работы исходники для которых находятся в папке » WebVend» проекта» Demo App «.

ETH_Labs

Исходники и другую интересующую информацию могу выслать по email.

Прога подключения через кабель ( для платы с графическим дисплеем).

Прога подключения через WI FI ( для платы с графическим дисплеем).

Программа не выводит данные на дисплей. Папку с исходником нужно положить в с:\ microchip_solutions_v2013-06-15\ Tcpip\.

Универсальный бытовой контроллер «Джинн»

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

Блочная схема.

Принципиальная схема блока приведена ниже. Прибор построен
на микроконтроллере PIC18F4520, часы и дата передаются на микроконтроллер от часов реального времени DS1307. В качестве датчиков температуры используются DS18B20.

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

Фото печатных плат.

Спецификация и чертеж печатных плат лежат в архиве.

Это схема настроек прибора.

Любой из выходов можно переименовать, на пример по имени нагрузки, настроить режим работы выхода под любую конфигурацию: вентиляция, обогрев, время, таймер. Так же на любой выход, через меню прибора можно подать питание, снять его, или оставить работать по программе.

Диапазон измеряемой температуры от -50 до +125 ºС.  Таймер поддерживает периодичность до 60 суток. Руководство на прибор в архиве. С помощью данного прибора можно реализовать различные варианты автоматики.

Скоро выйдет двухканальный вариант.

Возможности у него такие же, как и четырехканального
контроллера.

Вот такая получилась плата в Протеусе.

А это готовый пробный вариант.

Ну и вставив в корпус, получил такой вот результат.

А так выглядит конечный результат.

Сейчас контроллер проходит тестирование, После тестирования передам заказчику.

Программное постоянно дорабатывается, и скоро добавятся такие новые функции как:  управление по времени и температуре,
то есть в разное время можно поддерживать разную температуру.

Другая функция — управление по времени и таймеру, например, ночью включает какое-нибудь устройство с одной периодичностью (с одними настройками таймера), а днем с другой с периодичностью (с другими настройками таймера). Можно настроить вентиляцию дома, ночью реже включаться, а днем чаще.

Функция таймер  и температура – поддерживать один период таймера одну заданную температуру (25-28С), а в другой период таймера  другую заданную температуру (35-37С). Ну и много других вариантов.

Демо проект demo_4_canel

руководство rukovodstvo_na_universalnyj_pult_upravlenija

pH и ЕС регуляторы

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

ph_1

Сделал разводку платы в Proteuse.

ph_2

Получилась такая плата.

  Комбинированный pH электрод ЭСК-10608/4  заказал в компании «Измерительная техника»www.izmteh.ru  Он имеет пластмассовый корпус, заправлен загущенным электролитом. Не требует обслуживания.

Диапазон измерений 0 …12 pH.  Рабочая температура 0 …80 °С.

Настроил с помощью калибровочных растворов усилитель так, что бы диапазон измерений 0 …12 pH что бы соответствовал напряжению на выходе в диапазоне 0…5 вольт.

В качестве контроллера использовал плату от контроллера Джинн.

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

Отладка схемы и написание программы.

Схема в Proteuse, вместо усилителя включен переменный резистор, он имитирует его работу.

ph_5

Задачи прибора:

1.       Возможность калибровки.

2.       Точное поддержание заданного pH.

3.       Управление двумя дозирующими насосами.

4.       Возможность установки на емкости любого объема.

Для калибровки приборов, если выход с датчика линейный, обычно применяется уравнение прямой Y=k*X-b. Для калибровки я использую два раствора с разным pH.

На дисплее, если войти в калибровку, первая цифра отображает текущее оцифрованное напряжение в разрядах АЦП, которое мы получаем с выхода усилителя. Нужно опустить электрод в раствор с нижним значением  pH(кислота) и установить кнопками это значение на приборе, (вторая цифра).

Нажав кнопку «режим», настроим вторую, верхнюю точку. Ополоснув электрод в воде опустим в раствор с высоким pH(щелочь). И также установим на приборе pH.

Расчет производиться по такому алгоритму:

Х1 – значение с АЦП. У нас пусть будет 113 в десятичной системе.

Y1 – pH раствора с нижним значением, у нас пусть будет 4.

Х2 – значение с АЦП. У нас пусть будет 992 тоже в десятичной системе.

Y2 – pH раствора с нижним значением, у нас пусть будет 9.

Получилась система из двух линейных уравнений

Y1=k*X1-b      4 = k*113-b

Y2=k*X2-b      9 = k*992-b

Составляем уравнения для нахождения коэффициентов.

k:=(y2-y1)/(x2-x1);     k = (9-4)/(992-113)=5/879 = 0.0057

b:=k*x1-y1;                 b = 0.0057*113-4 = 0.62

Получается такое вот уравнение.

Y = 0.0057*X – 0.62

И уже сигнал, пересчитанный по этому уравнению, выдается на дисплей и на регулятор.

После того как научился получать реальное pH, встала задача регулирования. Для экспериментальной установки взял в качестве емкости для реагентов (кислоты и щелочи) баки от автомобиля, для воды для стеклоомывателя и насосы к ним. Через реле с катушкой на 220 вольт подключил к выходу прибора насосы.

ph_8

Из какой-то пищевой упаковки сделал пробоотборник, в него вставлен электрод.

ph_9

Из емкости, в которой требуется поддерживать pH, при помощи насоса раствор подается в пробоотборник и по шлангу стекает обратно в емкость. Штуцера внутри приподняты так, чтобы электрод для измерения pH всегда оставался растворе.

Вот что у меня получилось.

ph_10

Ёмкости с реагентами стоят по уровню ниже рабочей емкости. Шланги от насосов закреплены к краю ведра, и не касаются раствора, а то он перетечет в реагенты, или наоборот, смотря, где выше уровень.

Программная часть регулятора.

В качестве регулятора взял ПИД. Чтобы не изобретать велосипед, взял исходник с сайтаMicrochip.

en0 = zadanie*10-Ph;  // рассчитываем рассогласование(ошибку).

//*************************************

void PID()           //  C(n) = K(E(n) + (Ts/Ti)SumE + (Td/Ts)[E(n) — E(n-1)])

{

// Вычисление интегральной составляющей

   integral_term = derivative_term = 0; // интегральная и производная составляющие равны нулю

                SumE = SumE + en0;        // накапливаем интегральную сумму

               if(SumE > SumE_Max){      // ограничиваем её по верхнему пределу

                               SumE = SumE_Max;}

                if(SumE < SumE_Min){      // ограничиваем её по нижнему пределу

                               SumE = SumE_Min;}

                   // / Интегральное звено (Ts / Ti) * SumE, где Ti является Kp / Ki

                   // /  Ts является периодом выборки

                   // / Актуальное уравнение используется для расчета интегрального члена

                   // / Ki * Sum/ (Kp * Fs * X), где X является неизвестный коэффициент масштабирования

                   // / И Fs задает частоту дискретизации

                integral_term = SumE / 256;                        // Разделим на частоту дискретизации

                integral_term = integral_term * ki;          // Умножим на интегральный коэффициентKi

                integral_term = integral_term / 16;          // Сочетание коэффициента масштабирования и Kp

// Вычисление производной составляющей

                derivative_term = en0 — en3;

                if(derivative_term > 120){                                    // проверка по верхнему пределу

                               derivative_term = 120; }

                if(derivative_term < -120){                                // проверка по нижнему пределу

                               derivative_term = -120;               }

                              // / Вычислить производную составляющую (Td/Ts)[E(n) — E(n-1)]

                          // / Где Td является Kd / Kp

                           // / Актуальные уравнение используется Kd (en0-en3) / (Кр * Х * 3 * Ts)

                          // / Где X является неизвестный коэффициент масштабирования

                derivative_term = derivative_term * kd; // умножаем на коэффициент дифференцирования

              derivative_term = derivative_term >> 5;

                // делим на 32 предварительно расчитанные Kp*X*3*Ts

                if(derivative_term > 120)

            {  derivative_term = 120; }          // проверка по верхнему пределу

                if(derivative_term < -120)

            {  derivative_term = -120;               }                      // проверка по нижнему пределу

// Вычисляем переменную на выходе ПИД регулятора

                // C(n) = K(E(n) + (Ts/Ti)SumE + (Td/Ts)[E(n) — E(n-1)])

                Cn = en0 + integral_term + derivative_term;     // сумма составляющих

                Cn = Cn * kp / 1024;      // умножить на Kp затем масштабировать

                if(Cn >= 1000)   // Используется для ограничения выхода с регулятора

                {   Cn = 1000;   }

              if(Cn <= -1000)

                {   Cn = -1000;  }

//******************************************************

                en3 = en2;                          // Сохранение рассогласований (ошибки регулировании)

                en2 = en1;                   // три цикла назад

                en1 = en0;

                en0 = 0;

                return; }

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

Когда рассогласование (ошибка) равна нулю, интегральная сумма уже имеет какое-то значение, которое накопилась за некоторый промежуток времени, когда рассогласование не равнялось нулю. И дозирующий насос будет продолжать добавлять реагент. Добавил в регулятор мертвую зону (гистерезис) в один pH и сделал сброс интегральной суммы при входе измеряемой величины в мертвую зону.

//— задаем мертвую зону —

    err=zadanie*10-Ph;

if ((err > 5) || (err < -5)) { en0 = err;}

if ((err < 5) && (err > -5)) { SumE = 0;} // збрасываем интегральную сумму если в мертвой зоне.

И регулятор стал прекрасно поддерживать pH.

Вкратце расскажу алгоритм пид регулятора использованного здесь.

Переменные для настройки ПИД – регулятора. Из первых букв названия этих коэффициентов и происходит его название.

kp — пропорциональный коэффициент

ki — интегральный коэффициент

kd — коэффициент дифференцирования

С помощью пропорционального коэффициента kp  настраивается количество (объем) реагента для добавления в измеряемый раствор. Если у нас задано поддерживать 7.0 pH, а у нас на текущий момент 7.5 pH, то разница между ними будет 0.5 pH. Поставим коэффициент 10, тогда насос будет подавать раствор кислоты с периодичностью три секунды, а поставим коэффициент 100, то раствор кислоты будет подаваться с периодичностью 10 секунд. Все значения примерные и приведены для общего понимания, соответственно ими можно варьировать в больших диапазонах. Периодичность подачи растворов кислоты и щелочи также можно настроить, от нескольких секунд, до нескольких дней. С помощью пропорционального коэффициента, регулятор настраивают под соответствующий объем и концентрацию раствора кислоты и щелочи.

Интегральный коэффициент ki, предназначен для настройки изменения скорости подачи кислоты или щелочи. Пусть между заданным и текущим pH разница будет 0.5 pH, а периодичность десять минут. Если зададим интегральный коэффициент десяти, то в первый раз регулятор включит насос на пол секунды, через десять минут, если  pH не пришла в норму, он уже включит насос на одну секунду, ну и далее будет увеличивать время подачи кислоты или щелочи пока pH не начнет понижаться, тогда он также начнет снижать время работы насосов. Если интегральный коэффициент увеличить например до ста, то в следующее включение насоса он уже проработает три секунды, далее шесть секунд и так далее.

Коэффициент дифференцирования kd в этой системе можно не использовать, так как он в основном необходим в быстро меняющихся процессах. Здесь бы он понадобился, если бы регулятором пытаться регулировать pH в малом объеме, с помощью насос большой производительности, но в нашем случае это не к чему.

Как он работает. Если после подачи кислоты и щелочи pH резко пошла к норме, то следующая подача сильно уменьшиться по времени. Чем он выше, тем сильнее будет уменьшаться время подачи кислоты и щелочи. По сути, он следит за скоростью изменения pH раствора, и вносит свои коррективы на работу насосов дозирования.

В конечной конструкции, пользователь такого регулятора конечно будет избавлен от такого количества настроек, достаточно будет выбрать объем рабочей емкости гидропонной системы или аквариума, да уровень pH.

Как появиться время, переведу систему регулирования с ПИД – регулятора на адаптивный FUZZY LOGIC – регулятор.

ph_11

На дисплее отображается текущее значение pH. Ниже, слева внизу выход с регулятора, чуть дальше не масштабированный сигнал с АЦП.

После испытаний в ванной, настала пора придумать внешний вид, и проверить, как регулятор pH будет работать на гидропонной установке.

После проб с разными насосами и схемами получился такой вариант. Для прототипа взял плату контроллера от двухканального «Джина».

ph_36

 Насосы  от какой-то иномарки, вроде Дэу Матиз.  Каркас из толстого оргстекла. Емкости стандартные, от растворов регулирования pH.

ph_12

Вот такой девайс получился. Розетки с выходом 220 вольт, для подключения помпы пробоотборника и если необходимо (большая емкость) дополнительной перемешивающей помпы.

ph_13

А это с пробоотборником.

Растворы pH UP, pH DOWN, подаются по шлангам через компенсационные капельницы с дозировкой 12 литров в час.

ph_14

А это пробоотборник с pH- электродом. Снизу к одной из трубок прикреплена помпа, которая постоянно прокачивает раствор через  pH- электрод.

ph_15

Задал задание 6,0 pH. Мертвую зону (гистерезис) уменьшил до 0.1, то есть регулятор должен держать от 5.9 до 6.1 pH.  За время работы при установлении текущей pH до 6.3 pH, регулятор думал два дня (накапливал интегральную сумму), а потом выровнял pH до 6.1.  Три недели четко держит pH, в норме. Насосам, после трех месяцев работы сделаю вскрытие на контроль действия кислоты и щелочи.

Ну и сейчас нужно про мониторить работу регулятора, Для этого мой друг пишет прогу на делфи, которая будет опрашивать по сети 1-Wire датчики температуры и АЦП, с подключёнными к нему датчиков pH. И все это будет записываться в базу данных, можно просмотреть за любое время любой параметр в графиках.

ph_16

Собрал пробоотборник и поставил три электрода pH, один на дозатор, другой на показывающий прибор, а третий на компьютер, для записи показаний. А также воткнул два ЕС  датчика, один показывает, а другой мне, для разработки контроллера дозирования удобрений. вот что у меня получилось.

ph_17

ph_18

В течение двух недель регулятор регулировал исправно, но потом pH ушло вверх, а регулятор жужжит насосом подачи кислоты, а pH не выравнивается. Разобрал, чего ждал то и получил. Кислота съела ось моторчика и всю смазку, крыльчатка отвалилась.

ph_19

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

Да, и эксперименты с выравниванием pH привели к тому что вид у клубники очень печальный.

И как раз один добрый и умный человек Павел, в переписке, подсказал:

1. ph — не должен меняться резко, это приводит к стрессу у растений. Резкое изменение ph — более вредно, чем выход его за заданные границы (в пределах разумного, конечно).

2. ph — все таки желательно регулировать таким образом, чтобы не вносить лишние элементы в раствор (поскольку, они могут повлиять на усвоение растениями веществ, уже находящихся в растворе). Я предпочитаю повышать ph добавляя воду (можно очищать с помощью осмоса, но ее буферность в этом случае — уменьшится). Как правило, понижение ph раствора связано с поглощением воды растениями и для нормализации — достаточно ее долить. Однако, при этом надо еще следить за концентрацией раствора, не допуская резкого ее изменения (иначе тоже возможен стресс у растений и задержка в их развитии и урожайности).

3. Гистерезис у регулирующей системы нужен обязательно, причем надо учитывать еще инерционность всей системы: т.е. окончательное значение ph устанавливается только через некоторое время, порой достигающее нескольких часов. Это время зависит от объема раствора, а также конструкции установки (если она замкнута — должно пройти несколько циклов подачи раствора к растениям).

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

Теперь на основании полученных данных, после анализа графиков нужно придумать новый алгоритм регулирования.

Так клубника выглядит сейчас.

Такую же измерительную систему для записи pH и EC на компьютер в ближайшее время планируется установить на две промышленные гидропонные системы для выращивания салата и другой зелени, одного из спонсоров проекта.

Итог данного проекта — регулятор pH и регулятор ЕС.

Внутри.

Регулятор ЕС позволяет производить дозировку 1 — 3 компонентных удобрений.

По умолчанию он настроен на удобрения Flora Series, но можно настроить на любые другие удобрения.

В контроллерах для регулирования pH и ЕС, использован ПИ регулятор. Записывая показания с датчиков на компьютер, отладил процесс регулирования, и получил такую вот картину.

ph_37

На графике видно как происходит дозировка удобрений, сначала отрабатывает пропорциональное звено, а потом до заданного значения ЕС доводит интегральное звено, pH регулятор работает аналогично.

Инструкции на контроллеры:

Инструкция EC

Инструкция pH

Приборы можно приобрести на официальном сайте https://e-mode.pro/ или здесь  https://dzagigrow.ru/catalog/e_mode_pro/ .

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

Это IP для доступа на сайт тестируемого прибора   http://78.159.233.204:7775   достаточно вставить его в адресную строку браузера и нажать Enter.

Сам сайт находиться  в самом приборе, доступ к нему возможен по IP-адресу, если у вас динамический IP, что предоставляют большинство провайдеров, то можно настроить доступ через Dynamic DNS Clien. Более подробно в статье об управлении через интернет.