Точное измерение температуры с Arduino

10

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

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

Использование встроенной справки 5v для аналоговых датчиков не работает на всех - даже на питание от USB Arduino в + 5V на самом деле + 4.8V (что сдвиги измеренной температуры на несколько градусов). Когда на плату подается питание от батареи, напряжение падает примерно до 4 В и измеряется температура небесно-реактивного двигателя. Я также пытался использовать + 3.3 В от платы в качестве эталона. Кажется, что он более стабилен, когда на плату подается питание от USB, но ее напряжение падает при работе от батареи.

Есть ли другой способ надежного измерения выходного напряжения датчика?

Для второго этапа я планирую использовать термисторы. Только что заказал пару этих 20К термисторов .

Насколько я понимаю, это должно быть легче измерить точно, если я построить делитель напряжения и использовать V_in в качестве опорного напряжения для АЦП.

Пара вопросов о них:

  • Имеет ли смысл использовать несколько делителей напряжения с разными фиксированными резисторами для повышения точности?
  • Я могу использовать программируемый вывод как V_in, и измерять температуру, используя несколько разных уровней напряжения. Хотя мне не ясно, увеличит ли это точность.
Усов
источник
Пожалуйста, оставьте свой код преобразования температуры.
Геометрический
Пожалуйста, определите, что вы подразумеваете под «точно». Какого температурного разрешения и абсолютной точности вы пытаетесь достичь?
Джо Хасс
Я надеюсь получить разрешение около 1-2 градусов. Абсолютная погрешность калибровки 1-2 градуса тоже подойдет. Из того, что я понимаю, относительно легко получить контрольную точку при 0 ° С, и я предполагаю, что я могу получить вторую (гораздо более грубую) точку при комнатной температуре с помощью перекрестной калибровки датчиков.
Усов
1-2 градуса для температур в диапазоне 5-25C.
Усов
@geometrikal Сейчас у меня его нет, но в основном он такой же, как и у всех остальных: отбрось первый образец, подожди несколько миллисекунд, еще пару раз и усредни. Затем измените масштаб, исходя из того, что вы считаете своим опорным напряжением.
Усов

Ответы:

2

Кажется, что вы знаете о проблеме с изменением опорного напряжением, и если вы используете устройство как TMP36 (фиксированные 10 / DEGC) нет ничего, что вы можете сделать, кроме использования опорного напряжения от чипа, чтобы стабилизировать вещи.

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

Энди ака
источник
4

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

Обратитесь к следующим учебникам
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino

alexan_e
источник
2
Этот ответ не очень полезен, если вы не объясните, почему OP должен переключиться на другой датчик, и вы не дали никакого объяснения этому. Простое предоставление ссылок в ответе не очень хорошая идея, потому что они часто замирают, а содержание ответа теряется.
Джо Хасс
Вместо того, чтобы писать свой собственный ответ в том же духе, я отредактировал эту букву «А», чтобы решить проблему, высказанную Джо.
RedGrittyBrick
@JoeHass Единственная альтернатива, кроме ссылки на внешние статьи, - это прикрепить код в ответе, но у меня нет собственного кода для присоединения, и было бы нечестно прикрепить код кого-либо другого без его согласия. Даже если ссылки не работают, можно легко найти библиотеку для Arduino, используя Google и DS18B20 в качестве ключевого слова. Что касается объяснения, это была моя ошибка, я подумал, что упоминание о том, что датчик цифровой, объяснило бы мою точку зрения.
alexan_e
Спасибо за комментарий. По некоторым причинам цифровые датчики довольно сложно найти. Ни местные поставщики (Maplin), ни дешевые (э) онлайн-парни (я использовал Spiraltronics) не продают их. 3 фунта стерлингов + доставка по-прежнему делает его относительно дорогим вариантом.
Усов
@Usov Судя по предоставленным вами ссылкам, я предполагаю, что вы живете в Великобритании. Я обычно покупаю эти компоненты дешево из Китая, но я также нашел их в ebay.uk за 1,49 фунтов стерлингов, может быть, они вам подойдут
alexan_e
3

