Перейти к содержимому

Проектирование инфракрасной паяльной станции (Часть 1)

Стоит задача - спроектировать самодельную инфракрасную паяльную станцию. Станция состоит из двух нагревателей: верхнего и нижнего. Нагреватели должны нагревать плату в соответствии с определенным профилем температуры. Температура будет определяться по показаниям термопары (одной или нескольких).

На данном этапе я приступил к реализации алгоритма поддержания заданной температуры (ПИД регулятор). Интересно? Добро пожаловать под "кат".

Регулировать температуру я решил с помощью самодельного фазового регулятора. Видео можно посмотреть ниже.

https://www.youtube.com/watch?v=jSGbDmSUytAhttps://www.youtube.com/watch?v=-QZWYIpy9j0https://www.youtube.com/watch?v=hXBmD3VHRQo

Сначала, для управления будущей паяльной станцией я решил задействовать Arduino. Предполагалось, что фазовым регулятором будет управлять одна плата Arduino nano, а остальной функционал будет обеспечиваться второй платой. В видео я как раз экспериментировал с фазовым регулятором на базе Arduino.

Позже я решил поэкспериментировать с отладочной платой Nucleo F410RB. Она уже несколько месяцев пылилась на полке моего шкафа. Мне показалось интересным попробовать mbed os с её многопоточностью для реализации алгоритма управления паяльной станцией. Забегая вперед скажу, что mbed os оставила о себе положительное впечатление.

Панель управления

Еще до начала реализации, когда паяльная станция была только в мыслях, я начал задумываться: "Каким бы мне хотелось видеть панель управления этой станцией?" Самым простым было бы налепить разных кнопочек и индикаторов, но хотелось чего - то более современного. Я начал искать подходящие сенсорные панели и наткнулся на дисплей Nextion. Это сенсорный экран, совмещенный с микроконтроллером. Управление дисплеем осуществляется по UART. Его преимуществом является графический редактор интерфейса "Nextion Editor" , в котором можно быстро сверстать все необходимое.






Интерфейс приложения делится на страницы. На каждой странице можно добавлять различные элементы (кнопки, текстбоксы, графики, лейблы и.т.д). У каждого элемента есть свои свойства и события. Например, кнопка "Старт" на фотографии выше имеет обработчик события "Touch Press Event", в котором содержится следующий код:

Первые три строчки кода выводят в UART порт строку "xsd=89 ", где 89 - температура, установленная слайдером. page2.tempg.val=h1.val задает значение элемента tempg, который находится на второй странице и отображает требуемую температуру. h1 - это слайдер. page 2 - команда перехода на вторую странцу интерфейса.

Полный набор инструкций можно посмотреть на https://www.itead.cc/wiki/Nextion_Instruction_Set

А вот небольшой пример кода, который наоборот присылает данные из nucleo в дисплей

Здесь стоит обратить внимание, что все команды, отправляемые в дисплей должны оканчиваться последовательностью FF FF FF (255 255 255).

Выбор среды разработки для mbed os

С отладочной платой и панелью управления определился, теперь нужно подумать о среде программирования.Первое моё знакомство с mbed os началось с официального сайта и официального онлайн компилятора. Он находится по адресу https://os.mbed.com/compiler/.

Онлайн компилятор предоставляет очень простой способ программирования отладочных плат nucleo. Всё, что нужно - подключить плату к компьютеру(она определится как флешка) и загрузить в нее скомпилированный файл программы. Единственное неудобство такой разработки - постоянное подключение к интернету.

Сейчас есть очень удобный offline метод. Проект называется Platformio. Я установил версию на базе VSCode. По отзывам - это наиболее удобная платформа. Она из коробки настроена для работы со многими отладочными платами. Моя -nucleo F410RB тоже есть в списке.  Для моей платы platformio сразу же предлагает mbed в качестве фреймворка.




Как уже говорил ранее, в своём проекте я планирую использовать RTOS (real time operating system). Здесь крылся один из подводных камней Platformio. Нельзя просто взять и добавить в main.cpp строчку #include "rtos.h". Сначала я так и сделал. При этом проект напрочь отказывался собираться. Поискав информацию по теме в интернете я обнаружил, что в проекте platformio есть файл platformio.ini. Поддержку rtos нужно включить еще и в нем. Файл при этом примет следующий вид:

Программная реализация

Фазовый регулятор. Немного теории.

Теперь проект компилируется и запускается. Пора приступать к написанию кода. В предыдущих видео я управлял фазовым регулятором с arduino. Теперь попробуем переписать тоже самое, только на mbed os.

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


