Имитатор сигнала термопар ТХА, ТХК, ТПП(S), -10…100 мВ (Arduino)

Имитатор сигнала термопар ТХА, ТХК, ТПП(S), -10…100 мВ предназначен для проверки различных теплотехнических приборов имеющих в качестве датчика температуры термопары.

В имитаторе сигнала термопар выдает напряжение от -10 до 100 мВ, а так же преобразует это напряжение в температуру согласно ГОСТ Р 8.585-2001, для трех номинальных статических характеристик термопар типа  ТХА, ТХК и ТПП(S).

Так как ЭДС термопары определяется по разнице температур между температурами горячего и холодного спая, поэтому в имитаторе сигнала термопар используется цифровой датчик температуры DS18B20 для измерения температуры окружающей среды. Например если поместить измерительную часть термопары в печь с температурой в 200 °С, а концы термопары подключить к измерительному прибору который находится в некотором удалении от печи при температуре окружающего воздуха в 20 °С, то на концах термопары появится ЭДС соответствующая ∼180 °С, поэтому для правильного измерения температуры в печи к значению ЭДС термопары необходимо прибавить температуру окружающей среды в милливольтах согласно ГОСТ Р 8.585-2001 (как правило измерительные приборы работающие с термопарами имеют встроенные датчики для измерения температуры окружающей среды).

Имитатор сигнала термопар в данной статье достаточно прост в сборке, у него простая схема и применены недорогие компоненты.

Схема имитатора сигнала термопар

Для сборки имитатора сигнала термопар понадобятся следующие компоненты:

  • Плата разработчика на микроконтроллере LGT8F328p
  • Энкодер KY-040
  • OLED дисплей 1,3′ 128×64 SH1106  I2C
  • Датчик температуры DS18B20
  • Гибкая матричная клавиатура 4 на 3 кнопки
  • Стабилизатор 7805
  • ОУ LM358

Основное управление (выбор характеристик, режимы работы) осуществляется при помощи клавиатуры совместно с кнопкой энкодера.

Выбор характеристик:

  • Для выбора характеристики ТХА необходимо нажать и удерживая кнопку энкодера нажать на кнопку 1 клавиатуры

  • Для выбора характеристики ТХК необходимо нажать и удерживая кнопку энкодера нажать на кнопку 2 клавиатуры

  • Для выбора характеристики ТПП(S) необходимо нажать и удерживая кнопку энкодера нажать на кнопку 3 клавиатуры

  • Для выбора калибратора напряжения необходимо нажать и удерживая кнопку энкодера нажать на кнопку 4 клавиатуры

Режимы работы:

  • Генерируемое напряжение на выходе имитатора соответствует температуре без учета окружающий температуры. Для активации этого режима необходимо нажать и удерживая кнопку энкодера нажать на кнопку 7 клавиатуры

Как видно на картинке установлено 0°С, что соответствует 0,000 мВ по ГОСТ Р 8.585-2001, это напряжение подается на вход проверяемого прибора. Проверяемый прибор при 0° на имитаторе будет показывать окружающую температуру.

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

Как видно на картинке установлено 0°С, что соответствует 0,000 мВ по ГОСТ Р 8.585-2001, но чтобы установить на проверяемом приборе 0°С необходимо подать отрицательное напряжение с имитатора для компенсации температуры окружающей среды.

  • Генерируемое напряжение на выходе имитатора соответствует температуре с учетом окружающей температуры, напряжение выводится на дисплей с учетом окружающей температуры. Для активации этого режима необходимо нажать и удерживая кнопку энкодера нажать на кнопку 9 клавиатуры.

Это основной режим работы имитатора, набирая на клавиатуре имитатора (или при помощи энкодера) 200°С, на проверяемом приборе так же будет установлено 200 °С, что соответствует 8,138 мВ по ГОСТ Р 8.585-2001. Но по факту на проверяемый прибор Вы подаете 7,102 мВ, так как окружающая температура равна 25,9 °С, что по ГОСТ Р 8.585-2001 равно 1.036 мВ, в итоге 7,102 + 1,036 = 8,138 мВ.

Если в имитаторе нет необходимо Вам характеристики, можно использовать калибратор напряжения:

