ОПИСАНИЕ БИБЛИОТЕКИ ПИД-КОНТРОЛЛЕРА ДЛЯ МИКРОКОНТРОЛЛЕРОВ СЕМЕЙСТВА ARDUINO - Студенческий научный форум

XIII Международная студенческая научная конференция Студенческий научный форум - 2021

ОПИСАНИЕ БИБЛИОТЕКИ ПИД-КОНТРОЛЛЕРА ДЛЯ МИКРОКОНТРОЛЛЕРОВ СЕМЕЙСТВА ARDUINO

Медведев Д.Д. 1, Лысенко В.Н. 1
1Донской Государственный Технический Университет
 Комментарии
Текст работы размещён без изображений и формул.
Полная версия работы доступна во вкладке "Файлы работы" в формате PDF

Введение. Дифференциальный пропорционально-интегральный регулятор это устройство, которое устанавливают в автоматизированных системах для поддержания заданного параметра, способного к изменениям (Рисунок 1). ПИД-регулятор вырабатывает выходной сигнал, являющийся суммой трех составляющих пропорционального регулирования, регулирования по интегралу и регулирования по производной.[1] Первая часть пропорциональна ошибке выходной величины, т. е. разности между выходной величиной и опорным значением, вторая часть – интегралу по времени ошибки выходной величины, а третья часть – производной ошибки.[2]

Рисунок 1 – Структура ПИД регулятора

Алгоритм ПИД регулятора.

ПИД регулятор выдаёт на  выходе сигнал для плавного управления объектом, через управляющее устройство (транзистор).[3]

Рисунок 2 – Алгоритм ПИД регулятора

Логика работы.

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

Входной сигнал input  – сигнал с датчика (температура, скорость, положение, и т.д);

Установку setpoint – величина, к которой регулятор будет стараться регулировать входной сигнал с датчика.

На выходе ПИД-регулятора управляющий сигнал output – безразмерная величина, которая подаётся на управляющее устройство (Рисунок 2). Это может быть транзистор с ШИМ сигналом, диммер, сервопривод, и т.д. Выходной сигнал должен быть связан с входным, через обратную связь (датчик).

Закон управления регулятора устанавливается при помощи коэффициентов KpKi и Kd:

Kp – пропорциональный коэффициент, выходная величина будет увеличиваться пропорционально разнице входного сигнала и установки.

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

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

Инициализация.

Можно инициализировать объект тремя способами:

PID regulator;  // инициализировать без настроек (kp=ki=kd=0, dt=100 мс)

PID regulator(kp, ki, kd);// инициализировать с коэффициентами. dt будет стандартно 100 мс

PID regulator(kp, ki, kd, dt);   // инициализировать с коэффициентами и dt (в миллисекундах)

Режимы и настройки.

Направление регулирования: зависит от того, в какую сторону направляется управляемая величина input при увеличении управляющего сигнала output. Например: охлаждение или нагрев, разгон или торможение, и т.д. По умолчанию стоит NORMAL – регулятор считает, что увеличение управляющего сигнала output увеличит входной сигнал input. Устанавливается командой:

setDirection(dir);  // dir – NORMAL или REVERSE

Режим работы: режим регулирования по ошибке входного сигнала ON_ERROR или по изменению входного сигнала ON_RATE. По умолчанию стоит ON_ERROR, его рекомендуется использовать в большинстве случаев, потому что большинство процессов – самоустанавливающиеся (температура нагревателя сама установится в своём максимуме, скорость мотора – тоже). Режим ON_RATE рекомендуется использовать в интегрирующих процессах, в которых выходная величина влияет на скорость изменения входной величины, например положение моторизированного слайдера, который не остановится при управляющем сигнале, отличном от нуля. Таким процессом будет проще управлять в режиме ON_RATE. Устанавливается командой:

setMode(mode); // mode – ON_ERROR или ON_RATE

Пределы выхода: ограничение значения выходного сигнала, по умолчанию: 0-255 (для 8 бит ШИМ). Может быть установлено 0-180 для угла сервопривода, и т.д. Устанавливается командой:

setLimits(min, max);  // установить пределы

Время итерации: время итерации можно изменить в процессе работы. Время устанавливается в миллисекундах и влияет на функцию getResultTimer(), которая с этим периодом делает новый расчёт управляющего сигнала. Также это время входит в расчёт управляющего сигнала в интегральной и дифференциальной составляющей. Устанавливается командой:

setDt(dt);  // установка времени итерации в мс

Установка/чтение параметров.

Основные величины регулятора можно менять в любом месте программы и любым удобным способом (кнопки, энкодер, передача через UART/GSM/WiFi). Коэффициенты регулятора KpKi и Kd можно устанавливать и читать напрямую как члены класса, например:

regulator.Kp = 1.5; // установить

