Page 63 of 109

Re: Термостат ∆T=0,1°C

Posted: 10 Jan 2013 18:58
by kenkel
Хорошо- попробую объяснить алгоритм работы твердотопливного котла.
В отличии от инкубатора- основная задача которого поддержание температуры в заданных пределах, твердотопливный котел требует периодической закладки топлива (дров, угля...). Если это не сделать вовремя- котел попросту затухнет. При этом- что-бы не гонять циркуляционный насос вхолостую его нужно отключить. (экономия электрики). Необходимость закладки топлива в котел можно определить по падению температуры теплоносителя на выходе из котла. Актуальность проблемы возростает ночью, когда обслуживающий персонал ( например жена :-) ) попросту спит.
Исходя из выше сказанного городится огород с термостатом.
Итак- растапливаем котел- при достижении температуры уставки (около 20*с) включается циркуляционный насос системы отопления. Система прогревается до определенной температуры (70-80 *С) . Затем система начинает остывать. Опытным путем была определена температура теплоносителя- при которой нужно загрузить топливо Тalarm. При опускании температуры до Talarm термостат должен издать сигнал. Загружаем топливо и процесс повторяется. Если топливо не загружать- при достижении температуры уставки отключается циркуляционный насос.

Re: Термостат ∆T=0,1°C

Posted: 10 Jan 2013 19:25
by IYra
kenkel wrote: Итак- растапливаем котел- при достижении температуры уставки (около 20*с) включается циркуляционный насос системы отопления. Система прогревается до определенной температуры (70-80 *С) . Затем система начинает остывать. Опытным путем была определена температура теплоносителя- при которой нужно загрузить топливо Тalarm. При опускании температуры до Talarm термостат должен издать сигнал. Загружаем топливо и процесс повторяется. Если топливо не загружать- при достижении температуры уставки отключается циркуляционный насос.
Ну тогда примерно так.
Заводим глобальный флаг lHeat = 0. При достижении температуры = 60*С (большей чем Тalarm) флаг
устанавливается в 1 (lHeat = 1). Проверяем условие (lHeat == 1) и (t = Тalarm+диапазон).
Если выполняется - алярм. Флаг сбрасывается в 0 при достижении нижней границы диапазона.

Re: Термостат ∆T=0,1°C

Posted: 10 Jan 2013 22:30
by kenkel
Спасибо за ответ. На данном этапе выяснил- кусок кода выложенный выше- рабочий. Немного расширил диапазон Talarm- 55-54*C. Пока работой термостата удовлетворен.

Re: Термостат ∆T=0,1°C

Posted: 12 Jan 2013 16:45
by kenkel
Вот уже 2 дня гоняю свой термостат для твердотопливного котла (ТТК). Появились мысли по его усовершенствованию.
1. Захотелось вывести на индикатор в каком состоянии находится теплоноситель (идет нагрев или охлаждение). Для этого хочу задействовать на индикаторе сегменты E и F первого символа. Идея заключается в том, что-бы при нагреве (в течении 5 сек)горел сегмент F, соответсвенно при охлаждении сегмент E. При равновесном состоянии (температура стабильна в течении 5 сек)- ничего не горело. Выкладываю свою скромную попытку реализовать задуманное. К сожалению- в программировании я не силен и результатом остался недоволен.

Re: Термостат ∆T=0,1°C

Posted: 12 Jan 2013 19:14
by IYra
kenkel wrote: К сожалению- в программировании я не силен и результатом остался недоволен.
Что не получилось ? конкретней

Re: Термостат ∆T=0,1°C

Posted: 12 Jan 2013 19:53
by kenkel
___________________________________________!_______Имеем ________________________!____Желаемое________________
Что имеем сейчас.- 1- Температура не меняется -! Сегмент Е горит постоянно ! Сегменты E и F не горят
2- Температура поднимается-! Сегмент Е гаснет, Загорается сегмент F ! Горит сегмент F ( сегмент E не горит)
!и тут-же гаснет, Загорается сегмент E !
3- Температура снижается - ! Сегмент Е горит постоянно. ! Горит сегмент E (сегмент F не горит)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------

Re: Термостат ∆T=0,1°C

Posted: 12 Jan 2013 22:04
by IYra
["kenkel"]

