DIY паяльная станция T12 + блок питания

DIY паяльная станция T12 + блок питания Ремонт

Всем хорошего денька!

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

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

В общем, решил я, что не мешало бы обзавестись домашним паяльничком и источником питания. И так, ТЗ:

1. Удачный паяльничек с контролем температуры.

2. Блок питания на 3..12В и пару ампер. В эталоне до 5А, хотя бы краткосрочно.

3. Малые габариты и вес, что бы взять с собой к клиенту.

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

Желаю еще сказать, что я понимаю о существовании TS100 и что от повер-банка с PD и подходящим тригером — будут чудеса. Но это недешево, ну и хотелось использовать накопившееся дома барахло.

Во первых, в украинском магазине был куплен корпус Z4W. У него ширина 150 мм (как в большинстве моих поделок), глубина 130 и высота — всего 50 мм.

Для питания — я избрал всем узнаваемый народный блок на 24в. Тут, на веб-сайте, Kirich делал обзор на таковой блок. Его хватит и на паяльничек, и еще на пару ампер перегрузки. А если без паяльничка — то и ампер 5 даст, но краткосрочно, по другому в таком корпусе — ему станет горячо.

За паяльную часть будет отвечать контроллер Т12, за блок питания — модуль на XL4016, за измерения — Atmega328.

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

DIY паяльная станция T12 + блок питания Ремонт

Модуль преобразователя я купил давным-давно, вот здесь. Такие же — есть и на али.

Схема перобразователя:

DIY паяльная станция T12 + блок питания Ремонт .

Для начала, я выпаял с него потенциометр с выключателем и клеммники. Для крепления к днищу корпуса, болты были изменены на стойки, высотой 30 мм. Родный електролиты — мешали стойкам, потому были изменены на 35 вольтовые. Они и ниже, и ESR у их вдвое меньше.

DIY паяльная станция T12 + блок питания Ремонт

Еще фото
DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

На месте входных клем — поселился источник 5 вольт для Атмеги, измерительных цепей и мозгов для паяльничка.

Незначительно о источнике 5 вольт
Источник построен на микросхеме XL4001

Это — понижающий преобразователь. Она может принять на вход до 37 вольт. по даташиту — держит до 2 А, но я больше ампера — никогда не употреблял. И еще — может работать в режиме СС, как драйвер для светодиодов. Я еще употреблял ее в предрегуляторе собственного блока питания.

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

DIY паяльная станция T12 + блок питания Ремонт

Даный преобразователь не умеет СС. Но у китайцев есть много на данной нам микросхеме, и с таковым режимом. К примеру, Kirich уже делал обзор на схожий преобразователь.

Контроллер паяльничка — куплен уже издавна. Ах так он смотрится.

DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

Потому что на фронтальной панели он занял бы очень много места, было принято решение расположить его в глубинах корпуса. А энкодер, разьем и экран — вынести на переднюю панель. Ну и «родной» стабилизатор на 5 вольт уже не нужен. Заместо него — будет ушко крепления. При выпайке монитора — весьма посодействовал кусок медной фольги. А на его пространство — стал кусок макетки, со штырьковым разьемом. Кроме линий монитора, к штырькам выведены сигналы для светодиода нагрева, датчика вибрации, питание 5 вольт и общий. На пространство выходного разъема — вплотную стал папа CH 3.96.

Вот, что вышло
DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

Сейчас в Corel draw нарисовал макетик фронтальной панели, с настоящими размерами органов управления. Позже распечатал его, вырезал и прикрепил к пластмассовой стене корпуса, и разметил отверстия.

DIY паяльная станция T12 + блок питания Ремонт

Позже в кореле дооформил панель, распечатал, прорезал отверстия и заламинировал.

Рисунки с Corel
DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

Полная схема устройства:

DIY паяльная станция T12 + блок питания Ремонт

Пришлось сделать две платы, для индикаторов с атмегой, и для цепей ограничения тока.

Этот процес — я незначительно обрисовал в этой статье.

Вот так смотрится плата с индикаторами:

DIY паяльная станция T12 + блок питания Ремонт

Передняя панель — в сборе:

DIY паяльная станция T12 + блок питания Ремонт

Еще фото фронтальной панели
DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

Поверх ее — находится плата измерений и ограничения тока.

DIY паяльная станция T12 + блок питания Ремонт

Больше фото
DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

