Термопара и Arduino

Для измерения высоких температур используются термопары, в данной статье будет рассмотрен вариант измерения температуры при помощи термопар типа L(ХА) и K(XK).

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

В настоящем время применяются следующие обозначения и сокращения термопар:

  • R — ТПП (Платина — 13 % родий/платина)
  • S — ТПП (Платина — 10 % родий/платина)
  • B — ТПР (Платина — 30 % родий/платина — 6 % родий)
  • J — ТЖК рКелезо/медь — никель (железо/константан)]
  • T — ТМК [Медь/медь — никель (медь/константан)]
  • E — ТХКн [Никель — хром/медь — никель (хромель/константан)]
  • K — ТХА [Никель — хром/никель — алюминий (хромель/алюмель)]
  • N — ТНН [Никель — хром — кремний/никель — кремний (нихросил/нисил)]
  • А — (А-1, А-2, А-3) ТВР (Вольфрам — рений/вольфрам — рений)
  • L — ТХК (Хромель/копель)
  • М — ТМК (Медь/копель)

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

При всем выше сказанном необходим измерительный прибор, который должен измерять двух полярное напряжение в пределах 100 мВ и иметь датчик температуры окружающей среды. При измерении к ЭДС термопары необходимо прибавить температуру окружающей среды, но выраженную в мВ.

Аналоговые входы Arduino не способны измерять напряжение до 100 мВ с достаточной точностью, поэтому в уст-ве применен АЦП модуль ADS1115 16-bit (описание), выходы которого сконфигурированы как дифференциальные для измерения двух полярного напряжения с максимальной амплитудой +/-256 мВ. В качестве датчика температуры окружающей среды используется диод 1N4148.

Измерительный прибор получился достаточно простым, но весьма точным, с погрешностью не более 1,5 ºС во всем диапазоне ХА и ХК. АЦП модуль ADS1115 не нуждается в калибровке, он достаточно точен, а вот датчик температуры окружающей среды на диоде необходимо откалибровать (описание калибровке описано в скетче).

Так же необходимо изменить частоту дискретизации ADS1115, для этого откройте для редактирования файл библиотеки Adafruit_ADS1015.cpp найти все строчки ADS1015_REG_CONFIG_DR_1600SPS и заменить на ADS1015_REG_CONFIG_DR_128SPS , после чего загрузите скетч в Arduino.

В дальнейшем прибор будет дорабатываться, добавятся еще несколько видов термопар, регулятор температуры  и реле для управления нагрузкой.

#include <Wire.h>
#include <Adafruit_ADS1015.h>//https://github.com/adafruit/Adafruit_ADS1X15/archive/master.zip
#include <LiquidCrystal.h>
Adafruit_ADS1115 ads;//(0x48);
/* в файле библиотеки Adafruit_ADS1015.cpp найти все строчки: ADS1015_REG_CONFIG_DR_1600SPS и заменить на: ADS1015_REG_CONFIG_DR_128SPS */
 
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);// RS,E,D4,D5,D6,D7
 
