Как сделать термовоздушный паяльный фен своими руками


Поддавшись искушению, прикупил на AliExpress термовоздушный паяльный фен. Цена вопроса 600 рублей. Соответственно приступил к организации соответствующей «обвязки» устройства. Начал с управления вентилятором. Вентилятор в фене рассчитан на питание постоянным током 0,25 А и напряжением 24 вольта. Для этой цели тут исключительно подойдёт импульсный блок питания от принтера Canon К30232, коих в свободной вторичной продаже великое множество, причём за дёшево. И тут главное удобство даже не то, что он на необходимые 24 вольта и выдаёт вполне достаточный ток до 0,7 А, а то, что в схеме уже предусмотрен подстроечный резистор крайне необходимый при настройке выходного напряжения в нужном интервале.


Блок питания от принтера Canon К30232

Свой БП не покупал, был в наличии, правда уже года два как неисправный, но когда действительно понадобился, то его удалось как-то быстренько починить.

Принцип работы и общие характеристики

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

В конструкцию этого оборудования входят следующие компоненты:

  1. Блок управления, который контролирует рабочие параметры работы устройства.
  2. Паяльник, предназначенный для выполнения пайки.
  3. Пинцет, участвующий в сборке/разборке элементов, устанавливаемых на печатную плату.
  4. Фен, который предназначен для нагрева сборочного места. Его можно использовать для выполнения как единичных, так и групповых операций.
  5. Источник тепла, используемый для нагрева печатной платы для определенной в технологическом процессе температуры.
  6. Прибор для удаления лишнего олова.
  7. Вспомогательную оснастку – подставки и пр.
  8. Браслеты, которые снимают статическое напряжение.

Самодельная паяльная станция

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

И конечно нельзя забывать то, что паяльные станции с феном оснащены приспособлением для снятия статического напряжения.

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

Основные характеристики фена для пайки

Есть несколько параметров, на которые стоит обратить внимание, выбирая фен для пайки – это напряжение и мощность.

Для успешной пайки компьютерных микросхем и радиодеталей дома, мощность должна быть минимум 100 Ватт, но лучше больше.

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

Рекомендуемый диапазон напряжения 24-36 Вольт. Меньшие значения не позволят достигнуть требуемой мощности, а большие могут быть опасны. Кроме того, напряжение будет зависеть от сопротивления в проволоке нагревателя. Рекомендуется использовать нихромовую проволоку сопротивлением 6 Ом для напряжения 24 Вольта.

Рекомендации по сборке самодельной паяльной станции с феном

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

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

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

Схема электропитания паяльного фена

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

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

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

Спираль нагревателя из нихромовой проволоки

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

В качестве нагнетателя можно установить вентилятор небольшого размера. Кстати, его тоже можно снять со старого фена.

Вентилятор должен обеспечить поток воздуха в пределах 20-30 литров в минуту. Еще один вариант – воздушный компрессор для аквариумов. Для повышения его производительности необходимо дополнить его ресивером. Для него можно использовать обыкновенную пластиковую бутылку.

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

Корпус термофена для пайки

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

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

Сборку изделия начинают с изготовления спирали. При ее намотке необходимо учитывать, что ее сопротивление должно находиться в районе от 75 до 95 Ом. Спираль должна быть намотана на надежный изолятор, а сверху ее необходимо закрыть изолятором, например, асбест или стекловолокно. После сборки этого узла концы спирали должны выходить наружу.

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

ВАЖНО! При выполнении работ необходимо постоянно помнить о тепловой изоляции.

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

Особенности фенов для пайки

Фен для пайки применяется в работе с легкоплавкими сплавами и металлами. Кроме того, его часто применяют для удаления лакокрасочных покрытий с поверхности старых деталей и при их нагревании. Температура воздуха, выходящего из сопла фена достигает 800 °С. Регулируется она с помощью специального реле, но кроме этого, температура зависит от используемого напряжения, вентилятора и расстояния до нагреваемого предмета.

Работа паяльным феном

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

Правила пользования и техника безопасности

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

При работе недопустимо резко изменять температуру в нагревательном элементе.

Во время работу необходимо соблюдать осторожность и не допускать касания нагретых элементов. Недопустимо попадание влаги на корпус и внутрь термофена.

Насадки можно заменять только после того, как фен остынет.

Рабочее место должно хорошо проветриваться.

