Расширение диапазона аналоговых значений от датчика температуры

Я пытаюсь создать модуль реле с контролем температуры с помощью ATtiny45 (Arduino UNO R3 в качестве интернет-провайдера) и датчика температуры NXP KTY81-222.

Диапазон температур, который я хочу контролировать, составляет от 20°C до 30°C.

(технические данные -> http://www.produktinfo.conrad.com/datenblaetter/150000-174999/153653-da-01-en-TEMPERATUR_SENSOR_KTY10_7_KTY81_222.pdf )

Схема моей схемы выглядит так = (я использую Arduino UNO R3 для отладки)

введите описание изображения здесь

** обратите внимание, что я также пытался «поменять местами» резистор 1K и положение датчика, чтобы инвертировать выход.


*и плата ардуино ->

введите описание изображения здесь

A0 — это аналоговый вход 0 Arduino. 5V напрямую подключается к выходному контакту 5V Arduino.

(позже это будет то же самое на ATtiny45 с использованием некоторых батарей)

введите описание изображения здесь

(VCC может быть от 2,7 В до 5,5 В)

Я использовал бытовой цифровой термометр для сравнения значений аналогового входа с измеренными значениями °C.

это таблица быстрых измерений =

Аналоговый -> °C


от 687 до 690 -> от 24,4°C до 25,1°C

от 707 до 708 -> от 36,2°C до 36,5°C

как вы можете видеть, у меня есть диапазон примерно от 20 аналоговых единиц, который представляет диапазон примерно от 10 ° C единиц.

так что я на самом деле хочу, чтобы "вырастить" диапазон аналоговых единиц примерно до 200 аналоговых единиц для диапазона единиц измерения 10 ° C. решение должно подходить для обработки диапазона значений, поэтому я могу указать микроконтроллеру включить реле, если температура ниже 24°C, и закрыть реле, если температура выше 28°C.

Я хочу, чтобы 20 ° C было аналоговым значением примерно от 500, а 30 ° C - около 700. (Для меня этого диапазона от 500 до 700 было бы достаточно.

Я надеюсь, что смог хорошо объяснить свой вопрос из-за моего плохого английского.

Зачем вам больше точности? 0,5°C должно быть достаточно для этой задачи. И не слишком доверяйте бытовому термометру.
у меня нет другого термометра для расчета фактического ° C для каждого значения. поэтому, почему я хочу иметь больший «диапазон», мне нужно выяснить, какие значения использовать в моем коде для нижнего и верхнего предела...
Реальный способ решить вашу проблему настройки диапазона вашей системы таким образом, чтобы интересующий временной диапазон покрывал диапазон вашего АЦП, - это использовать схему операционного усилителя, убрав смещение и увеличив усиление. Это немного усложняется тем фактом, что у вас нет отрицательного источника питания, поэтому вам нужно использовать односторонние операционные усилители.
хм, хорошо, у меня нет опыта с усилением: я думаю, что я должен просто остаться с текущей схемой и попробовать с заданными значениями. Знаете ли вы какой-нибудь хороший метод «сравнения» аналоговых значений, которые я получаю, чтобы получить фактические ° C? мой комнатный термометр кажется недействительным.

Ответы (2)

схематический

смоделируйте эту схему - схема, созданная с помощью CircuitLab

Вы столкнетесь с некоторыми проблемами точности, такими как:

  1. шум от линии 5В
  2. самонагрев
  3. возможное падение напряжения (из-за длины провода)

Я бы просто использовал однопроводной термометр, такой как DS18B20/DS18S20. Использование цифрового датчика менее невосприимчиво к шуму. Вы даже можете запустить его на гораздо большее расстояние. Уже есть библиотека для Arduino. Во всяком случае, это мой маршрут.

Идем своим маршрутом:

Если вам нужен только температурный диапазон от 20°C до 30°C, вам придется поиграться с вашим резистором, чтобы получить этот диапазон. Например, при 20°С номинальное сопротивление составляет 1922 Ом, а при 30°С — 2080 Ом.

Таким образом, состояния делителя напряжения дают:

@ 20 С : В о "=" В я р с р с + р 1 "=" 5 В 1922 г. 1922 г. + 1000 "=" 3.288 В

@ 30 С : В о "=" В я р с р с + р 1 "=" 5 В 2080 2080 + 1000 "=" 3,376 В

Разница составляет 0,08778 В или 87,78 мВ. Так как аналог ардуино использует 10b (1023): 5 В 1023 "=" 4.888 м В / с т е п . Это должно было дать 17,9 шагов ( 87,78 м В 4.888 м В , так что давайте просто скажем 17. Если вы хотите уменьшить это до большего разрешения, вы можете подключить 3,3 В от порта FTDI Arduino к аналоговому опорному выводу. Однако запитайте делитель напряжения теми же 5 В. В вашей настройке void() используйте AnalogReference(EXTERNAL). Что это сделает, так это настроит ваш аналог на использование опорного напряжения 3,3 В вместо внутреннего опорного напряжения 5 В.

Теперь давайте сделаем еще немного математики:

Поскольку сейчас мы используем опорное напряжение 3,3 В, разрешение изменится на 3.3 В 1023 "=" 3,23 м В / с т е п . Теперь это даст 27,2 шага ( 87,78 м В 3,23 м В ) (скажем так, 27 шагов).

Как видите, мы только что увеличили количество шагов с 17 до 27. В диапазоне 10С (30С-20С) теоретически можно получить разрешение 10С/27 = 0,37С. Я бы порекомендовал подключить конденсатор параллельно датчику для создания фильтра нижних частот первого порядка (пропускает низкие частоты и подавляет высокие частоты после отсечки со скоростью 20 дБ или 10-кратное подавление за декаду). Подключите этот конденсатор прямо между A0 и gnd (как можно ближе к A0). Отсекающий фильтр рассчитывается с использованием:

Допустим, вы используете резистор 1 кОм и конденсатор 1 мкФ:

ф с "=" 1 2 π р С "=" 1 2 π 1000 0,000001 "=" 159 ЧАС г

Все, что вам нужно сделать сейчас, это поиграться со значением резистора (теперь оно должно быть больше 1k). Убедитесь, что в худшем случае напряжение не будет больше опорного.

Я бы, вероятно, выбрал резистор 2k:

В о "=" 5 В 1922 г. 1922 г. + 2000 г. "=" 2.450 В так что AnalogRead дает 759

В о "=" 5 В 2080 2080 + 2000 г. "=" 2,549 В так что AnalogRead дает 790

В худшем случае: @150C -> 4280 Ом

В о "=" 5 4280 4280 + 2000 г. "=" 3.4 В (хорошо)

Разница 98,73 мВ -> 98,73 мВ/3,23 мВ -> 30 шагов

Фильтр нижних частот: ( 2 π 2000 г. 0,000001 ) 1 "=" 79,6 ЧАС г (Сигнал переменного тока на частоте 796 Гц снижается в 10 раз меньше, на частоте 7960 Гц меньше в 100 раз и т.д.).

спасибо за это хорошее объяснение. Не могли бы вы загрузить быстрый чертеж схемы для вашего окончательного решения, пожалуйста? мои электрические навыки не так хороши. также имейте в виду (для самонагрева), что у меня датчик на дуплексном проводе длиной 1 метр. так что это вне "электронной области". а также: могу ли я просто использовать выходной контакт 3,3 В Arduino?
я обновил свой вопрос с некоторыми справочными изображениями для arduino и attiny, которые я использую.
Выходной контакт 3,3 В поступает от микросхемы FTDI. Помните, что этот вывод может работать только до 50 мА. Если вы попытаетесь нарисовать больше, чем это, то это поджарит бедняжку. Просто используйте изображение, которое у вас есть в настоящее время, для схемы. Поместите керамический конденсатор между A0 и землей так, чтобы он был параллелен датчику. Я не уверен, как загрузить фотографии.
под текстом вашего ответа вы можете нажать «редактировать», в редакторе вы можете нажать «символ изображения», чтобы загрузить изображение в текст в текущей позиции. я не знаю, почему я должен использовать конденсатор, потому что у меня нет шума.
Я почти уверен, что вы будете. Например, если вы серийно распечатываете AnalogRead(A0), значение будет колебаться, даже если температура не меняется. Это считается шумом.

Это может показаться не очень широким диапазоном цифровых чисел, но рассматривали ли вы усреднение (скажем) десяти показаний. Шум (если он обычно выше полосы пропускания, которую вам нужно измерить) может быть использован в ваших интересах с помощью процесса, называемого дизерингом. По сути, случайность шума даст вам разброс показаний для фиксированной температуры, а усреднение нескольких чисел даст большее разрешение. Процесс усреднения чисел представляет собой фильтр нижних частот, который (а) удаляет шум и (б) дает вам большее разрешение.

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

Я думаю, что проблема «шума» в моей таблице измерений выше связана с моим бытовым термометром. у меня нет другого прибора для измерения правильной температуры.
Если вы сделаете десять, или 16, или 32 измерения в быстрой последовательности, будут ли все показания одинаковыми? Если да, то мой ответ вам не поможет. Если есть разумный разброс + или - одно изменение счета, то мой ответ поможет вам. Я пытаюсь найти альтернативные способы, которые могут помочь в отличие от «стандартного» способа применения усиления. Если у вас есть запасной инвертор Шмитта, вы можете наложить треугольную форму сигнала (значительно уменьшенную по амплитуде), чтобы немного смягчить сигнал. Частота должна быть в пределах Найквиста и не связана с вашей частотой дискретизации, чтобы она работала.
да, пока провод с датчиком остается в моей комнате, значение не изменится, пока я не остыну или не нагрею датчик.