Например TDA7294

Форум РадиоКот • Просмотр темы - Помогите разобратся с терморегулятором на ds18b20
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт июл 15, 2025 18:43:08

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Помогите разобратся с терморегулятором на ds18b20
СообщениеДобавлено: Ср ноя 14, 2012 17:00:25 
Родился

Зарегистрирован: Ср ноя 14, 2012 00:31:24
Сообщений: 6
Рейтинг сообщения: 0
Нужно организовать сравнение температуры, передаваемой с датчика

Код:
#include <mega8.h>      //библиотека ввода\вывода
#include <delay.h>      //библиотека задержки
#asm            //сообщаем куда подключен датчик
        .equ __w1_port=0x15; PORTC
        .equ __w1_bit=3
#endasm                 
#asm            //сообщаем куда подключен экран
   .equ __lcd_port=0x18
#endasm
#include <lcd.h>      //библиотека для LCD
#include <1wire.h>      //библиотека работы с 1Wire
#include <ds18b20.h>      //библиотека для работы с датчиком ds18b20
#include <stdio.h>      //стандартная библиотека
char lcd_buffer[33];      //массив с данными для экрана

void main(void)                 
{
unsigned char devices;      //переменная в которой количество присоеденённых датчиков
int temp;
int izm;
DDRD = 0x01;
PORTD.0=0;   
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0
lcd_init(16);         //инициализация LCD, и говорим что он на 16 символов
devices=w1_init();      //ищем датчики
while(devices>0)      //бесконечный цикл, если датчик подключен
   {
    unsigned int u;
   temp=ds18b20_temperature(0);   //читаем температуру
    PORTD.0=0; 
   if (temp>1000)         //если датчик выдает больше 1000
       {               
                temp=4096-temp;      //отнимаем от данных 4096
      temp=-temp;      //и ставим знак "минус"
             }
   sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);   //записываем массив для экрана
   lcd_clear();                  //чистим дисплей перед выводом
   lcd_puts(lcd_buffer);               //выводим массив на LCD
    ADCSRA |= (1 << ADSC);    //Начинаем преобразование
    while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования   
    u = (ADCL|ADCH << 8);  // Считываем  ADC
    if (u > 128)                 //0.625V
      {izm = 0x140;
        while(izm!=temp)
        {
        PORTD.0=1;
        }
        }         
    if (u > 256)                  //1.25V
      {izm = 0x150;
       while(izm!=temp)
        {
        PORTD.0=1;
        }
        }     
    if (u > 384)                  //1.875V
      {izm = 0x160;
         while(izm!=temp)
          {
          PORTD.0=1;
          }
        }   
    if (u > 512)                  //2.5V
      {izm = 0x170;
            while(izm!=temp)
            {
            PORTD.0=1;
            }
        }   
    if (u > 640)                  //3.125V
      {izm = 0x180;
            while(izm!=temp)
            {
             PORTD.0=1;
            }
        }   
    if (u > 768)                  //3.75V
      {izm = 0x190;
        while(izm!=temp)
        {
        PORTD.0=1;
        }
        }   
    if (u > 896)                  //4.375V
      {izm = 0x1B0;
        while(izm!=temp)
        {
        PORTD.0=1;
        }
        }   
    if (u > 1020)                 //5V
      {izm = 0x1C0;
        while(izm!=temp)
        {
        PORTD.0=1;
        }
        }   
    delay_ms(500);
    }
}


не могу понять в какой системе счисления записывается temp

вроде как датчик передает шестнадцатеричный код, но сравнения с izm не происходит получается


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите разобратся с терморегулятором на ds18b20
СообщениеДобавлено: Чт ноя 15, 2012 11:53:18 
Вымогатель припоя

Карма: 6
Рейтинг сообщений: 36
Зарегистрирован: Пт ноя 05, 2010 12:53:36
Сообщений: 536
Откуда: Беларусь Витебск
Рейтинг сообщения: 0
Долго не всматривался,но и так понятно,что оно (сравнение) не пройдет...
Функция ds18b20_temperature(0) "отдаёт" Вам температуру в градусах Цельсия (
float ds18b20_temperature(unsigned char *addr)
this function returns the temperature of the DS18B20 sensor with the ROM code stored in an array of 8 bytes located at address addr.
The temperature is measured in °C. In case of error the function returns the value -9999.
If only one DS18B20 sensor is used, no ROM code array is necessary and the pointer addr must be NULL (0).

), а Вы пытаетесь сравнить её с результатом АЦПреобразования :

u = (ADCL|ADCH <<...); // Считываем ADC
if (u > 128) //0.625V
{izm = 0x140; // izm Вы присвоили значение в 320 градусов (0x140==320)
while(izm!=temp) // вечный цикл,учитывая данные из доки на DS18B20:
{ // Measures temperatures from -55°C to+125°C
PORTD.0=1;
}
}


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y