Точне вимірювання температури Arduino


10

Я намагаюся побудувати термостат з Arduino. Я хочу живити його за допомогою акумулятора / зарядного пристрою мобільного телефону, що робить напругу системи досить змінним. Зараз я використовую Arduino Uno, але як тільки він буде завершений, я відправлю його на Ліліпад.

Спочатку я спробував використовувати датчик температури TMP36 . Поки це був повний провал. Хоча сам датчик здається дуже стабільним, я не можу зрозуміти спосіб точного вимірювання його напруги.

Використання вбудованої 5В посилання для аналогових датчиків взагалі не працює - навіть живлення від USB arduino + 5V насправді становить + 4,8 В (що зміщує вимірювану температуру на кілька градусів). Коли плата живиться від акумулятора, напруга падає приблизно до 4В і вимірюється температурні небесні ракети. Я також намагався використовувати + 3.3V з дошки як орієнтир. Це здається більш стійким, коли плата живиться від USB, але напруга падає, коли розряджається акумулятор.

Чи є якийсь інший спосіб надійно виміряти вихідну напругу датчика?

Для другого етапу я планую використовувати термістори. Щойно замовив пару цих 20К термісторів .

З того, що я розумію, це повинно бути легше точно виміряти, якщо я будую дільник напруги і використовую V_in в якості опорного напруги для АЦП.

Кілька питань щодо них:

  • Чи має сенс використовувати кілька дільників напруги з різним фіксованим резистором для підвищення точності?
  • Я можу використовувати програмований штифт як V_in і вимірювати температуру за допомогою кількох різних рівнів напруги. Хоча мені не ясно, чи дійсно це підвищить точність.

Будь ласка, опублікуйте код перетворення температури.
geometrikal

Будь ласка, визначте, що ви маєте на увазі під «точно». Якого вибору роздільної температури та абсолютної точності ви намагаєтеся досягти?
Джо Хасс

Я сподіваюся отримати дозвіл приблизно на 1-2 градуси. Абсолютна похибка калібрування 1-2 градуси теж повинна бути добре. З того, що я розумію, відносно легко отримати опорну точку при 0 ° С, і, мабуть, я можу отримати другу (набагато більш грубу) точку при кімнатній температурі шляхом перехресної калібрування датчиків.
Усов

1-2 градуси для температури в інтервалі 5-25С.
Усов

@geometrikal У мене зараз немає під рукою, але в основному така ж, як і у всіх інших: скиньте перший зразок, зачекайте кілька мільйонів, пробіть ще пару разів і середні зразки. Потім переосминіть масштаб, як ви вважаєте, ваша опорна напруга.
Усов

Відповіді:


2

Здається, ви знаєте про проблему зі зміною опорної напруги, і якщо ви використовуєте такий пристрій, як TMP36 (фіксований 10mV / degC), ви нічого не можете зробити, окрім використання напруги від мікросхеми для стабілізації роботи.

Однак якщо ви використовуєте RTD або термістор, то проблеми не виникне. Ви АЦП роблять пропорційне вимірювання - воно порівнює вхід АЦП зі своїм опорним напругою, АЛЕ, якщо ви живите RTD або термістор (через відповідний резистор) від того ж перемикання, це не вплине на показання. Якщо коефіцієнт поглинання піднімається на 10%, то напруга в АЦП.


4

Я думаю, вам слід подумати про використання цифрового датчика температури типу DS18B20 / DS18S20, оскільки це не залежить від точності вашої АЦП ATmega для вимірювання аналогового сигналу, він використовує однопроводовий цифровий протокол для повідомлення температури.

Зверніться до наступних підручників
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino


2
Ця відповідь не дуже корисна, якщо ви не поясните, чому ОП повинен перейти на інший датчик, і ви не давали жодних обґрунтувань для цього. Надання посилань у відповіді - це не дуже гарна ідея, оскільки вони часто замирають, а зміст відповіді втрачається.
Джо Хасс

Замість того, щоб писати власну відповідь у тому ж рядку, я редагував цю А, щоб вирішити проблему, яку викликав Джо.
RedGrittyBrick

@JoeHass Єдиною альтернативою, ніж посилання на зовнішні статті, є приєднання коду до відповіді, але я не маю власного коду, який потрібно приєднати, і не було б різним справедливим приєднання когось elses коду без їхньої згоди. Навіть якщо посилання загинуть, бібліотеку для Arduino можна легко знайти, використовуючи google та DS18B20 як ключові слова. Щодо пояснення, це була моя помилка, я вважав, що згадка про те, що датчик є цифровим, пояснила б мою думку.
alexan_e

Дякуємо за коментар Чомусь цифрові датчики знайти досить складно. Ні місцеві постачальники (Maplin), ні дешеві (ер) онлайн-хлопці (я використовував Spiraltronics) не продають жодного. £ 3 за поп + доставка все ще робить його порівняно дорогим варіантом.
Усов

@Usov Судячи з наданих вами посилань, я припускаю, що ви живете у Великобританії. Зазвичай я купую ці компоненти дешево з Китаю, але я також знайшов їх на ebay.uk за 1,49 фунта, можливо, вони вам підходять
alexan_e

3

