ПСДПМ ч.3.2: Термометрия, подключаем ТЭН
Привет, ребятки, из числа подписчиков и не только (если кому-то ещё интересно - можете тоже заходить на огонёк). Как всегда, "пролетели 2 недели", но, программа потихоньку пишется (и уже даже как никогда близка к завершению). Сегодняшний пост будет о реализации обработки ТЭНа, которая жизненно необходима для получения горячей воды в посудомойке. Некоторые моменты я сильно упростил, но, тем не менее, удалось выполнить и эту задачу. Итак, как мы знаем, в нашей машинке имеется ТЭН. Но для его корректной работы необходима обработка данных термометра, чтобы понимать, на какой интервал времени нужно этот самый ТЭН включать. Устанавливать какой-то дополнительный термометр не нужно, он уже есть в машинке.
Нам необходимо показания этого самого термометра обработать. Так как он представляет собой термистор (элемент, изменяющий своё сопротивление в зависимости от температуры), ставится задача провести следующие преобразования:
1. Измерения по сопротивлению термистора (dR от dT)
2. Приведение их к изменению напряжения (преобразование dR в dU) (используется "мост Уитстона")
3. Сравнение полученного напряжения с опорным напряжением, получение разницы в процентном соотношении (в этом нам поможет физик Кларенс Мэлвин Зенер)
4. Приведение полученного соотношения к абсолютному значению температуры в градусах (а в этом нам поможет математика 7 класс)
5. Вычисление ориентировочных интервалов включения ТЭНа по полученным данным
Собственно, на момент написания поста, мною это всё уже проделано и результаты вписаны в историю программы:
Давайте теперь разберём каждый этап.
1. Измерение сопротивления термистора
Так как мы имеем дело с неизвестным термистором, для определения его характеристик, необходим какой-то эталон. В нашем случае я использую готовый покупной термометр, установленный в бак примерно на том же уровне, что и исследуемый. В первоначальную задачу входит запись показаний сопротивления в зависимости от показаний термометра. Практически этот процесс выглядит примерно так:
Тут я столкнулся со следующей проблемой: висячий на воздухе провод термистора ловил целую кучу помех, от насоса, мотора и т.д., поэтому, показания очень сильно прыгали. В данном случае видно, что значению в 26,6 градусов соответствует сопротивление 6,37 кОм. Однако, это совсем не верно. В качестве временного выхода было использовано измерение "на остывание": сначала я разогрел бак до 60 градусов, затем отключил все приборы из сети и измерил повышение сопротивления. Полученные точки показаны на графике (синяя кривая).
Как можно видеть, мы получили примерную характеристику термометра. На участке от 30 до 50 градусов почти линейна, далее немного закругляется в сторону экспоненциальной. Ниже 26 градусов измерить было невозможно, т.к. это была комнатная температура. В целом, этот график позволил сделать следующие выводы:
1. Функция зависимости dR от dT может быть приближена к линейной для температур до 60 градусов (что является заводской температурой в программах для данной машинки)
2. Сопротивление при комнатной температуре начинается от 10-12кОм, следовательно, балластный резистор примем сопротивлением в 15 кОм (т.к. ниже комнатной температуры машинка остывать у нас не будет).
2. Приведение к измерению напряжения
Для измерения напряжения используется слегка видоизмененный измерительный мост Чарльза Уитстона, открытый в 1843 году.
Суть его заключается в сравнении напряжений, полученном с помощью делителя на исследуемом сопротивлении (R1, R2) с опорным (R3, R4). Только, в данном случае, оно даёт как бы "логический" сигнал, где R4 - переменное сопротивление, подбираемое реостатом. А в нашем случае необходимо процентное соотношение, вместо вольтметра используется АЦП, который уже встроен в контроллер ATMEGA328.
3. Сравнение полученного напряжения с опорным напряжением
Хотел бы заострить внимание на следующих моментах:
- Ввиду большого количества помех из-за силовых агрегатов (насосы, клапаны) в качестве опорного напряжения выбирается не резистор, а стабилитрон с балластным сопротивлением. В моём случае нужен был стабилитрон (он же диод Зенера в честь известного физика) на 2,5В. Который заменяется микросхемой TL431 из блока питания, катод соединяется с управляющим выводом). Балластный резистор для него методом подбора выбран на 330 Ом (маловато, но можно оставить и так).
- Т.к. у нас второй "вывод" измерителя АЦП уже подключен к земле по схеме микроконтроллера, мы не можем подавать на него опорное напряжение, это приведёт к замыканию его на землю. Благо, в микроконтроллере на этот случай предусмотрен вывод AREF, на который и подключается опорное напряжение. Противоположный вывод термистора подключаем к одному из входов АЦП (в нашем случае ADC5)
Давайте теперь настроим АЦП на самом контроллере:
Настройка его очень простая:
- Разрешаем считывание показаний АЦП
- Выбираем опорное напряжение с AREF пина (нашего стабилитрона). Специально акцентировал на этом внимание, если REFS1 установить как 0 и REFS0 как 1, то будет выбрано напряжение питания, а на AREF желательно ставить керамический конденсатор. Использование такой конфигурации не всегда рекомендуется, в нашем случае показания начнут плясать, как Айседора Дункан, поэтому устанавливаем оба бита как 0.
- Выбираем ADC5 регистром мультиплексора ADMUX (в нашем случае - вывод 5 он же IN_RS C5 на порту C).
В CheckTemperature просто получаем значение ADC (он же ADCW) после установки соответствующего бита в регистре АЦП. В результате мы "загнали" текущую температуру в доступную нам для работы область.
4. Приведение полученного соотношения к значению температуры
После предыдущего шага мы получили значение в попугаях (процентах): насколько наше исследуемое напряжение превышает или ниже опорного. Так как исследуемое напряжение сконфигурировано резистором на уровень 2,5В и ниже, соответственно, мы будем получать значение от 1024 до 0. (Такое сравнение выбрано, чтобы не терять лишнюю дискретность).
Далее, аналогично с первым опытом были измерены значения температуры в попугаях относительно эталонного термометра. Полученные показания видны на том же графике (бордовая кривая). Как можно видеть, бордовая кривая лежит ниже голубой, что объясняется сопротивлением балластного резистора. Нам это нисколько не мешает, но необходимо будет ввести поправку.
Теперь, наша задача заключается в том, чтобы привести значение в "попугаях" к значению в градусах цельсия. Для этого исследуем зависимость этих двух величин:
Как можно видеть на графике, она представляет собой ветвь функции y = sqrt(x). Видна обратная зависимость значений (в красном квадрате) В нашем случае не требуются очень точные измерения, поэтому мы можем привести следующие простейшие преобразования:
1. Превратим обратную зависимость в прямую. Для этого y = 1024 (макс. значение АЦП) - x
2. Возьмём функцию y = kx + b. K подберём экспериментально, у меня он составил 13,24 для данной системы (при изменении сопротивления хотя бы одного резистора это значение изменится).
3. Сдвиг b подберём эмпирически, у меня он составил 4 единицы (это сдвигает полученный график ближе к середине характеристики), таким образом, погрешность при 25 и при 60 составляет всего лишь 2 градуса Цельсия, что допустимо.
Итак, полученная функция:
Коэффициент округлил до 13, т.к. нет работы с дробными числами. Для тонких термометров необходимо будет её реализовывать, в моём случае это значение нужно лишь для ориентировки, так что им можно пренебречь.
Итак, сверим показания термометров - заводского и нашего (самодельного):
Тут уже сфоткано на тапок, но суть, думаю, понятна. При b = 0 показания сходятся на 28 градусах, на 60 градусах расходятся на 8. При b = 4 Показания равномерно расходятся на 3-4 градуса, поэтому, для получения искомой температуры отключения выгоднее пользоваться попугаями (они более точны), а это значение использовать лишь для визуальной ориентировки.
Была идея сделать пост, посвященный именно термостатированию, если у меня дойдут руки, там исправим все эти недостатки.
5. Реализация работы с ТЭНом
Собственно, мы получили возможность измерять температуру в баке. Для работы ТЭНа реализуем две примитивные проверки:
Проверки сделаны "в 3 этажа", т.к. если делать только одну, то случайная помеха будет вызывать процедуру остановки машины. Периодически такие помехи у меня проскакивали. Поэтому, значение будет подтверждаться аж 3 раза, через 1мс и затем через 10 мс. Если же оно установилось, то ТЭН отключается.
- Первая проверка - догоняем до 60 градусов - 300 попугаев и выключаем ТЭН.
- Вторая - если попугаев очень мало или очень много, значит что-то у нас не так со схемой, выдать ошибку MINTEMP
Собственно говоря, для работы с ТЭНом машинки этого более чем достаточно. Никакого термостатирования в данном случае не требуется, так как машинка достаточно неплохо сохраняет тепло. Если будет необходимость в дополнительном подогреве, нужно будет ещё раз вызвать включение ТЭНа в программе. На данный момент бак прогревается до 62-63 градусов (по самодельному "термометру" это 59-60). После чего сохраняет такое тепло до 30 минут, этого достаточно для одной фазы мойки. Затем можно и подогреть чуть-чуть.
Вот и всё, ребята. На данном этапе практически все приготовления к работе машинки закончены. Программа разрабатывается уже больше месяца, из нереализованного остался только смягчитель воды. Теперь нужно лишь прописать рабочую программу (примерный макет её я набросал):
После этого можно будет испытывать получившийся результат. Далее дело, как говорится, за малым, а с вами был как всегда Kekovsky, спасибо, всем приятных выходных.