Самодельная паяльная станция на ATmega8
Что является одним из самых важных инструментов в наборе инженера, работа которого связана с электроникой. Это то, что вы, вероятно, любите и ненавидите, – паяльник. Вам необязательно быть инженером, чтобы он вам вдруг понадобился: достаточно быть просто умельцем, которые ремонтирует что-либо у себя дома.
Для базовых применений хорошо справляется и обычный паяльник, который вы включаете в розетку; но для более деликатной работы, такой как ремонт и сборка электронных схем, вам понадобится паяльная станция. Регулирование температуры имеет решающее значение, так как не сжигает компоненты, особенно микросхемы. Кроме того, вам также может потребоваться, чтобы она была достаточно мощной, чтобы поддерживать определенную температуру, когда вы будете что-то припаивать к большому земляному полигону.
В данной статье мы рассмотрим, как можно собрать собственную паяльную станцию.
Разработка
Когда я разрабатывал эту паяльную станцию, для меня были важны несколько ключевых свойств:
- переносимость – это достигается за счет использования импульсного источника питания, вместо обычного трансформатора и выпрямительного моста;
- простой дизайн – мне не нужны 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
".
Список комплектующих
Обозначение | Номинал | Количество |
---|---|---|
IC1 | ATMEGA8-P | 1 |
U1 | LM358 | 1 |
Q1 | IRF540N | 1 |
R4 | 120 кОм | 1 |
R6, R3 | 1 кОм | 2 |
R5, R1 | 10 кОм | 2 |
C3, C4, C7 | 100 нФ | 3 |
Y1 | 16 МГц | 1 |
C1, C2 | 22 пФ | 2 |
R2 | 100 Ом | 1 |
U2 | LM7805 | 1 |
C5, C6 | 100 мкФ (можно и меньше) | 2 |
R7, R8, R9, R10, R11, R12, R13, R14 | 150 Ом | 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. Вы можете использовать более высокий уровень заполнения и меньшую высоту слоя, если у вас есть время и терпение.
Заключение
Вот и всё! Надеюсь статья оказалась полезной. Ниже приведены все необходимые материалы.