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 (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-программа выполняет следующие действия:

  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. Собранный прототип показал работоспособность в широком диапазоне условий. Дальнейшее использование может требовать доводки, включающей распайку схем, изготовление корпуса и т.п.