Печка за 1580 рублей - Часть 2 Управление и пример работы

Обещанная статья, про управление печкойпервая часть) с помощью контроллера и пример работы печи.
Пример термопрофиля в режиме пайки (нагрев до 97 градусов и удержание температуры 2 минуты, преднагрев до 215 градусов и нагрев до 220 и удержание — отключение по таймеру):
Термопрофиль - пайка с сушкой и преднагревом.

Все подробности под катом.


Что программа умеет:
Есть 5 режимов работы:
  1. Режим ожидания (стартовый), показывается время и текущая температура:
    • По кнопке вверх/вниз выбираются пресеты.
    • Кнопками вправо/влево изменяется программа
    • Кнопка «отмена» сбрасывает программу.
    • Кнопка «ввод» показывает заданную температуру. Удержание в течении 3-х секунд запускает программу.
  2. Режим выбора пресетов, отображается таймер и температура:
    • кнопки вверх/вниз листают пресеты
    • кнопки вправо/влево сохраняют пресеты и переводят в режим изменения программы
    • кнопка «отмена» переводит в режим ожидания (через 5 секунд не активности, произойдет тоже самое).
    • кнопка «ввод» сохраняет выбранный пресет.
    Пресетов пока 6:
    • 40:00 85.0С — предварительная сушка маски
    • 99:59 200.0С — запекание маски
    • 15:00 115.0С — разложение для меднения
    • 15:00 175.0С — оплавление при меднении
    • 00:00 101.0С — сушка от воды
    • 00:30 220.0С — пайка
  3. Режим настройки программы, отображается таймер и температура:
    • кнопки вверх/вниз — уменьшает/увеличивает выбранное значение, удержание включает автоповтор.
    • кнопки вправо/влево — выбор настраиваемого значения: минуты, секунды или градусы. Настраиваемое значение мигает.
    • кнопка «отмена» переводит в режим ожидания.
    • кнопка «ввод» сохраняет настройки.
  4. Режим выполнения программы, отображается таймер и текущая температура:
    • кнопка «ввод» — показывает целевую температуру.
    • любая другая кнопка, приостанавливает выполнение.
  5. Режим паузы, отображается таймер и текущая температура:
    • Кнопка «ввод» показывает заданную температуру. Удержание в течении 3-х секунд запускает программу.
    • кнопка «отмена» переводит в режим ожидания.


Вся программа разбита на модули:
  • Модуль работы с tm1683
  • Модуль для работы с термопарой ads1118
  • Модуль работы с usart
  • Модуль работы с клавиатурой «keyBoard»
  • Модуль контроля температуры «powerControl»
  • Модуль управления «program»
  • Вспомогательный модуль пищалки «beeper»
  • Вспомогательный модуль обновления экрана «gui»
  • Обработчик таймера, дающий тики с разной частотой во все зависимые модули

Структура программы и связи (показаны только основные связи):
Фиолетовым отмечены вызовы по таймеру.
Зеленым — получение данных.
Структура программы и связи

Весь тяжелый код, вынесен в основной поток. Код в таймерах минимальный.
Все самое интересное происходит в модуле контроля температуры.
Модуль активно прогнозирует температуру и рассчитывает время включения подогрева.
Для работы, модуль использует 4 числа:
1) реальную температуру. вычисляется как средняя температура от 32-х измерений.
2) реальную сглаженную температуру (средняя за 8 последних измерений).
3) целевую температуру.
4) температуру прогноза.
Все 4 числа + таймер, раз в секунду сбрасываются на usart, для записи профиля.
Алгоритм расчета прогноза:
  • Если идет нагрев, то прогноз увеличивается на 1.4С каждую секунду (~3/100С каждый тик).
  • Вселеннаяпечка постоянно остывает, это учитывается. Скорость остывания зависит от текущей температуры.
Все числа выбраны по итогам эксперимента с печкой.
// Уведомление от таймера (делаем что-то быстрое)
void powerControl::onTick()
{
    //уменьшаем или увеличиваем внутренную температуру (для предсказания температуры)
    if (timeBeforeCold > 0)
    {
        timeBeforeCold--;
        
        if (PWMCountDown > 0)
        {
            PWMCountDown--;
            //Для контроля PWM (отключение в нужный момент)
            if (PWMCountDown <= 0) _powerOff();
            
            internalValue += TM_WARMUPC;
        }
    }    

    int value = convADS1118::warmDown(realValues[realValuePos]);
    
    if (internalValue > value)
        internalValue -= value;
}


Т.к. это прогноз, то неизбежна ошибка. Они корректируется:
  • Если прогноз меньше реальной, то берем реальную.
  • Если текущая температура меньше средней (т.е. печка остывает) и нагрев не идет, то прогноз равен текущей температуре.
if (isStoped() || intValue < realValue || (realValue < avgValue - TM_005C && timeBeforeCold <= 0))
{
	internalValue = realValue;
	intValue = realValue;
}


