Регуляторы расхода газа (РРГ) предназначены для поддержания заданного пользователем значения расхода. РРГ используются в промышленности и научно-исследовательских лабораториях для организации подачи газа из баллонов и магистралей. На рынке представлены устройства компаний Элточприбор, MKS, Bronkhorst и др. Стоимость таких приборов составляет 1000-2500 USD. Целью настоящей работы является создание регулятора расхода газа из более доступных компонентов. Идея состоит в организации системы с обратной связью, включающей в себя пропорциональный клапан и измеритель расхода. Ниже приведено краткое описание аппаратной и программной части системы, позволяющее воспроизвести ее всем, кто использует РРГ в своей деятельности. Все исходные коды доступны на GitHub.
Использовались изделия компании SMC, клапаны серии PVQ и измерители расхода серии PFM5 без индикации. Было собрано два РРГ с диапазонами регулируемых расходов 0.2-5 л/мин (PVQ13 + PFM510) и 1-50 л/мин (PVQ31 + PFM550), показанные на рисунке. Стоимость одного регулятора расхода можно оценить сверху как 100 USD (клапан PVQ31) + 80 USD (измеритель PFM5) + 20 USD (микроконтроллер Arduino Nano, блок питания и радиодетали) = 200 USD. Все описанное ниже относится к РРГ 1-50 л/мин. Создание регулятора 0.2-5 л/мин, а также любых других регуляторов из аналогичных компонентов следует той же схеме, но может отличаться незначительными деталями.
Аппаратная часть
Аппаратная часть показана на рисунке и состоит из:
- Пропорционального клапана PVQ31
- Измерителя расхода PFM550
- Фильтра
- Блока питания (24V, 1A)
- Схемы управления силой тока
- Микроконтроллера Arduino Nano и схемы его питания
Электрическая схема подключения компонентов показана на рисунке. Для питания схемы используется источник постоянного тока на 24 В, 1 А, которого более чем достаточно, учитывая потребление клапана менее 200 мА и измерителя менее 35 мА. Пропорциональные клапаны серии PVQ управляются силой тока. В соответствии с документацией не рекомендуется управлять ими путем контроля напряжения. Управление силой тока может быть реализовано с помощью схемы обсуждавшейся здесь, здесь и более подробно здесь. Схема управления силой тока выделена на общей электрической схеме (Рис.3) пунктирным прямоугольником. Клапаны серии PVQ подключаются двумя проводами питания: красный — DC+, черный — DC-.
Сила тока регулируется с помощью ШИМ сигнала, выдаваемого аналоговым пином микроконтроллера. По умолчанию контроллеры на базе ATmega328 (Arduino UNO/Nano/Pro Mini) генерируют 8 битный (значения 0-255) ШИМ сигнал на частоте 488 или 976 Гц, в зависимости от пина. Малая разрядность ШИМ сигнала снижает точность регулировки клапана. Низкая частота приводит к его гудению. Эти величины могут быть увеличены программно до 10 бит (0-1023) и 15.6 кГц, соответственно. Мы использовали частоту 7.8 кГц. Описание команд, которые необходимо вставить в функцию
setup()
прошивки Arduino приведено здесь и здесь.Измерители расхода серии PFM5 имеют 2 сигнальных провода (черный — аналоговый выход, белый — установка времени отклика (не используем)) и два провода питания (коричневый — DC+, синий — DC-). Питание от источника постоянного тока 24 В. Измеритель расхода выдает аналоговый сигнал в диапазоне 1-5 В. Значение 1 В соответствует нулевому расходу газа, 5 В — максимальному для данного измерителя. Согласно документации зависимость между расходом и напряжением линейная. Между тем представляется нелишним проведение регулярной тарировки расходомера. Аналоговый сигнал с измерителя расхода (черный провод) принимается 10 битным (0-1023) аналоговым пином Arduino для обработки и отображения. Белый провод предназначен для установки времени отклика, мы его не используем. В этом случае время отклика 50 мс.
Питание платы Arduino следует осуществлять через пин 5V, напряжение питания не должно превышать 5.5 В. Такое питание может быть организовано от БП клапана и расходомера через стабилизатор L7805, как показано на схеме (Рис.3). Скорее всего будет нужен радиатор на стабилизатор. Питание от USB порта компьютера, использованное во время тестирования (Рис.2) не желательно так как в этом случае опорное напряжение при использовании АЦП нестабильно. Более подробно про питание платы см. здесь.
Программная часть
Программная часть состоит из прошивки микроконтроллера Arduino Nano и графического интерфейса пользователя, запускаемого на ПК.
Программа, загружаемая на микроконтроллер, циклически выполняет следующие действия:
- Опрашивает последовательный порт и считывает с него данные, вводимые пользователем
- Выводит данные, полученные с измерителя расхода в последовательный порт
- В зависимости от данных, полученных от пользователя и измерителя расхода определяет величину открытия пропорционального клапана и формирует необходимый ШИМ-сигнал
Система может работать в ручном и автоматическом режиме. При ручном режиме работы в последовательный порт должна быть отправлена величина желаемого открытия клапана, выражаемая переменной
valve
(0<=valve
<1023). Значение этой переменной определяет заполненность ШИМ-сигнала, который отправляется через аналоговый выход микроконтроллера на схему контроля силы тока и пропорциональный клапан командой analogWrite(valvepin, valve)
. После открытия, клапан остается в заданном положении до получения новой команды через последовательный порт.Для перехода в автоматический режим работы в последовательный порт необходимо отправить отрицательное число
-targetflow
. Значение переменной targetflow
лежит в интервале 0-1023 и определяет расход газа, который следует поддерживать. Реальный расход газа, определяется показаниями расходомера, которые считываются с аналогового входа микроконтроллера командой realflow = analogRead(fmpin)
(0<=realflow
<1023). В автоматическом режиме система стремиться поддерживать равенство между targetflow
и realflow
управляя пропорциональным клапаном. Величина открытия клапана рассчитывается с помощью пропорционального-интегрально-дифференцирующего (ПИД) регулятора. Про ПИД-регулятор можно почитать здесь, здесь и здесь. Для реализация регулятора используется библиотека GyverPID с некоторыми изменениями и дополнениями. Так как библиотека была модифицирована, используйте библиотеку прилагаемую к настоящему коду, а не скачанную по ссылке выше. Для использования ПИД-регулятора необходимо подобрать коэффициенты пропорциональной
Kp
, интегральной Ki
и дифференциальной Kd
составляющих, а также время итерации dtpid
. Значение переменной dtpid
надо подбирать в зависимости от инертности системы. Чем более инертна система тем больше должно быть dtpid
. Исходя из оценок и результатов тестирования для рассматриваемого устройства мы выбрали значения dtpid
= 100-330 мс. Коэффициенты Kp
, Ki
, Kd
подбираются при фиксированном значении dtpid
и существенно зависят от системы. Рекомендации по подбору коэффициентов можно найти здесь, здесь и здесь.Итак, алгоритм, циклично выполняемый микроконтроллером выглядит следующим образом:
if(в последовательном порту есть данные)
считать в переменную inp
if(inp >= 0 && inp < 1023)
выключить автоматический режим
открыть клапан на величину inp
if(inp <= 0 && inp >= -1023)
включить автоматический режим
установить желаемое значение расхода равным -inp
if(автоматический режим && с прошлого включения регулятора прошло dtpid мс)
расчитываем величину открытия клапана с помощью ПИД-регулятора
открываем клапан на расчитанное значение
if(с прошлого чтения расход прошло dt мс)
считываем данные с расходомера
выводим в последовательный порт
обновляем текушее значение расхода
Графический интерфейс пользователя написан на языке Python с использованием графического фреймворка PyQt. Дизайн создан в программе Qt Designer, после чего код .ui-файла конвертировался в Python-файл. Введение в разработку графического интерфейса и использование PyQt см. здесь и здесь.
Графический интерфейс взаимодействует с прошивкой Arduino через последовательный порт с помощью библиотеки
pyserial
. Python-программа выполняет следующие действия:- Устанавливает соединение с последовательным портом микроконтроллера
- Через графический интерфейс получает от пользователя данные о требуемом режиме работы, значении желаемого расхода газа или величины открытия клапана, в различных единицах измерения
- Приводит полученные данные к диапазону 0-1023, принимаемому прошивкой микроконтроллера, по формулам пересчета
- Передает данные п.3 микроконтроллеру через последовательный порт
- Считывает из последовательного порта данные, полученные от измерителя расхода (значения 0-1023)
- Переводит данные п.5 в требуемые единицы измерения и отображает в числовом и графическом виде
Код, обеспечивающий установку соединения с последовательным портом, заимствован отсюда.
Для перевода из пользовательских единиц измерения в диапазон 0-1023 и обратно предназначен модуль
units.py
. Этот модуль позволяет легко добавлять новые единицы измерения. От пользователя требуется указать название единиц и формулу пересчета из 0-1023 в новые единицы измерения. Модуль снабжен подробными комментариями.Данные полученные от измерителя расхода и выведенные прошивкой микроконтроллера в последовательный порт считываются с порта Python-программой и после перевода единиц измерения отображаются в текстовом и графическом виде. Для отрисовки графика текущего расхода используется библиотека
pyqtgraph
.Результаты
Для начала работы с РРГ необходимо: прошить микроконтроллер, подключить питание, запустить Python-программу, установить соединение с последовательным портом. После этого пользователь может выбирать ражим работы (ручной или автоматический) и задавать требуемую величину открытия клапана в ручном режиме работы или поддерживаемое значение расхода в автоматическом. Текущий расход газа выводится в соответствующем поле и отображается на графике. График обновляется циклически, после достижения заданного количества точек график очищается и отрисовка начинается сначала. Пользователь может выбрать используемые единицы измерения.
На рисунке показан внешний вид графического интерфейса пользователя и график изменения расхода газа, полученный в автоматическом режиме и демонстрирующий переключение РРГ между разными значениями поддерживаемого расхода. Результаты приведены в единицах 0-1023.
Для демонстрации возможностей поддержания постоянного расхода газа был рассмотрен случай, когда расход при открытии пропорционального клапана на постоянную величину «плывет», как показано в левой части графика (x<950) на рисунке ниже. Результат работы режима автоматического поддержания заданного расхода можно видеть на правой части графика (x>1000). Тесты показали, что отклонение от заданного расхода в режиме автоматического удержания составляет не более 2%.
Замечания
Использование микроконтроллера Arduino Nano излишне так как задействована лишь малая часть его пинов. С другой стороны было бы лучше использовать микроконтроллеры с большей разрядностью аналоговых входов/выходов для повышения точности измерения и регулировки. При смене типа микроконтроллера может потребоваться своя реализация ПИД-регулятора, это не должно вызвать затруднений так как алгоритм простой.
На этапе разработки электрическая схема была собрана на макетной плате (см. Рис.2). Для дальнейшего использования необходимо спаять схему и поместить в корпус.
Авторы статьи не являются ни электронщиками, ни программистами, поэтому конструктивные советы по улучшению приветствуются.
Дополнительные материалы
Исходные коды прошивки Arduino и Python-программы, а также документацию на используемые измерители расхода и пропорциональные клапаны выложены на GitHub
Благодарности
Мы благодарны нашим коллегам за идею системы, реализованной в этой работе. AlexGyver и другим пользователям, щедро делящимся своим опытом, за информацию которую мы использовали в работе.
Выводы
Использование системы с обратной связью, состоящей из пропорционального клапана, измерителя расхода и микроконтроллера, позволяет сделать РРГ для поддержания заданного расхода газа. Тесты продемонстрировали отклонение расхода от требуемого в пределах менее 2%. Стоимость системы составила менее 200 USD. Собранный прототип показал работоспособность в широком диапазоне условий. Дальнейшее использование может требовать доводки, включающей распайку схем, изготовление корпуса и т.п.