Например TDA7294

Форум РадиоКот :: Просмотр темы - Помогите разобратся с терморегулятором на ds18b20
Форум РадиоКот
https://radiokot.ru/forum/

Помогите разобратся с терморегулятором на ds18b20
https://radiokot.ru/forum/viewtopic.php?f=2&t=80659
Страница 1 из 1

Автор:  Bagum_Bagum [ Ср ноя 14, 2012 17:00:25 ]
Заголовок сообщения:  Помогите разобратся с терморегулятором на ds18b20

Нужно организовать сравнение температуры, передаваемой с датчика

Код:
#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 не происходит получается

Автор:  Minor/2 [ Чт ноя 15, 2012 11:53:18 ]
Заголовок сообщения:  Re: Помогите разобратся с терморегулятором на ds18b20

Долго не всматривался,но и так понятно,что оно (сравнение) не пройдет...
Функция 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;
}
}

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/