Конструкционные особенности оборудования

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

  • нагреватель, то есть корпус, представленный трубкой;
  • нагнетатель, функцию которого выполняет насос либо вентилятор;
  • ручка;
  • выключатель.

В некоторых случаях дополнительно устанавливается датчик температуры и различные насадки.

Схема паяльной станции своими руками, элементная база

Ключевой инструмент паяльной станции является паяльник. Если при самостоятельной сборке станции можно использовать какие-то элементы, снятые, например, с отслуживших свой срок бытовых приборов. То паяльник без всяких споров должен быть новый. Многие мастера отдают предпочтение изделиям Solomon и некоторым другим.

Схема паяльной станции

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

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

Что нужно знать о такой технике?

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

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

Стоит отметить, что любые паяльные фены отличаются своими характеристиками:

  • диаметр в пределах 2–5 мм;
  • мощность около 450 Вт;
  • производительность вентилятора максимум в 30 л за минуту;
  • достижение температуры около 500°C.

Назначение кнопок и варианты прошивки

На передней панели станции должны быть установлены кнопки управления, отвечающие за исполнение следующих функций:

  • Понижение/повышение температуры с определенным шагом, например в 5 или 10 градусов.
  • Установку заранее подобранных режимов.

Настройка паяльной станции

Вместо кнопок управления можно использовать внешний прибор (программатор) или выполнить прошивку внутри схемы. Настроить температуру довольно просто.

Электрическая схема фена

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

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

При перемещении движка переключателя на один шаг вправо, его подвижный контакт замыкает выводы 1-2 и питающее напряжение через выпрямительный диод VD1 поступает через токоограничивающую спираль H1 на двигатель и нагревательную спираль H2. Диод обрезает половину синусоиды и таким образом снижает скорость вращения крыльчатки, и мощность нагрева спирали H2 наполовину.

При перемещении движка еще на один шаг, замыкаются контакты 1-2-3, на нагревательный элемент и двигатель подается все напряжение сети и фен работает на полную мощность.

Обычно в фенах устанавливают двигатели постоянного тока, рассчитанные на питающее напряжение 9-12 В. Для снижения напряжения служит спираль H1. Для преобразования переменного тока в постоянный служит диодный мост VD2-VD5. Электролитический конденсатор С4 сглаживает пульсации. Искрогасящие конденсаторы С2-С3 выполняют задачу гашения искр в щеточно-коллекторном узле двигателя и подавления радиопомех.

Кнопка S2 служит для возможности переключения работы фена в режим обдува холодным воздухом. При нажатии на нее спираль H2 перестает нагреваться.

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

Из паяльника и капельницы

Для изготовления своими руками паяного фена может быть использован простой паяльник со снятым с него защитным кожухом.

При взятии его за основу будущего нагревателя необходимо произвести доработку конструкции, заключающуюся в следующем:

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

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

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

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

Контролер паяльного фена, DIY

Почему бы не сделать себе станцию с паяльным феном, подумал я? И начал потихоньку собирать материал, читать про готовые устройства, собирать комплектующие. В итоге — получилось устройство, о котором я хочу разсказать. Будет несколько фото, радиолюбительства, программирования ардуино и самодельщины, или DIY. И еще: я понимаю, что купить готовое — намного дешевле, чем сделать самому. Кого не пугает, кто любит делать руками и программировать микроконтроллеры АВР — добро пожаловать :) Сам фен, или рукоятка, продавался в украинском интернет магазине, как запасной для китайской станции с труднозапоминаемым названием. Там же была куплена подставка со встроеным магнитом. Цена была очень приятная, похоже сбывали остатки. Сейчас его нет в наличии, но такое же есть на али, тут и тут, и еще подставка: раз и два. В рукоятке находится нагреватель с датчиком температуры, вентилятор турбинка и геркон. Я только добавил кнопочку с резистором, но об этом — ниже. На али куплен такой набор насадок. Контролер собирал сам. Он содержит ПИД регулятор температуры, позволяет работать с двумя уставками, регулировать обороты вентилятора. Температура или скорость вентилятора выводятся на цифровой дисплей. На подставке фен удерживается на 100 градусах. При снятии — за 2..3 секунды выходит на режим и формируется короткий звуковой сигнал. При нахождении на подставке более 10 минут — фен выключается, на 8-й и 9-й минуте формируются звуковые сигналы. Температура и скорость вентилятора задаются с помощью энкодера. Коэфициенты ПИД регулятора — в диалоговом окне монитора порта, при подключении к компьютеру. Органы управления