regulator.Ki += 0.7; // изменить

lcd.print(regulator.Kd); // читать

Время итерации меняется при помощи метода setDt().

Величины регулятора (вход, установка, выход) также являются членами класса и к ним можно обратиться напрямую для чтения и записи:

regulator.input = 10; // ВХОД регулятора, например текущая температура

regulator.setpoint = 20; // УСТАНОВКА регулятора, например необходимая температура

analogWrite(regulator.output); // ВЫХОД с регулятора можно подавать напрямую на ШИМ или серво

Тип вычислений.

Библиотека имеет режим целочисленных вычислений. Скорость вычислений особо не меняется, но код занимает меньше места и всё-таки должен выполняться быстрееПо умолчанию стоит режим чисел с плавающей точкой, datatype будет float или int в зависимости от настройки: это некоторые переменные и функции. Настройка осуществляется #define перед подключением библиотеки:

#define PID_INTEGER

#include "PID_regul.h"

Работа с библиотекой.

Нужно передать на вход регулятора текущее значение величины в input, нужное значение в setpoint, провести расчёт при помощи getResult() или getResultTimer(), и после этого выходную величину output подать на управляющее устройство. Делать это нужно часто для быстрых процессов (например стабилизация частоты оборотов шпинделя станка под нагрузкой: dt берём около 10-50 мс), и не очень часто для инерционных процессов (например удержание заданной температуры бойлера: dt можно взять пару секунд, процесс очень инерционный) (Рисунок 3). Функция getResult() делает расчёт в каждый свой вызов и возвращает output, а getResultTimer() делает расчёт только при срабатывании встроенного таймера. То есть getResult() нужно вызывать по своему таймеру, а getResultTimer() нужно вызывать как можно чаще, он посчитает только тогда, когда это будет нужно по своему таймеру. После расчёта можно подавать управляющий сигнал (выходную величину output) на управляющее устройство.

Настройка коэффициентов.

Подбор коэффициентов ПИД регулятора – индивидуальная задача, зависящая от конкретных условий и оборудования. Первым делом нужно установить время итерации (dt) .[4] Маленький dt для быстрых процессов и большой для медленных (инертных). Dt влияет на расчёты при неизменных коэффициентах, поэтому dt лучше не менять во время настройки, чтобы не пришлось пересчитывать все остальные коэффициенты. Диапазон коэффициентов: 0.01 – 100, т.е. довольно широк и зависит напрямую от инертности системы и выбранного времени dt. Коэффициенты должны быть положительные, противоположное направление регулирования задаётся в setDirection().

Пример схемы регулирования температуры.
Часто ПИД регуляторы используются при регулировке температуры, давайте на простом примере подогрева воды в ёмкости рассмотрим данный автоматический процесс.[5]

Рисунок 3 – Пример работы с библиотекой ПИД регулятора

Командой PIDregulator задаем коэффициенты и время дискретизации. Выбираем направление регулирования NORMAL для нагревания. Устанавливаем пределы выходного сигнала 0-255 для 8-битного ШИМ сигнала. Задаем температуру, которую должен поддерживать регулятор. Считываем с условного датчика температуру, и отправляем ее на вход регулятора. Выход регулятора отправляем на 3 выход микроконтроллера, к которому подключен нагревательный элемент через MOSFET транзистор.

Данные с микроконтроллера передаются через последовательный порт на ПК, и на их основе строятся графики.

Рисунок 4 – Графики работы нагревательной установки.

На данном рисунке начальная температура с датчика 25°С, температура, которую должен поддерживать регулятор 40°С. Верхний график - сигнал на нагревательный элемент.

Список использованных источников:

Что такое ПИД регулятор [Электронный ресурс] – Режим доступа: https://odinelectric.ru/kipia/chto-takoe-pid-regulyator-dlya-chajnikov (дата обращения: 27.11.2020).

Medvedev D.D. Pid law of regulation. Analogue (continuous) and discrete regulators. Pid control model / D.D. Medvedev, V.I. Timofeev, A.A. Zotov // Modern informatization problems in simulation and social technologies: Proc. Of the XXV-th International Open Science Conference.– Yelm, WA, USA: Science Book Publishing House, 2020.– p. 154-158.

PID регулятор на Arduino [Электронный ресурс] – Режим доступа: https://alexgyver.ru/gyverpid/ (дата обращения: 28.11.2020).

Настройка ПИД регулятора [Электронный ресурс] – Режим доступа: http://lazysmart.ru/osnovy-avtomatiki/nastrojka-pid-regulyatora/(дата обращения: 28.11.2020).

ПИД-регуляторы – для чайников-практиков [Электронный ресурс]. – Режим доступа https://spislit.ru/articles/57-spisok-literatury-po-predmetu-avtomatizacija.html (дата обращения: 25.11.2019).

Просмотров работы: 607