Регулятор расхода газа в 5 раз дешевле коммерческих решений

image
Регуляторы расхода газа (РРГ) предназначены для поддержания заданного пользователем значения расхода. РРГ используются в промышленности и научно-исследовательских лабораториях для организации подачи газа из баллонов и магистралей. На рынке представлены устройства компаний Элточприбор, 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 л/мин, а также любых других регуляторов из аналогичных компонентов следует той же схеме, но может отличаться незначительными деталями.

Аппаратная часть
image
Аппаратная часть показана на рисунке и состоит из:

  1. Пропорционального клапана PVQ31
  2. Измерителя расхода PFM550
  3. Фильтра
  4. Блока питания (24V, 1A)
  5. Схемы управления силой тока
  6. Микроконтроллера Arduino Nano и схемы его питания


image

Электрическая схема подключения компонентов показана на рисунке. Для питания схемы используется источник постоянного тока на 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 и графического интерфейса пользователя, запускаемого на ПК.
Программа, загружаемая на микроконтроллер, циклически выполняет следующие действия:

  1. Опрашивает последовательный порт и считывает с него данные, вводимые пользователем
  2. Выводит данные, полученные с измерителя расхода в последовательный порт
  3. В зависимости от данных, полученных от пользователя и измерителя расхода определяет величину открытия пропорционального клапана и формирует необходимый ШИМ-сигнал


Система может работать в ручном и автоматическом режиме. При ручном режиме работы в последовательный порт должна быть отправлена величина желаемого открытия клапана, выражаемая переменной valve (0valveanalogWrite(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-программа выполняет следующие действия:

  1. Устанавливает соединение с последовательным портом микроконтроллера
  2. Через графический интерфейс получает от пользователя данные о требуемом режиме работы, значении желаемого расхода газа или величины открытия клапана, в различных единицах измерения
  3. Приводит полученные данные к диапазону 0–1023, принимаемому прошивкой микроконтроллера, по формулам пересчета
  4. Передает данные п.3 микроконтроллеру через последовательный порт
  5. Считывает из последовательного порта данные, полученные от измерителя расхода (значения 0–1023)
  6. Переводит данные п.5 в требуемые единицы измерения и отображает в числовом и графическом виде

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

Для перевода из пользовательских единиц измерения в диапазон 0–1023 и обратно предназначен модуль units.py. Этот модуль позволяет легко добавлять новые единицы измерения. От пользователя требуется указать название единиц и формулу пересчета из 0–1023 в новые единицы измерения. Модуль снабжен подробными комментариями.

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

Результаты
Для начала работы с РРГ необходимо: прошить микроконтроллер, подключить питание, запустить Python-программу, установить соединение с последовательным портом. После этого пользователь может выбирать ражим работы (ручной или автоматический) и задавать требуемую величину открытия клапана в ручном режиме работы или поддерживаемое значение расхода в автоматическом. Текущий расход газа выводится в соответствующем поле и отображается на графике. График обновляется циклически, после достижения заданного количества точек график очищается и отрисовка начинается сначала. Пользователь может выбрать используемые единицы измерения.
image
На рисунке показан внешний вид графического интерфейса пользователя и график изменения расхода газа, полученный в автоматическом режиме и демонстрирующий переключение РРГ между разными значениями поддерживаемого расхода. Результаты приведены в единицах 0–1023.

Для демонстрации возможностей поддержания постоянного расхода газа был рассмотрен случай, когда расход при открытии пропорционального клапана на постоянную величину «плывет», как показано в левой части графика (x<950) на рисунке ниже. Результат работы режима автоматического поддержания заданного расхода можно видеть на правой части графика (x>1000). Тесты показали, что отклонение от заданного расхода в режиме автоматического удержания составляет не более 2%.
image

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

На этапе разработки электрическая схема была собрана на макетной плате (см. Рис. 2). Для дальнейшего использования необходимо спаять схему и поместить в корпус.

Авторы статьи не являются ни электронщиками, ни программистами, поэтому конструктивные советы по улучшению приветствуются.

Дополнительные материалы
Исходные коды прошивки Arduino и Python-программы, а также документацию на используемые измерители расхода и пропорциональные клапаны выложены на GitHub

Благодарности
Мы благодарны нашим коллегам за идею системы, реализованной в этой работе. AlexGyver и другим пользователям, щедро делящимся своим опытом, за информацию которую мы использовали в работе.

Выводы
Использование системы с обратной связью, состоящей из пропорционального клапана, измерителя расхода и микроконтроллера, позволяет сделать РРГ для поддержания заданного расхода газа. Тесты продемонстрировали отклонение расхода от требуемого в пределах менее 2%. Стоимость системы составила менее 200 USD. Собранный прототип показал работоспособность в широком диапазоне условий. Дальнейшее использование может требовать доводки, включающей распайку схем, изготовление корпуса и т.п.

© Habrahabr.ru