При этом необходимо так же учитывать окружающую температуру и пересчитывать ее в мВ, а затем прибавлять ее к значению полученному на калибраторе. Для удобства можно использовать онлайн калькулятор — http://rcl-radio.ru/?page_id=58138

Так как датчик температуры DS18B20 обладает небольшой погрешностью, то удерживая кнопку энкодера и нажав на кнопку * клавиатуры, можно зайти в меню калибровки датчика температуры:

Для сохранения коэффициента коррекции необходимо нажать кнопку #.

Установить выходное напряжение на выходе имитатора можно при помощи энкодера и клавиатуры. Поворачивая ручку энокодера Вы будете менять температуру с шагом 0,1 °С, при нажатии и удержании кнопки энкодера Вы будете менять температуру с шагом 5 °С. При работе с клавиатурой Вы просто набираете (только положительное значение температуры) необходимую температуру и нажимаете кнопку #, далее энкодером подстраиваете необходимое значение температуры.

Например установили значение в 200 °С , стрелка проверяемого прибора установится на отметке близкой к 200 °С, энкодером подвели стрелку ровно на отметку 200°С и с имитатора считали показания температуры (например 199,3 °).

Скетч:

#define NULLL  3247
#define MV30   5052

#include <Wire.h>
#include <EEPROM.h>
#include <MsTimer2.h>           // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 
#include <Encoder.h>            // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <U8glib.h> 
#include <OneWire.h>            // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <iarduino_KB.h>        // https://github.com/tremaru/iarduino_KB.git
iarduino_KB KB(8,7,6,5, 4,3,2);
Encoder myEnc(11, 12);// DT, CLK
OneWire  ds1(13); // Вход датчика 18b20
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_FAST);  // Dev 0, Fast I2C / TWI
long oldPosition  = 999,newPosition, times, times1,times_ds=10000,times14,save,times_off;
bool w,ttt=0;
byte ok,reg;
int menu;
float out = 0,e,temp,t_ok,t_ok_mv,temp_old,k_ok;
long code[5],ccc;
int i,i1,kb;
/// xa
float a[] = {0,3.9450128025*pow(10,-2),2.3622373598*pow(10,-5),-3.2858906784*pow(10,-7),-4.9904828777*pow(10,-9),
6.7509059173*pow(10,-11),-5.7410327428*pow(10,-13),-3.1088872894*pow(10,-15),-1.0451609365*pow(10,-17),
-1.9889266878*pow(10,-20), -1.6322697486*pow(10,-23)};
float b[] = {-1.7600413686*pow(10, -2),3.8921204975 *pow(10, -2),1.8558770032 *pow(10, -5),-9.9457592874 *pow(10, -8),
3.1840945719 *pow(10, -10),-5.6072844889 *pow(10, -13),5.6075059059 *pow(10, -16),-3.2020720003 *pow(10, -19),
9.7151147152 *pow(10, -23),-1.2104721275 *pow(10, -26)};
float c[] = {1.185976 *pow(10, -1),-1.183432 *pow(10, -4)};
float logg=2.718281828;int u=30;
/// xk
float a1[] = {-4.1626930*pow(10,-6),6.3310880*pow(10,-2),6.0118088*pow(10,-5),-7.9469796*pow(10,-8),9.3101891*pow(10,-11),
-2.4299630*pow(10,-14),-2.6547176*pow(10,-16),4.4332477*pow(10,-19),-2.1172626*pow(10,-22)};
// pps
//Для термопары типа S
float a2[] = {0, 5.40313308631*pow(10,-3),1.25934289740*pow(10,-5),-2.32477968689*pow(10,-8),3.22028823036*pow(10,-11),
-3.31465196389*pow(10,-14),2.55744251786*pow(10,-17),-1.25068871393*pow(10,-20),2.71443176145*pow(10,-24)};
float b2[] = {1.32900444085,3.34509311344*pow(10,-3),6.54805192818*pow(10,-6),-1.64856259209*pow(10,-9),1.29989605174*pow(10,-14)};
float c2[] = {1.46628232636*pow(10,2),-2.58430516752*pow(10,-1),1.63693574641*pow(10,-4),-3.30439046987*pow(10,-8),-9.43223690612*pow(10,-15)};