Проблема как я понял с алгоритмом вывода сегментов. Не знаю как сделано у вас.
Чтобы понять это нужен ваш проект.
Я бы сделал так. Заводим три глобальные переменные.
BYTE tCount = 0 - счетчик секунд увеличивается на 1 в таймере.
WORD oldTemp - значение температуры 5 сек назад
BYTE nFlag = 0 - что выводить (0 - ничего, 1 и 2 - соотв.сегменты)
Затем проверка после измерения температуры
tCount++
if (tCount==5)
{
if (oldTemp>Temp) nFlag = 1 ;
if (oldTemp<Temp) nFlag = 2 ;
if (oldTemp==Temp) nFlag = 0 ;
oldTemp=Temp;
tCount = 0;
}

Далее nFlag используется в функции PrepareData() для вывода сегментов

Re: Термостат ∆T=0,1°C

Posted: 12 Jan 2013 22:19
by andreich78
kenkel wrote: 2- Температура поднимается- Сегмент Е гаснет, Загорается сегмент F и тут-же гаснет, Загорается сегмент E
Если я правильно понял эту смелую попытку изобразить таблицу...

код я посмотрел, задумано почти правильно, но
думаю, дело вот в чем:
0. нулевую разницу текущего и предыдущего показания датчика ты считаешь за повышение температуры

Code: Select all

//####################### by Kenkel
if (Tnew >= Told)
{ Din =1;}
else
{ Din =0;}
//#################################
1. при остывании значения с датчика меняются медленно. я бы даже сказал очень медленно.
2. датчик настроен на минимальную дискретность, и даже при неизменной реальной температуре показания могут колебаться на величину одного дискрета то вверх, то вниз - это плата за точность.

итого:
температура почти не меняется, датчик выдает дискреты то вверх, то вниз, Din перекидывается то в 0 то в 1, на дисплее скачут твои сегменты.
По уму - надо делать какое-то усреднение по нескольким измерениям, и уже по нему решать, повышается температура, или нет.

Re: Термостат ∆T=0,1°C

Posted: 14 Jan 2013 01:33
by kenkel
Спасибо за подсказки.
Итак- в лоб решить задачу не удалось. Кодевижен ругается на недостаток места в ATTiny2313. В результате проб и ошибок сделал рабочий вариант. Его и выкладываю- строго не судите, это мои первые шаги в программировании.

Движемся дальше. Задача такая- обеспечить работу термостата с циркуляционным насосом, используя его возможность работать на 3 скоростях. Алгоритм работы будет такой:
1- Растапливаем котел. При температуре теплоносителя (Tохл) 22*С включается насос. При достижении Тохл 40*C включается вторая (повышенная) скорость насоса. При достижении Тохл 60*C- включается третья (самая высокая) скорость насоса. При остывании соответственно насос снижает свою скорость- вплоть до полной остановки. Естественно сохраняется функция Alarm. Скорость работы насоса думаю выводить на 3 горизонтальных сегмента первого символа индикатора.
Подозреваю, что для реализации задуманного можности ATTiny2313 ,будет уже недостаточно и придется переносить проект на более мощный камень ( например ATMega8). Надеюсь на Вашу помощь в реализации задуманного.

Re: Термостат ∆T=0,1°C

Posted: 14 Jan 2013 08:01
by andreich78
kenkel wrote:Кодевижен ругается на недостаток места в ATTiny2313. В результате проб и ошибок сделал рабочий вариант. Его и выкладываю- строго не судите, это мои первые шаги в программировании.
...
Подозреваю, что для реализации задуманного можности ATTiny2313 ,будет уже недостаточно и придется переносить проект на более мощный камень ( например ATMega8). Надеюсь на Вашу помощь в реализации задуманного.
тут такое дело - исходный проект выдает на экран температуру с точностью до 0.1С, под хранение температуры используются двухбайтные переменные, и с ними производят вычисления и сравнения. Под твои нужды - это чрезмерная точность. Если пользоваться однобайтовыми переменными, освободится куча места, по кр. мере под твою логику - хватит. Но придется переделать треть программы.

Если будешь мигрировать на другой чип - понадобится ревизия всей программы.

"Выбирай, но осторожно. Но выбирай" (С)

Re: Термостат ∆T=0,1°C