На передней панели находятся тумблер питания и энкодер, которым осуществляется регулировка параметра. Короткое нажатие на энкодер переключает установки температуры или оборотов вентилятора. Удержание до 4 сек. — переключает режим установки первого или второго заданий температуры. При выключении тумблера осуществляется охлаждение фена и потом отключение устройства от сети. При работе с феном, дисплей отображает поточную темературу. При нахождении на подставке — задание или поточную температуру, это выбирается удержанием кнопки энкодера более 4 сек. Кнопка, смонтированая на самом фене, позволяет работать с другим заданием температуры, пока она нажата. Например, если нужно кратковременно «прожарить» более высокой температурой. Ссылки на али: разъем на 9 пин, энкодер.

Индикация

Элементы индикации: трехрозрядный цифровой индикатор и четыре лампочки. Первая лампочка: на дисплее отображается температура. Вторая — отображается второе задание. третья (зеленая) — отображается задание температуры, четвертая (синяя) — отображается производительность вентилятора. Ссылки на али: неоновые лампочки, зеленые и синие.

Корпус

Корпус Z2P куплен в украинском интернет магазине. Рисунок передней панели сделан в Corel draw. Там же нарисован эскиз для вырезания отверстий. Порезка осуществлялась лазером на ЧПУ. Детальнее описано в конце этого обзора. Передняя панель распечатана на обычной бумаге. После вырезания отверстий — прогнана через ламинатор и прихвачена двусторонним скотчем к пластику.
Фото передней панели

Комплектующие, сборка

Донором индикаторов послужила часть неизвестного творения инженеров СССР.


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

Еще фото устройства индикации

Радиодетали и комплектующие приобретались на али и в украинских интернет магазинах. Большинство — было найдено в закромах. Ссылки на али: разъемы питания и нагревателя 2 пин, сигнальные разъемы и Dupont В качестве мозгов — выбрана Arduino pro. Она не дорогая и справляется со всеми функциями. Приобретена в Украине, вот здесь. Печатная плата нарисована в Sprint layout, вытравлена в перекиси с лимонной кислотой. Сверление и фрезеровка осуществлены с помощью ЧПУ станка. Печатная плата


Источник питания 24 вольт — выдран с какого-то адаптера. Собраная плата

Еще фото платы в сборе

Платы в корпусе, пробный запуск


Собранное устройство

Еще фото

Схема

Принципиальная схема устройства


Устройство индикации

Программа

Текст управляющей программы

