AVR-USB-MEGA16: измеряем и контролируем температуру |
Написал Сергей Кухтецкий | |
11.06.2009 | |
В этой статье я хочу рассказать о двух небольших разработках, выполненных недавно в лаборатории проблем материаловедения Института химии и химической технологии СО РАН в Красноярске (www.icct.ru). Буду рад, если статья поможет сэкономить время и деньги кому-нибудь из моих коллег, решающих аналогичные проблемы.
Обе конструкции связаны с измерением и регулированием температурных режимов для лабораторных установок. В их основе лежит плата AVR-USB-MEGA16 (http://microsin.ru/content/view/605/44/), которая выполняет следующие функции: Firmware в плате AVR-USB-MEGA16 спроектировано таким образом, что управление всеми необходимыми ресурсами микроконтроллера (инициализация портов, таймеров, ШИМ и т. п.) происходит со строны хоста через класс-обертку ATMega16. Поэтому единственное firmware подходит для всех проектов ПО хоста, опубликованных в статье. Все проекты ПО хоста разработаны с использованием свободно доступной на сайте Microsoft среды разботки - Visual Studio 2008 Express Edition (http://www.microsoft.com/express/download/). Для работы с USB используется библиотека libusb-win32, которую можно скачать с сайта http://libusb-win32.sourceforge.net. Для построения графиков используется бесплатная библиотека zedGraph. Ее можно загрузить с сайта http://sourceforge.net/projects/zedgraph/. Все необходимые комментарии находятся в исходных файлах. Проекты и firmware, описываемые в статье, можно скачать здесь – http://microsin.ru/Download.cnt/avr/termoctrl/090610termo-firmware&host.zip. Устройства (или их фрагменты), представленные в данной статье, могут использоваться не только в физико-химической лаборатории, но и в быту. Например, системы типа «умный дом» - регулирование температуры в помещениях, недорогая реализация «хитрых» температурных режимов кухонной печи или духовки, водонагреватели и т.п. Другие примеры – моделирование естественных температурных режимов для обитателей аквариумов или растений в теплицах.
Прежде чем перейти к описанию устройств, необходимо сделать несколько предварительных замечаний. [Блок-схема устройств]
Первая разработка – программируемая водяная баня. Водяная баня – это просто водяной термостат, но в данной задаче температура термостата должна изменяться по некой задаваемой программе и иногда - весьма сложным образом. Мощность – до 1 кВт. Вторая разработка - печь для исследования реакций в сверхкритических флюидах. Температура – от 200?C до 400?C, но выходы на режимы и дальнейшее поведение температуры должно было регулироваться по определенным законам, зависящим от процесса. Мощность – до 3 кВт. Рис.1. Блок-схема регулятора На долю персонального компьютера приходятся интерфейсные, сервисные функции и высокоуровневые функции управления температурой. На долю микроконтроллера платы AVR-USB-MEGA16 – низкоуровневые функции, перечисленные во введении: ШИМ, 1-Wire, АЦП и USB. Начнем с силового блока. [Силовой модуль] Нагреватели питаются от сети переменного тока. Поэтому естественное решение для управления нагревом – фазовая регулировка мощности. Несложных схем тиристорных регуляторов в Сети много. Однако, можно еще упростить решение, если учесть инерционность нагревателя как нагрузки. В этом случае можно перейти к режиму регулирования мощности по количеству целых полупериодов, пропущенных в нагрузку. Для управления яркостью лампочек освещения (диммеров) это не пойдет, т.к. они будут сильно мигать, но для печек или водонагревателей – в самый раз. Единственная задача, возникающая при конструировании таких регуляторов, – синхронизация моментов отпирания симисторов или тиристоров с нулем сетевого напряжения. Можно было бы нагрузить на эту задачу микроконтроллер платы AVR-USB-MEGA16, но более изящное решение - использовать оптосимисторы с детекторами перехода через ноль (Zero Crossing). Например, MOC3061-MOC3063. Этот вариант и был положен в основу силового модуля.
Схема и конструкция Рис.2. Схема силового модуля Токоограничивающий резистор Rin = 330 Ом для выбранной мною микросхемы MOC3061. Симистор – BT137-600 для бани, BT139-800 – для печки. Максимальный ток этого первого симистора в открытом состоянии - 8А, второго – 16А, так что моих этих задачи хватит с запасом. При подаче “0” на вход Vin, симистор откроется в ближайший момент прохождения нуля и нагрузка (нагреватель) будет подключена к сети. При подаче “1” – закроется и нагрузка от сети отключится. На Рис. 3 представлена конструкция силового модуля для водяной бани. Без радиатора симистор может работать на нагрузку 100-150 Вт.
ВНИМАНИЕ! Узлы этой схемы во время работы находятся под высоким напряжением. Поэтому соблюдайте правила электробезопасности при работе с этими устройствами в открытом виде. ПОДАВИТЕ в себе искушение потрогать симистор пальцем в процессе работы (нагрелся или еще не очень)! Рис.3. Конструкция силового модуля
Проверим работоспособность силового модуля самым простым способом. Подадим на Vcc (Рис.2) сигнал от генератора прямоугольных импульсов напряжением около 5 В, Vin – землю. В данной конструкции резистор Rin будет размещен на плате AVR-USB-MEGA16, поэтому на плате силового модуля разъем подключении непосредственно к ножке 1 микросхемы MOC3061. Следовательно, сигнал от генератора нужно подать на разъем через резистор 300-330 ом. В качестве нагрузки подключим лампочку 220 В мощностью до 100 Вт. Мне подвернулась под руку лампочка на 75 Вт. Частоту следования импульсов установим равную 1 Гц. Изменяя длительность импульсов (от 0 до 1 сек) мы можем менять длительность вспышек лампочки от нуля до постоянного свечения. На Рис.4 показан процесс такого испытания. В качестве генератора импульсов я использовал генератор, имеющийся в USB-осциллографе PV6501 (светлая коробочка в правом верхнем углу снимка). Рис.4. Проверяем силовой модуль Силовой блок успешно прошел испытания – идем дальше. Для подключения силового модуля к плате AVR-USB-MEGA16 нужно выполнить маленькую модификацию платы.
Модификация платы AVR-USB-MEGA16 Рис.5. Модернизированная плата. Фрагмент для управления силовым модулем выделен красным
Схема подключения разъема показана на Рис.6. Эта и следующие модификации отмечены красным цветом. Данная модификация – правая на схеме сверху. Рис.6. Схема изменений и дополнений платы AVR-USB-MEGA16 (отмечено красным) Разъем лучше сразу подключить к пину P20 платы AVR-USB-MEGA16 (PD5 микроконтроллера ATMega16), т.к. именно с этого выхода мы впоследствии сможем взять сигнал аппаратного ШИМ.
Помигаем лампочкой через USB Рис.7. Управление лампочкой через USB Все работает. Силовая часть готова для построения простейшего позиционного (релейного) терморегулятора. Но перед этим нам нужно научиться измерять температуру. К этому и приступим. [Работаем с датчиками температуры DS18B20] Следующий этап разработки – очередная (вторая) модификация платы, необходимая для реализации шины 1-Wire. Она позволит нам измерять температуру при помощи недорогих датчиков фирмы Dallas Semiconductor - DS18B20. DS18B20 – это, по сути, готовый цифровой термометр с разрешением до 12 разрядов и способный обмениваться данными по шине 1-Wire. Рабочий диапазон температур от -55oC до +125oC. Время оцифровки температуры для 12 разрядов около 750 мс.
Программная реализация шины 1-Wire Рис.8. Реализация 1-Wire для двух датчиков Интерфейс 1-Wire достаточно хорошо описан в Сети (в том числе и программная реализация на микроконтроллерах AVR). Соответствующие фрагменты кода подробно прокомментированы в исходных файлах программного обеспечения firmware (см. файл «main.c» в архиве «00 Firmware.zip»). Поэтому перейдем к работе с конкретными устройствами 1-Wire - температурными датчиками DS18B20.
Измеряем температуру при помощи датчиков DS18B20
Логика работы приложения следующая (см. файл Form1.cs). После запуска приложения и инициализации USB, запускается таймер timer1sec (в конце метода Form1_Load()). Каждую секунду этот таймер генерирует событие, которое обрабатывается в методе timer1sec_Tick(). В этом методе сначала определяется количество датчиков, подключенных к шине 1-Wire. Если на шине есть датчики, то всем им посылается команда начать оцифровать температуру. Время преобразования не превышает 750 мс. Поэтому после команды «начать преобразование» запускается второй таймер timer750ms. Через 750 мс этот таймер генерирует событие, при котором вызывается метод timer750ms_Tick(). В этом методе таймер timer750ms выключается и далее в цикле опрашиваются все датчики, подключенные к шине. Полученный двухбайтовый код температуры преобразуется в десятичное число со знаком и выводится на экран. Программа отслеживает наличие датчиков в каждом цикле. Поэтому датчики можно подключать и отключать в любой момент. Скриншот работающей программы показан на Рис.9. Первый датчик я положил на настольную лампу сверху, а второй показывает температуру в комнате. Рис.9. Пример работы с несколькими датчиками [Водяная баня] Итак, измерять температуру и вводить в компьютер информацию с датчиков мы умеем, включать и выключать нагреватель из компьютера - тоже. Можно собрать стенд, моделирующий работу водяной бани и поэкспериментировать с первой простейшей моделью регулятора.
Собираем экспериментальный стенд – модель водяной бани Рис.10. Стенд для отработки алгоритмов температурного регулятора Мощность нагревателя составляет около 400 Вт, поэтому симистор силового блока нужно прикрепить к радиатору. Термометр термостата, представляет собой датчик DS18B20, помещенный в узкую пробирку с тонкими стенками, заполненную трансформаторным маслом для улучшения контакта с водой термостата. Второй датчик, измеряющий температуру окружающей среды, воткнут непосредственно в разъем шины 1-Wire на плате AVR-USB-MEGA16. Правильнее было бы поместить его где-нибудь вблизи наружной стенки термостата, но для данных тестов это не так существенно.
Реализуем простейший регулятор
Пример его работы приложения показан на Рис.11. Температурный режим водяной бани запрограммирован следующим образом. Температура бани должна быть поднята до 80oC с шагом 20oC. На каждом шаге – прогрев в течении 20 мин. После прогрева на максимальной температуре – естественное охлаждение до 50oC и поддержание температуры на этом уровне до конца эксперимента. На графике по горизонтали отложено время с начала процесса в минутах, по вертикали – температура термостата в oC. Рис.11. Работа бани с позиционным регулятором Видно, что результат работы простейшего регулятора трудно назвать удовлетворительным. Видны заметные колебания температуры около точек равновесия, есть серьезные выбросы температуры (почти на 5oC) после фронтов нагрева.
Причина плохой работы релейных регуляторов известна и довольно очевидна - тепловая инерция нагревателя. Действительно, как только температура термостата станет равна уставке, нагреватель выключится. Но, нагревателя имеет ненулевую теплоемкость, а его температура несколько выше температуры воды (иначе он просто не будет греть воду). Поэтому нагреватель какое-то время продолжает отдавать тепло в воду, несмотря на то, что он уже отключен от сети. И наоборот. Если температура воды станет меньше заданной - реле включает нагреватель. Но его температура уже сравнялась с температурой окружающей воды. Поэтому должно пройти некоторое время, пока температура нагревателя станет выше температуры воды и он начнет отдавать ей тепло. Один из наиболее действенных способов добиться цели – изменять мощность нагревателя в процессе регулирования температуры. В частности, линейно уменьшать ее при приближении температуры к заданному значению. Т.е. мощность нагревателя устанавливается пропорциональной разнице текущей температуры термостата и уставки. Поэтому такой регулятор называется «пропорциональным регулятором». Он действительно позволяет резко улучшить ситуацию. Но, прежде чем приступить к исследованию такого регулятора мы должны научиться плавно регулировать мощность нагрева.
Делаем ШИМ Силовой модуль в нашей системе управляется дискретно. Симистор закрыт, когда на вход модуля подается «1» (+5В) и открыт, когда «0», причем момент открытия симистора «привязан» к моменту прохождения питающего напряжения через 0. Поэтому, если мы возьмем достаточно длительный период повторения открывающих импульсов (например, 1 сек) и будем изменять их длительность, то мы будем регулировать количество пропущенных к нагрузке полуволн питающего напряжения, т.е. регулировать среднюю мощность, поступающую в нагрузку. Например, при периоде 1 сек, мы сможем регулировать мощность с точностью 1% (в секунде как раз 100 полупериодов сети переменного тока 50 Гц). Как только длительность открывающего импульса станет больше 0.01 сек, каждую секунду в нагрузку будет подаваться 1 полупериод питающего напряжения и нагреватель будет работать с 1% мощностью от номинала. Как только ширина импульса превысит 0.02 сек, то к нагрузке будут проходить два полупериода каждую секунду и мощность возрастет до 2% от номинала и т.д. Когда длительность импульсов сравняется с периодом их следования, все 100 полупериодов будут поступать в нагрузку каждую секунду, и, следовательно, нагреватель будет работать с полной мощностью. Вот так все просто. Реализовать ШИМ можно несколькими способами. Можно реализовать программно на микроконтроллере или на ПК. Но в этом случае мы можем столкнуться со сбоями в работе ШИМ, особенно при малых или больших скважностях импульсов. Это связано с тем, что и микроконтроллер и ПК должен выполнять еще некоторые функции (обмениваться данными по USB, осуществлять их преобразование, вывод на экран и т.д.) и они могут не успевать обработать все прерывания при коротких интервалах. К счастью, в микроконтроллере ATMega16 есть возможность реализовать аппаратный ШИМ с регулируемой частотой следования импульсов и скважностью. Для исследования этой возможности разработаем небольшое приложение, которое представлено в архиве «04 Помигаем лампочкой при помощи ШИМ и USB.zip». Для генерирования сигналов ШИМ используется таймер TIMER1 микроконтроллера. Его инициализация и настройка подробно прокомментирована в исходных файлах проекта ПО хоста (файл «Form1.cs») – это происходит с помощью класса-обертки Atmega16.
Испытаем наш ШИМ-генератор. К выходу платы AVR-USB-MEGA16, который служит для подключения силового блока, подключим силовой модуль с лампочкой 75 Вт (как мы делали в самом начале статьи). А можно и просто воткнуть в этот разъем светодиод или подключить осциллограф. Запустим приложение PWM.exe из указанного архива. Устанавливая различную величину мощности нагревателя, мы увидим, что лампочка или светодиод мигают с различной длительностью в зависимости от установленного значения. На Рис.12 представлена осциллограмма ШИМ-сигнала, полученного с выхода платы AVR-USB-MEGA16 (пин PD5 микроконтроллера). Рис.12. Тестирование аппаратного ШИМ Теперь мы можем приступить к созданию и изучению пропорционального регулятора.
Исследуем пропорциональный регулятор Логика работы приложения следующая. При загрузке формы (метод Form1_Load()) создается объект dev класса ATMega16. В конструкторе этого класса происходит инициализация USB. Если с USB все в порядке, происходит инициализация рабочих переменных и запускается основной таймер программы timer1sec. Этот таймер генерирует события раз в секунду. В обработчике это события и происходит основная работа программы. Вернем к методу Form1_Load(). После запуска таймера timer1sec происходит настройка портов B и D и инициализация таймера Timer1 микроконтроллера ATMega16 для генерирования ШИМ-сигнала с регулируемой частотой и скважностью (управление настраиваемыми ресурсами микроконтроллера поддерживается firmware и классом-оберткой Atmega16). В оставшейся части метода Form1_Load() происходит инициализация библиотеки для построения графиков zedGraph. По событию Tick таймера timer1 вызывается метод timer1sec_Tick() в котором происходит измерение температуры и установка мощности нагревателя в зависимости от ситуации. Измерение температур происходит следующим образом. Вначале определяется количество датчиков на шине 1-Wire. Если это количество не менее двух, то считается что первые два датчика участвуют в процессе (первый датчик измеряет температуру термостата, а второй – окружающей среды). Всем датчикам подается команда «начать преобразование» и включается таймер на 750 мс. По тику этого таймера произойдет считывание значений с датчиков и установка значений соответствующих переменных (см. метод timer750ms_Tick()). Параллельно продолжается работа метода timer1sec_Tick() – регулирование температуры (по их предыдущим значениям, полученным на секунду раньше). Регулирование мощности нагревателя происходит просто. Определяется неувязка err, равная разности текущей температуры термостата и установленной (уставка). В зависимости от значения err устанавливается мощность нагревателя. Если невязка меньше 0, то греть не нужно, мощность устанавливается в 0. Если до желаемого значения далеко (т.е. невязка больше зоны пропорциональности), то мощность устанавливается в 100% от номинала. Если же мы находимся в зоне пропорциональности (т.е. недалеко от уставки), то мощность устанавливается пропорциональной невязке.
Вот, собственно, и вся логика. Пример работы водяной бани с той же программой прогрева, как и в случае позиционного регулятора показана на Рис.13. Мы видим, что никаких колебаний температуры уже нет. Рис.13. Работа бани с пропорциональным регулятором Ширину зоны пропорциональности можно изменять при помощи соответствующего органа управления в верхней части панели программы. При уменьшении зоны, обратная связь становится «жестче», появятся колебания, характерные для позиционного регулятора. При нулевой ширине зоны мы фактически превратим пропорциональный регулятор в позиционный. При увеличении зоны пропорциональности колебания и выбросы уменьшаются, но расплачиваться за это мы будем все большим и большим временем установления режимов. Так что оптимальную ширину зоны пропорциональности нужно подбирать экспериментально в зависимости от конструкции бани и решаемой задачи. В моем случае это оказалось около 14oC.
Но так ли уж все безоблачно для пропорционального регулятора? Если посмотреть внимательно вторую и третью «полочки» (60oC и 80oC на Рис.13), то мы видим, что равновесный уровень заметно ниже уставки (соответственно, 60oC и 80oC). На Рис.14 представлен увеличенный фрагмент. Видно, что систематическая ошибка на уровне 80oC составляет почти полтора градуса. Рис.14. Иллюстрация систематической ошибки регулятора Причина хорошо известна и кроется в самом принципе работы пропорционального регулятора - в уменьшении мощности нагревателя при приближении температуры термостата к заданной. Если температура термостата равна заданной, то мощность вообще становится равной нулю. Поэтому такая система регулирования в принципе не способна компенсировать даже незначительные потери тепла в этой точке. Как видно из рисунка 13, этот эффект усиливается с повышением температуры термостата, т.к. при этом увеличиваются тепловые потери. Для устранения этой ошибки пропорционального регулятора обычно используются более сложные схемы автоматического управления. Одним из наиболее универсальных является, так называемый, «ПИД-регулятор» или его вариант «ПИ-регулятор». ПИД означает «Пропорциональный Интегральный Дифференциальный». Интегральная составляющая регулирующего воздействия пропорциональна суммарной (интегральной) невязке за определенный промежуток времени. Она как раз и может компенсировать ту самую систематическую ошибку чисто пропорционального регулятора. ПИД-регулятор особенно эффективен, когда возможны непредсказуемые воздействия на систему (например, случайный отбор горячей воды из водонагревателя). Однако, в нашем случае все гораздо проще и можно не привлекать «тяжелую артиллерию» в виде ПИД-регуляторов. Для данной задачи мы можем воспользоваться более «физическим» методом регулирования, который называется «методом компенсации воздействия». В случае водяной бани воздействиями являются тепловые потери через стенки термостата и тепловые эффекты химических реакций, происходящих в реакторах, погруженных в баню. Первые воздействия вполне предсказуемы. Они пропорциональны разности температур термостата и окружающей среды. Вклад вторых в лабораторных условиях, часто, можно сделать достаточно малым за счет увеличения теплоемкости термостата. Таким образом, для компенсации систематической ошибки пропорционального регулятора нам нужно просто ввести в регулирующее воздействие новый член, пропорциональный разности температур термостата и окружающей среды. Для этого мне и нужен был второй датчик температуры. Он как раз измеряет температуру окружающей среды.
Пропорциональный регулятор с компенсатором тепловых потерь Рис.15. Работа пропорционального регулятора с компенсатором тепловых потерь Для данной задачи полученного результата вполне достаточно. На этом и остановимся и перейдем ко второй задаче – программированной печи. [Печь] Для измерения температуры в печи датчики DS18B20 уже не подойдут (они работают только до 125oC). Температура печи не должна превышать 400oC. Поэтому можно использовать низкотемпературные термопары. Поскольку термопара выдает аналоговый сигнал – необходимо использовать АЦП (аналого-цифровой преобразователь). В микроконтроллере ATMega16 есть 10 разрядный АЦП. Он достаточно быстрый (около 100 мкс на 10 разрядов) и снабжен аналоговым мультиплексором на 8 каналов. Для данной задачи вполне подойдет. Единственная проблема – малая термо-эдс термопары. Например, для пары медь-константан это порядка 40-60 мкВ/градус. Т.е. при разнице температуры между горячим и холодным спаем 400 градусов, мы имеем эдс всего 16-20 мВ. Поэтому перед АЦП необходимо поставить усилитель.
Термопара
Способов изготовления термопар много. Описания легко найти в Сети. Используемые материалы достаточно легкоплавкие и поэтому я просто сходил в институтскую стеклодувную мастерскую и попросил стеклодува спаять мне две проволочки при помощи горелки на очень узеньком кончике пламени. Проволочки я предварительно пропустил в стеклянные капилляры для электрической изоляции в высокотемпературной зоне. В холодной зоне достаточно лаковой изоляции, которая была на проводниках. У стеклодува получились два маленьких аккуратных шарика-спая. В разрез медного провода я впаял небольшую вилку. Что вышло в конечном итоге - показано на Рис.16. Рис.16. Готовая термопара для отладочных экспериментов Теперь займемся предварительным усилителем.
Усилитель Рис.17. Схема усилителя для термопары Работоспособность усилителя, запас по коэффициенту усиления и балансировку при питании от платы AVR-USB-MEGA16 я проверил на макетной плате (Рис.18). Но перед этим нужно опять слегка модернизировать плату AVR-USB-MEGA16. Схема этой третьей, и последней модернизации изображена на Рис.6 (красным слева). На плате появился еще один разъем, к которому необходимо подпаять +5В, землю и пин P1 (PA0) от АЦП.
Мы будем использовать внутренний источник опорного напряжения для работы АЦП. Поэтому необходима еще одна маленькая модификация. Выпаиваем аккуратно резистор R3 с платы AVR-USB-MEGA16, а пин AREF выводим на этот же разъем для аналоговых модулей. Это опорное напряжение нам потребуется в другом проекте (pH-метр) для смещения двухполярного сигнала в положительную область. Термопара, если горячий спай всегда теплее, чем холодный, будет выдавать однополярный сигнал (медь – плюс, константан – минус для нашей термопары). Поэтому в этом проекте напряжение AREF на внешней плате не потребуется, но резистор R3 отпаять все-таки нужно. Рис.18. Предварительный усилитель на макетной плате
Усилитель на OP07 мне понравился. Запас усиления достаточный, сбалансированный нуль стоит как вкопанный. Заметных шумов и наводок также не наблюдается. Так что можно переносить на печатную плату. Рис.19. Готовый усилитель термопары
Плату усилителя можно соединить с платой AVR-USB-MEGA16 непосредственно, как показано на Рис.20. Рис.20. Вся электроника печи в сборе Теперь осталось разобраться с АЦП.
Работаем с АЦП При создании объекта dev класса ATMega16 происходит инициализация USB. Если все прошло успешно (см. метод Form1_Load()), мы инициализируем АЦП. Собственно говоря работа идет с регистрам ADMUX и статусным регистром ADCSRA.
Сначала указываем, что мы будем работать с внутренним источником опорного напряжения (устанавливаем биты REFS0 и REFS1 регистра ADMUX в 1), разрешаем работу АЦП (бит ADEN регистра ADCSRA – в 1) и задаем коэффициент деления тактовой частоты процессора для работы АЦП (см. комментарий в тексте программы). В конце инициализации запускаем таймер, по событиям которого (каждые 0.1 сек) будем запускать АЦП, считывать и выводить результат. Это происходит в методе timer1_Tick(). Рис.21. Тестирование АЦП Все. Теперь все это нужно собрать вместе в единый стенд, подключить печь и откалибровать термопару. Этим мы сейчас и займемся.
Сборка стенда и калибровка Рис.22. Все готово для калибровки термопары Сам процесс калибровки несложен. Нагреем печь до максимальной рабочей температуры (в нашем случае 400oC). Регулируя коэффициент усиления усилителя (подстроечный резистор «Усиление», Рис.17) добьемся того, чтобы код АЦП был в конце диапазона с небольшим запасом (в случае 10 разрядного АЦП, пусть будет около 900). После этого оставляем печь остывать, фиксируя периодически код АЦП термопары, показания термометра, который считаем образцовым, и температуру холодного спая. Хотя это и не очень принципиально, но лучше производить калибровку именно при остывании печи, чем при нагреве (меньше градиенты температуры в печи).
Для облегчения этого процесса напишем небольшое приложение, которое представлено в архиве «08 Калибруем термопару.zip». Вид работающего приложения показан на Рис.23. Рис.23. Процесс калибровки термопары При нажатии на кнопку «Зафиксировать значения», текущие значения температур T0, T1 и код АЦП сигнала термопары заносятся в список справа панели. Потом по этим данным можно построить градуировочный график или использовать их непосредственно в табличном виде в программе регулятора температуры печи.
Построенный градуировочный график термопары показан на Рис.24. Видно, что в диапазоне от 100oC до 400oC градуировочная кривая хорошо описывается линейной функцией. Уравнение тренда – на графике слева вверху. Поэтому в программе регулятора можно использовать это уравнение для пересчета кода АЦП в градусы (естественно, не забывая прибавить температуру холодного спая, которая измеряется датчиком DS18B20). Рис.24. Градуировочный график Теперь осталось определить оптимальную зону пропорциональности и коэффициент компенсатора для терморегулятора печи и – печь готова. Мы это уже один раз делали при настройке водяной бани, поэтому повторяться не будем. Байты перемычек (fuse bits) ATmega16 должны быть 0xFF (low) и 0x09 (high).
@ S.V.Kukhtetskiy, 2009 [Ссылки]
1. Макетные платы с интерфейсом USB. |
|
Последнее обновление ( 21.10.2010 ) |