Калибровка терморезистора и уравнение Стейнхарта
- Войдите на сайт для отправки комментариев
Чт, 01/04/2021 - 14:26
Здравствуйте. Подключил термопару к аналоговому порту 2 (через подтяжку), получаю значения через широко растиражированный код
#define NUMSAMPLES 10// сколько показаний берется для определения среднего значения #define SERIESRESISTOR 2400 //номинал подтягивающего резистора для термодатчика #define THERMISTORNOMINAL 10000 // сопротивление при 25 градусах по Цельсию #define TEMPERATURENOMINAL 25 // t. для номинального сопротивления (практически всегда равна 25 C) #define BCOEFFICIENT 3950 // бета коэффициент термистора (из описания продавца) int samples[NUMSAMPLES]; void setup() { pinMode(2,INPUT); //терморезистор на а2 } void loop() { uint8_t i; float average; for (i=0; i< NUMSAMPLES; i++) { samples[i] = analogRead(2); delay(1); } // определяем среднее значение average = 0; for (i=0; i< NUMSAMPLES; i++) { average += samples[i]; } average /= NUMSAMPLES; average = 1023 / average - 1; average = SERIESRESISTOR / average; float steinhart; steinhart = (BCOEFFICIENT * 298.15 ) / (BCOEFFICIENT + (298.15 * log(average / THERMISTORNOMINAL)))-273.15; Serial.print(steinhart);
Понятное дело, что номинал резисторов может быть неточным (не 2.4 КОм, а 2350, не 10 КОм, а 9900), поэтому и на экране я вижу не точные значения: вблизи 25 градусов показывает температуру довольно точно, в то время как вместо 100 показывает 97-98, а вместо 0 показывает 2-3. Как калибровать, какой из коэффициентов или номиналов резисторов в какую сторону крутить?
Подозреваю, дело именно в B-коэффициенте (в коде программы он указан как 3950) и в сопротивлении при 25 градусах. Но подбирать методом тыка уже устал, поэтому обратился на форум.
Если не секрет, что за термопара? ))
А надо не методом тыка, а снять несколько значений, покрывающих весь рабочий диапазон прибора, а потом под них подбирать формулу. И не факт, что она окажется линейной.
Под "значением" подразумевается сырое значение, т.е. число, получаемое непосредственно с выхода АЦП без каких-либо преобразований (максимум - после усреднения).
PS. Кстати, код какой-то кривоватый. Зачем там вообще массив samples? Да еще и глобальный?
Ну и, кроме того, неплохо бы учитывать и реальную температуру холодного спая термопары.
Если не секрет, что за термопара? ))
Нет там никакой термопары, там NTC термистор и эта формула для него. Для бытового применения в терморегуляторах обычно хватает. В качестве точного термометра, сомнительно. Хотя во всей китайских термометрах это решение используется. Если брать 1% термистор, то достаточно калибровать при 0 градусов, и в разумных пределах +/- 30 градусов работает. Номинал резистора делителя желательно указать с точностью до десятков Ом. Коэффициент лучше не трогать, он достаточно точно описывае характеристику.
PS. Кстати, код какой-то кривоватый. Зачем там вообще массив samples? Да еще и глобальный?
Согласен, массивы там лишние, как и два цикла - в своей программе я обошёлся одной переменной без цикла (и так 92% памяти занято под код, сокращаю каждый байт везде, где можно), но выдирать оттуда строчки не стал, а привёл известный код.
И всё же, на мой вопрос не ответили.
Если не секрет, что за термопара? ))
Нет там никакой термопары, там NTC термистор и эта формула для него. Для бытового применения в терморегуляторах обычно хватает. В качестве точного термометра, сомнительно. Хотя во всей китайских термометрах это решение используется. Если брать 1% термистор, то достаточно калибровать при 0 градусов, и в разумных пределах +/- 30 градусов работает. Номинал резистора делителя желательно указать с точностью до десятков Ом. Коэффициент лучше не трогать, он достаточно точно описывае характеристику.
Всё так, как вы написали.
В моём случае погрешность в 2 градуса только "по краям", что для меня приемлимо для бытовых нужд, однако, эти 2 градуса хотелось бы поправить.
Если не секрет, что за термопара? ))
Нет там никакой термопары, там NTC термистор и эта формула для него. Для бытового применения в терморегуляторах обычно хватает. В качестве точного термометра, сомнительно. Хотя во всей китайских термометрах это решение используется. Если брать 1% термистор, то достаточно калибровать при 0 градусов, и в разумных пределах +/- 30 градусов работает. Номинал резистора делителя желательно указать с точностью до десятков Ом. Коэффициент лучше не трогать, он достаточно точно описывае характеристику.
Спасибо, что разъяснили, я в ардуино тоже начинающий...
Как по мне, лучше применить другое решение.
А здесь одним коэффициентом не отделаешься, ведь погрешность нелинейная,
значит надо вводить разный коэффициент на разные участки измерения.
Чем больше - тем точнее, но ведь это геморрой
А здесь одним коэффициентом не отделаешься, ведь погрешность нелинейная,
значит надо вводить разный коэффициент на разные участки измерения.
Нет. Смотрите в коде предпоследнюю строку. Подозреваю, достаточно будет на сотню-другую изменить B-коэффициент в одну или в другую сторону. Раз ответов нет, буду дома - проверю методом тыка.
В 3D принтерах еще используется табличный метод. Весь диапазон разбит на поддиапазоны, внутри которых считают изменения линейными. Но что самое интересное - во всех прошивках стоит одна и та-же таблица не учитывающая конкретный термистор.
И всё же, на мой вопрос не ответили.
А Вы, похоже, мой ответ либо не прочитали, либо не поняли. Ибо там я написал:
1. Что Ваш вопрос принципиально неверен.
2. Что именно следует делать в Вашей ситуации.
В 3D принтерах еще используется табличный метод. Весь диапазон разбит на поддиапазоны, внутри которых считают изменения линейными. Но что самое интересное - во всех прошивках стоит одна и та-же таблица не учитывающая конкретный термистор.
А в первом приближении это и не нужно.
Я думаю, таблица нужна чтобы скомпенсировать нелинейность, возникающую из-за того, что постоянный резистор достаточно плохо справляется с функцией генератора тока. Зато корректирующая функция легко считается аналитически. Что когда-то кем-то было единожды сделано, после чего стало массово переноситься в другие исходники без отчетливого понимания, что это такое и зачем оно нужно.
А вообще, табличная функция - это стандартное решение для микроконтроллеров.
И еще: как раз в данном случае, думаю, табличная функция - не лучшее решение. Ее, скорее всего, можно заменить полиномом низкого (2-3) порядка.
Всем спасибо. Жаль, что форумчане ничего не знают про коэффициенты. Разобрался уже сам, остальным рекомендую учить матчасть.
Всем спасибо. Жаль, что форумчане ничего не знают про коэффициенты. Разобрался уже сам, остальным рекомендую учить матчасть.
Поздравляем!!!
Но на практике использование этих коэффициентов очень проблематично. В моей деревне нет хорошей термокамеры, чтобы их определить. Я о них упомянул в соседней теме http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/ntc-termorezistor-10kom-na-vysokikh-temperaturakh#comment-598740 , но никогда не использовал, т.к. меня удовлетворяет точность при использовании уравнения для типового NTC термистора.
Рассказали-бы, как надо. А то так и помрем непросвещенными.
Рассказали-бы, как надо. А то так и помрем непросвещенными.
В моём случае номинал термистора при 25С - 9900 (но возможно даже 9800, надо перепроверять), что входит в заявленную производителем погрешность при изготовлении, а вот В-коэффициент не 3950, а 3750, что немного странновато, но при изменении этого коэффициента кривая чуть меняется и датчик работает точнее.
Рассказали-бы, как надо. А то так и помрем непросвещенными.
В моём случае номинал термистора при 25С - 9900 (но возможно даже 9800, надо перепроверять), что входит в заявленную производителем погрешность при изготовлении, а вот В-коэффициент не 3950, а 3750, что немного странновато, но при изменении этого коэффициента кривая чуть меняется и датчик работает точнее.
Рассказали-бы, как надо. А то так и помрем непросвещенными.
В моём случае номинал термистора при 25С - 9900 (но возможно даже 9800, надо перепроверять), что входит в заявленную производителем погрешность при изготовлении, а вот В-коэффициент не 3950, а 3750, что немного странновато, но при изменении этого коэффициента кривая чуть меняется и датчик работает точнее.
Мне не в лабораторию и погрешность 1 и даже 2 градуса почти приемлема.