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

Добавлено 16 июня 2017 в 18:05

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

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

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

Разработка

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

  • переносимость – это достигается за счет использования импульсного источника питания, вместо обычного трансформатора и выпрямительного моста;
  • простой дизайн – мне не нужны LCD дисплеи, лишние светодиоды и кнопки. Мне нужен был просто светодиодный семисегментный индикатор, чтобы показывать установленную и текущую температуру. Мне также нужна была простая ручка для выбора температуры (потенциометр) без потенциометра для точной подстройки, так как это легко сделать с помощью программного обеспечения;
  • универсальность – я использовал стандартную 5-контактную штепсельную вилку (какой-то тип DIN), чтобы она была совместима с паяльниками Hakko и их аналогами.

Как это работает

алгоритм регулирования температуры

Прежде всего, давайте поговорим о ПИД (пропорционально-интегрально-дифференцирующих, PID) регуляторах. Чтобы прояснить всё сразу, давайте рассмотрим наш частный случай с паяльной станцией. Система постоянно отслеживает ошибку, которая является разницей между заданной точкой (в нашем случае, необходимой нам температурой) и нашей текущей температурой. Он подстраивает выход микроконтроллера, который управляет нагревателем с помощью ШИМ, исходя из следующей формулы:

\[u(t)=K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d {de(t) \over dt}\]

Как можно увидеть, есть три параметра Kp, Ki и Kd. Параметр Kp пропорционален ошибке в настоящее время. Параметр Ki учитывает ошибки, которые накопились с течением времени. Параметр Kd является предсказанием будущей ошибки. В нашем случае мы для адаптивной настройки мы используем PID библиотеку Бретта Борегарда (Brett Beauregard), которая имеет два набора параметров: агрессивный и консервативный. Когда текущая температура далека от заданного значения, контроллер использует агрессивные параметры; в противном случае, он использует консервативные параметры. Это позволяет нам получить малое время нагрева, сохраняя при этом точность.

Ниже приведена принципиальная схема. Станция использует 8-битный микроконтроллер ATmega8 в DIP корпусе (вы можете использовать ATmega168-328, если они есть у вас под рукой), который очень распространен, а вариант 328 содержится в Arduino Uno. Я выбрал его, потому что его легко прошить, используя Arduino IDE, в котором также есть готовые к использованию библиотеки.

Температура считывается с помощью термопары, встроенной в паяльник. Мы усиливаем напряжение, создаваемое термопарой, примерно в 120 раз с помощью операционного усилителя. Выход операционного усилителя подключается к выводу ADC0 микроконтроллера, который превращает напряжение в значения от 0 до 1023.

Заданное значение устанавливается с помощью потенциометра, который используется в качестве делителя напряжения. Он подключен к выводу ADC1 контроллера ATmega8. Диапазон 0–5 вольт (выход потенциометра) преобразуется в значения 0–1023 с помощью АЦП, а затем в значения 0–350 градусов Цельсия с помощью функции "map".

Список комплектующих

ОбозначениеНоминалКоличество
IC1ATMEGA8-P1
U1LM3581
Q1IRF540N1
R4120 кОм1
R6, R31 кОм2
R5, R110 кОм2
C3, C4, C7100 нФ3
Y116 МГц1
C1, C222 пФ2
R2100 Ом1
U2LM78051
C5, C6100 мкФ (можно и меньше)2
R7, R8, R9, R10, R11, R12, R13, R14150 Ом8

Это список компонентов, экспортированный из KiCad. Кроме того, вам понадобятся:

  • клон паяльника Hakko, самого популярного в китайских онлайн магазинах (с термопарой, а не с термистором);
  • источник питания 24 В, 2 А (я рекомендую использовать импульсный, но вы можете использовать трансформатор с выпрямительным мостом);
  • потенциометр 10 кОм;
  • электрическая штепсельная вилка авиационного типа с 5 контактами;
  • электрический разъем, устанавливаемый на заднюю панель для подачи питания 220 В;
  • печатная плата;
  • выключатель питания;
  • штырьковые разъемы 2,54 мм;
  • много проводов;
  • разъемы Dupont;
  • корпус (я напечатал его на 3D принтере);
  • один тройной семисегментный светодиодный индикатор;
  • программатор AVR ISP (для этого вы можете использовать Arduino).

Конечно, вы можете легко заменить светодиодный индикатор LCD дисплеем или использовать кнопки, вместо потенциометра, ведь это ваша паяльная станция. Я изложил свой вариант дизайна, но вы можете по-своему.

Инструкции по сборке

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

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

