Для измерения высоких температур используются термопары, в данной статье будет рассмотрен вариант измерения температуры при помощи термопар типа L(ХА) и K(XK).
Термопара состоит из двух проводников выполненных из разнородных материалов, соединенных на одном конце и образующих часть устройства, использующего термоэлектрический эффект для измерений температуры.
В настоящем время применяются следующие обозначения и сокращения термопар:
- R — ТПП (Платина — 13 % родий/платина)
- S — ТПП (Платина — 10 % родий/платина)
- B — ТПР (Платина — 30 % родий/платина — 6 % родий)
- J — ТЖК рКелезо/медь — никель (железо/константан)]
- T — ТМК [Медь/медь — никель (медь/константан)]
- E — ТХКн [Никель — хром/медь — никель (хромель/константан)]
- K — ТХА [Никель — хром/никель — алюминий (хромель/алюмель)]
- N — ТНН [Никель — хром — кремний/никель — кремний (нихросил/нисил)]
- А — (А-1, А-2, А-3) ТВР (Вольфрам — рений/вольфрам — рений)
- L — ТХК (Хромель/копель)
- М — ТМК (Медь/копель)
Выходное напряжение термопар как правило не превышает несколько десятков мВ, так же следует учитывать что ЭДС термопары зависит от разницы температуры спая и температуры свободных концов, поэтому необходимо учитывать температуру окружающей среды в которой находятся свободные концы термопары. В идеале термопару необходимо напрямую подключать к измерительному прибору, если это сделать не возможно, то используют удлиняющий термопару компенсационный провод такого же типа как и сама термопара.
При всем выше сказанном необходим измерительный прибор, который должен измерять двух полярное напряжение в пределах 100 мВ и иметь датчик температуры окружающей среды. При измерении к ЭДС термопары необходимо прибавить температуру окружающей среды, но выраженную в мВ.
- Значения ТЭДС для термопары типа K (хромель \ алюмель) ТХА
- Значения ТЭДС для термопары типа L (хромель \ копель) ТХК
Аналоговые входы 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;} }