Вступление,
Сегодня у нас на столе многострадальный паяльник FNIRSI HS-01. Обзоры на него делали буквально все, включая меня в моей прошлой короткой статье. Блогеры восхваляют этот инструмент как чудо китайской инженерии, и я с ними соглашусь: стильный алюминиевый корпус, удобный колпачок и необычная геометрия со стильным маленьким OLED-экранчиком действительно радуют глаз своим минимализмом, но при этом обладают бешеной функциональностью.
Но, как это часто бывает, мне «повезло» нарваться на сырую версию паяльника начала 2023 года. Из-за несовместимости кривого стокового софта и такого же кривого загрузчика (бутлоадера), обновить прибор по-человечески было просто невозможно. Уж не знаю, какие именно иероглифы в коде скрывают эту страшную китайскую правду.
Я старался как мог: комбинировал разные качественные провода, перепробовал порты USB 2.0 и USB 3.0 на компьютере, даже гонял тестовые картинки с телефона на ПК и обратно, чтобы полностью исключить физические проблемы со связью. Со своей стороны я сделал всё возможное. При этом кривой софт прошивальщика мирно определял паяльник и делал вид, что успешно обновляет его до версии V0.3. Но на выходе, после перезагрузки по питанию, паяльник оставался прежним. Видимо, софт физически не знал, какой китайской буквой открыть доступ к памяти чипа и отправить его на запись. В итоге микроконтроллер просто угарал над программой, молча прослушивая поток данных, а утилита верила ему и обманывала пользователя. Короче, обычные будни.
И этот факт было легко проверить: достаточно было изменить дефолтные настройки (например, выставить температуру 100 градусов или поменять яркость экрана), запитав прибор от мощного блока питания, а затем попытаться его прошить. В итоге после «успешного» обновления на экране как горели мои 100 градусов, так и оставались, да и яркость не менялась. Родной софт просто намертво заблокировал память и отказывался принимать изменения.
Ну что, заинтересовал? Заваривайте чай, доставайте печеньки! Сегодня мы начнем создавать зачатки кастомной прошивки со своей собственной схемой регулирования температуры жала. Статья обещает быть большой, плотной и хардкорной! Я, конечно, не обещаю, что у меня в целом сразу все получится идеально, но постараюсь донести основную суть, а далее — возможно, кто-то из вас подхватит эту инженерную эстафету.
Для скептиков сразу скажу: сам чип аппаратно закрыт от считывания прошивки (Read-Out Protection), поэтому компьютер в принципе не мог заранее скачать заводские данные для отката. Единственный фантастический вариант — если бы разработчики оставили в энергонезависимой флеш-памяти заблокированный кусок, который после наката новой прошивки распаковался бы и вернул основные данные. Но зачем так мучиться в гражданском коммерческом устройстве? Зачем городить такие костыли, полностью теряя возможность гибкой перестройки исходного кода (структура не меняется)? Ответ прост: никто этим не занимался, софт просто кривой.
Короче, ситуация смешная до такой степени, что приходится напяливать прикид механика и с умным лицом разговаривать с этим глупым паяльником о том, как именно за счёт пропорционально-интегрально-дифференциальных формул он должен менять температуру своего жала. И, главное, о том, как я дико расстроюсь, если в процессе наших тестов он раскалит это самое жало докрасна.
Грешит не только боль прошивки
Вернёмся к проблемам. Выше я описал боль старых ревизий при попытке перепрошивки, но если бы дело было только в ней... Из-за тяжёлых программных фильтров и переусложнённого кода реальный отклик ПИД-регулятора на изменение температуры жала у FNIRSI имеет «резиновую» задержку чуть ли не в полсекунды! А учитывая крошечную теплоёмкость самого картриджа, температура при касании платы падает стремительно быстро. На деталях мгновенно вырастает уродливая статуя из холодного припоя, пока родной софт только-только начинает не спеша соображать, что пора бы подкинуть жару. Скорее всего, это связано с тем, что китайцам было банально лень влепить копеечный конденсатор по линии питания жала. Вместо этого они до последнего пытают чип, доводя дело до абсурда: внутри контроллера сидит софтверное подобие ИИ с осциллографом и судорожно вычисляет, что здесь полезный сигнал, а что — силовой шум.
В итоге пользователь не может толком залудить даже простую площадку, и ему приходится задирать температуру свыше 350 градусов, просто чтобы паять было хоть как-то комфортно, пускай и оставляя после себя уродливые следы холодной или перегретой пайки. По себе знаю :) Знакомые радиолюбители недавно даже в шутку отругали меня за такую «холодную» пайку. И дабы из-за житейских обстоятельств не бежать в магазин за новым инструментом, я решил взять прибор силой. И итог таких упёртых действий таков: паяльник теперь чист, как белый лист. Терять уже явно нечего...
Капкан захлопнулся, выхода нету... Или всё-таки есть?
А теперь отойдём от лирики и пойдём строго по фактам. Заливаться соплями над испорченным устройством — вообще не в моём стиле. Работаем по классике: пока волшебный белый дым из чипа не вышел, прибор считается живым, а там — как дальше будет видно.
Так вот, за регулировку температуры отвечает пропорционально-интегрально-дифференцирующий регулятор (ПИД). В интернете его определение звучит как:
ПИД-регулятор (пропорционально-интегрально-дифференциальный регулятор) — это устройство или алгоритм в системах автоматического управления, который формирует управляющий сигнал на основе трёх составляющих для поддержания заданного значения параметра процесса (например, температуры, давления, расхода) на определённом уровне - из поисковика Яндекс
Если коротко, этот алгоритм отвечает за удержание заданной температуры в нужном диапазоне. ПИД-регулятор — это чистая математическая логика. Но как именно он управляет нагревом физически? Ведь можно подавать мощность через ШИМ, можно плавно менять напряжение, можно обрезать синусоиду диммером или, на худой конец, просто хлопать транзистором по принципу «сильнее закройся, меньше откройся». И ответ прост: этот алгоритм может управлять абсолютно всем!
ШИМ (широтно-импульсная модуляция, PWM — pulse-width modulation) — метод управления мощностью, подаваемой на нагрузку, путём изменения длительности импульсов при постоянной частоте их следования. При этом меняется не амплитуда сигнала, а скважность — отношение длительности импульса к периоду его следования - из поисковика Яндекса
Можно, конечно, пойти по пути абсолютного безумия: наложить скоростной ШИМ поверх синусоиды, динамически менять размах амплитуды и частоту сигнала, а в реальном времени вычислять среднеквадратичное значение напряжения... Можно ещё бонусом, по фану, менять саму форму сигнала, превращая его в двухполярный меандр или пилу. Но давайте мы оставим эту задачу со звёздочкой для гиков 5–6 разряда РЭА на тяговых подстанциях. Мы же люди практичные, менять простую топологию на полный мост каскадов транзисторов не будем, поэтому за базу возьмём классический ШИМ
N-канальный MOSFET (Metal-Oxide-Semiconductor Field-Effect Transistor, МОП-транзистор) — это разновидность полевого транзистора с изолированным затвором. Он управляется напряжением, приложенным к затвору относительно истока. Транзистор — это полупроводниковый прибор, который позволяет управлять значительным током в электрической цепи с помощью небольшого входного сигнала. Он используется для усиления, генерирования, коммутации и преобразования электрических сигналов. Транзистор является ключевым элементом большинства электронных устройств и интегральных схем. - из поисковика Яндекс
Если отбросить сложную терминологию, силовая схема паяльника схлопывается на раз-два-три. Плюс питания идёт на само жало, а минус подключается через транзистор-ключ. Этот ключ работает как обычный скоростной выключатель: замкнулся — ток пошёл, разомкнулся — нагрев прекратился. Притом на то, чтобы закрыться, ему надо всего-то наносекунды — технологии, не иначе! Китайцы воткнули сюда N-канальный тип транзисторов, потому что они просто лучше за счёт того, что управляют основными носителями заряда — электронами, которые куда подвижнее «дырок». Так что это крутая фича от физики полупроводников, а не просто экономия от маркетинга. Ну и бонусом внутри жала сидит термопара, которая за счёт эффекта Зеебека превращает разницу температур в микровольты, показывая нашему мк, насколько остыл инструмент.
Эффект Зеебека — это явление возникновения электродвижущей силы (термо-ЭДС) в электрической цепи, состоящей из последовательно соединённых разнородных проводников, контакты между которыми поддерживаются при разных температурах. Иногда его также называют термоэлектрическим эффектом - из поисковика Яндекс
Вся суть ОС (обратной связи) паяльника заключается в том, чтобы банально измерять температуру на жале, а после — правильно её удерживать. И вся прелесть здесь в том, что реальный мир чертовски неидеален. Напряжение блока питания может внезапно просесть, а данные с термопары физически запаздывают относительно самого нагревателя из-за тепловой инерции металла. Вот и всё. Именно для решения этих проблем и придумали алгоритмы ПИД-регуляторов. Ну а теперь давайте изобретать их заново!
ПИД-регулятор: разрабатываем математическую формулу через призму графиков. Линейная зависимость
Для того чтобы вам было проще понять мою идею, я решил использовать нейросеть для моделирования графиков зависимости. Вам приятно смотреть на ровные линии, а мне не надо ломать голову в Paint. Автоматизация, в общем.
(Если вы сейчас подумали, что смысл этих строчек тоже сгенерирован ИИ, то вы глубоко ошибаетесь. Нейросеть пока ещё физически не способна в реальном времени повторять живой потоковый ход мыслей человека, да и делать столь объёмные работы ей не под силу. Так что выдыхайте, живой контент ещё будет существовать — как минимум до тех пор, пока я не сдамся и не заброшу данное ремесло. Да и Т9, если подумать, в своём роде тоже прадедушка ИИ, с которого на мобилках всё и начиналось. Ну а если у кого-то всё равно есть дикое желание признать меня жертвой ИИ, жду в комментариях, лопату я уже приготовил).
Как видно из графика, такая линейная логика будет работать просто отлично, и на её основе уже можно строить полноценный ПИД-регулятор. Только для этого нужно будет снизить максимальный ШИМ до 95%, чтобы можно было спокойно и без проблем опросить датчик, не попав под силовой выброс самоиндукции спирали. При скорости обновления сетки в 50 Гц эти 5% будут как раз составлять 1 миллисекунду — нашему микроконтроллеру этого времени хватит с огромным запасом.
Также мы должны врезать в код новую переменную: Тсред = 200 * 0.75 — в нашем случае это ровно 150 градусов. И в диапазоне от нуля до Тсред мы наглухо пропишем максимальные 95% мощности. Всё, проблема со скоростью первоначального разогрева решена, а вероятность того, что температура жала улетит в бесконечный перелёт за наш предел, полностью исчезает. Также добавим глухое ограничение: если температура больше или равна 200 градусам, то мощность фиксируется на уровне 5%. То есть итоговая мощность на холостом ходу составит всего 3.25 Ватта при максимальной мощности блока питания в 65 Ватт.
А если термопара сломается или отвалится контакт жала? Ладно, сделаем простую прозвонку цепи. Если в течение двух секунд от датчика не появится адекватная обратная связь, мы наглухо глушим паяльник и выдаём ошибку. Причём этот опрос мы можем делать как в процессе работы, так и на самом старте, при инициализации устройства, а затем просто повторять его на репите с задержкой в 1 секунду. Точно так же поступим и с самим жалом: если при поданном питании температура физически не будет расти, софт сразу выдаст ошибку и принудительно снизит ШИМ до безопасных 5%.
Учитывая, что за 2 секунды набежит 130 Джоулей энергии, масса меди на кончике составляет около 4.5 грамма, а удельная теплоёмкость всего жала (это бутерброд из разных видов металлов) будет 400 Джоулей на один градус для массы в 1 килограмм. Конкретно: если вы захотите жало весом 1 кг разогреть на 1 градус, готовьтесь влить в него 400 Джоулей без учёта теплопотерь. Пересчитав наши данные и сделав поправку на нагрев воздуха, мы увидим, что за время аварийного таймера жало разогреется примерно на 110 градусов. Притом учитывая, что ситуация на этапе разгона категорически опасная и мы не можем знать, что именно пошло не так, мы полностью глушим нагреватель, ставим ШИМ 0% и выводим ошибку на экран.
На моменте напискания текста сам запутался, по этому смотрите, если всё хорошо и мы перепрынули 200 градусов, даём 3 ватта при шиме 5%, если всё плохо и жало не рабочее, сравниваем температуру в начале и через 2 секунды, после нехитрой логики мол если разница температур в конце и в начале не превышает 10 градусов, всё глушим.А когда мы доползли до заданной отметки, ставим зелёный флаг
Вернёмся к графику
Итоговый график нашей прошивки схлопывается в три понятных шага: до Тсред (150 °C) у нас идёт ровная полка максимального жара на 95%, затем от Тсред до 200 °C мощность плавно съезжает по линии линейной логики, а после 200 °C превращается в прямую линию экономичного подогрева на уровне 5%.
Проблемы линейности
Вам кажется, что этот график идеален? Я скажу, что нет. Температура плавления того же ПОС-61 составляет целых 185 градусов, а у нас по логике есть всего лишь 15 градусов дельты для «разворота» и набора мощности. Если мы начнём паять массивную деталь, температура жала мгновенно рухнет, а линейный паяльник с такой узкой зоной реакции снова превратится в детскую погремушку с кривым ПИД-регулятором.
И вот тут мы окончательно отказываемся от линейной логики в этой зоне и включаем нелинейную — а именно кусок инвертированной параболы. При приближении к критической точке парабола начнёт задирать ШИМ не плавно, а лавинообразно. При этом мы помним, что из-за физической задержки получения данных с термопары (тепловой инерции самого металла жала) математика параболы должна быть просчитана аккуратно, чтобы процессы протекали плавно и система не уходила в дикий авторезонанс, хотя из-за инерции жало это маловероятно, но в любом случае, будем в плюсе
Шах и мат! С помощью одной лишь изящной логики мы выжали дополнительные 20% мощности в критический момент, даже не залезая в душные вузовские интегралы. Многие, конечно, могут сказать, мол, нафига я изобрёл очередной велосипед? Но будем честны: пытаться запускать тяжелую 3D-симуляцию или векторную графику на условном калькуляторе — банально бессмысленная затея. Наше железо имеет свои физические ограничения, микроконтроллер здесь слабенький, поэтому куда проще и эффективнее сразу забить на классические формулы ТАУ и не копить программные ошибки интегратора в зашумленной линии.
В итоге такой простой и лёгкий код позволит процессору без проблем разогнаться до частоты опроса в целый килогерц. При скорости обработки данных 1000 раз в секунду любым отклонениям температуры просто не остаётся места в системе. Ошибки регулирования превращаются в жалкий факт, который наша парабола уже успела заранее просчитать и полностью скорректировать на опережение.
Так что, мы изобрели классический ПИД-регулятор?
Нет, к сожалению, такую логику управления нельзя описать как банальный ПИД-регулятор. Мы полностью исключили из кода сам факт софтверного мыла, задержек и накопительных неточностей интегратора. Но это вовсе не значит, что наша логика плоха. Напротив, в суровой промышленной автоматизации такой подход называется кусочно-нелинейным адаптивным автоматом управления. Мы взяли тупую железную конвейерную схему и заставили её подчиняться законам термодинамики
Но вспомните, что мы получили взамен — свободу мыслей и огромные просторы для творчества! Я считаю, что теперь в прошивку можно будет зашить такие продвинутые функции, как: калибровка сопротивления жала, учёт ТКС нагревателя, прецизионная регулировка ШИМ и температуры, а также возможность вычислять и выводить на экран реальную мгновенную мощность в Ваттах, Амперах и Вольтах, возможность менять крутизну меняя 0.75 в диапазоне от 0 до 1.
Туда же пойдут жёсткие программные ограничения мощности и возможность «базарить» с блоками питания не только по каналу Power Delivery (PD), но и полноценно задействовать триггеры протокола Quick Charge (QC). А учитывая, что силовой транзистор работает на уровне низкоуровневой логики, а штатный линейный стабилизатор напряжения платы имеет приличный запас, наш паяльник сможет спокойно завестись и работать даже от банальных 5 Вольт по обычному народному протоколу зарядки на 2.1 Ампера.
В целом я на этом высказал все теоретические мысли и поделился своим опытом. В дальнейшем я обязательно постараюсь продолжить эту ветку, но буду дико благодарен, если кто-то из вас, читающих, поможет мне добрым словцом или даже решит развить эту тему дальше. И честно, чтобы не было никаких рамок, я официально заявляю: эта идея будет полностью свободной, никаких авторских прав на неё нет и не будет! Развивайте концепт, пишите код, создавайте ветки и не забудьте ими со мной поделиться, только используйте наработки исключительно в мирных целях :)
Всем спасибо за прочтение данной статьи, оставайтесь с нами. Всем всего хорошего, и до связи во второй части. 73!