вторник, 28 апреля 2015 г.

ЛАБОРАТОРНЫЙ БЛОК ПИТАНИЯ. (часть 2. Паяльная станция.)


Начнем с паяльника. В первой части был описан паяльник, купленный для разработки блока.
Пришло вдохновение и я занялся его тестами. Во-первых, через ардуино был подключен паяльник к блоку питания через MOSFET тразистор IRFZ44n. За основу я взял эту статью. Схему прикладывать не буду, так-как никаких изменений в схеме подключения самого паяльнике нет.

Отладка проводится следующим образом: с компьютера приходит значение в диапазоне от 0 до 255 (в ардуино 8 битный PWM), задающее время открытия транзистора. Тестер с термопарой отображает температуру. Надо сказать, что данный полевой транзистор не совсем подходит для этого, так как полное его открытие происходит где-то при 12в. и теоретически 5в ардуино может и не хватить, тогда транзистор будет греться. Однако в даташите указано, что при 4.5в транзистор открывается и способен пропускать токи до 10А (всего по даташиту 44А).
Наш паяльник имеет мощность 50W при 24В, что в среднем дает максимальное потребление всего в 2А. Для уверенности я "потыкал" осциллографом на сток и затвор и увидел четкий квадрат без завалов. Частота на PWM всего 500Гц.
Итак - данный транзистор вполне подходит для наших задач, не требует драйвера и греться не должен. В результате тестов он теплый. Единственное, что при начальном включении "на холодную" транзистор греется, так-как сопротивление холодного паяльника всего около 50 Ом.

Далее нужно откалибровать установку. Примотав термопару замеряем и записываем соотношение температуры паяльника и скважность ШИМ. Это долго, неудобно и нужно постоянно усреднять значения... В итоге решил автоматизировать процесс.

В наличии имеется модуль усилителя термопары на микросхеме MX31855. Модуль имеет SPI интерфейс, библиотеку для программирования, встроенный термодатчик окружающей среды для компенсации температуры холодного спая.
Термопару подключаем через него к ардуино. К ней же подключаем паяльник и через резистивный делитель - терморезистор встроенный в паяльник. (у меня резистор на 290кОм). Значение с делителя заводим на аналоговый вход ардуино.

Далее следует говнокод упрощенный скетч вывода значений со всей этой конструкции:

#include "SPI.h"
#include "Wire.h"
#include "Adafruit_MAX31855.h"


// Инициализация контроллера термопары
// DO=3 , CS=4, CLK  5
Adafruit_MAX31855 thermocouple(5, 4, 3);
double tS = thermocouple.readInternal();
String myString;

const int SolderPin = 9;      // затвор MOSFET
int sensorPin = A0;           // резистивный делитель терморезистора
int _PWM_ = 0;
double sensorValue  = 0;
double all_sens = 0;
double all_tT = 0;
double tT = 0;
int iteration = 1000;        // количество итераций
int badit=0;


void setup()
{
  Serial.begin(9600);
  pinMode(SolderPin, OUTPUT);
}

void loop()
{
  all_sens = 0;
  all_tT = 0;
  badit=0;

  analogWrite(SolderPin, _PWM_);

  // проверяем подключен ли контроллер термопары
  if(thermocouple.readInternal() == 0)
  {
    Serial.print("no termosensor\n");
  }
    // проверяем подключена ли термопара
  if(thermocouple.readCelsius() == 0)
  {
    Serial.print("no thermocouple\n");
  }


/*
  if (Serial.available())
  {
    _PWM_ = Serial.parseInt();

  }
*/
  // считываем в цикле значения температуры паяльника и сопротивления терморезистора
  for(int i=0;i<iteration;i++)
  {
      sensorValue = analogRead(sensorPin);
      all_sens += sensorValue;
      tT = thermocouple.readCelsius();
      // Библиотека работы с термопарой возвращает NAN при ошибке
      myString = String(tT);
      if(myString != " NAN")
      {
        all_tT += tT;
      }
      else
      {
        // Увеличим счетчик ошибок измерения температуры
        badit++;
      }
  }
  // Выводим значение на экран
  Serial.print("TT: ");
// Делим сумму замеров на количество итераций минус ошибки для получений среднего
  Serial.print(all_tT / (iteration-badit));         
  double house_temp = thermocouple.readInternal();
  Serial.print("  TH: ");
  Serial.print(house_temp);
  Serial.print("  TR: ");
// Делим сумму замеров на количество итераций для получений среднего
  Serial.print(all_sens / iteration);       
  Serial.print("  PWM:");
  Serial.print(_PWM_);
  Serial.print("  IT:");
  Serial.print(iteration-badit);
  Serial.print("\n");

  // Ограничим значение PWM для того чтобы не сжечь паяльник
  // В моем случае 80 вполне хватило для разогрева паяльника до 400 градусов
  if(_PWM_ > 80)
  {
    while(true)
    {
    }
  }

  _PWM_++;
}

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

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

Всем удачи в экспериментах....


Дополнение: В качестве силового транзистора, решено использовать транзистор от компьютерного блока питания, снят с дежурки. Во-первых он Logic Level, то-есть полностью открывается при логической единице, во-вторых у меня куча убитых блоков, почему бы не брать его оттуда. Я использую 45N03LT (30 В 45А)

2 комментария:

  1. Если есть ардуино и терморезистор, то почему не использовать PID ? это 3 строчки кода.

    ОтветитьУдалить
  2. Использовать! Не обновлял давно блог.

    ОтветитьУдалить