Posted: 14 Jan 2013 19:36
by IYra
kenkel wrote:Спасибо за подсказки.
Надеюсь на Вашу помощь в реализации задуманного.
Не все так страшно. Предлагаю свой вариант термостата (модернизация).
В нем есть три гистерезиса на один датчик (дельта одна - общая). Делалось для теплицы.
Два гистерезиса на нагрев, третий на открывание форточки. Но он пока закомментирован
так как не хватает выводов. Можно убрать точки на индикаторе. Или не выводить с такой
точностью(3 цифры).
Также подключив еще два датчика можете смотреть температуру дома и на улице.
Только вам надо проект немного допилить под себя. Место там хватит.
Кстати предлагаю использовать CodeVisionAVR V2.05.3 Пользуюсь уже месяц.
Глюков пока не замечено и размер программы получется меньше на несколько байтов.
Описание в прикрепленном файле.

Добавлено спустя 10 часов 43 минуты 43 секунды:
В ветке №53 RuTa56c предлагает вставлять
extern BYTE View;
extern BYTE Counter;
extern WORD T_LoadOn;
extern WORD DeltaT;
extern void RefreshDisplay(void);
в файл kbd.h для сборки проекта в CodeVisionAVR V2.0

При этом получаются интересные вещи
размер файла при сборке CodeVisionAVR V1.25.9 - 945 байт
размер файла при сборке CodeVisionAVR V2.05.3 - 957 байт
добавления в файле kbd.h
размер файла при сборке CodeVisionAVR V2.05.3 - 939 байт
добавления в файле kbd.с
Ну это так - информация к размышлению

Re: Термостат ∆T=0,1°C

Posted: 15 Jan 2013 00:24
by kenkel
Спасибо за проект- буду разбираться.
Сегодня разобрал ( фактически снял верхнюю крышку) циркуляционный насос. Цель- понять как коммутируются в нем скорости. В итоге набросал кусок схемы управления насосом. Прошу подсказать электронный эквивалент данной схемы (можно- но не хочу собирать управление на реле).

Пока вырисовывается следующее. Для реализации задуманного мне нужно 4 свободные пина ATTiny2313 (1- Alarm, 3- управление насосом). От точности отказываться не хочу. Скорее всего откажусь от кнопок- по мне проще перешить микру.

CodeVisionAVR V2.05.3 скачал. Попробовал в нем собрать свой последний вариант- не вышло. Буду работать на добром старом CodeVisionAVR V1.25.7a. Интересно, что Ваш проект собрался в V2.05.3 без проблем.

Re: Термостат ∆T=0,1°C

Posted: 15 Jan 2013 08:40
by IYra
kenkel wrote: CodeVisionAVR V2.05.3 скачал. Попробовал в нем собрать свой последний вариант- не вышло. Буду работать на добром старом CodeVisionAVR V1.25.7a. Интересно, что Ваш проект собрался в V2.05.3 без проблем.
Повторяю еще раз. Чтобы все собиралось в V2.05.3 без проблем вам надо вставить в начало файла
kbd.c следующий код
extern BYTE View;
extern BYTE Counter;
extern WORD T_LoadOn;
extern WORD DeltaT;
extern void RefreshDisplay(void);


Но так как вы склоняетесь к варианту без кнопок(кстати помоему для вашего проекта это оптимальный
вариант) то в проекте можно удалить все что сязано с кнопками (файл kbd.c,kbd.h и код в termostat_led.с).
И тогда все это спокойно соберется в V2.05.3
Также убирается все связанное с EEPROM - повышается надежность устройства при сбоях питания.
Хотя все равно супервизор не помешает.
Кстати можно еще ALARM повесить на обрыв датчика. В моем проекте это есть.

А по поводу насоса как я понял на каждую скорость своя обмотка.
Ну и использовать 3 связки оптопара+симистор

Re: Термостат ∆T=0,1°C

Posted: 16 Jan 2013 23:35
by kenkel
Да- похоже что так. На каждую скорость- своя обмотка. Однако боюсь програмных глюков и буду делать управление в связке- транзистор+ реле+симистор. Зима знаете- не хочу рисковать.


"Кстати можно еще ALARM повесить на обрыв датчика. В моем проекте это есть."

