Фанат науки

 
  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта
Алексей Жуков. Контроллер температуры радиатора на Proteus.

    Написал программу платы управления для преобразователя напряжения на атмеге8. Код программы конечно пока корявый, сейчас пытаюсь изучить использование функций для того, чтобы его оптимизировать. Микроконтроллер контролирует температуру радиатора (включает кулер при нагреве радиатора свыше 39 градусов и отключает схему при температуре радиатора свыше 60 градусов), а так же отключает преобразователь при перегрузке по току (PD3, по прерыванию INT1). Кнопка включения- выключения по прерыванию INT0. Проект в железе пока еще не испытан, но в Протеусе работает!

AlexeyZhukov

Текст программы на CodeVisionAVR:

//МОЙ ПЕРВЫЙ БОЛЕЕ-МЕНЕЕ ЗНАЧИМЫЙ ПРОЕКТ
//ПРОГРАММА ПЛАТЫ УПРАВЛЕНИЯ ЗАЩИТЫ ЭЛЕКТРОУДОЧКИ ATMEGA8,DS18B20,4MHZ.
//07.12.2012, qw1432
//ИСПОЛЬЗУЕТСЯ 2 ПРЕРЫВАНИЯ, ШИНА 1-WIRE, 3 СВЕТОДИОДА, КНОПКА START
//ЗЕЛЕНЫЙ-РАБОТА, ЖЕЛТЫЙ-ПЕРЕГРЕВ, КРАСНЫЙ-ПЕРЕГРУЗКА

#include <mega8.h>
// 1 Wire Bus functions
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=0
#endasm

#include <1wire.h>
#define MAX_DEVICES 8
// ds18b20 temperature sensor functions
#include <ds18b20.h>
unsigned char rom_code[MAX_DEVICES][9];
// объявление глобальных переменных
int temper_rad, devices;
unsigned char start1=0,start, peregruzka=0;

// обработка прерывания int0
  interrupt [EXT_INT0] void ext_int0_isr(void)
  {
    SREG=1;
   if (start1==0)
    {
      start1=1;
      start=start1;
      peregruzka=0;
    }
   else 
   {
     start1=0;
     peregruzka=start1;    
   };
}

// обработка прерывания int1
interrupt [EXT_INT1] void ext_int1_isr(void)
  {
    start1=0;
    start=start1;
    peregruzka=1;
  }

// объявление глобальных переменных
void main(void)
{
// объявление локальных переменных
// инициализация портов ввода\вывода
// Port B initialization

PORTB=0x00;
DDRB=0x00;
// Port C initialization
PORTC=0x00;
DDRC=0b00011111;
// Port D initialization
PORTD=0x00;
DDRD=0b00000000;
// инициализация прерываний
// INT0: On
// INT0 Mode: Rising Edge по возрастающему уровню
// INT1: On
// INT1 Mode: Rising Edge по возрастающему уровню

GICR|=0xC0;
MCUCR=0x0F;
GIFR=0xC0;
// 1 Wire Bus initialization
w1_init();
/* определим сколько устройств DS18B20 подключено к шине 1-Wire */
devices = w1_search(0xf0,rom_code);

//считывание температуры с DS18B20
// глобальное разрешение прерываний

#asm("sei")

while (1)
  {
    temper_rad = s18b20_temperature(&rom_code[0][0]);
    if(temper_rad < 60)
      {
        start=start1;
        PORTC.2 = start;
        PORTC.4 = start;
        PORTC.1 = 0;
        PORTC.0 = peregruzka;
          if (temper_rad >39)
            {
              start=start1;
              PORTC.2 = start;
              PORTC.4 = start;
              PORTC.1 = 0;
              PORTC.0 = peregruzka;
              PORTC.3 =1;
           }
//кулер  
          else
            {
              PORTC.3 = 0;
            }
  }
     else
       
{
         start1 = 0;
         start = start1;
         PORTC.2 = start;
         PORTC.4 = start;
         PORTC.1 = 1;
         PORTC.0 = 0;
         PORTC.3 = 1;
     }
  }
}

 
   © Фанат науки 2010 - 2022.  Все права защищены.  При использовании материалов обязательна ссылка на сайт  www.fanatnauki.ru