Добрый день!
Сделал небольшой девайс с атмегой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 не ясно.
Есть у кого какие мысли, товарищи?
Заранее спасибо!
Обмен по I2C Atmega8 и цифрового датчика температуры.
- Реклама
Re: Обмен по I2C Atmega8 и цифрового датчика температуры.
Честно говоря ничего особенного не узрел - стандартные данные в двоичном коде с тремя знаками за запятой.
Правила расчета одни и те же, что для положительного значения, что для отрицательного.
Есть правда одна тонкость - но она общая для любого цифрового термометра:
При обработке отрицательной величины надо превращать в абсолютную величину сразу все данные, включая используемые десятичные значения (а не по кускам - отдельно целую часть, отдельно дробную) независимо от того используются ли программой дробная часть или нет.
Иначе погрешность на один градус обеспечена.

Правила расчета одни и те же, что для положительного значения, что для отрицательного.
Есть правда одна тонкость - но она общая для любого цифрового термометра:
При обработке отрицательной величины надо превращать в абсолютную величину сразу все данные, включая используемые десятичные значения (а не по кускам - отдельно целую часть, отдельно дробную) независимо от того используются ли программой дробная часть или нет.
Иначе погрешность на один градус обеспечена.
Re: Обмен по I2C Atmega8 и цифрового датчика температуры.
Три старших бита результата - это флаги сравнения с пороговыми значениями, если их обрезать - все будет нормально.
Re: Обмен по I2C Atmega8 и цифрового датчика температуры.
Дык их (флаги) по-любому к данным относить...
- в даташите все расписано, а как использовать - то уже на усмотрение программописателя.

Re: Обмен по I2C Atmega8 и цифрового датчика температуры.
Все флаги у меня обнуляются в соответствии с даташитом. Сейчас посмотрел внимательно, у меня были перепутаны формулы для температур ниже и выше нуля. Сделал все как положено, но проблема от этого не пропала. Теперь температура ниже 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 и цифрового датчика температуры.
СИиии
Это не про меняааууу...
Работаю токмо с ассемблером и под своими алгоритмами (руководствуясь даташитовским описанием и мактной проверкой).

Это не про меняааууу...
Работаю токмо с ассемблером и под своими алгоритмами (руководствуясь даташитовским описанием и мактной проверкой).
Re: Обмен по I2C Atmega8 и цифрового датчика температуры.
А проблема вовсе не в программе то оказывается. Попробовал передать не пересчитанное значение, а сами байты. В результате выяснилось, что микросхема сама сбрасывает флаг знака температуры. Т.е. при температуре ниже 16 градусов, флаг устанавливается в 0, а должна быть единица. Подскажите товарищи, с чем это может быть связано?