Ваше измерение будет таким же хорошим, как и эталонное напряжение для АЦП. Arduino по умолчанию использует напряжение питания в качестве эталонного напряжения, но в вашем случае правильным способом было бы использовать контакт Aref Arduino. Вы должны получить специальный чип под названием «Источник опорного напряжения» и подключите его к Арефа штифтом, а затем установить АЦП использовать внешнюю ссылку на Arduino код ( analogReference(EXTERNAL))

Напряжение ссылки должно быть выбрано так, чтобы полный размах вашего датчика температуры будет вписываться в Referece напряжение. TMP36 будет выводить ~ 1.5В @ 100C, так что вы должны использовать ссылки выше 1.5V для измерения температуры до 100 ° С. Вы хотите, чтобы ваш эталон был как можно ближе к максимальному измеренному напряжению, чтобы получить максимально возможное разрешение.

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

Если вы действительно хотите получить гайки с разными диапазонами, вы можете использовать несколько внешних ссылок и переключать их с помощью аналогового переключателя, например 74hc4051. Или вы можете переключаться между двумя внутренними ссылками.

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

При выборе внешнего эталона убедитесь, что у вас достаточно напряжения, чтобы выдержать его падение напряжения при питании от батарей, а батареи разряжены. Vref + Vdropout <Vbat-min.

miceuz
источник
Спасибо за ваш комментарий. Это в основном тот же комментарий , который я получил сегодня - построить свое собственное напряжение реф на стабилитрон или получить специальный регулятор низкого напряжения для AREF.
Усов
Почему лучше результаты с постоянным током и термистором?
Геометрический
2

Отсутствие стабильного задания АЦП на самом деле является признаком другой проблемы в вашей цепи: вы не подаете на плату достаточно высокое напряжение. На это указывает падение напряжения 5 В до 4 В, а также падение напряжения 3,3 В.

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

Работает правильно, вы можете использовать либо внутренний источник опорного напряжения АЦП или либо на 5V или 3.3V линии. Поскольку датчик температуры изменяется примерно на 10 мВ на градус Цельсия, можно использовать делитель напряжения, чтобы установить эквивалент опорного напряжения для максимального ожидаемого выходного сигнала датчика напряжения (например, 50 градусов C). Это даст более точное измерение.

Если вы хотите использовать менее 6 батарей типа АА, попробуйте повышающий преобразователь постоянного тока, например, https://www.sparkfun.com/products/10968 . Связанный пример берет 1V - 4V и составляет 5V. Выход будет подаваться непосредственно на вывод 5 В Arduino, минуя его регулятор.

Чтобы заставить плату работать дольше на батареях, переведите MCU в спящий режим между показаниями датчика. Rocketscream низкой библиотека питания отлично подходит для этой цели. Но это действительно полезно только при использовании эффективного регулятора / преобразователя постоянного тока, поскольку стандартный регулятор Arduino сам по себе потребляет 10 мА!

geometrikal
источник
1

Ответ на вопрос Есть ли другой способ надежного измерения выходного напряжения датчика?

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

Одним из простых вариантов является использование внутреннего эталонного напряжения внутри Arduino (т.е. контроллера Atmega).

См. Ссылку ниже, где приведен пример кода для использования внутреннего АЦП (имя функции Arduino - analogReference (DEFAULT))

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

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

robomon
источник
Я не уверен, насколько уместен "Взлом Wifi Finder" - я не могу найти там что-нибудь уместное. По поводу внутренней ссылки АЦП - я об этом писал. Это не работает, даже когда Arduino питается от USB. А когда плата питается от аккумулятора сотового телефона (3,7 - 4,5 В), это еще хуже.
Усов
Извините, это ошибка копирования / вставки. Скоро исправлю ссылку!
Робомон
@Usov ссылка исправлена!
Робомон
Внутренний ток 1.1 В может плавать более чем на 10% в соответствии со спецификацией atmega328. Это тоже не очень надежная ссылка.
Усов