На основе 3-х температур: прогноза, реальной температуры и целевой, происходит расчет времени включения подогрева:
//Функция для проверки необходимости включения подогрева и расчета времени включения
bool powerControl::_checkWarmUp(uint realValue, uint intValue, uint targetValue)
{
	if (realValue < targetValue) //Если еще не нагрели, то пытаемся греть...
	{
		if (timeBeforeCold <= 0 && intValue < targetValue) // Если еще не греем, то считаем, насколько греть...
		{
			//посчитать насколько запустить нагрев (не менее 0.1 сек)...
			int tmpTime = (targetValue - intValue + TM_02C)/TM_WARMUPC + TIM_01Sec;
			
			if (tmpTime >= TIM_MIN_WARMUP)
			{
                                PWMCountDown = tmpTime;
                
				if (tmpTime < TIM_2Sec)
					timeBeforeCold = tmpTime + TIM_2Sec;
				else
					timeBeforeCold = tmpTime + 1;
				
				_powerOn();
			}
		}
		
		return(realValue > targetValue - TM_05C); //Если пол-градуса недогрели, то не важно
	}
	return true; //Нагрели...
}


Т.е. программа делает прогноз температуры, учитывает инерцию нагрева, и отключает нагрев заранее, что позволяет удерживать температуру точнее, при максимальной скорости нагрева.

Еще из особенностей работы алгоритма:
Нагрев проходит в 3 этапа:
  1. Сушка — прогрев до 97 градусов и выдержка при этой температуре в течении 2-х минут.
  2. Предварительный прогрев — прогрев на 5 градусов меньше целевой и выдержка при этой температура 1 минуту.
  3. Прогрев до целевой температуры и выдержка при ней заданное время.
Этап сушки, будет пропущен в 2-х случаях:
  • если целевая температура меньше 100 градусов (вода не закипит, поэтому это безопасно)
  • если текущая температура уже больше 100 градусов (вода все равно закипит, мы ничего делать не можем)

Для индикации работы печи, на каждом этапе мигает свой диод (слева на право). Правый диод показывает включение нагрева.
По окончании работы, все диоды мигают (кроме последнего). Планировалось, что по окончании работы, будет писк, но случился трабл: на ножке контроллера всегда 1.6вольта. Видимо я ее перегрел, когда паял… Поэтому пока без пищалки…

Видео работы (скучное, т.к. не умею монтировать):
В начале показано как задавать программу: пресетами и руками.
В 1:03 запуск программы «сушка».
В 1:56 при температуре 72 градуса отключается подогрев (гаснет правый стетодиод).
В 4:08 программа завершается.


UPDATE: Поправил описание принципа расчета прогноза.
Файлы в топике: oven.zip

Комментарии (33)

RSS свернуть / развернуть
я бы до 97 не грел при сушке, т.к. это фактически уже кипение. разность давлений и наличие примесей могут легко заставить воду закипеть при 95градусах
0
  • avatar
  • xar
  • 02 мая 2014, 22:36
Не осилил смысла с каким то прогнозом, чем классический регулятор не устраивает? Жесткость и скорость реакции можно сделать любую.
0
Хотя, это не прогноз а задание
0
Точность выше. В одном случае, печь уже остывает и тогда мы ее греем. А тут мы греем заранее, предполагая, что печь остывает. Кроме того, при нагреве, из-за инерции она гарантировано будет перегрета. Причем градусов на 10 легко. Если сушишь маску при 85 градусах, то 95 это уже запоротая маска.
0
Для этого есть ПИД-регулятор. Хотя по сути, D-компонент предсказанием и занимается. Правда, ПИД еще настраивать надо.
0
Что-то странное. Или народ празднует и еще не читал… Или не интересно/не нравится… Ни комментариев, ни плюсов/минусов )
0
А задумка управления толковая. Зря я все на бетонный блок ругался. Расчет прогноза сходу понять не удалось, все какие-то неведомые операции.
0
Суть проста: экспериментально выяснил, что печь греется на 1.4 градуса/секунда. Остывает в зависимости от температуры: от 0.01 до 0.1 градус/секунда. Далее все просто:
если греем, то увеличиваем прогноз
постоянно, уменьшаем прогноз в зависимости от РЕАЛЬНОЙ температуры.

Для коррекции неизбежной ошибки используем алгоритм:
1) реальная всегда меньше либо равна прогнозу
2) если печь остывает, то прогноз равен реальному.
0
Занятно наблюдать, как человек изобретает PID регулятор :)
0
Я еще только изучаю электронику. И пока даже не знаю, что такое PID регулятор. Да и самому сделать — интересно )
+1
PID регулятор не совсем к электронике относится=)) это всемогущее ТАУ!
0
Это не важно. Я узнал что-то новое. Это главное. Раздел я выясню после изучения.
0
Вы вроде способный человек. Почему бы вам не потратить немного времени на более или менее систематическое образование? Иначе будете тратить его на изобретение велосипедов…