Да- это понятно. Кстати- пробовал отключать датчик температуры, насос продолжает работать.
Сегодня после резкого похолодания у нас резко потеплело. Решил поэкспериментировать- поднял температуру отключения насоса до 45*С. Циклическая работа твердотопливного котла позволила не только топить его при плюсовой температуре (обычно в такой ситуации я перехожу на отопление газом) , но и сьекономить топливо. Супер- первый раз в жизни топлю в таком режиме!!!.
Перешил микру- температуру Alarm опустил до 45*С. Температура отключения насоса- 50*C. Посмотрим , что из этого получится.

"Повторяю еще раз. Чтобы все собиралось в V2.05.3 без проблем вам надо вставить в начало файла
kbd.c следующий код"

С этим я разобрался. Пробовал собирать на собственном проекте термостата. Дополнительно нужно вставить- extern WORD Delta T;. Так вот- хекс файл в V1.25.7a- 5 745b, V2.05.3- 5 769b.

Re: Термостат ∆T=0,1°C

Posted: 17 Jan 2013 08:42
by IYra
kenkel wrote:Однако боюсь програмных глюков и буду делать управление в связке- транзистор+ реле+симистор. Зима знаете- не хочу рисковать.
Что за програмные глюки ??? А связка оптопара(переход через 0)+симистор меньше по размерам,
дешевле, надежней и тише.
kenkel wrote: Кстати- пробовал отключать датчик температуры, насос продолжает работать.
При обрыве датчика (если вы вставили мой код) температура = 10999. На дисплее - 9999.
А там вы уж сами програмируйте что нужно включить или выключить.
kenkel wrote: С этим я разобрался. Пробовал собирать на собственном проекте термостата. Дополнительно нужно вставить- extern WORD Delta T;. Так вот- хекс файл в V1.25.7a- 5 745b, V2.05.3- 5 769b.
В какой файл вы вставили ? Вставлять надо в kbd.c тогда размер будет меньше.

Re: Термостат ∆T=0,1°C

Posted: 17 Jan 2013 11:00
by kenkel
Да я не прав- не туда вставлял. V2.05.3- хексфайл- 5708b.
Спасибо за терпение.

Под програмными глюками я имел ввиду ситуацию когда у насоса включатся сразу две скорости одновременно. Как понравится это насосу я не знаю. Не хочу рисковать.

Работаю пока с оригинальным кодом (инкубатор)- переделанным под свои нужды. Кстати- ночные испытания показали, что перевод насоса по скоростям нужно привязывать не к температуре на выходе из котла, а к разности температур- выход\вход. Чем выше разность- тем выше скорость. Температуру Alarm- нужно поднимать с 45 до 52*C. Котел практически потух- а тревожного гудка так и небыло.

Re: Термостат ∆T=0,1°C

Posted: 17 Jan 2013 14:36
by andreich78
kenkel wrote: Под програмными глюками я имел ввиду ситуацию когда у насоса включатся сразу две скорости одновременно. Как понравится это насосу я не знаю. Не хочу рисковать.
ну твоя-то существующая схема включения исключает возможность одновременного включения обмоток. Или ты решил релюшки отрезать и напрямую рулить с МК?
релюшки включены так, что третья замкнет свою обмотку только при включенной второй, вторая - только при включенной первой.

Re: Термостат ∆T=0,1°C

Posted: 17 Jan 2013 15:32
by kenkel
Да- схему на реле я задумывал так. При включении второй скорости- автоматически отключается первая. При этом реле R1- остается во включенном состоянии. При включении третьей (R3)- отключается вторая. Реле R1 и R2- включены. То есть- одновременно может быть включена только одна обмотка на насосе.
Под электронным эквивалентом схемы на реле я имел ввиду- схему в которой была-бы реализована указанная функция.

Напрямую рулить с МК- боюсь.

Re: Термостат ∆T=0,1°C

Posted: 19 Jan 2013 00:51
by kenkel
Решено- делаю спаренный термостат. Верхняя часть- использую свою версию термостата. В ней- Alarm+ общее включение котла (пока для реализации функции циклического включения котла по заданной температуре. В перспективе- думаю посадить на этот пин управление заслонкой на выхлопе из котла). Нижняя часть- вариант термостата от IYra. В ней- управление насосом (3 скорости) по разности температур - выход\вход воды в котел. 3й пин- PD4 думаю получить за счет отказа от индикации десятых градуса.
Пока пробую самостоятельно править исходник от IYra.

