суббота, 22 февраля 2014 г.

Термостат для защиты от перегрева


Термостат на ATtiny13A для защиты от перегрева.
             Анализ неисправностей силового электронного оборудования показывает, что одним из основных факторов, влияющих на качественные характеристики устройств, является устойчивость компонентов к перегрузу по току. Хорошим признаком ухода в область максимальных величин есть повышенное тепловыделение. То, что предлагает промышленность и доступно пользователям,  для контроля температуры, сложно применить для решения данной задачи.
          В ниже следующем обзоре рассмотрен, простой в реализации, способ  фиксации температуры. Это устройство представляет собой контроллер, далее по тексту термостат. Область применения данного прибора определена необходимостью чёткого соответствия измеренной температуры к заданным параметрам Есть  одно   программное ограничение, что сделано для конкретных целей, диапазон контролируемой температуры находится в пределах от 0ºС до+125ºС. Для примера, в качестве исполнительного элемента, использовано реле. 


             Выбор измерительного элемента остановился на DS18B20, что облегчает процесс калибровки, а точнее в его отсутствие, что очень важно. В данном варианте, для образца, указан один датчик. Из практики, оптимальным можно считать три точки контроля, это транзисторный блок, трансформатор и выпрямительный модуль. Вся логика работы схемы заложена в контроллере ATtiny13A, ссылка на архив с прошивкой прилагается, там также находится макет платы в pdf, формат А5 1:1 . Если тема будет интересной, выложу схемы с двумя и тремя датчиками. Уставка срабатывания и отпускания, выбирается пользователем самостоятельно, находится она в EEPROM по адресу 0x00-верхний порог, 0x01-нижний порог и инициализируется с помощью программатора PoniProg.
                Кратко о работе схемы. Питание 12 вольт, длина соединительных жил датчика около 50 см, но лучше менее, располагать шлейф надо перпендикулярно силовым цепям. С подачей напряжения происходит инициализация контроллера, светодиод led1 "Готовность" начинает промаргивать, а в установившемся режиме горит постоянно, схема подготовлена к измерениям. Если температура в контролируемой точке достигнет порога срабатывания, светодиод led1 гаснет и зажигается led2 “tº”, а также срабатывает реле Rel1. Процесс отпускания идёт в обратном порядке, т.е. реле обесточивается, светодиод led2 гаснет, led1 зажигается.

    Вот так выглядит устройство в сборе.


Один из способов крепления датчика.



Далее, описание как работать с программой и программатором.

         В архиве имеется основная прошивка “tds.hex” и пример, для образца, прошивки EEPROM “tds.eep”. Напомним, в EEPROM находятся уставки срабатывания и отпускания, для наглядности они выбраны как 70º и соответственно 65º. Все операции по переносу данных в контроллер выполняются с помощью программатора PoniProg и соответствующего программного обеспечения. Работы с программатором, касаться не будем, есть подробные инструкции в интернете. Сначала загружаем файл “tds.hex” , а затем “tds.eep”.

Так выглядит окно программы после всех основных прошивок.



Чтобы изменить порог срабатывания термостата необходимо в среде PoniProg поменять вот эти уставки.



Для этого активируем опцию “Edit Buffer enabled”.




           Кликаем на цифру 46, всплывает окно, где в десятичной форме можно задать параметр верхнего уровня порога срабатывания. Все единицы соответствуют единицам градусов в Цельсиях. Hex 46 это шестнадцатеричный эквивалент 70º градусов.




Подобные движения проводим с позицией 41, это нижний порог срабатывания.

И последнее FUSE.


Ссылка для скачивания прошивки Здесь

Пример кода чтения данных датчика ds18b20.
          В данном обзоре используется компилятор, со своей средой, “ WinAVR-20100110” для Cи  . Для примера, в исходнике указана переменная “termo”, где скомпонован результат измерения температура, только целая часть. Вся программа оптимизирована под контроллер attiny13a, и хорошо просматривается в “ PROTEUS”.


/*
 * prog_example_ds18b20_attiny13a
 *
 * Created: 26.06.2014
 *  Author: alexander
 */
 //определяем частоту
#define F_CPU 4800000L
//подключаем заголовочные файлы
#include <avr/io.h>
#include <avr/signal.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//задаёмся прототипом функции, чтения данных датчика ds18b20
void temperature(void);
int8_t volatile termo; //переменная для данных температуры


int main(void)
{

                        
  while(1)
 {    
      temperature() ; //  функцию read ds18b20  
         
 }


 return 0;
}
 //-----------------------------------------------------------------------
 uint8_t therm_reset() //функция подготовки  ds18b20
{
uint8_t i;            // переменная
PORTB&=~(1<<3);      //устанавливаем порт PB3 в низкий уровень
 DDRB|=(1<<3);         //активируем   PB3 как выход
_delay_us(480);//--480  // ждём
DDRB&=~(1<<3);          //активируем   PB3 как вход
_delay_us(60);//--60
  i=(PINB & (1<<3));    //читаем
_delay_us(420);//--420

return i; // возвращаем "1" ok
}
//-------------------------------------------------------------------------
//запись бита
void therm_write_bit(uint8_t bit)
{
PORTB&=~(1<<3);
  DDRB|=(1<<3);
_delay_us(2);//---2
if(bit) DDRB&=~(1<<3);
_delay_us(60);//--60
 DDRB&=~(1<<3);
}
//----------------------------------------------------------------------
//запись байта
void therm_write_byte(uint8_t byte)
{
uint8_t i=8;
while(i--)
{
therm_write_bit(byte&1);
byte>>=1;
}
}          
 //-----------------------------------------------------------------------
 //чтение бита
uint8_t therm_read_bit(void)
{
uint8_t bit=0;
PORTB&=~(1<<3);
 DDRB|=(1<<3);
_delay_us(2);//2
DDRB&=~(1<<3);
_delay_us(14);//--14
if(PINB&(1<<3)) bit=1;
_delay_us(45);//--45
return bit;
}
//---------------------------------------------------------------------

//чтение байта
uint8_t therm_read_byte(void)
{
uint8_t i=8, n=0;
while(i--)
{
n>>=1;
n|=(therm_read_bit()<<7);
}
return n;
}
//----------------------------------------------------------------------
  void temperature(void)
  {
   asm("cli");
  
 uint8_t temperature[2];
 therm_reset();
 therm_write_byte(0xcc);
 therm_write_byte(0x44);
 while(!therm_read_bit());
 therm_reset();
 
 therm_write_byte(0xcc);
 therm_write_byte(0xbe);
 
 temperature[0]=therm_read_byte();
 temperature[1]=therm_read_byte();

  therm_reset();
 // обрабатываем полученные данные в читаемый вид 
  termo=temperature[0]>>4;
  termo|=(temperature[1]&0xf)<<4;
 
  }
 //-------------------------------------------------------------------------------- 

Здесь собраны все файлы для WinAVR, а также схема в “ PROTEUS”.
Здесь рабочий вариант устройства  для точного измерения температуры.      

Мой контакт: avt48@yandex.ua


2 комментария:

  1. Здравствуйте. А можно переделать термостат наоборот, для защиты от переохлаждения.

    ОтветитьУдалить
    Ответы
    1. Нет, в этом варианте проблематично. Данный проект предназначен для защиты от теплового пробоя силового электронного оборудования, там есть свои особенности, а низкие температуры не совсем по теме.

      Удалить