Преобразователь для термосопротивления Pt100

Теория
Сборка платы
Тестовый стенд
Калибровка
Что нужно для проекта
Тестовый скетч

Фото контроллера
Версия для печати

Вернуться на главную

Во многих проектах, представленных на этом сайте, используется термодатчик сопротивления Pt100, но чтобы подключить его к Arduino, нужен преобразователь. Самое простое решение - заказать специальную микросхему на AliExpress (например MAX31865) и не мучаться со схемами, расчетами и пайкой. В свое время автор сайта так и сделал, но, к сожалению, MAX31865 до меня не доехал, а открывать спор и разбираться времени не было (я уезжал на теплоход). Поэтому я обратился к интернету, где и нашел интересное решение с подробным описанием. По сути, страница ниже - это адаптивный перевод найденной статьи. Ссылка на оригинал - здесь. Обратите внимание и на сам сайт - bestengineeringprojects.com - там много интересных идей.

Фото. Преобразователь для термосопротивления Pt100

Преобразователь для термосопротивления Pt100

Итак, на этой странице вы узнаете, как замерить температуру, используя резистивный датчик Pt100 и Arduino. Pt100 - платиновый терморезистор, чье внутреннее сопротивление меняется в зависимости от температуры. Свое название он получил, потому что при 0ºC его сопротивление составляет 100 Ом. Таблицу "температура - сопротивление" для Pt100 вы можете скачать здесь.

Обратите внимание, датчики Pt100 выпускаются в 2-х, 3-х, 4-х проводном исполнении. Где дополнительные соединения компенсируют влияние сопротивления самих проводов. В этом проекте схема рассчитана на 2-х проводное подсоединение. Как показали полевые испытания, при длине проводов от датчика к PLC до 10 метров особенных искажений нет. Если у вас 3-х и 4-х проводные датчики, просто заизолируйте "лишние" провода. Определить дополнительный провод можно по нулевому сопротивлению с основным.

ТЕОРИЯ

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

Сперва соберем простейший делитель напряжения, состоящий из источника питания постоянного тока (5 вольт), постоянного резистора и, собственно, сопротивления Pt100 - Rtd (Resistance Temperature Detector). Схема на рисунке ниже.

Рисунок 1. Делитель напряжения

Рисунок 1. Делитель напряжения

Сопротивление меняется в соответствии с температурой, в результате чего меняется и Vout (падение напряжения на Pt100). Используя формулу делителя напряжения, мы можем вычислить Vout :

Vout = (Vcc x RT1) / (RT1 + R1)

Выбирая номинал постоянного резистора R1, мы должны иметь ввиду несколько моментов :

1. Значение R1 должно быть достаточно большим, чтобы избежать проблему самонагрева. Если мы возьмем сопротивление R1 с маленьким значением, то на терморезисторе RT1 будет большое падение напряжения, как результат - самонагрев, а значит и увеличение погрешности.

2. Значение R1 должно быть достаточно маленьким, чтобы избежать проблему низкого соотношения сигнал-шум. Если мы увеличим номинал R1, изменение напряжения на ºC уменьшится, в результате - низкое соотношение сигнал-шум.

Для правильного выбора значения R1 мы должны выбирать между проблемой самонагрева и лучшего соотношения сигнал-шум. Не будем гадать, и возьмем номинал резистора R1 = 1 KOm.

Теперь выберем диапазон измерения нашего термометра. В данном конкретном случае это будет 0ºC - 190ºC. Если у вас другие параметры, пересчитайте формулы под свои потребности.

Задав Vcc=5 В (питание Arduino) и R1=1 KOm, имеем :

1. Напряжение Vout при 0ºC :
Vout = (5 x 100) / (100 + 1000) = 0,4545 В.
где RT1=100 Om (при 0ºC, данные из таблицы датчика Pt100)

2. Точно также рассчитаем Vout при 190ºC :
Vout = (5 x 172,17) / (172,17 + 1000) = 0,7344 В,
где RT1=172,17 Om (при 190ºC, данные из таблицы датчика Pt100).

Из этих вычислений становится понятно, что нам надо замерить напряжение между 0,4545 В и 0,7344 В.

Внесем небольшое улучшение в схему и добавим фильтр нижних частот (low pass filter). Обычно длина сенсора Pt100 достаточно большая, а проводов тем более. Вместе они могут действовать, как антенна, в результате чего в них наводятся шумы, которые примешиваются к замеряемому напряжению. Чтобы избежать этой проблемы, в схему добавлен конденсатор с большим номиналом (100 мкФ). Он впаивается параллельно сенсору RT1. Этот конденсатор действует, как фильтр нижних частот и убирает практически весь шум.

Рисунок 2. Делитель напряжения с фильтром нижних частот

Рисунок 2. Делитель напряжения с фильтром нижних частот

Далее мы включим в схему повторитель напряжения (voltage follower). Есть две причины его использования.

1. Для исключения проблемы нагрузочного эффекта (loading effect)

2. Более высокое входное сопротивление

Выход с Pt100 (Vout) подается на повторитель напряжения. Сам повторитель напряжения по существу представляет неинвертирующий усилитель (unity gain noninverting amplifier). Этот усилитель называется повторителем напряжения, потому что его выходное напряжение равно и по фазе совпадает с входным. Выход с Pt100 (Vout) соединяется с неинвертирующим контактом, а инвертирующий контакт соединяется напрямую к выходу. Физически в качестве усилителя мы будем использовать один из операционных усилителей микросхемы LM324N.

Рисунок 3. Делитель напряжения с повторителем напряжения

Рисунок 3. Делитель напряжения с повторителем напряжения

Минимальная температура, которую мы будем измерять, 0ºC. Напряжение при этой температуре 0,4545 В. Соответственно, нам надо вычесть это напряжение из напряжения от датчика Pt100, чтобы получить 0 В при 0ºC. Для этих целей нам необходим дифференциальный усилитель. Но прежде, нужно создать источник постоянного напряжения 0,4545 В.

Рисунок 4. Делитель напряжения с подстроечным резистором

Рисунок 4. Делитель напряжения с подстроечным резистором

Этим источником станет еще один делитель напряжения, состоящий из резистора R2 (47 KOm) и подстроечного резистора VR1 (10 KOm). Собрав его, настройте резистор VR1 так, чтобы выходное напряжение с делителя было равно 0,4545 В (или напряжению, эквивалентному минимальной температуре, которую вы собираетесь измерять). Затем мы создадим еще один повторитель напряжения. Так же, как и выше, мы будем его использовать для исключения проблемы нагрузочного эффекта. Выход с делителя постоянного напряжения мы подадим на неинвертирующий контакт второго операционного усилителя микросхемы LM324N, а инвертирующий контакт соединим напрямую с выходным контактом.

Рисунок 5. Делитель напряжения с повторителем напряжения

Рисунок 5. Делитель напряжения с повторителем напряжения

Теперь подошла очередь дифференциального усилителя. Он имеет два входных контакта, которые изолированы от земли одним сопротивлением. Дифференциальный усилитель усиливает только разницу напряжений на двух входных терминалах (инвертирующего и неинвертирующего). Выход с Pt100 (повторителя напряжения) подается на неинвертирующий контакт третьего операционного усилителя микросхемы LM324N, в то время, как выход с источника постоянного напряжения (повторителя напряжения) подается на инвертирующий контакт.

Но это еще не все. Разрабатывая дифференциальный усилитель, нам надо рассчитать коэффициент усиления, то есть до какой степени мы должны усилить входное напряжение. Для этого воспользуемся уравнением дифференциального усилителя, из которого выходное напряжение равно :

Vout = (Rb/Ra)*(V2-V1), где

Rb - резистор цепи обратной связи (feedback)
Ra - входной резистор (input)
V1 - напряжение на инвертирующем терминале
V2 - напряжение на неинвертирующем терминале

Случай 1. Температура равна 0ºC, выход с Pt100 - 0,4545 В, выход с источника постоянного напряжения так же равен 0,4545 В. В этом случае выход с дифференциального усилителя равен 0 В.

Vout = (Rb/Ra)*(0,4545-0,4545) = (Rb/Ra)* 0 = 0

Случай 2. Максимальная замеряемая температура 190ºC, выход с Pt100 - 0,7344 В, тогда

Vout = (Rb/Ra)*(0,7344-0,4545) = (Rb/Ra)* 0,2799

Значит коэффициент усиления = Rb/Ra и нам нужно подобрать правильное соотношение резисторов Rb и Ra.

Но прежде, чем считать коэффициент усиления, нужно выбрать правильное опорное напряжение для Arduino. По умолчанию внутреннее опорное напряжение АЦП (аналого-цифрового преобразователя) Arduino - 5 вольт, но мы также можем использовать и внутреннее опорное напряжение 1,1 В (его можно включить программно).

Если бы мы не усиливали сигнал с помощью LM324, то 10-битный АЦП (1024 градации : 2 в 10 степени) мерил бы входное напряжение при 5 вольтах опорного с разрешением 5/1024 = 0,00488 вольт. Из вышеописанных вычислений мы знаем, что при измерении в диапазоне от 0ºC до 190ºC, нижнее напряжение будет 0,4545 вольт, а верхнее 0,7344 вольт. Разница между ними 0,2799 вольт. Тогда общее количество делений для 0,2799 вольт равно 0,2799/0,00488 = 57,35. То есть приблизительно 57 делений от 0ºC до 190ºC, а значит цена одного деления 190/57 = 3,33ºC. Очевидно, это очень грубо.

А вот если использовать внутреннее опорное напряжение 1,1 вольт, то разрешение АЦП будет 1,1/1024 = 0,001074 вольт, а цена деления в ºC станет 0,73ºC, что вполне приемлемо.

Но так как мы сигнал усиливаем, проблема точности замера не стоит так остро. Для себя я решил взять опорное 1,1 вольт, чтобы подстраховаться от перевольтажа на входе в Arduino (не более 5 вольт). И хотя микросхема LM324 не сможем усилить сигнал больше напряжения питания минус 1 вольт, но вдруг мы будем использовать в качестве питания сторонний источник свыше 5 вольт.

Теперь приступим к расчету коэффициента усиления для нашего дифференциального усилителя. Так как мы будем использовать опорное напряжение 1,1 вольт, то максимальное напряжение, которое сможет считать Arduino, то же будет 1,1 вольт. Следовательно, мы должны усилить максимально возможный в нашем случае дифференциал напряжения (0,2799 вольт) до 1,1 вольт.

Vout = 1,1 В
V2 - V1 = 0,2799 В

Подставим эти значения в уравнение.

Vout = (Rb/Ra)*(V2-V1)
1,1 = (Rb/Ra)*0,2799
Rb/Ra = 1,1/0,2799 = 3,93

То есть коэффициент усиления = 3,93 и номинал резистора Rb должен быть в 3,93 раза больше номинала резистора Ra.

При выборе резисторов нужно учесть следующие факторы :

1. Отношение Rb/Ra должно быть как можно ближе к 3,93
2. Большие значения сопротивления увеличивают шум, но уменьшают потребление энергии

Для наглядности можно составить такую таблицу.

Резистор Ra Резистор Rb Шум Потребляемая мощность
1 1K 3,93K низкий высокая
2 10K 39,3K средний средняя
3 100K 393K высокий низкая

Наилучшая комбинация - под №2. Ближайший из стандартных резисторов 36K, соответственно Ra=10K, а Rb=36K.

Схема дифференциального усилителя будет выглядеть следующим образом :

Рисунок 6. Дифференциальный усилитель

Рисунок 6. Дифференциальный усилитель

Теперь объединим все вышеописанное вместе.

Рисунок 7. Схема температурного преобразователя

Рисунок 7. Схема температурного преобразователя

Пояснения к схеме :

  1. Питание микросхемы LM324 подводится к пинам 4 и 11. Оно общее для всех трех операционных усилителей на схеме.
  2. A0 - аналоговый вход Arduino.
  3. Все выводы +5V соединяются вместе и запитываются от Arduino или шилда.
  4. То же самое относится и ко всем выводам "земли".
  5. Для дополнительной фильтрации сигнала в схему добавлены резистор R7 и конденсатор C2.
  6. Конденсатор C1 - электролитический - соблюдайте полярность.
  7. Емкость конденсатора C1 - 100 мкФ, С2 - 100 нФ.
  8. Мощность резисторов 0,25 Ватт.
  9. При желании на входе питания в термопреобразователь можно добавить светодиод с токоограничительным резистором 220 Ом.

СБОРКА ПЛАТЫ

Схема пайки элементов термопреобразователя представлена на рисунке ниже. За базу взята макетная плата 50х55 мм. Конечно вы можете расположить элементы по другому и более компактно.

Схема пайки термопреобразователя на макетной плате

Схема пайки термопреобразователя на макетной плате

Примечания :

  1. Микросхема LM324N устанавливается в панель DIP14. Хотя вы можете ее сразу впаять в плату.
  2. Питание 5 В имеет подводы в трех вариантах : клеммница, штыревой соединитель "папа" и "мама" для проводов Dupont.
  3. Аналоговый выход для Arduino также выполнен в трех вариантах : клеммница, штыревой соединитель "папа" и "мама" для проводов Dupont.
  4. Клеммницу для подсоединения терморезистора Pt100 выбирайте самую большую и прочную.
  5. Конденсатор C1 - электролитический - соблюдайте полярность.
  6. Мощность резисторов 0,25 Ватт.
  7. На рисунке выше в схему добавлен светодиод, показывающий наличие питания.

Так выглядит термопробразователь в реале.

Распайка платы

Распайка платы

ТЕСТОВЫЙ СТЕНД

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

Схема подключения термопреобразователя для тестирования

Схема подключения термопреобразователя для тестирования

Управлять системой можно с помощью трех кнопок : НАСТРОЙКИ, ВВЕРХ, ВНИЗ. Рассмотрим их функции подробно :

Кнопка НАСТРОЙКИ

При нажатии этой кнопки вы будете циклично переходить по пунктам меню. Изменение параметров осуществляется кнопками ВВЕРХ и ВНИЗ. Изменение цифровых параметров сразу принимается системой, подтверждение не нужно.

Пройдемся по пунктам меню Настройки.

  • Min_Volt XXX (minimum voltage) : нижняя граница вольтажа с аналогового порта переведенный в цифровой вид (1024 градации).
  • Min_Temp XXºC (minimum temperature) : соответствующая нижней границе температура в ºC.
  • Max_Volt XXX (maximum voltage) : верхняя граница вольтажа с аналогового порта переведенный в цифровой вид
  • Max_Temp XXºC (maximum temperature) : соответствующая верхней границе температура в ºC.
  • SaveSet. (UP) : запись настроек в энергонезависимую память Arduino. При нажатии кнопки ВВЕРХ текущие параметры запишутся в постоянную память PLC. При перезагрузке контроллера (выключение - включение) именно эти настройки загрузятся в программу.
  • ReadSet. (UP) : чтение настроек из энергонезависимой памяти Arduino. При нажатии кнопки ВВЕРХ настройки из памяти PLC перейдут в оперативную.
  • Default (UP) : загрузка значений по умолчанию. При нажатии кнопки ВВЕРХ параметры, определенные в начале скетча, загрузятся в оперативную память PLC (в текущие настройки). Эта функция может быть полезна, когда вы запутались в регулировках и хотите все вернуть в исходное положение. Но есть и еще одна причина ее использования. Если вы на одну и ту же плату Arduino постоянно записываете скетчи разных проектов, возможна ситуация, когда параметры одного проекта запишутся в настройки другого. Конечно, это можно исправить, но представьте, что в параметре, где должно быть, например, число 10, стоит 32000. Вручную кнопками ВВЕРХ или ВНИЗ корректировать это очень долго, проще сбросить настройки к заводским, а уже затем их подправить.

Кнопки ВВЕРХ-ВНИЗ

Этими кнопками меняются значения параметров.

ИНДИКАЦИЯ LCD

Верхняя строчка :
"T=XX.XºC V=XXX" - текущая температура в ºC и соответствующий вольтаж, переведенный в цифровой вид
Нижняя строчка :
пункты меню настроек

КАЛИБРОВКА

После того, как плата собрана, ее нужно откалибровать. Для этого загрузим в Arduino тестовый скетч, а затем подключим плату к PLC (аналоговый вход A0, питание от самой Arduino или шилда).

В теории все понятно : напряжение можно замерить, сопротивления и температуры берутся из таблицы датчика Pt100 и подставляются в скетч. Но на практике не все так просто. Дело в том, что компоненты, которые вы будете использовать (резисторы, усилитель), имеют свои погрешности (для обычных резисторов 5%). Питать термопреобразователь можно как от шилда, так и от Arduino, а это немного разные напряжения. Сам мультиметр вносит довольно большие искажения в выходной сигнал при замере.

Хуже того, даже, если вы добьетесь 0,4545 В при 0ºC по термометру, и выставите те же 0,4545 В на нулевом операционном усилителе, на выходе с дифусилителя (пин 8 LM324) вы можете так и не получить желаемый 0 мВ : 0,4545 В с пина 1 минус 0,4545 В с пина 7. Причина в том, что эти сигналы проходят через резисторы R5/R3 и R6/R4, соотношение которых должно быть одинаковым - они определяют коэффициент усиления дифференциального усилителя. Но на самом деле они отличаются (обычные резисторы имеют погрешность 5%), на выходе вы получите некую величину (например 45 мВ). Сразу совет : подбирайте резисторы R3, R4, R5 и R6 вручную (замеряйте сопротивления мультиметром), так, чтобы равенство R5/R3 = R6/R4 было максимальным. Но даже если на выходе с диф усилителя вы не получили 0, страшного ничего нет - программа сама проинтерполирует данные.

Поэтому калибровать преобразователь лучше на реальных температурах (по термометру), а информацию считывать с экрана LCD, а не мультиметра. Итак, при запуске скетча в верхней строчке экрана LCD вы увидите температуру в ºC и соответствующее напряжение в битах (например, Т=22.5ºC V=151). Далее определитесь, от куда вы будете брать питание. Более стабильным считается питание с пинов GRN и VCC аналоговых пинов Arduino (если вы используете шилд со снятой перемычкой).

Стенд для калибровки

Стенд для калибровки

Сначала настроим точку 0ºC, для чего опустим датчик в стакан со льдом и водой (желательно туда же опустить какой нибудь термометр для контроля). Выжидаем стабилизации температуры и потенциометром VR1 добиваемся значения напряжения (V) максимально близким к нулю. На температуру (T) внимание не обращаем. Полученные значения заносим в настройки (V в MinVolt), а температуру в стакане по термометру (НЕ по LCD) в MinTemp.

Теперь настроим точку 100ºC, для чего опустим датчик в кипятильник или потер. Доводим воду до кипения и считываем данные напряжения с LCD. На температуру (T) внимание не обращаем. Полученное значение заносим в настройки (V в MaxVolt), а температуру берем за 100ºC и подставляем в MaxTemp.

После изменений в настройках проверяем показания температуры по LCD. Если есть сомнения, калибруем систему еще раз. Если все нормально, заносим данные замеров с LCD в скетч. Загружаем исправленный скетч в Arduino и перепроверяем все еще раз. При необходимости вносим коррективы.

Результаты замеров в скетче могут выглядеть подобным образом :

  • float Min_Volt = 39;
  • float Min_Temp = 0;
  • float Max_Volt = 546;
  • float Max_Temp = 100;

ЧТО НУЖНО ДЛЯ ПРОЕКТА

Термопреобразователь

  • макетная плата под пайку 50х55 мм - 1 шт
  • клеммница для проводов термодатчика Pt100 - 1 шт
  • клеммница для подвода питания и отвода сигнала к Arduino - 2 шт
  • микросхема LM324N (datasheet) - 1 шт
  • панель DIP14 - 1 шт
  • резистор подстроечный многооборотный типа 3296 (datasheet) на 10К - 1 шт
  • резистор 220 Ом (0,25 Вт) - 1 шт
  • резистор 1К (0,25 Вт) - 1 шт
  • резистор 10К (0,25 Вт) - 2 шт
  • резистор 36К (0,25 Вт) - 2 шт
  • резистор 47К (0,25 Вт) - 1 шт
  • резистор 220К (0,25 Вт) - 1 шт
  • конденсатор электролитический 100 мкФ (25 В) - 1 шт
  • конденсатор керамический 100 нФ - 1 шт
  • светодиод 5 мм (20 мА) - 1 шт
  • провод типа AWG - 10 см
  • штыревой соединитель - 6 шт
  • разъем PBS - 6 шт

Тестовый стенд

  • PLC Arduino UNO (datasheet) - 1 шт
  • Sensor Shield v 5.0 (datasheet) - 1 шт
  • понижающий DC-DC преобразователь типа LM2596 (не менее 2А) (datasheet) - 1 шт
  • LCD-дисплей 1602 (datasheet) + модуль I2C - 1 шт
  • кнопка тактовая с колпачком (datasheet) - 3 шт
  • макетная плата под пайку 30х55 - 1 шт (для монтажа кнопок)
  • резистор 10 кОм (0,25 Вт) - 3 шт
  • стойка мама-мама М3х15 - 8 шт (для монтажа LCD-дисплея и самодельного термопреобразователя)
  • гайка М3 - 50 шт и более в зависимости от способа крепления вышеуказанных элементов
  • болт М3х15, М3х10 - 20 шт и более
  • провод Dupont мама-мама или папа-мама (20 см) - 30 шт и более в зависимости от типа пинов соединяемых элементов
  • провод типа AWG - 50 см (соединение штекер - DC-DC преобразователь - Sensor Shield)
  • штекер питания DC 2.1 мм с клеммной колодкой папа и мама - 1 пара (для подключения шилда)
  • кусок оргстекла или т.п. - 20х30 см (для монтажа всех элементов)
  • болт М6х15 и гайка - 4 шт (ножки оргстекла)

ТЕСТОВЫЙ СКЕТЧ

Ниже представлен скетч системы управления. В этом окне он неудобочитаем, поэтому скачать его в формате ino вы можете по этой ссылке.

Для работы этого скетча вам понадобятся дополнительные библиотеки :

  • EEPROM.h - библиотека работы с памятью (она нужна для чтения и записи наших настроек в энергонезависимую память Arduino). Это стандартная библиотека, она входит в комплект среды программирования Arduino IDE.
  • Wire.h - библиотека для работы с протоколом I2C. Это тоже стандартная библиотека, ее устанавливать не нужно.
  • LiquidCrystal_I2C.h - библиотека для работы с LCD по протоколу I2C. Скачать.

Если есть возможность, проверьте эти библиотеки на наличие обновлений.