Обязательно установите выключатель между источником питания и разъемом питания. Используйте относительно толстые провода для соединений источника питания с печатной платой и выходного разъема со стоком MOSFET транзистора (точка H на плате) и земли на печатной плате. Для подключения потенциометра подключите 1-ый контакт к линии +5В, 2-ой – к точке POT, и 3-ий – к земле. Обратите внимание, что я использую светодиодный индикатор с общим анодом, что может отличаться от того, что у вас. Вам придется немного изменить код, но все инструкции в коде программы прокомментированы. Подключите выводы E1–E3 к общим анодам/катодам, а выводы a–dp к соответствующим выводам вашего индикатора. Для более подробной информации смотрите техническое описание на него. И наконец, установите выходной разъем паяльной станции и припаяйте к нему все соединения. Вам должна помочь картинка, приведенная выше, со схемой и цоколевкой разъема.

Теперь начинается интересное, загрузка кода. Для этого вам понадобится PID библиотека (ссылка на GitHub).


#include <PID_v1.h>

// Этот массив содержит сегменты, которые необходимо зажечь для отображения на индикаторе цифр 0-9 
byte const digits[] = {
  B00111111, B00000110, B01011011, B01001111, B01100110, B01101101, B01111101, B00000111, B01111111, B01101111
};

int digit_common_pins[] = {A3, A4, A5}; // Общие выводы для тройного 7-сегментного светодиодного индикатора
int max_digits = 3;
int current_digit = max_digits - 1;

unsigned long updaterate = 500; // Изменяет, как часто обновляется индикатор. Не ниже 500
unsigned long lastupdate;

int temperature = 0;

// Определяет переменные, к которым мы подключаемся
double Setpoint, Input, Output;

// Определяет агрессивные и консервативные параметры настройки
double aggKp = 4, aggKi = 0.2, aggKd = 1;
double consKp = 1, consKi = 0.05, consKd = 0.25;

// Задать ссылки и начальные параметры настройки
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);

void setup()
{
  DDRD = B11111111;  // установить выводы Arduino с 0 по 7 как выходы
  for (int y = 0; y < max_digits; y++)
  {
    pinMode(digit_common_pins[y], OUTPUT);
  }
  // Мы не хотим разогревать паяльник на 100%, т.к. это может сжечь его, поэтому устанавливаем максимум на 85% (220/255)
  myPID.SetOutputLimits(0, 220);
  myPID.SetMode(AUTOMATIC);
  lastupdate = millis();
  Setpoint = 0;
}


void loop() 
{
  // Прочитать температуру
  Input = analogRead(0);
  // Преобразовать 10-битное число в градусы Цельсия
  Input = map(Input, 0, 450, 25, 350);
  // Отобразить температуру
  if (millis() - lastupdate > updaterate) 
  {
    lastupdate = millis();
    temperature = Input;
  }
  // Прочитать установленное значение и преобразовать его в градусы Цельсия (минимум 150, максимум 350)
  double newSetpoint = analogRead(1);
  newSetpoint = map(newSetpoint, 0, 1023, 150, 350);
  // Отобразить установленное значение
  if (abs(newSetpoint - Setpoint) > 3) 
  {
    Setpoint = newSetpoint;
    temperature = newSetpoint;
    lastupdate = millis();
  }

  double gap = abs(Setpoint - Input); // Расстояние от установленного значения

  if (gap < 10)
  { // мы близко к установленному значению, используем консервативные параметры настройки
    myPID.SetTunings(consKp, consKi, consKd);
  }
  else
  {
    // мы далеко от установленного значения, используем агрессивные параметры настройки
    myPID.SetTunings(aggKp, aggKi, aggKd);
  }

  myPID.Compute();
  // Управлять выходом
  analogWrite(11, Output);
  // Отобразить температуру
  show(temperature);
}

void show(int value) 
{
  int digits_array[] = {};
  boolean empty_most_significant = true;
  for (int z = max_digits - 1; z >= 0; z--) // Цикл по всем цифрам
  {
    digits_array[z] = value / pow(10, z); // Теперь берем каждую цифру из числа
    
    if (digits_array[z] != 0 ) 
        empty_most_significant = false; // Не отображать впереди стоящие нули
    
    value = value - digits_array[z] * pow(10, z);
    if (z == current_digit)
    {
      if (!empty_most_significant || z == 0) // Проверить, что это у нас не ведущий ноль, и отобразить текущую цифру
      { 
        PORTD = ~digits[digits_array[z]]; // Удалить ~ для общего катода
      }
      else
      {
        PORTD = B11111111;
      }
      digitalWrite(digit_common_pins[z], HIGH);// Изменить на LOW для общего катода
    } 
    else 
    {
      digitalWrite(digit_common_pins[z], LOW); // Изменить на HIGH для общего катода
    }

  }
  current_digit--;
  if (current_digit < 0)
  {
    current_digit = max_digits; // Начать сначала
  }
}

Если у вас есть программатор AVR ISP, вы знаете, что нужно делать. Подключите контакты +5V, GND, MISO, MOSI, SCK и RESET, скачайте скетч Arduino, откройте его (вам понадобится установленная на компьютере Arduino IDE) и нажмите «Загрузить».