// Hot air gun temperature controller // Arduino pro mini // 5V; 16 MHz; 328P // Settings #define FAN_MINIMAL 20 #define SV_MINIMAL 100 #define SV_MAXIMAL 450 #include // Display #define HV 4 #define DATA 5 #define LATCH 11 #define CLK 18 byte regL, regH; // Control #define ENC_CLK 3 #define DIRECT 7 #define BUTTON 8 #define POW_SW 9 int bt_timer; bool bt_tap, bt_hold, bt_hold_long; byte SV_show_timer; volatile bool power_control; bool instrument_connected; bool device_hot; unsigned int sleep_timer; bool sleeping; byte eeprom_timer; bool eeprom_store; bool show_SV_on_iddle; // Inputs #define INSTRUMENT 13 #define TEMP_PV 0 #define USE 1 int PV, PV_buf [8]; byte PV_buf_index; bool reg_action; int disp_PV, disp_PV_buf[5]; byte disp_PV_buf_index; volatile int SV, SV2; int task; bool SV2_mode; float error, deltaPV, prevPV, integr; byte use_value; byte use_state_temp, use_state_temp_old, use_state_stable_count; volatile byte use_state; // 0: instrument on holder // 1: instrument in use, button pressed // 2: instrument in use, button released volatile bool stabilized; byte stabile_timer; // Outputs #define HEAT 10 #define FAN 6 #define RELAY 12 #define SUPPLY 17 #define BEEP 19 volatile bool triac_control; volatile int power; float task_power; float kp, ki, kd; byte fan_speed; volatile byte set_fan_speed; bool relay_state, relay_state_old; volatile bool let_work; byte start_timer; byte beep_timer; byte display_mode; // 0: PV // 1: SV // 2: Fan //enum {PV,SV,FAN} display_mode; //https://alexgyver.ru/lessons/variables-types/ // Serial dialog String inData; char inChar[15]; float float_var; byte inSymbol; void setup() { Serial.begin(9600); Serial.println(«Hello»); print_help(); pinMode(HV,OUTPUT); pinMode(DATA,OUTPUT); pinMode(LATCH,OUTPUT); pinMode(CLK,OUTPUT); pinMode(ENC_CLK,INPUT_PULLUP); pinMode(DIRECT,INPUT); pinMode(BUTTON,INPUT); pinMode(POW_SW,INPUT); pinMode(INSTRUMENT,INPUT); pinMode(HEAT,OUTPUT); pinMode(FAN,OUTPUT); pinMode(RELAY,OUTPUT); pinMode(SUPPLY,OUTPUT); pinMode(BEEP,OUTPUT); TCCR1A = 0; //TCCR1B = 1<<<<<<<<<<<<80) device_hot = 1; if (PV<50) device_hot = 0; if (power_control) digitalWrite(SUPPLY,1); else digitalWrite(SUPPLY,(device_hot && instrument_connected)); if (use_state > 0) sleep_timer = 0; if (use_state > 0) { if (SV2_mode) task = SV2; else task = SV; } else {if (sleeping) task = 0; else task = 100;} if (use_state > 0) {SV2_mode = (use_state == 1);} relay_state = (PV < 480)&&(power_control)&&(!(sleeping)); if ( relay_state_old != relay_state ) { let_work = 0; //Serial.print(«Let work: «); Serial.println(let_work); delay(3200); //500*64 relay_state_old = relay_state; digitalWrite(RELAY,relay_state); //Serial.print(«Relay: «); Serial.println(relay_state); delay(3200); //500*64 let_work = 1; //Serial.print(«Let work: «); Serial.println(let_work); } if (reg_action) { reg_action = 0; PV = 0; for (byte i = 0; i < 4; i++) { PV = PV + PV_buf; } PV = PV >> 2; if (instrument_connected) PV = map(PV,0,500,25,500); else PV = 0; error = task — PV; deltaPV = prevPV — PV; prevPV = PV; if ( (task_power>0) && (task_power<1000) ) integr = integr + (ki * error); task_power = ((kp * error) + integr + (kd * deltaPV)); power = constrain(task_power, 0, 1000); //Serial.print(«Power: «); Serial.print(task_power); Serial.print(«, «); Serial.println(power); disp_PV_buf[disp_PV_buf_index] = PV; disp_PV_buf_index++; if (disp_PV_buf_index>4) { disp_PV_buf_index = 0; disp_PV = 0; for (byte i = 0; i < 4; i++) { disp_PV = disp_PV + disp_PV_buf; } disp_PV = disp_PV >> 2; //Serial.println(use_state); } stabilized = ((abs(PV — task)) < 5) && (use_state > 0); } if (power_control) { if (sleeping) { if (device_hot) fan_speed = 30; else fan_speed = 0; } else { if (use_state > 0) fan_speed = set_fan_speed; else fan_speed = 20; } } else fan_speed = 50; if (fan_speed < 80) analogWrite(FAN, map(fan_speed,0,80,0,100)); else analogWrite(FAN, map(fan_speed,80,100,100,255)); if (eeprom_store) { eeprom_store = 0; //beep_timer = 12; // 200 mS tone StoreSV(); } switch (display_mode) { case 0: DisplayValue(disp_PV); break; case 1: if (SV2_mode) DisplayValue(SV2); else DisplayValue(SV); break; case 2: DisplayValue(set_fan_speed); break; } if (bt_tap) { bt_tap = 0; sleep_timer = 0; if ( (power_control)&&(instrument_connected) ) {if (display_mode == 2) display_mode = 0; else (display_mode = 2);} } if (bt_hold) { bt_hold = 0; sleep_timer = 0; if ( (power_control)&&(instrument_connected) ) {if (use_state == 0) SV2_mode = !(SV2_mode);} } if (bt_hold_long) { bt_hold_long = 0; if (use_state == 0) show_SV_on_iddle = !(show_SV_on_iddle); } SetLamp(0,( ((display_mode == 0)||(display_mode == 1))&& instrument_connected ) ); SetLamp(1,SV2_mode); SetLamp(2,((display_mode == 1))); SetLamp(3,(display_mode == 2)); if(Serial.available() >0) { inData = «»; while(Serial.available() > 0) { delay(1280); //20*64 inSymbol = Serial.read(); inData += char(inSymbol); } inData.toCharArray(inChar, inData.length() +1); float_var = atof(inChar); //Serial.println(inData); if (inData.indexOf(«help») > -1) { print_help(); } else if (inData.indexOf(» sv1″) > -1) { SV = int(float_var); Serial.print(«New SV is «); Serial.println(SV); eeprom_timer = 0; } else if (inData.indexOf(» sv2″) > -1) { SV2 = int(float_var); Serial.print(«New SV2 is «); Serial.println(SV2); eeprom_timer = 0; } else if (inData.indexOf(» fan») > -1) { set_fan_speed = byte(float_var); Serial.print(«New FAN value is «); Serial.println(set_fan_speed); eeprom_timer = 0; } else if (inData.indexOf(«list») > -1) { print_PID(); } else if (inData.indexOf(«store») > -1) { StorePIDkoef(); Serial.println(«Stored»); } else if (inData.indexOf(» p») > -1) { kp = float_var; Serial.print(«kp: «); Serial.println(kp); } else if (inData.indexOf(» i») > -1) { ki = float_var; Serial.print(«ki: «); Serial.println(ki); } else if (inData.indexOf(» d») > -1) { kd = float_var; Serial.print(«kd: «); Serial.println(kd); } else print_help(); } } ISR(TIMER2_OVF_vect) //timer 2 interrupt { // temperatute measuring PV_buf[PV_buf_index] = analogRead(TEMP_PV)>>1; //Serial.print(PV_buf[PV_buf_index]); Serial.print(» «); Serial.println(PV_buf_index); PV_buf_index ++; if (PV_buf_index > 4) {PV_buf_index = 0; reg_action = 1;} // use state recognize use_value = analogRead(USE)>>2; // 0, 142, 255 if (use_value < 70) use_state_temp = 0; else if (use_value < 190) use_state_temp = 1; else use_state_temp = 2; if ( use_state_temp_old == use_state_temp ) {if (use_state_stable_count < 255) use_state_stable_count++;} else {use_state_stable_count = 0; use_state_temp_old = use_state_temp;} if ( use_state_stable_count == 20 ) use_state = use_state_temp; // button manage if (digitalRead(BUTTON)) if ( (bt_timer>6) && (bt_timer<62) ) {bt_tap = 1; bt_hold = 0; bt_hold_long = 0;}// >100mS, <1000mS if (bt_timer==62) {bt_tap = 0; bt_hold = 1; bt_hold_long = 0;}// = 1000mS if (bt_timer==244) {bt_tap = 0; bt_hold = 1; bt_hold_long = 1;}// = 4000mS if (!(digitalRead(BUTTON))) {if (bt_timer<32768) bt_timer++;} else bt_timer = 0; // stabilization beep if (stabilized) {if (stabile_timer < 255) stabile_timer ++;} else stabile_timer = 0; if (stabile_timer == 182) beep_timer = 12; // after 3000 ms, 200 mS tone // SV show if (power_control) { if ( (use_state == 0) && (show_SV_on_iddle) ) { if (display_mode == 0) display_mode = 1;} else { if (SV_show_timer < 122) {SV_show_timer++;} else {if (display_mode ==1) display_mode = 0;} } } else display_mode = 0; // eeprom store timer if (eeprom_timer == 250) eeprom_store = 1; // 4.1 sec if (eeprom_timer < 255) eeprom_timer++; // initial start delay if (start_timer < 255) start_timer++; if (start_timer == 122) let_work = 1; // sleep if (sleep_timer < 65500) sleep_timer++; if (sleep_timer == 29268) beep_timer = 122; // 2000mS // about 480s, 8min if (sleep_timer == 32927) beep_timer = 244; // 4000mS // about 540s, 9min sleeping = (sleep_timer > 36585); // about 600s, 10min // beep if (beep_timer > 0) beep_timer—; digitalWrite(BEEP,(beep_timer > 0)); } ISR(TIMER1_COMPA_vect) { if (triac_control) { TCCR1B = 0; digitalWrite(HEAT,LOW); triac_control = 0; } else { TCNT1 = 0; //TCCR1B = 0; digitalWrite(HEAT,HIGH); //delayMicroseconds(100); digitalWrite(HEAT,LOW); OCR1A = 25; triac_control = 1; } } ISR(INT0_vect) //INT0 interrupt, Zero cross { triac_control = 0; //OCR1A = 1250; // 250: 1mS for max power // 2250: 9mS for min power // 25: 0.1ms for open triac TCNT1 = 0; if (power > 0) { OCR1A = map(power,1,1000,2250,250); TCCR1B = 1<<<< SV_MAXIMAL) SV2 = SV2 + 5;} else {if (SV2 > SV_MINIMAL) SV2 = SV2 — 5;} } else { if (digitalRead(DIRECT)) {if (SV < SV_MAXIMAL) SV = SV + 5;} else {if (SV > SV_MINIMAL) SV = SV — 5;} } eeprom_timer = 0; SV_show_timer = 0; display_mode = 1; Serial.print(«SV: «); Serial.print(SV); Serial.print(«; SV2: «); Serial.println(SV2); } if (display_mode == 2) { if (digitalRead(DIRECT)) {if (set_fan_speed < 100) set_fan_speed = set_fan_speed + 2;} else {if (set_fan_speed > FAN_MINIMAL) set_fan_speed = set_fan_speed — 2;} eeprom_timer = 0; Serial.print(«Fan: «); Serial.println(set_fan_speed); } sleep_timer = 0; //beep_timer = 31; // 500mS //digitalWrite(BEEP, HIGH); delay(5000); digitalWrite(BEEP, LOW); } void StoreSV() { EEPROM_int_write(0,SV); // 0,1 EEPROM_int_write(2,SV2); // 2,3 EEPROM.update(4,set_fan_speed); // 4 EEPROM.update(5,show_SV_on_iddle); // 5 } void GetSV() { SV = EEPROM_int_read(0); // 0,1 if (SV > SV_MAXIMAL) SV = 0; SV2 = EEPROM_int_read(2); // 2,3 if (SV2 > SV_MAXIMAL) SV2 = 0; set_fan_speed = EEPROM.read(4); // 4 show_SV_on_iddle = EEPROM.read(5); // 5 } void GetPIDkoef() { kp = EEPROM_float_read(5); // 5,6,7,8 ki = EEPROM_float_read(9); // 9,10,11,12 kd = EEPROM_float_read(13); // 13,14,15,16 } void StorePIDkoef() { EEPROM_float_write(5,kp); // 5,6,7,8 EEPROM_float_write(9,ki); // 9,10,11,12 EEPROM_float_write(13,kd); // 13,14,15,16 } void print_PID() { Serial.print(«p: «); Serial.print(kp); Serial.print(«; i: «); Serial.print(ki); Serial.print(«; d: «); Serial.print(kd); Serial.println(«;»); } int EEPROM_int_read(int addr) { byte raw[2]; for(byte i = 0; i < 2; i++) raw = EEPROM.read(addr+i); int &num = (int&)raw; return num; } void EEPROM_int_write(int addr, int num) { byte raw[2]; (int&)raw = num; for(byte i = 0; i < 2; i++) EEPROM.update(addr+i, raw); } float EEPROM_float_read(int addr) { byte raw[4]; for(byte i = 0; i < 4; i++) raw = EEPROM.read(addr+i); float &num = (float&)raw; return num; } void EEPROM_float_write(int addr, float num) { byte raw[4]; (float&)raw = num; for(byte i = 0; i < 4; i++) EEPROM.update(addr+i, raw); } void DisplayValue(int data) { byte dig1,dig2,dig3; if (data < 100) dig3 = 0x0F; else dig3 = (data/100)%10; //Serial.print(dig3); Serial.print(» «); if (data < 10) dig2 = 0x0F; else dig2 = (data/10)%10; //Serial.print(dig2); Serial.print(» «); dig1 = (data%10); //Serial.print(dig1); Serial.print(» «); regH = regH & 0xF0; regH = regH + dig3; //Serial.print(regH,BIN); Serial.print(» «); regL = dig2; regL = regL << 4; regL = regL + dig1; //Serial.print(regL,BIN); Serial.print(» «); Update595(); } void SetLamp(byte lamp, bool mode) { //Serial.print(lamp); Serial.print(» «); switch (lamp) { case 0: if (mode) regH = regH | 0b00010000; else regH = regH & 0b11101111; break; case 1: if (mode) regH = regH | 0b00100000; else regH = regH & 0b11011111; break; case 2: if (mode) regH = regH | 0b01000000; else regH = regH & 0b10111111; break; case 3: if (mode) regH = regH | 0b10000000; else regH = regH & 0b01111111; break; } //Serial.print(regH,BIN); Serial.print(» «); Serial.print(regL,BIN); Serial.println(» «); Update595(); } void Update595() { byte i, regH_, regL_; regH_ = regH; regL_ = regL; digitalWrite(LATCH,LOW); digitalWrite(CLK,LOW); for (i = 0; i < 8; i++) { if (regH_ & 0x80) { digitalWrite(DATA,HIGH); //Serial.print(«Y «); } else { digitalWrite(DATA,LOW); //Serial.print(«N «); } digitalWrite(CLK,HIGH); digitalWrite(CLK,LOW); regH_ = regH_ << 1; } for (i = 0; i < 8; i++) { if (regL_ & 0x80) { digitalWrite(DATA,HIGH); //Serial.print(«Y «); } else { digitalWrite(DATA,LOW); //Serial.print(«N «); } digitalWrite(CLK,HIGH); digitalWrite(CLK,LOW); regL_ = regL_ << 1; } digitalWrite(LATCH,HIGH); digitalWrite(LATCH,LOW); } void print_help() { Serial.println(«***********************************»); Serial.println(«Commands»); Serial.println(«help: shows help»); Serial.println(«XX sv1: set new SV»); Serial.println(«XX sv2: set new SV2»); Serial.println(«XX fan: set new fan speed»); Serial.println(«XX.XX p: set new P value»); Serial.println(«XX.XX i: set new I value»); Serial.println(«XX.XX d: set new D value»); Serial.println(«list: show PID parameters»); Serial.println(«store: save PID parameters to FLASH»); Serial.println(«***********************************»); }

