ПИД регулятор температуры на Arduino, термопаре и модуле MAX6675

В данной статье мы рассмотрим создание на основе платы Arduino ПИД регулятора температуры, который можно использовать для управления температурой нагревательного элемента 3D принтера, а при небольшой модификации его также можно использовать для управления температурой паяльника. Еще при небольшой доработке с его помощью можно управлять симистором (TRIAC), с помощью которого управлять, к примеру, частотой оборотов электродвигателя переменного тока. В общем, возможности ПИД (пропорционально-интегрально-дифференциальный) регулятора практически безграничны.

Внешний вид ПИД регулятора температуры на Arduino, термопаре и модуле MAX6675

Ранее на нашем сайте мы рассматривали принципы работы ПИД (proportional-integral-derivative, PID) контроллера при создании самобалансирующегося робота и энкодера для двигателя постоянного тока.

Что такое ПИД регулятор температуры

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

Как работает ПИД регулятор температуры

В любом ПИД алгоритме мы сначала должны уяснить, что он должен делать. В нашем случае нам необходимо поддерживать заданную температуру нагревательного элемента, которая устанавливается с помощью инкрементального энкодера. Первое, что нам необходимо делать для этого – это измерять значение температуры. Для этого мы будем использовать термопару типа K в связке с модулем преобразователя термопары на микросхеме MAX6675 (MAX6675 Cold-Junction-Compensated K-Thermocouple to Digital Converter IC), что даст нам возможность измерять значения температуры вплоть до нескольких сотен градусов. Модуль MAX6675 в данном случае выполняет роль преобразователя аналогового сигнала в цифровой.

Внешний вид термопары типа K вместе с модулем преобразователя MAX6675 показаны на следующем рисунке.

Внешний вид термопары типа K вместе с модулем преобразователя MAX6675

Технические характеристики термопары типа K вместе с модулем MAX6675:

  • Тип преобразователя: аналогово-цифровой (АЦП) с компенсацией холодного спая;
  • Разрядность преобразователя: 12 бит;
  • Шаг измерения: 0,25°C ;
  • Точность: 1,5°C;
  • Интерфейс подключения к контроллеру: SPI;
  • Напряжение питания: 3 – 5,5 В постоянного тока;
  • Габариты модуля: 32 x 15 x 14 мм;
  • Тип термопары: К (хромель-алюмелевая);
  • Диапазон измеряемой температуры: 0 – +600°С;
  • Диаметр резьбы термопары: 6 мм;
  • Длина резьбы термопары: 13 мм;
  • Длина кабеля термопары: 50 см;
  • Вес комплекта: 25 г.

Значения температуры, считываемые с термопары, будут действовать как обратная связь. Итак, мы будем измерять разницу (ошибку) между текущим значением температуры и ее требуемым значением и с помощью пропорционально-интегрально-дифференциального (ПИД) алгоритма будем пытаться свести эту разницу к нулю. Влиять на работу нашего регулятора мы будем с помощью ШИМ (PWM) сигнала, параметры которого (коэффициент заполнения) будут определяться на основе работы ПИД алгоритма.

Обзор модуля MAX6675

Функция термопары состоит в обнаружении разницы температуры между концами ее проводников. Рабочий спай термопары может измерять температуру в диапазоне от 0°C до +1023.75°C. Холодный конец (температура окружающей среды, в которой находится микросхема MAX6675) может варьироваться только от -20 °C до +85 °C. В то время как температура на холодном конце колеблется, MAX6675 продолжает точно определять разницу температур на противоположном конце.

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

Внешний вид модуля преобразователя MAX6675

Назначение контактов модуля MAX6675:

  • GND – «-«, питание модуля;
  • VCC – «+», питание модуля;
  • SCK – тактовые импульсы;
  • CS – вывод интерфейс SPI;
  • SO – вывод интерфейс SPI.

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

Внутренняя схема модуля преобразователя MAX6675

Оптимальная производительность MAX6675 достигается, когда холодный спай термопары и MAX6675 находятся при одной и той же температуре. MAX6675 включает в себя оборудование для преобразования сигнала термопары в напряжение, совместимое с входными каналами АЦП. Входы T+ и T подключаются к внутренней схеме, что уменьшает появление ошибок, вызванных тепловыми шумами в проводах термопары. Более подробную информацию о принципах работы данного устройства можно найти в техническом описании (даташите) микросхемы MAX6675.

Необходимые компоненты

  1. Плата Arduino Nano (купить на AliExpress).
  2. OLED дисплей 128х64 (купить на AliExpress).
  3. Инкрементальный энкодер с кнопкой (купить на AliExpress).
  4. Модуль преобразователя термопары на MAX6675 с термопарой типа К (купить на AliExpress).
  5. Макетная плата.
  6. Соединительные провода.

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

Внешний вид компонентов, необходимых для сборки проекта

Схема проекта

Схема ПИД регулятора температуры на Arduino, термопаре и модуле MAX6675 представлена на следующем рисунке.

