Калибровка терморезистора и уравнение Стейнхарта

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Здравствуйте. Подключил термопару к аналоговому порту 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. Как калибровать, какой из коэффициентов или номиналов резисторов в какую сторону крутить?

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Подозреваю, дело именно в B-коэффициенте (в коде программы он указан как 3950) и в сопротивлении при 25 градусах. Но подбирать  методом тыка уже устал, поэтому обратился на форум.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Если не секрет, что за термопара? ))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А надо не методом тыка, а снять несколько значений, покрывающих весь рабочий диапазон прибора, а потом под них подбирать формулу. И не факт, что она окажется линейной.

Под "значением" подразумевается сырое значение, т.е. число, получаемое непосредственно с выхода АЦП без каких-либо преобразований (максимум - после усреднения).

 

PS. Кстати, код какой-то кривоватый. Зачем там вообще массив samples? Да еще и глобальный?

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

svm
Offline
Зарегистрирован: 06.11.2016

Дим-мычъ пишет:

Если не секрет, что за термопара? ))

Нет там никакой термопары, там NTC термистор и эта формула для него.  Для бытового применения в терморегуляторах обычно хватает. В качестве точного термометра, сомнительно. Хотя во всей китайских термометрах это решение  используется. Если брать 1% термистор, то достаточно калибровать при 0 градусов, и в разумных пределах +/- 30 градусов работает. Номинал резистора делителя  желательно указать с точностью до десятков Ом. Коэффициент лучше не трогать, он достаточно точно описывае характеристику.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

andriano пишет:

PS. Кстати, код какой-то кривоватый. Зачем там вообще массив samples? Да еще и глобальный?

Согласен, массивы там лишние, как и два цикла - в своей программе я обошёлся одной переменной без цикла (и так 92% памяти занято под код, сокращаю каждый байт везде, где можно), но выдирать оттуда строчки не стал, а привёл известный код.

И всё же, на мой вопрос не ответили.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

svm пишет:

Дим-мычъ пишет:

Если не секрет, что за термопара? ))

Нет там никакой термопары, там NTC термистор и эта формула для него.  Для бытового применения в терморегуляторах обычно хватает. В качестве точного термометра, сомнительно. Хотя во всей китайских термометрах это решение  используется. Если брать 1% термистор, то достаточно калибровать при 0 градусов, и в разумных пределах +/- 30 градусов работает. Номинал резистора делителя  желательно указать с точностью до десятков Ом. Коэффициент лучше не трогать, он достаточно точно описывае характеристику.

Всё так, как вы написали.

В моём случае погрешность в 2 градуса только "по краям", что для меня приемлимо для бытовых нужд, однако, эти 2 градуса хотелось бы поправить.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

svm пишет:

Дим-мычъ пишет:

Если не секрет, что за термопара? ))

Нет там никакой термопары, там NTC термистор и эта формула для него.  Для бытового применения в терморегуляторах обычно хватает. В качестве точного термометра, сомнительно. Хотя во всей китайских термометрах это решение  используется. Если брать 1% термистор, то достаточно калибровать при 0 градусов, и в разумных пределах +/- 30 градусов работает. Номинал резистора делителя  желательно указать с точностью до десятков Ом. Коэффициент лучше не трогать, он достаточно точно описывае характеристику.

Спасибо, что разъяснили, я в ардуино тоже начинающий...

Как по мне, лучше применить другое решение.

А здесь одним коэффициентом не отделаешься, ведь погрешность нелинейная,

значит надо вводить разный коэффициент на разные участки измерения.

Чем больше - тем точнее, но ведь это геморрой

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Дим-мычъ пишет:

А здесь одним коэффициентом не отделаешься, ведь погрешность нелинейная,

значит надо вводить разный коэффициент на разные участки измерения.

Нет. Смотрите в коде предпоследнюю строку. Подозреваю, достаточно будет на сотню-другую изменить B-коэффициент в одну или в другую сторону. Раз ответов нет, буду дома - проверю методом тыка.

svm
Offline
Зарегистрирован: 06.11.2016

В 3D принтерах еще используется табличный метод. Весь диапазон разбит на поддиапазоны, внутри которых считают изменения линейными. Но что самое интересное - во всех прошивках стоит одна и та-же таблица не учитывающая конкретный термистор.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

