Ремонт мини-печи (таймер на микроконтроллере AVR с симистором)

Печка

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

Вот решил это дело поправить и заодно попрактиковаться в использовании микроконтроллера ATtiny13A в термически жестких условиях.

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

При разборе механизма выяснилось, что перетерлась ось одной из шестеренок. Центральная ось подходила к переменному резистору от старой микроволновки. Только немного ее подпилил надфилем.

Сам резистор по размеру отлично поместился внутрь механизма.
Пружина оставлена — она после поворота ручки для установки времени возвращает ручку в начальное положение.

Основной контакт решил оставить — он теперь выполняет функцию первоначальной подачи напряжения на микроконтроллер.
То есть в режиме ожидания схема не питается. После старта микроконтроллер подает управляющий сигнал на включение симистора.

Переменный резистор

Программа написана на С в Atmel Studio 6.1.

В качестве основного счетчика времени используется прерывание по переполнению 8-ми битового таймера. Для удобства микроконтроллер работает на частоте 2621440 Гц.
Делитель таймера равен 1024. В этом случае прерывания происходят раз в десятую долю секунды.
Внутренний RC генератор с помощью OSCCAL откалиброван на 10485760 Гц (AppNote: AVR053). Значение OSCCAL у использованного контроллера оказалось равно 0x72 при 4.99 вольт питания, тогда как заводская калибровка была равна 0x60.

Переменный резистор подключен к входу ADC и автоматически опрашивается 10 раз в секунду по переполнению таймера.
Для оповещения использован светодиод и пассивный пьезоизлучатель.

Доработанный механизм

Алгоритм программы прост — ждем максимального значения в течении 2 секунд, оповещаем об этом и начинаем его отсчитывать.
Если повторно производится установка времени — начинаем отсчитывать новое значение.
Если установить очень маленькое значение, повернув ручку на малый угол — печь сразу выключается.
По окончании времени пищим и отключаемся.

В программу встроен механизм авто-калибровки смещения «нуля».
Если в течении 30 секунд после получения времени значение больше минимального, то значение смещения корректируется и запоминается в EEPROM.
Сброс смещения на начальное значение — подержать ручку более 30 секунд в максимальном положении.

Схема
  • +4
  • 17 июня 2013, 12:15
  • vad7
  • 1
Файлы в топике: OvenRepair.zip

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

RSS свернуть / развернуть
КААААТ ))
0
Не хватает обратной связи: «сколько времени осталось до отключения?» стрелочным вольтметром + шим например.
0
Так старый механизм ведь остался. А на нем и указатель времени
0
А толку? Он же уже не крутится сам по себе.
+1
Сначала тоже думал про индикацию, а в итоге оказалось, что она не нужна фактически. Готовность блюда почти всегда определяется визуально. :-)
0
надо было еще электромагнит для звонка приделать
0
R8, наверное, на 56 кОм, а не 56 Ом ;)
0
Тама все верно :-)
0
Внутренний RC генератор с помощью OSCCAL откалиброван на 10485760 Гц.
А ты учел, что он работает при повышенной температуре, а калибровка при этом сбивается?
+1
  • avatar
  • Vga
  • 17 июня 2013, 20:04
Да, но точность здесь особо не нужна. В минуту на пару секунд убегать будет…
0
Угу. Правда, несколько забавно при этом указывать точную частоту)

Я еще не понял один момент — после установки времени нужно вернуть ручку в ноль или оставить на уставке? И как заглушить печь раньше времени?
+1
Там пружина осталась, она возвращает ручку (сразу после отпускания). А отключить по всей видимости «задав новое малое время».
0
В качестве основного счетчика времени используется прерывание по переполнению 8-ми битового таймера. Для удобства микроконтроллер работает на частоте 2621440 Гц. В этом случае прерывания происходят раз в десятую долю секунды.
ну так надо сразу и писать, что таймер тактируется через делитель в 1024.

Внутренний RC генератор с помощью OSCCAL откалиброван на 10485760 Гц.
очень странный подход. калибровать заведомо неточный и нестабильный генератор с такой точностью. при этом еще и для работы в условиях сильно меняющейся температуры, от которой частота генератора прилично зависит.
0
Да, надо действительно по подробней написать.
Про точность — я тут просто использовал уже наработанный блок.
Одна ножка свободна и память еще есть — можно, в принципе, и небольшую подстройку OSCCAL по температуре сделать…
0
R11 не сильно греется? ИНХО, одного ватта маловато будет.
0
1Вт — 0.1А. А кондер ограничивает ток на уровне миллиампер 40-50, если я еще правильно помню формулы.
0
Для 1 Вт резистора схема должна потреблять меньше 100 мА.