Регулировка температуры осуществляется по ПИД алгоритму. Подробнее о нем можно почитать здесь и здесь Я делал по принципу библиотеки от AlexGyver. Настройка коефициентов регулятора осуществляется вро=учную через монитор порта Arduino. Список доступных команд выводится командой help. Регулировка мощности нагревателя осуществляется фазоимпульсным методом. Отслеживается переход синусоиды через ноль и формировка задержки подачи имульса открывания на симистор.

Осциллограмма сигнала на входе прерывания 0


Формированием задержки занимается таймер1 TCCR1A = 0; //TCCR1B = 1<<<<

На таймере2 реализовано перрывание каждые 16,4 миллисекунд

TCCR2A = 0; //TMR2 normal mode TCCR2B = 1<<<<

Кроме того, задействованы аппаратные прерывания от энкодера и детектора нуля

EICRA = 1<<<<

ШИМ вентилятора реализован на таймере0. По умолчанию, он тактируется через делитель на 64 и формирует частоту 976 Гц. Вентилятор при этом сильно шумит и греется транзистор VT5. Избавится от дросселя L2 и других элекентов не желательно. В своем блоке питания я сталкивался с проблемой, когда вентилятор не хотел запускаться при питании ШИМом. Еще провода питания вентилятора проходят рядом с проводами от термопары, и лишние помехи тут ни к чему. Я отключил этот предделитель, чтобы избавится от писка вентилятора, теперь частота ШИМ составляет 62.5 кГц