andreykrasnodar пишет:

И всё же, на мой вопрос не ответили.

А Вы, похоже, мой ответ либо не прочитали, либо не поняли. Ибо там я написал:

1. Что Ваш вопрос принципиально неверен.

2. Что именно следует делать в Вашей ситуации.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

svm пишет:

В 3D принтерах еще используется табличный метод. Весь диапазон разбит на поддиапазоны, внутри которых считают изменения линейными. Но что самое интересное - во всех прошивках стоит одна и та-же таблица не учитывающая конкретный термистор.

А в первом приближении это и не нужно.

Я думаю, таблица нужна чтобы скомпенсировать нелинейность, возникающую из-за того, что постоянный резистор достаточно плохо справляется с функцией генератора тока. Зато корректирующая функция легко считается аналитически. Что когда-то кем-то было единожды сделано, после чего стало массово переноситься в другие исходники без отчетливого понимания, что это такое и зачем оно нужно.

А вообще, табличная функция - это стандартное решение для микроконтроллеров.

И еще: как раз в данном случае, думаю, табличная функция - не лучшее решение. Ее, скорее всего, можно заменить полиномом низкого (2-3) порядка.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

Всем спасибо. Жаль, что форумчане ничего не знают про коэффициенты. Разобрался уже сам, остальным рекомендую учить матчасть.

svm
Offline
Зарегистрирован: 06.11.2016

andreykrasnodar пишет:

Всем спасибо. Жаль, что форумчане ничего не знают про коэффициенты. Разобрался уже сам, остальным рекомендую учить матчасть.

Поздравляем!!!

Но на практике использование этих коэффициентов очень проблематично. В моей деревне нет хорошей термокамеры, чтобы их определить. Я о них упомянул в соседней теме http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/ntc-termorezistor-10kom-na-vysokikh-temperaturakh#comment-598740  , но никогда не использовал, т.к. меня удовлетворяет точность при использовании уравнения для типового NTC термистора.

Рассказали-бы, как надо. А то так и помрем непросвещенными.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

svm пишет:

Рассказали-бы, как надо. А то так и помрем непросвещенными.

В моём случае номинал термистора при 25С - 9900 (но возможно даже 9800, надо перепроверять), что входит в заявленную производителем погрешность при изготовлении, а вот В-коэффициент не 3950, а 3750, что немного странновато, но при изменении этого коэффициента кривая чуть меняется и датчик работает точнее.

svm
Offline
Зарегистрирован: 06.11.2016

andreykrasnodar пишет:

svm пишет:

Рассказали-бы, как надо. А то так и помрем непросвещенными.

В моём случае номинал термистора при 25С - 9900 (но возможно даже 9800, надо перепроверять), что входит в заявленную производителем погрешность при изготовлении, а вот В-коэффициент не 3950, а 3750, что немного странновато, но при изменении этого коэффициента кривая чуть меняется и датчик работает точнее.

В исходном уравнении, а не упрощенной формуле, не один, а три коэффициента которые указываются в документах на партию. Но эти резисторы стоят уже не по  6 рублей на Али, а порядка 150. Есть онлайн калькуляторы, где кажется по трем измерениям они определяются. Но не имея хорошнго оборудования  этим измерениям доверять не стоит.

andreykrasnodar
Offline
Зарегистрирован: 04.10.2020

svm пишет:

andreykrasnodar пишет:

svm пишет:

Рассказали-бы, как надо. А то так и помрем непросвещенными.

В моём случае номинал термистора при 25С - 9900 (но возможно даже 9800, надо перепроверять), что входит в заявленную производителем погрешность при изготовлении, а вот В-коэффициент не 3950, а 3750, что немного странновато, но при изменении этого коэффициента кривая чуть меняется и датчик работает точнее.

В исходном уравнении, а не упрощенной формуле, не один, а три коэффициента которые указываются в документах на партию. Но эти резисторы стоят уже не по  6 рублей на Али, а порядка 150. Есть онлайн калькуляторы, где кажется по трем измерениям они определяются. Но не имея хорошнго оборудования  этим измерениям доверять не стоит.

Мне не в лабораторию и погрешность 1 и даже 2 градуса почти приемлема.