Почему показания моего термистора отстают?

Я пытаюсь создать термистор, который будет мигать светодиодом при температуре выше 30 C. Моя настройка, по-видимому, правильно сообщает о комнатной температуре последовательному монитору, но затем я заметил, что воздействие термистора на горячий предмет приводит к снижению заявленной температуры, в то время как воздействие на холодный предмет вызывает повышение заявленной температуры.

Ранее я построил более простую схему термистора с аналогичным подходом, и все, казалось, функционировало правильно. Я не уверен, что я здесь нарушил:

const int WarningLED = 7;
const int Thermistor = 0;

/* Информация о термисторе:
 * P/N: BC2301-ND
 * MFG P/n: NTCLE100E3103JB0
 * DESC: THERMISTOR NTC 10KOHM 3977K BEAD, IDX: 1 */

int Vo; // напряжение между термистором и
float R1 = 10000; // резистор 10 Ком, используемый для
float TR; // сопротивление float термистора с отрицательным температурным коэффициентом (NTC)
float beta;  // бета позже будет равна ln ( TR / Rref)
float Tk, Tc, Tf;

/* Steinhart-Hart equation coefficients via data table at 
 * http://www.vishay.com/docs/29049/ntcle100.pdf
 * Bead used: 3977K (refer to #9 values on Nominal R table) */
float A = 3.354016e-03,B = 2.569850e-04; 
float C = 2.620131e-06,D = 6.383091e-08;

void setup() {
  pinMode(WarningLED, OUTPUT); //устанавливает вывод предупреждающего светодиода в качестве цифрового выхода
  Serial.begin(9600);          // настройка последовательного порта для включения связи с компьютером.                             
 } 

void loop() {

  Vo = analogRead(Thermistor);
  Serial.print("Vo: ");
  Serial.print(Vo);
  Serial.println(" mV");

  //Уравнение делителя напряжения: R2 = R1 * [Vo / (Vi - Vo)]
  //где R2 = TR, Vi = 1023,0 : 
  TR = R1 * ((float)Vo / (1023.0 - (float)Vo));
  Serial.print("Thermistor resistance: ");
  Serial.print(TR);
  Serial.println(" ohms");


  beta = log(TR/10000); // В соответствии с расширенным уравнением Стейнхарта-Харта,
  // где Rref = 10000 (см. страницу 10 PDF-файла, связанного выше)
  Tk = (1.0 / (A + B*beta + C*beta*beta + D*beta*beta*beta));
  Tc = Tk - 273.15;
  Tf = (Tc * 9.0)/ 5.0 + 32.0; 

  Serial.print("Temperature: ");
  Serial.print(Tk);
  Serial.print(" K; ");
  Serial.print(Tf);
  Serial.print(" F; ");
  Serial.print(Tc);
  Serial.println(" C");   
  Serial.println();

  if (Tc > 30.0) digitalWrite(WarningLED, HIGH);
  else if (Tc < 30.0) digitalWrite(WarningLED, LOW);
  delay(1000);
}  

На последовательном мониторе отображается следующее сообщение:

Vo: 550 mV
Thermistor resistance: 11627.91 ohms
Temperature: 294.74 K; 70.86 F; 21.59 C

Подвергая его воздействию более высокой температуры, неверно сообщается:

Vo: 597 mV
Thermistor resistance: 14014.08 ohms
Temperature: 290.61 K; 63.43 F; 17.46 C

Я замечаю, что, помимо других проблем, это сообщение о повышенном сопротивлении в термисторе, несмотря на то, что я использую NTC, но я не уверен, почему это происходит.

Известные детали, используемые в этой схеме:

  • Термистор: NTCLE100E3103JB0
  • R1: 10 КОМ
  • R2: 1 КОМ
  • C1 и C2: 33 нф

circuit diagram

arduino

, 👍1


2 ответа


Лучший ответ:

2

Напряжение Vo - это не напряжение на термисторе, это напряжение на R1! Переключите место термистора и R1. /Микаэль

,

Я повторно вывел уравнение для сопротивления термистора после учета моего ошибочного размещения делителя напряжения, которое перевернуло части Vo и Vi уравнения, так что вместо этого уравнение имеет вид TR = R1 [ (Vi - Vo) / Vo]. Это решило проблему; спасибо! Более того, полезно видеть, что значения термистора, работающие неправильно, могут указывать на то, что деление напряжения было взято из неправильного места!, @Octavius


1

Кроме того, обратите внимание, что Vo определенно выражается не в мВ (милливольтах), а в шагах АЦП, т.е. 1024-м от Vref, то есть здесь 5 В (по умолчанию). И там есть ссылка на то, что оно должно быть 512 для 25deg.

Кроме того, не обманывайтесь точностью приведенных чисел. Допуск составляет от 2% до 5% от значения R25, что означает до ~ 25 "шагов" (Vo). Предполагая, что изменение R1 и TR дает вам 450 при 22 градусах, это означает, что ваш реальный порог в 30 градусов может быть где-то между 28 и 32 (примерно).

Вы можете получить лучшие результаты, откалибровав TR: при 25 градусах, измерив его реальное сопротивление и используя его вместо 10000 в своих расчетах, это первый вариант. Калибровка для других температур уже намного сложнее.

,