Ваші вимірювання будуть такими ж хорошими, як і опорне напруга для АЦП. Arduino за замовчуванням використовує напругу живлення в якості опорної напруги, але у вашому випадку правильним способом зробити це буде використання Aref pin arduino. Ви повинні отримати спеціальну мікросхему під назвою "Посилання на напругу" і підключити її до штифта Aref, а потім встановити АЦП для використання зовнішньої посилання в коді Arduino ( analogReference(EXTERNAL))

Напруга еталонної лінії повинно вибиратися таким чином, щоб повний розмах датчика температури підходив до напруги референсу. TMP36 виводить ~ 1,5 В при 100 С, тому для вимірювання температури до 100 С вам доведеться використовувати посилання вище 1,5 В. Ви хочете, щоб ваша довідка була максимально наближеною до максимально виміряної напруги, щоб отримати максимальну роздільну здатність.

Atmega328p має дві внутрішні посилання, які можна використовувати без будь-яких зовнішніх компонентів. Один - 1,1 В, інший - 2,56 В. Зазвичай вони трохи гірші, ніж те, що ви отримаєте, використовуючи зовнішній виділений компонент. Перевірте документацію на Arduino на таблицю даних analogReference та Atmega328p на предмет внутрішньої точності посилання.

Якщо ви дійсно хочете отримати гайки з різним діапазоном, ви можете використовувати кілька зовнішніх посилань та перемикати їх за допомогою аналогового перемикача типу 74hc4051. Або ви можете перемикатися між двома внутрішніми посиланнями.

З термісторами ви отримаєте кращі результати, якщо замість цього встановите постійне джерело струму, використовуючи тупий резистор. З іншого боку - тупий резистор, що живиться від стабільної напруги, працював би нормально.

Вибираючи зовнішню орієнтацію, переконайтеся, що у вас є достатня напруга, щоб пристосувати її до випадання напруги, коли живлення від акумуляторів і батареї вирівняні. Vref + Vdropout <Vbat-хв.


Дякуємо за ваш коментар Це, в основному, той самий коментар, який я отримав сьогодні - побудувати власну напругу ref на зенер-діоді або отримати виділений низьковольтний регулятор для AREF.
Усов

Чому кращі результати при постійному струмі та термісторі?
geometrikal

2

Немає стабільної посилання АЦП - це насправді ще одна проблема у вашому ланцюзі: ви не подаєте на плату достатньо високої напруги. На це вказує падіння напруги 5В до 4В та падіння 3,3В.

Регулятор напруги (MC33269D-5.0 IIRC) на платі Arduino має напругу випаду ~ 1,0 В, тому для отримання стабільного виходу 5В вам потрібно подати щонайменше 6 В. Акумулятори AA заряджаються від 1,5-1,6 В і майже не вмирають при 1,1 В, тому ви повинні живити плату мінімум 6 батареями АА для стабільного виходу протягом усього терміну служби акумулятора.

Працює правильно, ви можете використовувати внутрішню посилання АЦП або лінії 5 В або 3.3 В. Оскільки датчик температури коливається приблизно на 10 мВ на градус Цельсія, ви можете використовувати дільник напруги, щоб встановити опорне напруга, еквівалентне максимальній очікуваній вихідній напрузі датчика (наприклад, для 50 градусів С). Це дасть більш точне вимірювання.

Якщо ви хочете використовувати менше 6 батарейок типу AA, спробуйте перетворювач напруги постійного струму постійного струму, наприклад, https://www.sparkfun.com/products/10968 . Зв'язаний приклад приймає 1 В - 4 В і складає 5 В. Вихід подаватиметься безпосередньо в 5-контактний контакт Arduino, минаючи його регулятор.

Щоб плата працювала довше на батареях, покладіть MCU у режим сну між показаннями датчика. Rocketscream низькою бібліотека харчування відмінно підходить для цієї мети. Але це корисно лише при використанні ефективного регулятора / постійного струму-перетворювача постійного струму, оскільки стандартний регулятор Arduino використовує 10mA просто сам по собі!


1

Відповідь на питання Чи є інший спосіб надійно виміряти вихідну напругу датчика?

АЦП використовує опорну напругу для перетворення з аналогового в цифрове. Отже, якщо відбудеться зміна опорної напруги, перетворені значення (тобто цифрове значення) зміниться. Цифрове значення буде різним для одного і того ж аналогового входу, якщо зміниться опорна напруга.

Одним з простих варіантів є використання внутрішньої опорної напруги всередині Arduino (тобто контролера Atmega).

Перегляньте посилання нижче, де надається зразок коду для використання внутрішнього АЦП (назва функції Arduino - analogReference (DEFAULT))

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

Я думаю, що це вирішить вашу проблему, і немає необхідності переходити до термісторів.


Я не впевнений, наскільки "Злом Wifi-пошуку" є релевантним - я не можу знайти там нічого релевантного. Щодо внутрішньої посилання на АЦП - я писав про це. Це не працює навіть тоді, коли Arduino живиться від USB. А коли плата живиться від акумулятора стільникового телефону (3,7 - 4,5 В), це ще гірше.
Усов

Вибачте за помилку копіювання / вставки. Виправить посилання незабаром!
Робомон

@Usov посилання виправлено!
Робомон

Внутрішня потужність 1.1V може плавати на понад 10% згідно зі специфікацією atmega328. Це здається не дуже надійним посиланням.
Усов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.