Цепь термистора NTC, преобразование АЦП, вычисление температуры

Вот схема моей схемы NTC-ADC,

НТК НТЦ-АДК АРЕФ

АЦП 10 бит, ADCVCC 2,56 В

Вин = 5В

Кто-нибудь может объяснить мне, как я получаю RT, значение сопротивления NTC от значения ADC? Спасибо.

Я использую формулу делителя напряжения:

Vout = ADCVCC * ADC_value / 1024
BETA = 3950
R25 = 4700
RT = 10K / (Vin - Vout - 1)
T = (1 / (1/298.16 + 1/BETA * ln(RT/R25 )) - 273.15

Но я получил неправильные результаты:

Диапазон моих температур:

adc = 1    -> T = 344 °C;
adc = 1023 -> T = 8

Как мне настроить АЦП в AVR? с внутренним опорным напряжением или нет?

у меня неправильная формула?

Мне нужно прочитать "точную" температуру в диапазоне от -10°C до +30°C более или менее.

Я уже пробовал с уравнением SH с коэффициентами A, B, C, но у меня были худшие результаты!!!

Я думаю, что не понимаю схемы цепей NTC - ADC...

И настроил мою ATMega с неправильными параметрами.

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

Спасибо в совете за помощь.

[РЕДАКТИРОВАТЬ]

Моя установка для AVR ADC:

ADMUX |= (1<<REFS0) | (1<<REFS1);
ADCSRA |= (1<<ADEN) |(1<<ADSC) |(1<<ADIE);
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

и формула, используемая для получения сопротивления из значения АЦП: Vin = 5V Vref = 2,56V (AREF)

Vout = adc_val * (Vref / 1024.0))
RT   = 10k / (Vin / Vout - 1.0)

Этот код соответствует схемам? Правильно ли настроен мой АЦП с этими схемами? спасибо за совет.

Первое предположение, которое нужно прояснить. Сопротивление NTC становится ниже по мере нагрева. Поэтому, когда холодный NTC имеет высокое сопротивление. В горячем состоянии сопротивление снижается. Напряжение на термисторе будет падать по мере повышения температуры... Вы этого хотите? Я не проводил расчеты, но ваши результаты показывают, что вы не можете получить желаемый диапазон... Соответствуют ли бета-версия и R25 вашему NTC? Они различаются в зависимости от номера модели ... И был ли операционный усилитель на случай, если потребуется смещение уровня и масштабирование?
Мои значения Beta и R25 верны. Я взял из даташита. Я настроил АЦП с внутренним опорным напряжением 2,56 В (AREF), поэтому в коде AVR-C: ADMUX |= (1<<REFS0) | (1<<REFS1); и значение adc преобразуется с помощью формулы делителя напряжения: Vref=2,56V Vin=5V Vout=(adc_val * (Vref/1024.0)) RT= 10k/(Vin/Vout - 1.0) [Я отредактировал свой вопрос, добавив больше Информация]

Ответы (2)

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

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

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

Таким образом, значение АЦП представляет собой отношение т час е р м я с т о р   р е с я с т а н с е т час е р м я с т о р   р е с я с т а н с е + 10 к Ом

Вы можете взять это отсюда?

Я полагаю, что схема операционного усилителя рассматривается как «шумовой фильтр», чтобы получить лучшие результаты. Но я не уверен. Я не знаю решения для этого ... :) для уравнения, которое вы предлагаете, я отредактировал свой вопрос с дополнительной информацией. но верна ли формула делителя напряжения? Вх/Ввых = R1/(R1+R2)
если R1 - термистор, а R2 - резистор, питающий его от источника питания, это формула для напряжения на термисторе по отношению к источнику питания, но если ваш АЦП использует источник питания в качестве эталона, тогда формула представляет собой значение АЦП, деленное на 1024.

Я запустил ваш код на Python и получил 285 для adc_val = 1 и -84 для adc_val = 1023. При adc_val 318 я получаю 25,9. RT в этот момент составляет 4504. Похоже, ваши уравнения должны быть правильными. Вы уверены, что это правильно реализовано с точки зрения типов? Это должно быть все с плавающей запятой. Если что-то преобразуется в целое число или что-то в этом роде, вы можете получить странные результаты.

>>> BETA = 3950
>>> R25 = 4700
>>> Vin = 5
>>> Vref = 5
>>> adc_val = 1
>>> Vout = adc_val * (Vref / 1024.0)
>>> RT   = 10000 / (Vin / Vout - 1.0)
>>> T = (1 / (1/298.16 + 1/BETA * log(RT/R25 ))) - 273.15
>>> T
285.3553121325664
>>> adc_val = 1023
>>> Vout = adc_val * (Vref / 1024.0)
>>> RT   = 10000 / (Vin / Vout - 1.0)
>>> T = (1 / (1/298.16 + 1/BETA * log(RT/R25 ))) - 273.15
>>> T
-84.45667531777428
>>> adc_val = 318
>>> Vout = adc_val * (Vref / 1024.0)
>>> RT   = 10000 / (Vin / Vout - 1.0)
>>> RT
4504.249291784702
>>> T = (1 / (1/298.16 + 1/BETA * log(RT/R25 ))) - 273.15
>>> T
25.970525623383708
Ну, я тогда понял, что в прототипе (устройстве) были какие-то ошибки. Когда у меня была эта интуиция (я не электронщик), потому что я заметил какое-то странное поведение аппаратных ответов. Результаты оказались менее точными, чем было приемлемо для бизнеса, потому что это был прототип. Так или иначе: еще раз идеальное и реальное несоответствие! :D :D :D (кстати спасибо)