Схема ПИД регулятора температуры на Arduino, термопаре и модуле MAX6675В данном проекте мы использовали датчик MAX6675 для считывания данных температуры с термопары. MAX6675 представляет собой Cold-Junction-Compensated K- Thermocouple to Digital Converter module и он подключается непосредственно к плате Arduino. Питание схемы осуществляется от контакта +5V платы Arduino. Для изменения режимов работы проекта и установки необходимой температуры мы использовали инкрементальный энкодер. Более подробно о его подключении к плате Arduino можно прочитать в этой статье. Отображать информацию проекта мы будем на экране OLED дисплея 128х64 с интерфейсом I2C. О его подключении к плате Arduino на нашем сайте можно прочитать в этой статье.

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

Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.

Внешний вид собранной на макетной плате конструкции проекта

Объяснение программы для Arduino

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

Для корректной работы программы вам необходимо скачать и установить следующие библиотеки (либо же вы можете установить их с помощью менеджера библиотек Arduino IDE:

Далее первым делом в программе нам необходимо подключить все используемые библиотеки и объявить все используемые контакты платы Arduino. Далее нам необходимо задать значения для коэффициентов Kp, Ki и Kd, которые будут использоваться для формирования выходного значения нашего ПИД регулятора температуры. Автор проекта (ссылка на оригинал приведена в конце статьи) сразу предупреждает, что он использовал "метод проб и ошибок" для определения значений этих коэффициентов, при желании вы их можете переопределить для своего проекта.

Далее в программе мы объявим все необходимые переменные и создадим три объекта: для работы с ПИД регулятором, OLED дисплеем и термопарой. Переменные clockPin, clockPinState, debounce и encoder_btn_count будут использоваться для чтения данных с энкодера. Переменная temperature_value_c будет хранить значение температуры, считанное с термопары. В переменной encoder_btn_count будет храниться количество нажатий кнопки энкодера.

Затем в функции void setup() мы инициализируем последовательную связь со скоростью 9600 бод (для целей отладки) с помощью функции Serial.begin(). В нашем случае мы эту функцию заключили в выражения #ifdef и #endif чтобы нам было просто отключить монитор последовательного порта когда код программы будет полностью готов.

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

Затем мы инициализируем ПИД регулятор с помощью функции  pid.begin(). После этого мы зададим цель (целевую точку, setpoint) для нашего ПИД алгоритма с помощью функции setpoint(). Целевая точка – это точка, которую будет стремиться достичь ПИД алгоритм в процессе своей работы. Далее мы вызовем функцию tune(), которая произведет первоначальную настройку ПИД алгоритма. В качестве аргументов в данную функцию будут передаваться значения коэффициентов __Kp, __Ki и __Kd. И, наконец, мы зададим пределы работы ПИД регулятора с помощью функции pid.limit(0, 255), в результате чего выходные значения ПИД алгоритма не будут выходить из диапазона 0-255 (диапазон изменения коэффициента заполнения ШИМ сигнала на контактах платы Arduino).

Далее мы будем проверять доступен ли OLED дисплей (возможна ли работа с ним) и если он доступен, то мы будем продолжать выполнение программы. Если же он не доступен, то мы будем выводить в окно монитора последовательной связи сообщение об ошибке и дальше программу выполнять не будем.

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

Далее мы запрограммируем функцию set_temp(). Внутри данной функции мы будем устанавливать температуру нагревательного элемента и проверять состояние кнопки энкодера. Если ее состояние равно двум, то мы будем очищать экран дисплея, устанавливать размер текста и выводить значение температуры на экран дисплея.

После этого мы запрограммируем функцию read_encoder() – как следует из ее названия, в ней мы будем считывать значения с энкодера и проверять вращается ли он по часовой, или против часовой стрелки. Если энкодер вращается по часовой стрелке, то мы будем увеличивать значение счетчика (counter), а если против часовой – мы будем уменьшать значение счетчика. Также мы будем проверять состояние кнопки энкодера чтобы переключаться между режимами установки температуры и ее мониторинга.

И, наконец, в функции loop мы будем вызывать функции read_encoder() и set_temp, эти функции будут вызываться последовательно. Также мы будем проверять состояние кнопки энкодера. Если оно равно единице, то мы будем считывать значение температуры с термопары и подавать ее на вход ПИД алгоритма. После того как ПИД алгоритм произведет необходимые расчеты, мы будем подавать рассчитанное значение в функцию analogWrite, которая будет формировать на его основе ШИМ сигнал с требуемым коэффициентом заполнения. Когда все это будет сделано, мы будем обновлять состояние экрана дисплея.

Тестирование работы ПИД регулятора температуры

Для тестирования работы проекта его автор подключил к ему мультиметр Meco 450B+ чтобы с его помощью измерять коэффициент заполнения ШИМ сигнала на контакте 11 платы Arduino. В качестве нагревательного элемента автор использовал экструдер (extruder, приспособление для выдавливания расплавленного покрытия) от 3D принтера, который запитывается от внешнего источника с напряжением 12V. Плата Arduino получает питание по кабелю от компьютера.

Подключение мультиметра к нашему проекту

Теперь, чтобы установить значение температуры, необходимо нажать кнопку инкрементального энкодера, в результате чего будет задана целевая точка (к которой он будет стремиться) для работы ПИД алгоритма. После этого нагревательный элемент начнет нагреваться чтобы достичь установленной температуры. На экране мультиметра вы при этом должны наблюдать увеличение коэффициента заполнения ШИМ сигнала. Для теста автор проекта установил температуру 64*C.

Установка температуры для тестирования работы ПИД регулятора

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

Тестирование работы проекта

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
325 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *