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

Схем паяльных станций в интернете великое множество. Часть из них выполнены на специализированных микросхемах, часть — на микроконтроллерах. Кроме того, некоторые из них позволяют не только регулировать температуру паяльника, но и использовать термофен.

Что касается данной схемы, то она рассчитана на подключение только лишь паяльника. Это связано не только с малым количеством свободных выводом микроконтроллера, но и с тем, что это потребовало бы увеличение и усложнение программного кода МК, когда места под него, что говорится, «в обрез». Большая часть кода — это управление регистрами сдвига, через которые, в свою очередь можно управлять индикатором. Программный код на языке Pascal вы можете увидеть ниже:

 program PIC_SolderStation;  const      led_d: array [0..9] of array [0..7] of byte = (      (0,0,0,0,0,0,1,1),      (1,0,0,1,1,1,1,1),      (0,0,1,0,0,1,0,1),      (0,0,0,0,1,1,0,1),      (1,0,0,1,1,0,0,1),      (0,1,0,0,1,0,0,1),      (0,1,0,0,0,0,0,1),      (0,0,0,1,1,1,1,1),      (0,0,0,0,0,0,0,1),      (0,0,0,0,1,0,0,1));      led_c: array [0..2] of array [0..2] of byte = (      (0,0,1),      (0,1,0),      (1,0,0));      {mx_s: array [0..7] of array [0..2] of byte = (      (0,0,0),       (0,0,1),       (0,1,0),       (0,1,1),       (1,0,0),       (1,0,1),       (1,1,0),       (1,1,1));}      mx_s: array [0..3] of array [0..1] of byte = (      (0,0),      (0,1),      (1,0),      (1,1));      /////////////////////////////////////////////////////////////////////////// var    ds: sbit at GP2_bit;    sh_cp: sbit at GP4_bit;    st_cp: sbit at GP5_bit;        id: array [0..2] of byte;    led: array [0..1] of byte;    mp: byte;    temp, r_temp, count, count_adc: integer;     //////////////////////////////////////////////////////////////////////////////// procedure Save; var a:array [0..2] of byte;     i: byte; begin      a[2] := temp div 100;      a[1] := (temp mod 100) div 10;      a[0] := (temp mod 100) mod 10;      for i := 0 to 2 do          Eeprom_Write(i, a[i]); end;  function Read: integer; var a: array [0..2] of byte;     i: byte; begin      for i := 0 to 2 do          a[i] := Eeprom_Read(i);      result := (a[2] * 100) + (a[1] * 10) + a[0]; end; ////////////////////////////////////////////////////////////////////////////////  procedure RegWrite(var l_n: array [0..2] of byte; var led: array [0..1] of byte); var n: byte;     outp_a: array [0..15] of byte; begin          for n := 8 to 15 do              outp_a[n] := led_d[l_n[count]][n - 8];          for n := 5 to 7 do              outp_a[n] := led_c[count][n - 5];          for n := 3 to 4 do              outp_a[n] := led[n - 3];          for n := 1 to 2 do              outp_a[n] := mx_s[mp][n - 1];          ///////////////////////////////////////////////////////////////////////          for n := 0 to 15 do begin              if outp_a[n] = 0 then ds := 0 else ds := 1;              delay_us(500);              sh_cp := 1;              delay_us(500);              sh_cp := 0;              ds := 0;              delay_us(500);          end;          st_cp := 1;          delay_us(500);          st_cp := 0;          if count < 2 then inc(count) else count := 0;          ///////////////////////////////////////////////////////////////////////          if GPIO.3 = 0 then begin             case mp of             0: temp := temp + 10;             1: temp := temp - 10;             2: Save;             3: temp := Read;             {4: temp := 200;             5: temp := 250;             6: temp := 300;             7: temp := 350; }             end;             while GPIO.3 = 0 do          end;          if mp < 3 then inc(mp) else mp := 0; end;  procedure ReadTemp; var a: array [0..2] of byte;     adc_data: integer; begin      RegWrite(a, led);      ///////////////////////////////////////////////////////////////////////////      if count_adc < 20 then         inc(count_adc)      else begin          count_adc := 0;          adc_data := adc_read(0);          r_temp := (adc_data shl 2) + adc_data - (adc_data shr 1) + (adc_data shl 3)/256;          r_temp := r_temp / 5;          a[2] := temp div 100;          a[1] := (temp mod 100) div 10;          a[0] := (temp mod 100) mod 10;          if r_temp < temp then begin             led[0] := 0;             GP1_bit := 1;          end else begin              led[0] := 1;              GP1_bit := 0;          end      end;      ///////////////////////////////////////////////////////////////////////////; end;  begin      CMCON0 := $7;      TRISIO := $1;      ANSEL := $71;      ADCON0 := $1;      led[0] := 1;      led[1] := 0;      while true do begin            ReadTemp;      end; end.

К слову, как вы наверное уже догадались, программа была написана в среде mikroPascal for PIC. 

Немного о коде:

Основная трудность (для меня) заключалась в том, чтобы реализовать динамический опрос кнопок, используя сдвиговый регистр (74HC595) и мультиплексор (74HC4051 или 74HC4052). В итоге решил действовать следующим образом:​

  • При каждом вызове процедуры записи в регистр проверяем, есть ли на выходе мультиплексора низкий уровень.
  • Если есть, то определяем на каком именно (переменная mp). Если нет, то просто увеличиваем значение переменной mp на 1 и идем дальше. Так же, переключаем мультиплексор на следующий канал.

Таким образом можно опросить до 8-ми кнопок включительно.

Теперь о АЦП. Функцию чтения значения АЦП я использовал встроенную, но конфигурировал значение регистров, отвечающих за АЦП, вручную, дабы не возникло лишних конфликтов.

Информация о температуре выводится на 3-х разрядный семисегментный светодиодный индикатор. Управление устройством осуществляется посредством 8-ми кнопок (или 4-х, в урезанном варианте).

Теперь посмотрим, у нас 12 (8 сегменты + 3 аноды) выходов регистров отведены под индикатор, 3 (2) — под управление мультиплексором. Итого, остается всего 2 (3) свободных выхода. Вот к ним мы и подцепим светодиоды, которые будут отображать наличие питания и нагрев. Да, конечно, наличие питания можно не отображать светодиодом, ведь индикатор в случае отсутствия оного будет погашен. Но все же решил этот светодиод поставить — дань традиции 🙂

Управление же нагревом паяльника осуществляется с помощью транзистора IRFZ44 (в принципе, можно поставить IRFZ24). Он подключен напрямую, к 1 пину микроконтроллера.

Назначение кнопок на схеме указано, но повторюсь:

  1. Увеличить температуру на 10 градусов
  2. Уменьшить на 10 градусов
  3. Загрузить сохраненное значение
  4. Сохранить значение температуры
  5. Значение температуры 200
  6.    —//—    250
  7.    —//—    300
  8.    —//—    350

Схема устройства:

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

Сразу хочу заметить, что это схема для 4-х кнопок. Если вам нужен вариант, где используется 8 кнопок, то мультиплексор нужно заменить на 74HC4051, подключив адресный вход «С» к выходу Q7 сдвигового регистра U3. Соответственно разъем J7 взять на 8 пин, и как следствие — немного переделать печатную плату. 

Печатная плата устройства (четыре кнопки):

Кнопки и светодиоды монтируются вне платы. 

Теперь кратко о характеристиках устройства:

  • Питание 24 вольта
  • Потребляемый ток — в зависимости от выбранного паяльника, электроника ~150mA (зависит от индикатора)
  • Для отображения используется индикатор с общим анодом.
  • Регулировка температуры — без лимита. Но это не значит что можно поставить больше, чем может нагреться паяльник.
  • Микроконтроллер работает от внутреннего тактового генератора на 4МГц

Взаимозаменяемость деталей. Микроконтроллер заменить нельзя, как и микросхемы логики. Транзисторы можно взять КТ361 и аналогичные (маломощные, p-n-p). Операционный усилитель так же можно взять аналогичный, но скорее всего придется переделывать печатную плату. Резисторы можно брать +/- 10% от исходного номинала (это не касается резисторов в обвязке ОУ). Светодиодный индикатор — 3 разряда с общим анодом (можно и четыре разряда взять, но один будет погашен).

Спасибо за внимание! Если есть замечания или пожелания, пишите в комментариях!

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 МК PIC 8-бит PIC12F683 1 DIP
U2, U3 Сдвиговый регистр CD74HC595 2 DIP
U4 Мультиплексор/демультиплексор CD74HC4051 1 DIP
U5 Операционный усилитель LM358 1 DIP
U6 Линейный регулятор LM7805 1 Так как ток нагрузки выше 100 мА, то необходим радиатор
Q1, Q2, Q4 Транзистор 2N3702 3 Можно заменить на КТ315
Q3 MOSFET-транзистор IRFZ44 1
С1, С2 Конденсатор 100 нФ 2
С4 Конденсатор 1000мкФ х 16В 1
С3 Конденсатор 1000мкФ х 50В 1
R1 Резистор 1 кОм 1 0805
R2-R11 Резистор 220 Ом 10 0805
R12 Резистор 100 кОм 1 0805
R13 Резистор 4.7 кОм 1 0805
R14 Резистор 1 МОм 1 0805
R15, R19-21 Резистор 10 кОм 4 0805
RV1 Резистор 47 кОм 1 подстроечный
На схеме нет обозначения Индикатор 3-х разрядный семисегментный индикатор с ОА 1
Все разъемы на схеме Разъемы PLS-40. PBS-40 2
PB1-PB4 Кнопка 4 Любые без фиксации