void setup(){
  Serial.begin(9600);
  delay(500);
  pinMode(10,INPUT);// encoder button
  // TIMER_1 D9 OUTPUT
  DDRB = 1 << PB1; // D9 output pwm
  noInterrupts();
  TCCR1A=0;TCCR1B=0;
  TCCR1A = 1 << COM1A1 | 1 << WGM11;
  TCCR1B = 1 << WGM13 | 1 << WGM12 | 1 << CS10;
  ICR1 = 20000;
  MsTimer2::set(2, to_Timer);MsTimer2::start();
 k_ok = (EEPROM.read(10)<<8)+EEPROM.read(11);
 ok=EEPROM.read(0);menu=EEPROM.read(1);
 times=float(MV30)/30.0*out+NULLL;
 OCR1A = times;
 interrupts();
 KB.begin(KB3); 
// if(ok==1||ok==2){temp = dsRead(0)*k_ok/100;}else{temp=0;}
  }

void loop(){
  if(digitalRead(10)==LOW){times_off=millis();}
  
  if(KB.check(KEY_DOWN )){ kb=1;
     if(digitalRead(10)==HIGH && KB.getNum==14){i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}kb=0;temp=0;delay(200);}
     if(digitalRead(10)==HIGH && KB.getNum==15){delay(200);kb=0;temp=ccc;i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}}
     if(digitalRead(10)==LOW && KB.getNum==1){menu=0;w=1;times1=millis();kb=0;temp=ccc;i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}delay(200);}
     if(digitalRead(10)==LOW && KB.getNum==2){menu=1;w=1;times1=millis();kb=0;temp=ccc;i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}delay(200);}
     if(digitalRead(10)==LOW && KB.getNum==3){menu=2;w=1;times1=millis();kb=0;temp=ccc;i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}delay(200);}
     if(digitalRead(10)==LOW && KB.getNum==4){menu=3;w=1;times1=millis();kb=0;temp=ccc;i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}delay(200);}

     if(digitalRead(10)==LOW && KB.getNum==7){ok=0;w=1;times1=millis();kb=0;temp=ccc;i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}delay(200);}
     if(digitalRead(10)==LOW && KB.getNum==8){ok=1;w=1;times1=millis();kb=0;temp=ccc;i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}delay(200);}
     if(digitalRead(10)==LOW && KB.getNum==9){ok=2;w=1;times1=millis();kb=0;temp=ccc;i=0;ccc=0;for(i1=0;i1<5;i1++){code[i]=0;}delay(200);}

     if(digitalRead(10)==LOW && KB.getNum==0&&ttt==0){kb=0;KB.getNum=500;ttt=1;Serial.println(ttt);delay(500);}
     if(digitalRead(10)==LOW && KB.getNum==0&&ttt==1){kb=0;KB.getNum=500;ttt=0;Serial.println(ttt);delay(500);}

     if(digitalRead(10)==LOW && KB.getNum==14){menu=14;delay(200);}

     if(menu==14&&KB.getNum==15){EEPROM.update(10,highByte(int(k_ok)));EEPROM.update(11,lowByte(int(k_ok)));save=millis();delay(200);}

