Начнем с паяльника. В первой части был описан паяльник, купленный для разработки блока.
Пришло вдохновение и я занялся его тестами. Во-первых, через ардуино был подключен паяльник к блоку питания через 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А)