Если у вас нет программатора, то можете использовать Arduino. Подключите свою плату Arduino (Uno/Nano) к компьютеру, перейдите в меню Файл → Примеры → ArduioISP и загрузите его. Затем перейдите в Инструменты → Программатор → Arduino as ISP. Подключите свою плату к плате Arduino, скачайте скетч, а затем выберите Скетч → Загрузить через программатор.

Вот и всё. Теперь вы можете наслаждаться работой паяльной станцией, собранной собственными руками.

Паяльная станция. Открытый корпус

Калибровка

А нет, еще не всё. Теперь нам нужно откалибровать ее. Так как нагреватели и термопары в паяльниках могут различаться, особенно если вы используете неоригинальный паяльник Hakko, нам нужно откалибровать паяльную станцию.

Во-первых, нам нужен цифровой мультиметр с термопарой для измерения температуры жала паяльника. После того, как вы измерили температуру, вам необходимо изменить значение по умолчанию "510" в строке кода map(Input, 0, 510, 25, 350), используя следующую формулу:

\[newValue = { {TempSet \cdot ValueSet} \over TempRead }\]

где TempRead – это температура, которая отображается на вашем цифровом термометре, а TempSet – это температура, которую вы установили на паяльной станции. Это всего лишь приблизительная настройка, но ее должно хватить, ведь вам не нужна при пайке предельная точность. Я использовал градусы Цельсия, но вы можете изменить их в коде на Фаренгейты.

Печать корпуса на 3D принтере (необязательно)

Я разработал и напечатал корпус, в который можно было бы установить импульсный источник питания и печатную плату, чтобы всё выглядело аккуратно. К сожалению, для использования этого корпуса вам необходимо будет найти точно такой же тип источника питания. Если у вас есть подходящий источник, и вы хотите напечатать корпус, или если вы хотите изменить его под свои требования, то можете скачать приложенные файлы. Я печатал с заполнением 20% и толщиной слоя 0,3. Вы можете использовать более высокий уровень заполнения и меньшую высоту слоя, если у вас есть время и терпение.

Заключение

Вот и всё! Надеюсь статья оказалась полезной. Ниже приведены все необходимые материалы.

Паяльная станция на ATmega8

Теги

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

На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.

В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.


  • 2024-01-27Сергей

    Повторил данную конструкцию. Доработал ПО, добавил дополнительный функционал (индикация отсутствия подключения паяльника). Исходники и файл прошивки выложил на гитхабе: https://github.com/sergey12...

  • 2020-07-23dzanis

    Спасибо за открытый проект,сам я делаю контроллер для паяльной ручки на stm8,но схема приблизительно такая же.Хотел спросить про конденсатор C4,он у меня после резистора R5 , между 3 ногой операционника и землёй,и этот классический вариант фильтрует помехи.Почему на вашей схеме иначе?

  • 2019-01-05antzol

    Сейчас попробовал на макете из Arduino Uno и индикатора. Никаких мерцаний нет, просто хаотически изменяющиеся значения (так как аналоговый вход висит в воздухе). В коде проблем тоже нет.
    Проблема все-таки во фьюзах. У вас видимо выбран внутренний RC генератор 8 МГц, плюс делитель на 8; в итоге контроллер работает с тактовой частотой 1 МГц, а значения для обновления индикатора рассчитаны на 16 МГц.
    Выставьте весь младший байт фьюзов в единицы. CKDIV8, CKOUT, SUT1, SUT0, CKSEL3, CKSEL2, CKSEL1, CKSEL0 - все равны единице (не запрограммированы).

  • 2019-01-04Алексей Водуд

    unsigned long updaterate = 500; // Изменяет, как часто обновляется индикатор. Не ниже 500
    unsigned long lastupdate;
    При таком будет прыгать все цифры как изменить что нормально светились ??????

  • 2019-01-04Алексей Водуд

    Разьясните как повлияет на индикацию

  • 2019-01-04Алексей Водуд

    Было так temperature = Input
    Должно быть так volatile= Input;?????

  • 2019-01-04Алексей Водуд

    Было так int temperature = 0;
    Должно быть так volatile= 0;?????

  • 2019-01-04Алексей Водуд

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

  • 2018-12-12antzol

    Из-за редкого обновления цифр на отдельных семисегментных индикаторах. Но в коде вроде ничего криминального нет.
    Меньше всего "мерцает" индикатор самого младшего разряда? Если да, то возможно слишком редко вызывается функция show(int value).
    Как вариант перенести отображение чисел в обработчик прерывания по таймеру. Переменную temperature, разумеется, объявить как volatile.

  • 2018-12-12Алексей Водуд

    доброгод суток может автор ответит почему идет мерцание светодиодного индикатора?

  • 2018-11-09Игорь Кучук

    И что мы тут видим. Галимую LM358 и недопаяльник с раздельными нагревателем и жалом. Убожище

  • 2018-08-26Алексей Водуд

    можно ли получить готовый hex на почту

  • 2018-08-26Алексей Водуд

    кто нибудь собирал?что-то не получается с прошивкой не могу скомпилировать