TCCR0B = 1; // default is 3 (prescaler 64) Но так как delay работает от этого таймера, необходимо не забывать умножать желаемое время в delay на 64.

Для аналоговых входов задействован внутренний опорный источник 1,1 В

analogReference(INTERNAL);

Одну проблему я так и не поборол: при срабатывании реле вызывалось прерывание от энкодера. Сильно помог конденсатор на 470пФ непосредственно на выводах энкодера. Экранировка проводов к энкодеру — тоже ничего не дала. Пришлось сделать костыль в виде переменной let_work, которая выключает функции в обработчике прерываний энкодера.

if ( relay_state_old != relay_state ) { let_work = 0; //Serial.print(«Let work: «); Serial.println(let_work); delay(3200); //500*64 relay_state_old = relay_state; digitalWrite(RELAY,relay_state); //Serial.print(«Relay: «); Serial.println(relay_state); delay(3200); //500*64 let_work = 1; //Serial.print(«Let work: «); Serial.println(let_work); }

В прерывании таймера 2 осуществляется замер температуры и внесение даных в буфер. После взятия 4-х измерений — выставляется флаг reg_action. А уже в основном цикле — выщитывается температура и управляющее значение для регулятора мощности. Один раз на 4 срабатывания флага — обновляется отображаемое значение температуры.

if (reg_action) { reg_action = 0; PV = 0; for (byte i = 0; i < 4; i++) { PV = PV + PV_buf
; } PV = PV >> 2; if (instrument_connected) PV = map(PV,0,500,25,500); else PV = 0; error = task — PV; deltaPV = prevPV — PV; prevPV = PV; if ( (task_power>0) && (task_power<1000) ) integr = integr + (ki * error); task_power = ((kp * error) + integr + (kd * deltaPV)); power = constrain(task_power, 0, 1000); //Serial.print(«Power: «); Serial.print(task_power); Serial.print(«, «); Serial.println(power); disp_PV_buf[disp_PV_buf_index] = PV; disp_PV_buf_index++; if (disp_PV_buf_index>4) { disp_PV_buf_index = 0; disp_PV = 0; for (byte i = 0; i < 4; i++) { disp_PV = disp_PV + disp_PV_buf; } disp_PV = disp_PV >> 2; //Serial.println(use_state); } stabilized = ((abs(PV — task)) < 5) && (use_state > 0); }
Переменная display_mode задает, что будет отображаться на дисплее в даный момент

switch (display_mode) { case 0: DisplayValue(disp_PV); break; case 1: if (SV2_mode) DisplayValue(SV2); else DisplayValue(SV); break; case 2: DisplayValue(set_fan_speed); break; } 0 — поточное значение температуры 1 — задание температуры. 2 — задание производительности вентилятора.

Переменная use_state принимает три значения: 0 — инструмент находится на подставке. 1 — инструмент снят с подставки, нажата кнопка. 2 — инструмент снят с подставки, кнопка не нажата. В прерывании от таймера 2 считывается значение аналогово входа 1, защита от дребезга сигнала и установка значения use_state

// use state recognize use_value = analogRead(USE)>>2; // 0, 142, 255 if (use_value < 70) use_state_temp = 0; else if (use_value < 190) use_state_temp = 1; else use_state_temp = 2; if ( use_state_temp_old == use_state_temp ) {if (use_state_stable_count < 255) use_state_stable_count++;} else {use_state_stable_count = 0; use_state_temp_old = use_state_temp;} if ( use_state_stable_count == 20 ) use_state = use_state_temp;

В этом же прерывании обрабатывается нажатие кнопки энкодера, формируются 3 логических переменных: bt_tap, bt_hold, bt_hold_long

// button manage if (digitalRead(BUTTON)) if ( (bt_timer>6) && (bt_timer<62) ) {bt_tap = 1; bt_hold = 0; bt_hold_long = 0;}// >100mS, <1000mS if (bt_timer==62) {bt_tap = 0; bt_hold = 1; bt_hold_long = 0;}// = 1000mS if (bt_timer==244) {bt_tap = 0; bt_hold = 1; bt_hold_long = 1;}// = 4000mS if (!(digitalRead(BUTTON))) {if (bt_timer<32768) bt_timer++;} else bt_timer = 0;

В прерывании сравнения таймера 1 (TIMER1_COMPA_vect) осуществляется формирование импульса управления симистором. Формируется задержка от 1 мС до 9 мС на включение и длительность управляющего импульса 0.1 мС

В прерывании от детектора нуля (INT0_vect) выщитывается необходимая задержка, в зависимости от значения power

В прерывании от энкодера (INT1_vect) определяется направление вращения и изменяется соответствующий параметр.

Функция DisplayValue(int data) формирует 2 байта, которые будут отправлены в сдвиговые регистры. Число разбивается на сотни, десятки, единицы. Для гашения разряда, на все 4 входа К155ИД1 подается единица (число F).

Функция SetLamp(byte lamp, bool mode) отвечает за включение и выключение лампочек путем изменения битов 7..4 в старшем байте, отправляемом на индикацию.

Функция Update595() отправляет 2 байта в регистры сдвига, для индикации.

Рейтинг
( 2 оценки, среднее 4.5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]