Почему показания моего термистора отстают?
Я пытаюсь создать термистор, который будет мигать светодиодом при температуре выше 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 нф
@Octavius, 👍1
2 ответа
Лучший ответ:
Напряжение Vo - это не напряжение на термисторе, это напряжение на R1! Переключите место термистора и R1. /Микаэль
Кроме того, обратите внимание, что Vo определенно выражается не в мВ (милливольтах), а в шагах АЦП, т.е. 1024-м от Vref, то есть здесь 5 В (по умолчанию). И там есть ссылка на то, что оно должно быть 512 для 25deg.
Кроме того, не обманывайтесь точностью приведенных чисел. Допуск составляет от 2% до 5% от значения R25, что означает до ~ 25 "шагов" (Vo). Предполагая, что изменение R1 и TR дает вам 450 при 22 градусах, это означает, что ваш реальный порог в 30 градусов может быть где-то между 28 и 32 (примерно).
Вы можете получить лучшие результаты, откалибровав TR: при 25 градусах, измерив его реальное сопротивление и используя его вместо 10000 в своих расчетах, это первый вариант. Калибровка для других температур уже намного сложнее.
- Как создать код, позволяющий использовать массив из 10 термисторов на одном arduino?
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
Я повторно вывел уравнение для сопротивления термистора после учета моего ошибочного размещения делителя напряжения, которое перевернуло части Vo и Vi уравнения, так что вместо этого уравнение имеет вид TR = R1 [ (Vi - Vo) / Vo]. Это решило проблему; спасибо! Более того, полезно видеть, что значения термистора, работающие неправильно, могут указывать на то, что деление напряжения было взято из неправильного места!, @Octavius