Re: Термостат ∆T=0,1°C

Posted: 19 Jan 2013 11:45
by IYra
kenkel wrote:Решено- делаю спаренный термостат. Верхняя часть- использую свою версию термостата. В ней- Alarm+ общее включение котла.
Нижняя часть- вариант термостата от IYra. В ней- управление насосом (3 скорости) по разности температур - выход\вход воды в котел. 3й пин- PD4 думаю получить за счет отказа от индикации десятых градуса.
Если отказаться от кнопок и от индикации десятых градуса (от точки тоже можно отказаться) то получится
6 свободных выходов. Это я к тому что можно все сделать на одном проекте. Опять же Alarm будет общий.
Ну это конечно если без кнопок можно обойтись.

Re: Термостат ∆T=0,1°C

Posted: 19 Jan 2013 19:44
by kenkel
Думаю, что без кнопок пока не обойтись. Нужно погонять термостат в разных режимах- поэтому принято такое решение.

Подправил Ваш исходник под свои нужды. На удивление- в кодевижине V2.05.3 все собралось. За железом поеду завтра. Сегодня решил погонять хекс в протеусе и тут облом. Не показывает температуру протеус. Подскажите, в чем моя ошибка?

Re: Термостат ∆T=0,1°C

Posted: 19 Jan 2013 21:11
by IYra
kenkel wrote:Думаю, что без кнопок пока не обойтись. Нужно погонять термостат в разных режимах- поэтому принято такое решение.
Ну потом когда все устаканится можно расмотреть и бескнопочный вариант
kenkel wrote: Сегодня решил погонять хекс в протеусе и тут облом. Не показывает температуру протеус. Подскажите, в чем моя ошибка?
Протеусом не пользуюсь. Собираю на макетке. На форуме много информации что протеус часто глючит.
Так что не обращайте внимание. Правильно собрать и все заработает.

Добавлено спустя 1 час 6 минут 55 секунд:
А кстати мой проект в Протеусе работает ?

Посмотрел ваши добавления. Нашел несколько ошибок
1.
BYTE Tnew1 ; // температура воды на выходе из котла MOD
BYTE Tnew2 ; // температура воды на входе в котел MOD

заменить на

WORD Tnew1 ; // температура воды на выходе из котла MOD
WORD Tnew2 ; // температура воды на входе в котел MOD

если Gis больше 25.6 то и ее надо делать WORD
2. В условиях на равенство использовать == а не =
3. Реакцию на разницу температур надо ставить после for(ii=0; ii<devices; ii++)
когда будут измерены обе температуры

Code: Select all

       for(ii=0; ii<devices; ii++)
       {
        Tnew = izm_temp(ii) ;
         
        if (ii==0) Tnew1 = Tnew ;          // Первый датчик температура на выходе из котла  
        if (ii==1) Tnew2 = Tnew ;          // Второй датчик 
                  
        if (ii==UBRRL)  // Текущий датчик
        {
        } 
       }   // for
        Tvyvod = Tnew2 ;    // Вывод на индикатор температуры на обратке
        if (( Tnew1 == 10999) | ( Tnew2 == 10999)) 
        {
         PORTD.5 = 1;  // (на индикаторе 9999 ) проблемы с датчиком включаем 3 скорость насоса MOD
        }      
        else
        { 
         Gis = (Tnew1 - Tnew2) ;         
              
         if (Gis >= (T_LoadOn + DeltaT)) PORTD.3 = 1 ; //если разность темп. равна или больше 1 уставки + дельта = включаем 1 скорость насоса            
         if (Gis <= T_LoadOn) PORTD.3 = 0 ;  // если разность темп. меньше 1 уставки = выключаем 1 скорость (выкл. насоса)
          
         if (Gis >= (T_LoadOn1 + DeltaT)) PORTD.4 = 1 ;  //если разность темп. равна или больше 2 уставки + дельта = включаем 2 скорость насоса             
         if (Gis <= T_LoadOn1) PORTD.3 = 0 ;     // если разность темп. меньше 1 уставки = выключаем 1 скорость 
         
         if (Gis >= (T_LoadOn2 + DeltaT)) PORTD.5 = 1 ;    //если разность темп. равна или больше 3 уставки + дельта = включаем 3 скорость насоса 
         if (Gis <= T_LoadOn1) PORTD.5 = 0 ;  // если разность темп. меньше 1 уставки = выключаем 3 скорость
        }         