//////////////////////////////////////////////////////////// 
     if(KB.getNum<10&&i<5&&digitalRead(10)==HIGH){
      code[i] = KB.getNum;delay(200);
   switch(i){
     case 0: ccc = code[0];break;
     case 1: ccc = code[0]*10 + code[1];break;
     case 2: ccc = code[0]*100 + code[1]*10 + code[2];break;
     case 3: ccc = code[0]*1000 + code[1]*100 + code[2]*10 + code[3];break;
     case 4: ccc = code[0]*10000 + code[1]*1000 + code[2]*100 + code[3]*10 + code[4];break;
    }
    i++;if(i>3){i=4;}
    if(menu==0){if(ccc>13720){ccc=13720;}}
    if(menu==1){if(ccc>8000){ccc=8000;}}
    if(menu==2){if(ccc>17680){ccc=17680;}}
    if(menu==3){if(ccc>10000){ccc=10000;}}
    }
  }

  
  if(millis()-times_ds>10000){t_ok=dsRead(0)*k_ok/1000;times_ds=millis();}
  if(menu==0){ 
  if(newPosition != oldPosition){oldPosition = newPosition;pos();
      if(digitalRead(10)==LOW){temp=temp+newPosition*50;}else{temp=temp+newPosition;}times_off=millis();
      myEnc.write(0);newPosition=0;if(temp<-2700){temp=-2700;}if(temp>13720){temp=13720;}}
      t_ok_mv = (t_ok-20)*0.0405+0.798;
      if(ok==0){out=fun_xa(temp/10.0);}
      if(ok>0){out=fun_xa(temp/10.0)-t_ok_mv;}
      if(ttt==1){out=0;}
      OCR1A=float(MV30)/30.0*out+NULLL;
      if(millis()-times_off>300000){u8g.firstPage();do {  }   while( u8g.nextPage() );}
      else{
      u8g.firstPage();do {   
      u8g.setFont(u8g_font_profont29r);
      u8g.setPrintPos(0, 20);
      if(ttt==1){u8g.setFont(u8g_font_profont17r);u8g.drawStr(10,40,"Out=0 mV");}
       else{
      if(kb==0){u8g.print(temp/10.0,1);}
      if(kb==1){u8g.print(ccc/10.0,1);}
      u8g.setPrintPos(0, 45);
      if(ok==2){u8g.print(out+t_ok_mv,3);}
      else{u8g.print(out,3);} 
      u8g.setFont(u8g_font_profont17r);u8g.drawStr(5,64,"TXA");u8g.drawStr(100,20,"*C");
      u8g.drawStr(100,45,"mV"); 
      u8g.setPrintPos(75, 64);if(ok>0){u8g.print(t_ok,1);}
      if(ok==2){;u8g.drawStr(60,64,"+");} 
      }
  } 
  while( u8g.nextPage() );
      }}

  if(menu==1){ 
  if(newPosition != oldPosition){oldPosition = newPosition;pos();
      if(digitalRead(10)==LOW){temp=temp+newPosition*50;}else{temp=temp+newPosition;}times_off=millis();
      myEnc.write(0);newPosition=0;if(temp<-2000){temp=-2000;}if(temp>8000){temp=8000;}}
      t_ok_mv = (t_ok-20)*0.0661+1.290;
      if(ok==0){out=fun_xk(temp/10.0);}
      if(ok>0){out=fun_xk(temp/10.0)-t_ok_mv;}
      if(ttt==1){out=0;}
      OCR1A=float(MV30)/30.0*out+NULLL;
      if(millis()-times_off>300000){u8g.firstPage();do {  }   while( u8g.nextPage() );}
      else{
      u8g.firstPage();do {   
      u8g.setFont(u8g_font_profont29r);
      u8g.setPrintPos(0, 20);
      if(ttt==1){u8g.setFont(u8g_font_profont17r);u8g.drawStr(10,40,"Out=0 mV");}
       else{
      if(kb==0){u8g.print(temp/10.0,1);}
      if(kb==1){u8g.print(ccc/10.0,1);}
      u8g.setPrintPos(0, 45);
      if(ok==2){u8g.print(out+t_ok_mv,3);}
      else{u8g.print(out,3);} 
      u8g.setFont(u8g_font_profont17r);u8g.drawStr(5,64,"TXK");u8g.drawStr(100,20,"*C");
      u8g.drawStr(100,45,"mV"); 
      u8g.setPrintPos(75, 64);if(ok>0){u8g.print(t_ok,1);}
      if(ok==2){;u8g.drawStr(60,64,"+");} 
      }
  } 
  while( u8g.nextPage() );
      }}

  if(menu==2){ 
  if(newPosition != oldPosition){oldPosition = newPosition;pos();
      if(digitalRead(10)==LOW){temp=temp+newPosition*50;}else{temp=temp+newPosition;}times_off=millis();
      myEnc.write(0);newPosition=0;if(temp<-500){temp=-500;}if(temp>17680){temp=17680;}}
      t_ok_mv = (t_ok-20)*0.006+0.113;
      if(ttt==1){out=0;}
      if(ok==0){out=fun_pps(temp/10.0);}
      if(ok>0){out=fun_pps(temp/10.0)-t_ok_mv;}
      OCR1A=float(MV30)/30.0*out+NULLL;
      if(millis()-times_off>300000){u8g.firstPage();do {  }   while( u8g.nextPage() );}
      else{
      u8g.firstPage();do {   
      u8g.setFont(u8g_font_profont29r);
      u8g.setPrintPos(0, 20);
      if(ttt==1){u8g.setFont(u8g_font_profont17r);u8g.drawStr(10,40,"Out=0 mV");}
       else{
      if(kb==0){u8g.print(temp/10.0,1);}
      if(kb==1){u8g.print(ccc/10.0,1);}
      u8g.setPrintPos(0, 45);
      if(ok==2){u8g.print(out+t_ok_mv,3);}
      else{u8g.print(out,3);} 
      u8g.setFont(u8g_font_profont17r);u8g.drawStr(5,64,"TPPs");u8g.drawStr(100,20,"*C");
      u8g.drawStr(100,45,"mV"); 
      u8g.setPrintPos(75, 64);if(ok>0){u8g.print(t_ok,1);}
      if(ok==2){;u8g.drawStr(60,64,"+");} 
      }
  } 
  while( u8g.nextPage() );
      }}          
  
 if(menu==3){ 
  if(newPosition != oldPosition){oldPosition = newPosition;pos();
      if(digitalRead(10)==LOW){temp=temp+newPosition*30;}else{temp=temp+newPosition;}times_off=millis();
      myEnc.write(0);newPosition=0;if(temp<-1000){temp=-1000;}if(temp>10000){temp=10000;}reg=1;}
      out=temp;
      if(ttt==1){out=0;}
      OCR1A=float(MV30)/30.0*out/100+NULLL; 
      if(reg==1){reg=0;Serial.println(OCR1A);}
      if(millis()-times_off>300000){u8g.firstPage();do {  }   while( u8g.nextPage() );}
      else{
      u8g.firstPage();do {   
      u8g.setFont(u8g_font_profont29r);
      u8g.setPrintPos(5, 20);
      if(ttt==1){u8g.setFont(u8g_font_profont17r);u8g.drawStr(10,40,"Out=0 mV");}
       else{
      if(kb==0){u8g.print(temp/100.0,2);}
      if(kb==1){u8g.print(ccc/100.0,2);} 
      u8g.setFont(u8g_font_profont17r);if(kb==0){u8g.drawStr(100,20,"mV");}
      }
  } 
  while( u8g.nextPage() );
      }}

  if(menu==14){ 
  if(newPosition != oldPosition){oldPosition = newPosition;pos();
      k_ok=k_ok+newPosition;myEnc.write(0);t_ok=dsRead(0)*k_ok/1000;newPosition=0;if(k_ok<800){k_ok=800;}if(k_ok>1200){k_ok=1200;}}
      u8g.firstPage();do {  
      if(millis()-times14>1000){t_ok=dsRead(0)*k_ok/1000;times14=millis();}
      u8g.setFont(u8g_font_profont29r);
      u8g.setPrintPos(5, 20);u8g.print(t_ok,1);
      u8g.setPrintPos(5, 45);u8g.print(k_ok/1000,3);
      u8g.setFont(u8g_font_profont17r);
      if(millis()-save<1000){u8g.drawStr(5,60,"SAVE");}
      else{u8g.drawStr(5,60,"kall t_ok");}
  } 
  while( u8g.nextPage() );
      }     

  if(millis()-times1>5000 && w==1){EEPROM.update(0,ok);EEPROM.update(1,menu);w=0;}
  
  }  

