"Чайник" и термистор (проект метеостанция)

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Сергей777, 14 июл 2016.

  1. Сергей777

    Сергей777 Нерд

    Помогите "чайнику" разобраться в проекте "Метеостанция" из конспекта хакера который приведен здесь
    http://wiki.amperka.ru/конспект-arduino:метеостанция

    В целом код понятен за исключением самого вычисления температуры, думаю это связано с моими скудными знаниями в электронике
    В конспекте написано: "// вычисляем температуру в °С с помощью магической формулы."
    Что это за магическая формула?
    Код (C++):

    float voltage = analogRead(A0) * VIN / 1024.0; //где vin=5в.
    float r1 = voltage / (VIN - voltage);
    float temperature = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; //где TERMIST_B Параметр конкретного типа термистора (из datasheet) равный 4300
     
    С первой строчкой вопросов нет там у нас значение в вольтах на пине.
    А дальше танцы с бубном, что это за значения? что за TERMIST_B, как я понял у него единицы измерения Кельвины?

    Беда еще в том что в печатном варианте конспекта хакера набор цифр выглядит отличным, но не менее загадочным

    Код (C++):

    float v = analogRead(A0) * 5 / 1024.0;
    float temperature = -14.46 * log((10000.0*v) / (5.0 -v) / 27074.0);
     
    Здесь куда-то пропадает значение TERMIST_B, но зато появляется -14.46; 27074.0; что это? 10000.0 как я понял это сопротивление термистора при 25градусах - 10КоМ?

    Уверен есть сведущие люди, помогите, пожалуйста!
     
  2. Сергей777

    Сергей777 Нерд

    Поскольку ответов в ветке нет, следовательно, либо никто не знает, либо никто не хочет объяснять элементарные вещи, пришлось все искать самому.

    Решил разместить здесь свои изыскания, может пригодиться очередному «чайнику».

    И так что я раскопал:

    Оказывается изменение сопротивления термистора не линейны по отношению к температуре. А для описания этих зависимостей существует куча формул, одной из них является уравнение B parameter

    B = (ln(R25) – ln(R100)) / (1 / T25 - 1 / T100)

    Вот из нее нам и придется вычислить температуру.

    В – рассчитывается для стандартных температур 25 и 100 градусов выраженных в Кельвинах, и его значение можно найти в описании конкретного термистора – в нашем случае это значение 4300.
    Путем переноса значений выразим изменяемую температуру.
    Здесь за изменяемый параметр выбрана температура в 100 градусов, так как для 25 градусов нам известно сопротивление термистора (10000 Ом)

    (1 / T25 - 1 / Tn) = ( ln(R25) – ln(Rn) ) / B

    (- 1 / Tn) = (( ln(R25) – ln(Rn) ) / B) - 1 / T25

    Tn = - 1 / ((( ln(R25) – ln(Rn) ) / B) - 1 / T25)

    Подставляем все известные нам значения:

    R25 (при 25 градусах) =10000 ом и В = 4300 – берем из даташита. T25 это температура 25 градусов выраженная в кельвинах (25+273)= 298

    Tn = - 1 / ((( ln(10000) – ln(Rn) ) / 4300.0) - 1 / 298.0)

    Не забывайте после чисел указывать дробную часть, иначе результатом деления станет целое число и оно будет равно нулю. Честно говоря, надо, чтобы одно число в операции было дробным, т.е. указание дробной части в числе 4300 некритично, так как разница логарифмов будет дробным числом.

    Для вычисления формулы нам не хватает значения Rn – то есть сопротивления термистора на конкретный промежуток времени. Придется вычислять.

    Термистор подключен у нас по схеме делителя напряжения в положение R2
    1.jpg
    Термистор у нас NTC, т.е. с отрицательны температурным коэффициентом, это означает, что при повышении температуры его сопротивление будет снижаться.

    Следовательно, при нагреве термистора находящегося у нас в положении R2, значение потенциала на пине начнет стягиваться к нулю, и напряжение на участке U2 будет падать.

    Попробуем их считать. Так как ардуинка на пине видит некое значение напряжения, преобразуемое АЦП в диапазоне от 0 до 1023, с помощью простого деления этого показания на весь диапазон, мы можем узнать, какую часть от этого диапазона в текущий момент регистрирует пин ардуино.

    value_pinA0 = analogRead(A0);

    int range = value_pinA0 / 1024;


    Теперь у нас есть некая часть от максимального значения. Умножив полученную часть на максимально возможное напряжение на пине - 5в. Мы получим эту часть от максимума выраженную в вольтах, регистрируемое пином в настоящий момент времени.

    float volt_U2 = range * 5.0

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

    Теперь попробуем добраться до значения сопротивления термистора R2, чтобы подставить его в формулу для вычисления температуры.
    По закону Ома напряжение U2 равно силе тока I2 умноженному на сопротивление R2.

    U2 = R2*I2

    Подставляем известное нам значение U2, которое у нас вычисляется Ардуино и сохраняется в переменной volt_U2, а R2 нам предстоит вычислить.

    volt_U2 = R2*I2

    Не хватает значения I2. Мы знаем, что ток во всей цепи одинаков, а следовательно ток на участке I2 такой же как и на участки цепи I1

    I2 = I1

    I1 по тому же закону Ома равно

    I1= U1/ R1

    Наш R1 равен 10000 Ом которые мы воткнули с схему

    А U1 равен Общему напряжению цепи (5в) за вычетом напряжения на участке U2

    I1= U0 – volt_U2 / R1
    I1= 5 – volt_U2 / 10000


    Подставляем все это в формулу и находим R2

    R2= volt_U2 / I
    R2= volt_U2 / (U0 – volt_U2 / R1)
    R2= volt_U2 / (5 – volt_U2 / 10000)

    и подставляем полученное R2 в формулу для расчета температуры

    Tn = - 1 / ((( ln(10000) – ln(volt_R2 ) ) / 4300.0) - 1 / 298.0)

    Останется вычесть 273 из результата чтобы получить показания температуры в градусах Цельсия.

    Область моих профессиональных знаний лежит далеко от технической, так что очень прошу не судите строго за мои обороты и неправильные термины и если где допустил ошибки помогите исправить.
     
    alp69 и Vetrinus нравится это.