Таким образом мне нужно задавать задержку включения симистора в микросекундах относительно пересечения синусоиды с 0. Здесь есть один важный нюанс. Я знаю, что полупериод длится 10000мкс. Допустим я хочу включить нагреватель на 10% мощности. Какую задержку мне нужно задать? Если я задам задержку в 1000 мкс(10% от полупериода), то мощность не будет равна 10%, так как площадь части синусоиды вначале периода меньше, чем, допустим, в середине.

На помощь мне пришла статья на habr.com. Раздел "Управление мощностью".  Мгновенная мощность вычисляется по следующей формуле:

2018-11-03_20-01-49

Количество выделенного тепла

В общем виде получаем, что максимальное количество  тепла за период от 0 до Pi равно

2018-11-03_20-21-22

Вместо Pi запишем T*Pi, где T - коэффицент от 0 до 1 для того чтобы получить значение тепла на отрезке от 0 до T*Pi

2018-11-03_20-39-39

Получается, что при T=1 мы получем максимальное количество тепла за время от 0 до Pi

2018-11-03_20-49-08

Введем переменную Q, принимающую значения от 0 до 1. Таким образом мы получим уравнение, в которое можно вместо Q подставить нужное значение количества тепла, например, 0.1, что соответствует 10%. Решив его получим значение T, которое покажет какую часть периода нужно оставить, чтобы получить эти 10% тепла.

2018-11-03_20-53-23

Решал уравнение я по методу автора статьи с помощью консольного приложения qtcreator. В результате получил массив значений. Порядковый номер соответствует требуемой мощности от 0 до 250. Значение соответствует требуемой задержке. Например d[200]=3363 говорит, что для того чтобы получить мощность 200 необходима задержка 3363мкс.

Результат работы программы


Ради интереса построил график в excel, на котором отражена разбивка по 10% в соответствии с полученным массивом.

Фазовый регулятор. Код.

Фазовый регулятор описан классом PowerControl. Он содержит обработчик прерывания ZeroCross_ и пять таймеров. По одному для каждого нагревателя.

Класс PowerControl

Посмотрим на обработчик прерывания. Как только синусоида проходит через 0, он взводит пять таймеров, по одному на каждый нагреватель. Время для каждого берется из массива, который мы вычислили заранее.

 

А вот обработчики для первого таймера:

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

ПИД регулятор

Для установки требуемой температуры будем использовать Пропорционально-интегрально-дифференцирующий регулятор. Введем такое понятие, как "ошибка".

Ошибка - разность температур (заданной и текущей) Error = tзад -  tтек.

ПИД регулятор состоит из трех составляющих.

  1. Пропорциональная составляющая - разность температур, умноженная на пропорциональный коэффициент. Эта составляющая позволяет работать нагревателю, пока есть разность температур.(Error*Kp)
  2. Дифференцирующая составляющая - ошибка на предыдущем шаге минус текущая ошибка и всё это умноженное на дифференцирующий коэффициент. (Error(пред.) - Error)*Kd)
  3. Интегрирующая составляющая - сумма всех ошибок Error, умноженная на интегрирующий коэффициент.

Для некоторых систем достаточно только одной - пропорциональной составляющей. Например, я пока использую вместо керамического нагревателя лампочку накаливания. Она нагревает небольшой металлический предмет. В этом случае система почти не имеет инерции. И пропорциональный регулятор поддерживает заданную температуру достаточно точно.

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

Как только мы начнем использовать пропорциональную и дифференцирующую составляющую, возникнет ситуация, когда они установят равновесие немного раньше заданного значения. В этом случае нам поможет интегрирующая составляющая. Она за несколько шагов накопит ошибку системы и добавит недостающую мощность. Температура снова установится на заданном значении.

В моей программе ПИД регулятор оформлен ввиде класса. Он содержит таймер, который через равные промежутки времени рассчитывает значения мощности и выставляет эту мощность на фазовом регуляторе.

Pid.h

Pid.cpp

На данном этапе у меня получился пропорциональный регулятор температуры. Как только в моём распоряжении появятся керамические нагреватели, буду настраивать ПИД регулятор, подбирать необходимые коэффициенты.

Дополнительные материалы

Проект в Platfomio и интерфейс для дисплея Nextion

Компоненты паяльной станции

Проектирование инфракрасной паяльной станции (Часть 1): 3 комментария

  1. Уведомление: Проектирование инфракрасной паяльной станции (Часть 2) — ITWORKCLUB

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