Серьезно, заниматься электроникой не имея никакого представления о ТАУ, кроме интуитивного, достаточно бессмысленно. Ведь большая часть того что вы хотите сделать — системы управления. Если хотите, накидаю вам ссылок на учебники для начинающих.
+1
Да. Конечно давайте. Спасибо.
0
Тут важно понимать, что это хобби. ) Пока что-то делаю узнаю новое.
0
Это хобби может перерасти во что-то более серьезное, не стоит себя ограничивать.
0
Я и не ограничиваю )
Но я понимаю, что пока программирование это мой хлеб. И чем дальше тем больше…
0
У меня ситуация обратная… с железа приходится уходить в программирование… Как-то пока не сопоставимы (в плане хлеба) эти два направления…
0
Об этом и речь… Особенно, если ты попал в струю… Я не знаю пока альтернативы своему заработку.
0
График зачётный!
Я уже давно собираюсь сделать себе что-то подобное. Но как-то лень, да и не знаю как.
Честно говоря, меня не столько волнует точность температуры какой-то там точки, куда приделана термопара, сколько равномерность нагрева предмета. Я знаю, что у меня на утюге жуткие градиенты, поэтому паять на нём платы просто так не получается. Тут никакая схема регулировки не поможет. К тому же платы имеют свойство изгибаться на горячей поверхности — опять проблемы. В общем так и живу с утюгом на его родном механическом термостате =)
Я давно уже думаю, как бы печку слепить, но как-то ничего достойного пока не придумал.
0
Я знаю, что у меня на утюге жуткие градиенты
В этом и суть печки. Замкнутое пространство уменьшает градиенты. А предварительный нагрев на 5 градусов ниже и удержание 1 минуту снижает их еще меньше.
0
А не слишком ли высокая температура, чтобы при ней минуту держать? Даташиты обычно указывают нечто вроде «не долее 10с при температуре выше 250С».
0
ну пайка вроде идет при 220. т.е. преднагрев до 215.
0
Темне менее, в тех термопрофилях, что я видел в датащитах, предпрогрев идет при температуре порядка 150С, а при температуре пайки выдержка порядка 10-20с. Плато на 5С ниже целевой температуры ни разу не видел.
0
Значит исправлю алгоритм. ) Спасибо.
0
Бывает такое, в особенно запущенных случаях, когда надо минимизировать время на температуре пайки. Делается преднагрев для предотвращения коробления платы, потом плавный выход на температуру ниже точки плавления градусов на 10-15 с небольшим плато для активизации флюса, потом быстрый подскок для оплавления припоя на несколько секунд.

Как правило это или датчики, или пайка готовых модулей для поверхностного монтажа.
0
А сейчас с большим плато на большой температуре вы имеете шанс начать пайку с уже испарившимся флюсом. Не надо так делать. Есть риск плохой пайки.

Ну и печь без конвекции, поэтому на особенно быстрые изменения температуры платы не рассчитывайте. Быстро манипулировать температурой могут только конвекционные печи, у вас по любому термопрофиль будет «размазан». Впрочем для любительского применения неважно, это важно когда паяется бессвинцовкой что-то большое и сложное (многослойное).
0
плавный выход на температуру ниже точки плавления градусов на 10-15 с небольшим плато для активизации флюса
А, да. Но все же там не минутное плато.
0
Достаточно секунд 10, чтобы убрать градиенты и активизировать флюс. А дальше довольно резкое оплавление с маленьким плато на позиционирование элементов силами поверхностного натяжения.

В любом случае перед пайкой нельзя долго держать большую температуру, иначе паста лишится флюса — он банально испарится, на что и рассчитан. В профилях пасты можно подробнее посмотреть, там это есть. В общем-то именно эти профили и используются при пайке, профили компонентов — только для справки (чтобы не было выхода за допуски). Все равно никогда не бывает, что паяется какой-то один компонент.

Бывает так, что производитель компонентов рекомендует определенную пасту. Но заставить производство следовать этим рекомендациям почти нереально…
0
И не забудьте сделать вторую часть профиля с охлаждением. Понятно, что резкого охлаждения у вас по любому не будет по причине закрытости конструкции и отсутствия конвекции, но все же желательно проконтролировать этот момент. Иначе на многослойках может быть коробление (нечасто, но бывает).
0
А на этой части есть что-то кроме охлаждения с заданным градиентом? Я не припоминаю, но я и не специалист в этом вопросе)
0
Там все проще, но есть свои тонкости и при охлаждении. Задается или постоянная скорость охлаждения, или она плавно понижается в процессе, от 4 до 2 градусов в секунду. Опять же, зависит от условий и материалов.

Но это больше актуально для конвекции, при печке без конвекции скорее всего достаточно свободного охлаждения — при нем как раз скорость и будет плавно падать.

Особо заморачиваться не стоит, достаточно просто профиль применяемой пасты посмотреть. И рекомендации JEDEC. Ну и учитывать покрытие платы, профили немного отличаются на разных покрытиях (из-за разной смачиваемости и окисляемости).

Вообще особенно многого от печи такой конструкции ждать не приходится, больше чем 6 слоев я бы в нее не стал совать, может покоробиться. Впрочем для любительской практике ничего большего и не нужно.

Я так думаю что главная проблема у автора теперь будет с правильным нанесением пасты, особенно если он хочет паять что-то мелкое.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.