float fun_xa(float t){
//термопары типа К -270...1372 (ХA)
if(t<=0){
e=(a[0]*pow(t,0))+(a[1]*pow(t,1))+(a[2]*pow(t,2))+(a[3]*pow(t,3))+(a[4]*pow(t,4))+(a[5]*pow(t,5))+(a[6]*pow(t,6))+(a[7]*pow(t,7))+(a[8]*pow(t,8))+(a[9]*pow(t,9))+(a[10]*pow(t,10));}
if(t>0){
e=(b[0]*pow(t,0))+(b[1]*pow(t,1))+(b[2]*pow(t,2))+(b[3]*pow(t,3))+(b[4]*pow(t,4))+(b[5]*pow(t,5))+(b[6]*pow(t,6))+(b[7]*pow(t,7))+(b[8]*pow(t,8))+(b[9]*pow(t,9)+(c[0]*pow(logg,c[1]*pow(t-126.9686,2))));}
return e;
}
float fun_xk(float t){
//термопары типа L -200...800 (ХК)
e=(a1[0]*pow(t,0))+(a1[1]*pow(t,1))+(a1[2]*pow(t,2))+(a1[3]*pow(t,3))+(a1[4]*pow(t,4))+(a1[5]*pow(t,5))+(a1[6]*pow(t,6))+(a1[7]*pow(t,7))+(a1[8]*pow(t,8));
return e;
}
// pps  -50...+1768 (PPs)
float fun_pps(float t){
if(t<=1064){
e=(a2[0]*pow(t,0))+(a2[1]*pow(t,1))+(a2[2]*pow(t,2))+(a2[3]*pow(t,3))+(a2[4]*pow(t,4))+(a2[5]*pow(t,5))+(a2[6]*pow(t,6))+(a2[7]*pow(t,7))+(a2[8]*pow(t,8))+(a2[9]*pow(t,9));}
if(t>=1065 and t<=1664){
e=(b2[0]*pow(t,0))+(b2[1]*pow(t,1))+(b2[2]*pow(t,2))+(b2[3]*pow(t,3))+(b2[4]*pow(t,4))+(b2[5]*pow(t,5));}
if(t>=1665){
e=(c2[0]*pow(t,0))+(c2[1]*pow(t,1))+(c2[2]*pow(t,2))+(c2[3]*pow(t,3))+(c2[4]*pow(t,4));}
return e;
}
void pos(){if(newPosition>1){newPosition=1;}if(newPosition<-1){newPosition=-1;}}

