Страница 1 из 1

Обмен по I2C Atmega8 и цифрового датчика температуры.

Добавлено: Чт май 14, 2015 14:41:13
kushman
Добрый день!
Сделал небольшой девайс с атмегой8 и цифровым датчиком температуры MCP9844.
Столкнулся со следующей проблемой: при температурах выше 16-17 градусов, пересчет температуры идет верно, а при более низких температурах начинаются неадекватные показания. Не могу понять с чем это может быть связано, формула пересчета в программу забита из даташита: http://ww1.microchip.com/downloads/en/D ... 05192A.pdf
Запись температуры идет каждый час, вот пример результатов измерения:
HOUR 0:243.687
HOUR 1:244.125
HOUR 2:244.687
HOUR 3:245.187
HOUR 4:245.125
HOUR 5:245.375
HOUR 6:245.250
HOUR 7:244.187
HOUR 8:16.562
HOUR 9:241.000

Судя по значениям, неправильно выбирается формула пересчета (согласно даташиту, если температура ниже нуля - то формула одна, если выше - другая), однако, почему она выбирается при таких значениях а не при 0 не ясно.
Есть у кого какие мысли, товарищи?
Заранее спасибо!

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Добавлено: Чт май 14, 2015 15:39:59
BOB51
Честно говоря ничего особенного не узрел - стандартные данные в двоичном коде с тремя знаками за запятой. :dont_know:
Правила расчета одни и те же, что для положительного значения, что для отрицательного.
Есть правда одна тонкость - но она общая для любого цифрового термометра:
При обработке отрицательной величины надо превращать в абсолютную величину сразу все данные, включая используемые десятичные значения (а не по кускам - отдельно целую часть, отдельно дробную) независимо от того используются ли программой дробная часть или нет.
Иначе погрешность на один градус обеспечена.
:roll:

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Добавлено: Чт май 14, 2015 16:41:31
BorisSPB
Три старших бита результата - это флаги сравнения с пороговыми значениями, если их обрезать - все будет нормально.

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Добавлено: Чт май 14, 2015 20:33:51
BOB51
Дык их (флаги) по-любому к данным относить... :roll: - в даташите все расписано, а как использовать - то уже на усмотрение программописателя.
8)

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Добавлено: Вт май 19, 2015 18:21:28
kushman
Все флаги у меня обнуляются в соответствии с даташитом. Сейчас посмотрел внимательно, у меня были перепутаны формулы для температур ниже и выше нуля. Сделал все как положено, но проблема от этого не пропала. Теперь температура ниже 16 градусов показывается, а если она выше 16, то берется другая формула. Для наглядности вот код, по которому происходит вычисление температуры:

Код: Выделить всё

float temperature(void) {

    float t; 
    char c_byte;
    I2C_Start(); 
    I2C_Send_byte(0x30 & 0xFE); 
    I2C_Send_byte(0x05); //0x05
    I2C_Start();
    I2C_Send_byte(0x30 | 0x01);    
    UpB=I2C_Receive_byte();
    I2C_ACK();
    LwB=I2C_Receive_byte();
    I2C_NOT_ACK();
    I2C_Stop();  
    UpB=UpB&0x1F;
    c_byte=UpB;
    if(c_byte&0x10==0x10) {
    UpB=UpB & 0x0F;  
    t=(256.0-((UpB*16.0)+(LwB/16.0)));
    } else {     
    t=((UpB*16.0)+(LwB/16.0)); 
    };
    return t;
}

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Добавлено: Ср май 20, 2015 08:24:13
BOB51
СИиии :shock:
Это не про меняааууу... :cry:
Работаю токмо с ассемблером и под своими алгоритмами (руководствуясь даташитовским описанием и мактной проверкой).
:oops:

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.

Добавлено: Ср май 20, 2015 21:29:37
kushman
А проблема вовсе не в программе то оказывается. Попробовал передать не пересчитанное значение, а сами байты. В результате выяснилось, что микросхема сама сбрасывает флаг знака температуры. Т.е. при температуре ниже 16 градусов, флаг устанавливается в 0, а должна быть единица. Подскажите товарищи, с чем это может быть связано?