Хотя можно обойтись резистором и меньшей мощности: на схеме не указан тип моста BR1, от его максимального импульсного тока будет зависеть сопротивление и мощность резистора R11 (Rогр). Используя мост с достаточно большим током, можно уменьшить сопротивление и мощность этого резистора:

Rогр >= 2 * U1m / Imax,
P_Rогр = (Id ^ 2) * Rогр,

где U1m — амплитудное напряжение сети;
Imax — максимальный импульсный ток моста;
Id — ток нагрузки.
0
Нет, схема потребляет максимум 35-40 mA в момент писка пищалки.
Там из-за самой печки все разогревается градусов до 70. Пришлось барьер делать.
0
А не боитесь использовать в своей схеме блок питания с гасящим конденсатором без гальванической развязки от сети. Епнуть может так, что потом кушать разогретую еду не захочется. Почему не применить нормальный БП? Мало места?
0
В этих печках и так нету ни единой развязанной от сети детали, поэтому ручка таймера изолирована. Да и резистор, как можно заметить, изолированный. Так что епнет скорее от самой печки, а не этой схемы.
0
А не боитесь использовать в своей схеме блок питания с гасящим конденсатором
В современных электронных приборах учёта электроэнергии(электросчётчиках) только такая схема питания электроники и применяется. Там она посложнее, конечно. И работает в режиме 24/7/365.
0
А УЗО не выбивает?
0
А с чего выбивать?
0
Ток идёт с диодного моста на землю.
0
Возможно, это просто обозначение. Я бы не стал подобную вещь соединять с корпусом, даже если оно с трехпроводной проводкой используется.
0
Но если появится человек, который решит повторить схему…
0
«Фирма» веники не вяжет — «фирма» делает гробы.
-1
Это «земля» схемы управления, а не защитный ноль (PE). Этот ток должен вернуться в рабочий ноль электропроводки (N или PEN). И можно лишь предполагать или надеяться, что эта схемная земля не соединена с корпусом аппарата и что УЗО в самом деле есть. Но это уж автор должен лучше знать, как у него сделано.
0
Земля «сигнальная». С корпусом не соединена, конечно.
0
Лучше бы это уточнить, а то и исправить на схеме — там всего одну линию кинуть. Тем более, что выбранный тобой знак означает заземление, а не общий провод.
0
С удовольствием выбрал бы другой, но в протеусе не нашел…
0
И не найдете! Его там просто нет. Если есть необходимость в другом символе «земли», то этот символ необходимо создать вручную
0
А почему запрет прерываний из функции EEPROM_write убрали?
0
Епром читается/пишется только в главном цикле. Ограничений на количество тактов нет, поэтому можно прерываться.
0
Ответил ниже.
0
Ууу, 2-байтовая переменная OffTimer в теле как неатомарно используется. А она ведь изменяется в прерывании.
0
Она volatile.
0
Гм. Я об атомарности изменения переменной забочусь… А volatile это совершенно из другой оперы(про нее много статей в инете). Volatile не обеспечивает отсутствие прерываний между обращениями к разным байтам одного числа в теле программы. Она же не запрещает прерывания!(Можете убедиться в этом, посмотрев листинг). Прерывания руками надо запрещать. Рекомендую простое правило: если переменная(int, long...) изменяется в обработчике — то в теле программы запрещать прерывания при ее чтении и записи. Если же переменная в обработчике только читается — то в теле программы запрещать только при записи в нее.
0
Посмотрел на сгенеренный код — использования ATOMIC_BLOCK() еще позволяет отказаться от volatile, для уменьшения размера кода.
В блоке используется макрос __asm__ volatile ("" ::: «memory»), устанавливающий барьер.
0
Да, по хорошему надо в cli/sei обернуть, а то может теоретически попасть в момент между чтением в промежуточные регистры в значениях, кратных 256.
0
Не в этом дело. Опасность в том, что между установкой флага на запись в епром и стартом записи не должно быть более 4 тактов. А у Вас прерывания разрешены. Вот и вклинится прерывание в эти 4 такта. И после возвращения из обработчика флаг разрешения записи в епром уже протухнет. Поэтому тут тоже нужна «атомарность» — то есть надо запрещать прерывания.
0
В общем случае вместо sei нужно восстановить прежнее состояние прерываний. Вроде в gcc для атомарных есть специальная конструкция. ЕМНИП, ATOMIC_чтототам.
0
В этой программе восстанавливать состояние флага не нужно.
ATOMIC_BLOCK(ATOMIC_FORCEON) — просто обертывает в cli/sei.
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) — восстанавливает предыдущее состояние флагов.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.