В преобразователе — был заменен резистор R7, что бы снизить спектр установки наибольшего выходного напряжения с 32 до 23 вольт. Анод диодика, который стоит на входе для защиты от переплюсовки — сейчас подключен выходу плюс.

Фото преобразователя с проводами и разъемами
DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

DIY паяльная станция T12 + блок питания Ремонт

Комплекты пап и обжатых мам XH — отсюда.

Ну и вот, как все это разместилось в корпусе

DIY паяльная станция T12 + блок питания Ремонт

Незначительно о схеме:

Если к выходным клеммам подключить наружный источник питания от 10 до 24 вольт — можно будет воспользоваться паяльничком, он запитается через диодик VD1. Он был добыт на плате преобразователя, стоял параллельно входу, для защиты от переплюсовки.

ОР1 — увеличивает сигнал с датчика тока и масштабирует его до 2,5 вольт при токе 5,12 ампер. Это понадобится при вычислениях, в атмеге. Я специально употреблял неплохой rail-to-rail ОУ, но схема начинала «созидать» ток на выходе, лишь начиная где то с 160мА, при падении на шунте (0,16 * 0,01) = 1,6мВ. Ниже этого — на выходе ОУ был ноль. В последствии — был добавлен резистор R13, он очевидно выделяется на фото. В паре с R16 — он образует делитель до, приблизительно, 1,4мВ, ОУ сейчас лицезреет ток от 50мА. Можно было бы еще прирастить R16, но меня и так устроило.

Делитель на R5, R17, R22 — масштабирует выходное напряжение, что бы получить 2,5 вольт при выходном 25,6. Так — удобнее при вычислении.

OP2 — ассоциирует выходной ток с заданием от потенциометра R27 (5мВ…2,5В). При превышении — включает светодиод HL2 подает «притормаживающее» напряжение на вход оборотной связи преобразователя.

Интегрированный в потенциометр регулировки напряжения выключатель S1 — открывает транзистор VT1, шунтирующий блокирующее напряжение для XL4016, и дает сигнал на атмегу.

Схемка на ОР3 — обязана управлять вентилятором остывания, но я этот фрагмент не воплотил. Пока — и так не горячо.

О программировании Atmega328:

Я писал програму в среде Arduino IDE, потому остановлюсь лишь на моментах, которые не совершенно стандартны для «ардуинопользования».

Контроллер Atmega328 — взят новейший. С завода — он не будет работать со средой ардуино, потому что в нем нет загрузчика. Программирование будет осуществляться через USBasp программатор и SPI интерфейс. В качестве такового программатора, в теории, можно применять и обыденную ардуину, в обычных примерах даже есть соответственный скетч, но я не пробовал. Еще момент: в моем USBasp есть перемычка, которая замедляет скорость интерфейса при прошивке. Мне приходится ее применять при прошивке новых Атмег, видимо с завода они «тикают» на низкой частоте.

На моей плате — не нашлось места для кварцевого резонатора. Но атмега может работать и от встроенного резонатора. Чтоб разъяснить Arduino IDE, что так тоже можно, нужно добавить в нее соответственное ядро. Я предпочел MiniCore. Делал все по инструкции от Alex Gyver. Сейчас в меню инструменты — плата покажется вкладочка MiniCore, избираем там ATmega328. Сейчас в меню инструменты — Clock непременно избираем Internal 8 MHz. Еще в меню инструменты — программатор необходимо избрать USBasp.

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

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

О программке:

Все сегменты индикатора — подключены к одному порту. Это дозволяет выводит информацию весьма стремительно. У меня — самым не занятым оказался порт D. Под таковой вариант и разводилась плата. Как организованы выводы портов — видно на этом рисунке:

DIY паяльная станция T12 + блок питания Ремонт

Выходы разрядов идут к ардуино пинам 11, 12, 13, 8, 9, 10. Сигнал включения — к 16, Аналоговые значения напряжения и тока, соответственно к А4 и А5. Все это — только в угоду удобству разводки платы.

Ардуино пины 11, 12, 13, как и вывод Reset и GND — подведены к разьему программирования.

Текст программки
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Use Mini core, Atmega328, No bootloader, Internal clock 8 MHz
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#define TRIMM 0
// 0: normal
// 1: voltage
// 2: current
// 3: A/h

// Real input range       ADC input     ADC value
//-------------------------------------------------
//        25.5 V          2.5V          1023 / 4 = 255
//          2 V                         80
//          12 V                        480
//          22 V                        883
//-------------------------------------------------
//        5.12 A          2.5V          1023 / 2 = 512
//          0.5 A                       100
//          2 A                         400
//          4 A                         800

#define DIG_1 11
#define DIG_2 12
#define DIG_3 13
#define DIG_4 8
#define DIG_5 9
#define DIG_6 10

#define ON_OFF 16

#define VOLTAGE_PIN 4
#define CURRENT_PIN 5

byte active_digit;
byte image[6];

long current_count_mA; 
int current_count;
unsigned int current_count_timer;

int ms_3600_ticks;

volatile int voltage_ADC, current_ADC, voltage_ADC_dirty, current_ADC_dirty;
int voltage_display, current_display;
int voltage_buffer, current_buffer;
byte buffer_count;
float voltage_corrector, current_corrector;

const byte symbols[] =
  {
    //bfagc0de
    0b11101011, // 0
    0b10001000, // 1
    0b10110011, // 2
    0b10111010, // 3
    0b11011000, // 4
    0b01111010, // 5
    0b01111011, // 6
    0b10101000, // 7
    0b11111011, // 8
    0b11111010, // 9
    0b00000000, // space
    0b01110001, // F
    0b11111001, // A
    0b10010001, // /
    0b01011001  // h
  };

void setup()  1<<CS11 

void loop() {
  voltage_ADC_dirty = analogRead(VOLTAGE_PIN);
  current_ADC_dirty = analogRead(CURRENT_PIN);

  current_count = current_count_mA / 1000;

  voltage_corrector = map(voltage_ADC,0,1023,3,-6);
  voltage_display = ((float)voltage_ADC + voltage_corrector) / 4; // VV.V
  current_corrector = map(current_ADC,0,1023,10,-10);
  if (current_ADC == 0) current_corrector = 0;
  current_display = ((float)current_ADC + current_corrector) / 2; // A.AA

  
  if (digitalRead(ON_OFF))
    {
      if (TRIMM == 0)
        = 0b00000100;
          image[2] = symbols[(voltage_display%10)];
          image[3] = symbols[((current_display/100)%10)];
          image[3] 
      if (TRIMM == 1)
        {
          image[0] = symbols[((voltage_ADC/1000)%10)];
          image[1] = symbols[((voltage_ADC/100)%10)];
          image[2] = symbols[((voltage_ADC/10)%10)];
          image[3] = symbols[(voltage_ADC%10)];
          image[4] = symbols[10];
          image[5] = symbols[10];
        }
      if (TRIMM == 2)
        {
          image[0] = symbols[((current_ADC/1000)%10)];
          image[1] = symbols[((current_ADC/100)%10)];
          image[2] = symbols[((current_ADC/10)%10)];
          image[3] = symbols[(current_ADC%10)];
          image[4] = symbols[10];
          image[5] = symbols[10];
        }
      if (TRIMM == 3)
        {
          image[0] = symbols[((current_count_mA/100000)%10)];
          image[1] = symbols[((current_count_mA/10000)%10)];
          image[2] = symbols[((current_count_mA/1000)%10)];
          image[3] = symbols[((current_count_mA/100)%10)];
          image[4] = symbols[((current_count_mA/10)%10)];
          image[5] = symbols[(current_count_mA%10)];
        }
    }
  else
    {
      if (current_count_timer < 1000) 
        = 0b00000100;
          image[4] = symbols[((current_count/10)%10)];
          image[5] = symbols[(current_count%10)];
        
      else
        {
          current_count_mA = 0;
          image[0] = symbols[10];
          image[1] = symbols[10];
          image[2] = symbols[10];
          image[3] = symbols[0];
          image[4] = symbols[11];
          image[5] = symbols[11];
        }
      
    }

}

ISR(TIMER1_COMPA_vect) // each 10mS
{
  TCNT1 = 0; // !!!!!!!!!!!!!!!!!!!!!!!!!!!

  ms_3600_ticks++;
  if (ms_3600_ticks > 360)
    {
      ms_3600_ticks = 0;
      current_count_mA = current_count_mA + current_display;
      if (current_count_mA > 999000) current_count_mA = 999000;
    }

  if (current_count_timer < 65000) current_count_timer++;
  if (digitalRead(ON_OFF)) current_count_timer = 0;


  voltage_buffer = voltage_buffer + voltage_ADC_dirty;
  current_buffer = current_buffer + current_ADC_dirty;
  buffer_count++;
  if (buffer_count > 15)
    {
      buffer_count = 0;
      voltage_ADC = voltage_buffer >> 4;
      voltage_buffer = 0;
      current_ADC = current_buffer >> 4;
      current_buffer = 0;
    }
  
}

ISR(TIMER2_OVF_vect) 
{ 
  active_digit++;
  if (active_digit > 5) active_digit = 0;

  digitalWrite(DIG_1,LOW); digitalWrite(DIG_2,LOW); digitalWrite(DIG_3,LOW); digitalWrite(DIG_4,LOW); digitalWrite(DIG_5,LOW); digitalWrite(DIG_6,LOW);
  switch (active_digit) 
    {
      case 0: 
        PORTD = image[0];
        digitalWrite(DIG_1,HIGH); digitalWrite(DIG_2,LOW); digitalWrite(DIG_3,LOW); digitalWrite(DIG_4,LOW); digitalWrite(DIG_5,LOW); digitalWrite(DIG_6,LOW);
        break;
      case 1:
        PORTD = image[1];
        digitalWrite(DIG_1,LOW); digitalWrite(DIG_2,HIGH); digitalWrite(DIG_3,LOW); digitalWrite(DIG_4,LOW); digitalWrite(DIG_5,LOW); digitalWrite(DIG_6,LOW);
        break;
      case 2:
        PORTD = image[2];
        digitalWrite(DIG_1,LOW); digitalWrite(DIG_2,LOW); digitalWrite(DIG_3,HIGH); digitalWrite(DIG_4,LOW); digitalWrite(DIG_5,LOW); digitalWrite(DIG_6,LOW);
        break;
      case 3:
        PORTD = image[3];
        digitalWrite(DIG_1,LOW); digitalWrite(DIG_2,LOW); digitalWrite(DIG_3,LOW); digitalWrite(DIG_4,HIGH); digitalWrite(DIG_5,LOW); digitalWrite(DIG_6,LOW);
        break;
      case 4:
        PORTD = image[4];
        digitalWrite(DIG_1,LOW); digitalWrite(DIG_2,LOW); digitalWrite(DIG_3,LOW); digitalWrite(DIG_4,LOW); digitalWrite(DIG_5,HIGH); digitalWrite(DIG_6,LOW);
        break;
      case 5:
        PORTD = image[5];
        digitalWrite(DIG_1,LOW); digitalWrite(DIG_2,LOW); digitalWrite(DIG_3,LOW); digitalWrite(DIG_4,LOW); digitalWrite(DIG_5,LOW); digitalWrite(DIG_6,HIGH);
        break;
    }
}

Соответственно разводке платы, сигнальные полосы порта D, в виде 0bxxxxxxxx соответствуют секторам bfagcpde, где p — десятичная точка. Значения, которые необходимо выслать в регистр для отображения соответственного знака, лежат в масиве symbols[].

Ардуино меряет аналоговые сигналы относительно напряжения питания. Функция analogRead(PIN) возвратит 0, если на соответственном пине 0, и максимум 1023, если уровень на входе равен напряжению питания. Питание быть может не размеренно, потому лучше применять отдельный источник опорного напряжения. Дешевый и обычный метод — это получить 2,5вольт от TL431 (VD6 на схеме) и подать их на Aref микроконтроллера. Функция analogReference(EXTERNAL); переводит АЦП атмеги на работу от наружного источника опорного напряжения.

Для вывода инфы на экран употребляется порт D. Нужно записать 1 во все биты регистра направления работы и 0 — в биты регистра вывода DDRD = 0xFF; PORTD = 0x00;.

В атмеге есть три аппаратных таймера. Здесь хорошо о их написано. В ардуино они употребляются для генерации ШИМ, а таймер 0 — для функций delay и millis. Таймеры работают независимо от основного ядра. Они могут генерировать прерывания, это когда процесор прерывает главный цикл, делает то, что описано в обработчике прерывания, а позже — ворачивается к основному цыклу.

Таймером 1 управляют регистры TCCR1A, TCCR1B. Я включил его на обычный счет, с тактированием от основного генератора и предделителем 64. Процесор работает на 8 МГц, как следует таймер будет возрастать на 1 любые 1/(8000000/64=250kHz) = 8 микросекунд.

Сейчас необходимо разрешить прерывание по сопоставлению от таймера, в регистре TIMSK1 и записать в регистр OCR1A величину для сопоставления. До значения 1250 таймер досчитает за (1250 * 8 мкС) = 10000мкС, либо 10 миллисекунд.