void setup(void)
{Serial.begin(9600);
lcd.begin(16, 2);// LCD 16X2
ads.setGain(GAIN_SIXTEEN); // +/- 0.256V 1 bit = 0.0078125mV
ads.begin();
analogReference(INTERNAL);// опорное 1,1 В
pinMode(A0,INPUT_PULLUP);
pinMode(5,INPUT);
 
}
long u_digital,u_an,u_sum;
const float multiplier = 0.0078125;
float u,u_iz,t,tx_sum,t_sum,t_iz,t_iz_analog,t_analog;
float a[]={0,2.5173462*10,-1.1662878,-1.08336338,-8.9773540/10,-3.7342377/10,-8.6632643/100,-1.0450598/100,-5.1920577/10000};
float b[]{0,2.508355*10,7.860106/100,-2.503131/10,8.315270/100,-1.228034/100,9.804036/10000,-4.413030/100000,1.057734/1000000,-1.052755/100000000};
float c[]{-1.318058*100,4.830222*10,-1.646031,5.464731/100,-9.6550715/10000,8.802193/1000000,-3.110810/100000000};
float e[]={1.1573067/10000,1.5884573*10,4.0458554/100,0.3170064,0.1666128,5.146958/100,9.5288883/1000,1.0301283/1000,6.0654431/100000,1.5131878/1000000};
float f[]{7.2069422/1000,1.5775525*10,-0.2261183,9.4286756/1000,-3.5394655/10000,1.0050886/100000,-1.9323678/10000000,2.3816891/1000000000,-1.7130654/100000000000,5.4857331/100000000000000};
int tx,tip,kn,kn1;
const float t0 = 26.0; // калибровка
const float t0_analog = 545; // По показаниям эталонного градусника задайте свое значение температуры t0, далее посмотрите значение t0_analog в мониторе порта и укажите его
void loop(void){ if(digitalRead(5)==HIGH){kn1++;delay(100);}if(kn1==2){kn1=0;}
lcd.clear();
u_sum=0;tx_sum = 0;
u_iz=u_an * multiplier;
lcd.setCursor(0,0);lcd.print("T = ");lcd.setCursor(4,0);lcd.print(t,1);lcd.print(" C");lcd.setCursor(12,0);
if(tip==0){lcd.print(" TXA ");}if(tip==1){lcd.print(" TXK ");}
lcd.setCursor(0,1);lcd.print(u_iz,2); lcd.print(" mV");lcd.setCursor(11,1);lcd.print(t_iz,1);lcd.print("C");
if(kn1==0){txa();}
if(kn1==1){txk();}
for(int i=0;i<100;i++){
u_digital = ads.readADC_Differential_0_1();
tx = analogRead(A0);// 545 при 26 гр
Serial.println(tx);
tx_sum = tx_sum + tx;
u_sum = u_sum + u_digital;
delay(1);
}
u_an=u_sum/100;
t_analog = tx_sum / 100;// среднее значение
t_iz_analog = (t_analog-t0_analog) / 2;// отклонение гр.Цельсия от t0
t_iz = t0 - t_iz_analog;// вычисление температуры
}
 
void txa(){tip=0;u=u_iz+t_iz*0.0403;// окружающая температура 0.0403 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXA
if(u<0){t=(a[0]*pow(u,0))+(a[1]*pow(u,1))+(a[2]*pow(u,2))+(a[3]*pow(u,3))+(a[4]*pow(u,4))+(a[5]*pow(u,5))+(a[6]*pow(u,6))+(a[7]*pow(u,7))+(a[8]*pow(u,8));}
if(u>=0&&u<=20.64){t=(b[0]*pow(u,0))+(b[1]*pow(u,1))+(b[2]*pow(u,2))+(b[3]*pow(u,3))+(b[4]*pow(u,4))+(b[5]*pow(u,5))+(b[6]*pow(u,6))+(b[7]*pow(u,7))+(b[8]*pow(u,8))+(b[9]*pow(u,9));}
if(u>20.64){t=(c[0]*pow(u,0))+(c[1]*pow(u,1))+(c[2]*pow(u,2))+(c[3]*pow(u,3))+(c[4]*pow(u,4))+(c[5]*pow(u,5))+(c[6]*pow(u,6));}
if(u<-6.35){t=-240;} if(u>54.9){t=1372;}
}
void txk(){tip=1;u=u_iz+t_iz*0.06555;// окружающая температура 0.06555 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXK
if(u<0){t=(e[0]*pow(u,0))+(e[1]*pow(u,1))+(e[2]*pow(u,2))+(e[3]*pow(u,3))+(e[4]*pow(u,4))+(e[5]*pow(u,5))+(e[6]*pow(u,6))+(e[7]*pow(u,7))+(e[8]*pow(u,8))+(e[9]*pow(u,9));}
if(u>=0){t=(f[0]*pow(u,0))+(f[1]*pow(u,1))+(f[2]*pow(u,2))+(f[3]*pow(u,3))+(f[4]*pow(u,4))+(f[5]*pow(u,5))+(f[6]*pow(u,6))+(f[7]*pow(u,7))+(f[8]*pow(u,8))+(f[9]*pow(u,9));}
if(u<-9.49){t=-200;} if(u>66.47){t=800;}
}

 

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

Войти с помощью: