Преобразователь для термосопротивления Pt100 |
Во многих проектах, представленных на этом сайте, используется термодатчик сопротивления Pt100, но чтобы подключить его к Arduino, нужен преобразователь. Самое простое решение - заказать специальную микросхему на AliExpress (например MAX31865) и не мучаться со схемами, расчетами и пайкой. В свое время автор сайта так и сделал, но, к сожалению, MAX31865 до меня не доехал, а открывать спор и разбираться времени не было (я уезжал на теплоход). Поэтому я обратился к интернету, где и нашел интересное решение с подробным описанием. По сути, страница ниже - это адаптивный перевод найденной статьи. Ссылка на оригинал - здесь. Обратите внимание и на сам сайт - bestengineeringprojects.com - там много интересных идей. ![]() Преобразователь для термосопротивления 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. Делитель напряжения Сопротивление меняется в соответствии с температурой, в результате чего меняется и 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 :
2. Точно также рассчитаем Vout при 190ºC :
Из этих вычислений становится понятно, что нам надо замерить напряжение между 0,4545 В и 0,7344 В. Внесем небольшое улучшение в схему и добавим фильтр нижних частот (low pass filter). Обычно длина сенсора Pt100 достаточно большая, а проводов тем более. Вместе они могут действовать, как антенна, в результате чего в них наводятся шумы, которые примешиваются к замеряемому напряжению. Чтобы избежать этой проблемы, в схему добавлен конденсатор с большим номиналом (100 мкФ). Он впаивается параллельно сенсору RT1. Этот конденсатор действует, как фильтр нижних частот и убирает практически весь шум. ![]() Рисунок 2. Делитель напряжения с фильтром нижних частот Далее мы включим в схему повторитель напряжения (voltage follower). Есть две причины его использования. 1. Для исключения проблемы нагрузочного эффекта (loading effect) 2. Более высокое входное сопротивление Выход с Pt100 (Vout) подается на повторитель напряжения. Сам повторитель напряжения по существу представляет неинвертирующий усилитель (unity gain noninverting amplifier). Этот усилитель называется повторителем напряжения, потому что его выходное напряжение равно и по фазе совпадает с входным. Выход с Pt100 (Vout) соединяется с неинвертирующим контактом, а инвертирующий контакт соединяется напрямую к выходу. Физически в качестве усилителя мы будем использовать один из операционных усилителей микросхемы LM324N. ![]() Рисунок 3. Делитель напряжения с повторителем напряжения Минимальная температура, которую мы будем измерять, 0ºC. Напряжение при этой температуре 0,4545 В. Соответственно, нам надо вычесть это напряжение из напряжения от датчика Pt100, чтобы получить 0 В при 0ºC. Для этих целей нам необходим дифференциальный усилитель. Но прежде, нужно создать источник постоянного напряжения 0,4545 В. ![]() Рисунок 4. Делитель напряжения с подстроечным резистором Этим источником станет еще один делитель напряжения, состоящий из резистора R2 (47 KOm) и подстроечного резистора VR1 (10 KOm). Собрав его, настройте резистор VR1 так, чтобы выходное напряжение с делителя было равно 0,4545 В (или напряжению, эквивалентному минимальной температуре, которую вы собираетесь измерять). Затем мы создадим еще один повторитель напряжения. Так же, как и выше, мы будем его использовать для исключения проблемы нагрузочного эффекта. Выход с делителя постоянного напряжения мы подадим на неинвертирующий контакт второго операционного усилителя микросхемы LM324N, а инвертирующий контакт соединим напрямую с выходным контактом. ![]() Рисунок 5. Делитель напряжения с повторителем напряжения Теперь подошла очередь дифференциального усилителя. Он имеет два входных контакта, которые изолированы от земли одним сопротивлением. Дифференциальный усилитель усиливает только разницу напряжений на двух входных терминалах (инвертирующего и неинвертирующего). Выход с Pt100 (повторителя напряжения) подается на неинвертирующий контакт третьего операционного усилителя микросхемы LM324N, в то время, как выход с источника постоянного напряжения (повторителя напряжения) подается на инвертирующий контакт. Но это еще не все. Разрабатывая дифференциальный усилитель, нам надо рассчитать коэффициент усиления, то есть до какой степени мы должны усилить входное напряжение. Для этого воспользуемся уравнением дифференциального усилителя, из которого выходное напряжение равно : Vout = (Rb/Ra)*(V2-V1), где Rb - резистор цепи обратной связи (feedback)
Случай 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 В
Подставим эти значения в уравнение. Vout = (Rb/Ra)*(V2-V1)
То есть коэффициент усиления = 3,93 и номинал резистора Rb должен быть в 3,93 раза больше номинала резистора Ra. При выборе резисторов нужно учесть следующие факторы : 1. Отношение Rb/Ra должно быть как можно ближе к 3,93
Для наглядности можно составить такую таблицу.
Наилучшая комбинация - под №2. Ближайший из стандартных резисторов 36K, соответственно Ra=10K, а Rb=36K. Схема дифференциального усилителя будет выглядеть следующим образом : ![]() Рисунок 6. Дифференциальный усилитель Теперь объединим все вышеописанное вместе. ![]() Рисунок 7. Схема температурного преобразователя Пояснения к схеме :
|
СБОРКА ПЛАТЫ |
Схема пайки элементов термопреобразователя представлена на рисунке ниже. За базу взята макетная плата 50х55 мм. Конечно вы можете расположить элементы по другому и более компактно. ![]() Схема пайки термопреобразователя на макетной плате Примечания :
Так выглядит термопробразователь в реале. ![]() Распайка платы |
ТЕСТОВЫЙ СТЕНД |
Прежде, чем начать работать с термопреобразователем, его нужно откалибровать. А для этого нам понадобится тестовый стенд, схема которого представлена ниже. Наша задача найти две точки характеристики "температура-вольтаж", по которым путем интерполяции контроллер будет вычислять температуру, соответствующую полученному с датчика напряжению. ![]() Схема подключения термопреобразователя для тестирования Управлять системой можно с помощью трех кнопок : НАСТРОЙКИ, ВВЕРХ, ВНИЗ. Рассмотрим их функции подробно : Кнопка НАСТРОЙКИПри нажатии этой кнопки вы будете циклично переходить по пунктам меню. Изменение параметров осуществляется кнопками ВВЕРХ и ВНИЗ. Изменение цифровых параметров сразу принимается системой, подтверждение не нужно. Пройдемся по пунктам меню Настройки.
Кнопки ВВЕРХ-ВНИЗЭтими кнопками меняются значения параметров. ИНДИКАЦИЯ LCD
|
КАЛИБРОВКА |
После того, как плата собрана, ее нужно откалибровать. Для этого загрузим в 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 и перепроверяем все еще раз. При необходимости вносим коррективы. Результаты замеров в скетче могут выглядеть подобным образом :
|
ЧТО НУЖНО ДЛЯ ПРОЕКТА |
Термопреобразователь
Тестовый стенд
|
ТЕСТОВЫЙ СКЕТЧ |
Ниже представлен скетч системы управления. В этом окне он неудобочитаем, поэтому скачать его в формате ino вы можете по этой ссылке. Для работы этого скетча вам понадобятся дополнительные библиотеки :
Если есть возможность, проверьте эти библиотеки на наличие обновлений. |
|