void to_Timer(){newPosition = myEnc.read()/4;} 
float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds1.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds1.reset_search();  // Сброс поиска датчика
  ds1.reset();         // Инициализация, выполняется сброс шины
  ds1.select(addr[x]); // Обращение к датчику по адресу
  ds1.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds1.reset();         // Инициализация, выполняется сброс шины
  ds1.select(addr[x]); // Обращение к датчику по адресу
  ds1.write(0xBE);     // Обращение памяти
  data[0] = ds1.read();// Чтение памяти byte low
  data[1] = ds1.read();// Чтение памяти byte high
  float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}    

После загрузки скетча имитатор сигнала термопар нуждается в калибровке, для этого Вам необходим измерительный прибор  для измерения постоянного напряжения с пределом 100 мВ и классом точности не хуже 0,05%.

Для калибровки имитатора необходимо перейти в меню калибратора. Для выбора калибратора напряжения необходимо нажать и удерживая кнопку энкодера нажать на кнопку 4 клавиатуры.

Далее откройте монитор порта и ручкой энкодера установите на выходе имитатора напряжение 0,000 мВ (контролируя измерительным прибором)

В мониторе порта будет выводится значение, которое соответствует 0 мВ имитатора, это значение необходимо вписать в строку:

#define NULLL  3247

Далее установите на выходе имитатора напряжение 30,000 мВ (контролируя измерительным прибором), в мониторе порта будет выводится значение, которое соответствует 30 мВ имитатора,  из этого значения необходимо вычесть значение нуля.

Пример:

8301-3247 = 5054

#define MV30   5054

При тестировании имитатора сигнала термопар, нестабильность выходного напряжения составила не более 10 мкВ, что для характеристики типа ТХК составило 0.16 °С, что вполне приемлемо для регулировки и проверки приборов классом 0,5 и выше.

Форум — http://forum.rcl-radio.ru/viewtopic.php?id=583


Доработка

Калибровка нуля и напряжения 30 мВ.

Для выбора меню калибровки нуля необходимо нажать и удерживая кнопку энкодера нажать на кнопку 5 клавиатуры.

Для выбора меню калибровки 30 мВ необходимо нажать и удерживая кнопку энкодера нажать на кнопку 6 клавиатуры.

Скетч — http://forum.rcl-radio.ru/viewtopic.php?pid=8732#p8732

Порядок работы:

  1. Подключить к выходу имитатора вольтметр (с диапазоном 0…100 мВ)
  2. Перейти в меню калибровки нуля, поворотом энкодера добиться на вольтметре показания 0,000 мВ, нажать кнопку # для сохранения поправочного коэффициента.
  3. Перейти в меню калибровки 30 мВ, поворотом энкодера добиться на вольтметре показания 30,000 мВ, нажать кнопку # для сохранения поправочного коэффициента.

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

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