Таймером 2 управляют регистры TCCR2A, TCCR2B. Я включил его на обычный счет, с тактированием от основного генератора и предделителем 32. Это 8 — розрядный таймер. Он считает до переполнения, равного 255, позже сбрасывается на 0, и дальше — по кругу, всегда.

Сейчас необходимо разрешить прерывание по переполнению от таймера, в регистре TIMSK2. Переполнятся таймер будет любые 1 / (8000000/256/32=976.56Hz) = 1024 мкС.

Именованием ISR(TIMER1_COMPA_vect) обзывается обработчик прерывания по сопоставлению таймера 1. Вызывается он любые 10 мС.

Сначала, необходимо обнулить счетный регистр TCNT1.

Позже — в отдельные переменные суммируются данные с АЦП напряжения и тока. Через любые 16 замеров — эти суммы делятся на 16 (сдвиг числа на 4 разряда на право). Это происходит через 160 мС. Довольно стремительно, и не очень числа мелькают.

Именованием ISR(TIMER2_OVF_vect) обзывается обработчик прерывания по переполнению таймера 2. Тут числятся разряды монитора, от 0 до 5. И зависимо от значения, вытягиваем с массива image соответственное значение в порт D и зажигаем соответственный разряд.

У уже писал про приведение аналоговых сигналов напряжения 25,5 вольт и тока 5,12 ампер к 2,5 вольтам. Это не спроста. При 25,5 вольт АЦП выдаст 1023. Делим его на 4 и выводим на индикацию число 255. По току — делим на 2 и выводим 512,

Но если по наибольших значениях все удалось подстроить потенциометрами R5 и R19, то на малых — наблюдалось занижение результата. Так что по потенциометрах будем выстраивать среднее значение.

Возьмем среднее значение 12 вольт, и последние 2 вольта и 22 вольта. Собираем математическую пропорцию, получаем, что в АЦП обязано быть, соответственно 480, 80 и 883. Заставляем программку выводить значение АЦП напряжения (условие if (TRIMM == 1)) и выставляем на выходе 12 вольт. Резистором R5 — добиваемся показания 480. Ставим 2 вольта, лицезреем 77, заместо хотимых 80, а при 22В — 889 заместо 883.

Функция вывода напряжения воспринимает вид voltage_display = ((float)voltage_ADC + voltage_corrector) / 4;, где значение корректировки изменяется от 3 до -6. Это делается в функции voltage_corrector = map(voltage_ADC,0,1023,3,-6);.

Аналогично — с током. Среднее значение было взято 2А. Последние 0,5А и 4А. Ожидаемые значения АЦП — соответственно 400, 100 и 800. По условию if (TRIMM == 2) выводим значение АЦП и выставляем резистором R19 показание 400 при настоящем токе 2А. При 0,5А получили 90 заместо хотимых 100, а при 4А — 810 заместо 800. как следует, корректировка изменяется от 10 до -10. current_corrector = map(current_ADC,0,1023,10,-10); Вот лишь когда на АЦП реально 0, корректировка +10 нам не нужна if (current_ADC == 0) current_corrector = 0;. Ну и выводим ток на экран current_display = ((float)current_ADC + current_corrector) / 2;. Как итог — получена точность 0,1 вольт и 0,01 ампер.

Когда поворачиваем регулятор напряжения на минимум, до щелчка, размыкается выключатель S1. Запирается транзистор VT1 и 12 вольт через VD2 поступают на вход оборотной связи XL4016. Крайняя выключается и на выходе устанавливается 0.

Переменная current_count_timer перестает повсевременно сбрасываться и возрастает до значения 65000.

Но пока она меньше значения 1000 (а продолжается это 1000 * 10 мс = 10 сек), на индикаторе напряжения высвечивается «A/h», а тока — значение счетчика ампер-часов. Позже, если включений в протяжении этого периода не будет, счетчик сбросится, а на экран — выведется «OFF».

В обработчике прерываний таймера 1 повсевременно возрастает переменная ms_3600_ticks. Когда она добивается значения 360, через (360 * 10 = 3600 мС) = 3,6 секунды, в переменную current_count_mA суммируется значение индикатора тока. За час — таковых замеров будет ровно 1000. Как следует, что бы получить значение Ампер/час, необходимо эту сумму поделить на 1000.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

один × 3 =