И что-то вы с портами намудрили PORTD.5 занят левым разрядом дисплея
И ShowDisplayData(BYTE Num) надо править если вы хотите убрать один разряд
Может проше отказаться от точки и выводить 4 разряда

Re: Термостат ∆T=0,1°C

Posted: 19 Jan 2013 23:59
by Satarych
Всем здрасте.
Спаял сей девайс, отличная штука, всё работает. Пришлось правда немного изменить прошивку, поменять выводы на индикатор)).
Собственно зачем пишу. Я достаточно неплохо шарю в программировании, а вот с электроникой только на уровне "спаял - работает, отлично". Хотелось бы разобраться с питанием, слетел у меня EEPROM и в дельту вписалось какое то огромное адовое значение. Каждый раз после фейла перепрошивать как то лень, хочется раз и навсегда разобраться.
1. "При включенном BOD и температуре кристала близкой к 0°С работа устройства оказывалась очень нестабильной - постоянно происходил сброс."
При температуре тиньки или даже только датчика? Если датчик будет на улице в -20 С, а основная схема дома, то с BOD будет нормально работать?
2. На случай работы без BOD. Подойдёт ли такая деталька в качестве супервизора и как её подключать?

Re: Термостат ∆T=0,1°C

Posted: 20 Jan 2013 09:54
by IYra
Satarych wrote:Всем здрасте.
1. Если датчик будет на улице в -20 С, а основная схема дома, то с BOD будет нормально работать?
Должна работать нормально. Проблемы возникают только если Тинька на морозе.
А может вам повезет с Тинькой и она заработает на холоде. Попробуйте ради интереса.
Satarych wrote: 2. На случай работы без BOD. Подойдёт ли такая деталька в качестве супервизора и как её подключать?
Второй вариант предпочтительней тем более деталь копеечная.
Деталька подойдет только надо выбрать с соответствующим порогом, зависящим от питания МК.
Подключать просто - питание и 3 вывод (OUT) к RESET. Ну и не забыть сопротивление между ПЛЮС и Reset

Re: Термостат ∆T=0,1°C

Posted: 20 Jan 2013 18:59
by kenkel
++++++++++++++++А кстати мой проект в Протеусе работает ?++++++++++++++++++++

Ваш проект в протеусе то-же не работает. Нет индикации температуры+ странная реакция на нажатие кнопок.


++++++++++++++Посмотрел ваши добавления. Нашел несколько ошибок++++++++++++++
1. Заменил.....
+++++++++++ если Gis больше 25.6 то и ее надо делать WORD+++++++++++++++++++++
1.1 Сделал....
2.Поменял.....
3. Поменял....

+++++++++++++++++И что-то вы с портами намудрили PORTD.5 занят левым разрядом дисплея+++++++++++++++++++++

Да- с портами я то-же напутал- нужно было PORTD.4.

И ShowDisplayData(BYTE Num) надо править если вы хотите убрать один разряд+++++++++++++++++++++++++++++++++++
Попытался закоментировать вывод 4 разряда- наверное что-то не правильно сделал?


++++++++++++++++++Может проше отказаться от точки и выводить 4 разряда++++++++++++++++++++++++++++

Под точкой Вы понимаете- точку отделяющую целое значение градуса от десятых или точка есть показатель включения нагрузки?
Если второй вариант- то конечно нужно отказаться от точки. Есть мысль- выводить на дисплей скорость насоса например так- 1я скорость= включено нижнее подчеркивание в первом разряде, 2я скорость- включено нижнее и среднее (минус) подчеркивание в первом разряде, 3я скорость- включено нижнее, среднее и верхнее подчеркивание.
Как в таком случае отказатся от точки?

Добавлено спустя 1 час 33 минуты 56 секунд:
PS/ С последним вопросом разобрался- как в железе отключить точку- понятно. Как это сделать в программе- пока не ясно.