Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Bosch BMP085, Някой ползвал ли е този Сензор?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9566
Страница 1 от 2

Автор:  klez [ Вто Ное 29, 2011 5:03 pm ]
Заглавие:  Bosch BMP085, Някой ползвал ли е този Сензор?

Работя по една играчка която ползва този сензор за атмосферно налягане и температура
Свързах го през i2c, прочетох информацията за калибриране на сензора, чета регистрите в които се съдържа температурата, но после при пресмятането по 'простата' формула нещо се прецакват нещата.

http://www.electroguru.net/pics/bmp085.jpg

Тук е описан алгоритъма по който се смятат стойностите.

Първи проблем.
Когато визуализирам стойности (с функцията itoa() обръщам Integer стойностите на променливите в стринг за да ги визуализирам). Ако използвам Двуична бройна система или 16-тична всичко е ок. Обаче ако сложа 10тична бройна система, част от числата стават отрицателни и ... ми е много трудно да зацепя логиката по която точно стават отрицателни.

DECIMAL__________________HEX
AC1=8053_________________0x 1F75
AC2=-1101________________0x FBB3
AC3=-14322_______________0x C80E
AC4=-31380_______________0x 856C
AC5=24929________________0x 6161
AC6=25984________________0x 6580
B1=5498__________________0x 157A
B2=58____________________0x 003A
MB=-32768________________0x 8000
MC=-11075________________0x D4BD
MD=2432__________________0x 0980

100% нещо много сериозно ми убягва и проблема е в мен, уви не можах да го открия.

Другото което е, че нещо не мога да осмисля тая формула за смятането на налягането от горната картинка...

Та някой ако е ползвал подобни датчици и има няква идея за ползването им със Atmega8 или 128 или подобен...

В момента ползвам Atmega8, с AVR Studio 5, пиша на C

Автор:  miro_atc [ Вто Ное 29, 2011 5:25 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

klez написа:
Обаче ако сложа 10тична бройна система, част от числата стават отрицателни и ... ми е много трудно да зацепя логиката по която точно стават отрицателни.


Кое му е трудното?
Ако най-старшия бит е 1, числото е отрицателно... т.е. ако е >0x8000

Положително:
8053 = 0x1F75

Отрицателно:
0xFBB3 = -1101

0x10000 - 0xFBB3 = 0x44d = (-1) * 1101


и един съвет - ако числата са unsigned използвай unsigned променливи и като ги печаташ използвай %u ;-)

Автор:  klez [ Вто Ное 29, 2011 5:34 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

хммм...
сега зацепих чак.
Мерси, Миро.

Аз сега гледам и още един проблем. нещо сметките не излизат.

На ръка го смятах преди малко и ст-ста за температурата излизаше 0x4A3 (1187) което ще рече 118.7 градуса, тъй като са на стъпка по 0.1градус целзий.

Сега вкарах алгоритъма който Бош са дали в API-то иии учудващо ама то сметна същата стойност. Което вече.. и аз не знам ко да го правя :)
Функцията която ползвам е следната:
Код:
unsigned int bmp_readT() {
   unsigned long int X1,X2,B5,Temp;
   unsigned long int tempvalue, temperature;
   twiStart(0b01110111, 0); //изпращане на СТАРТ чрез Twi модула. Адрес на Slave у-вото 01110111, 0 = Писане
   twiCommit(0xf4);  Изпращане на адреса на регистъра за писане (0xF4 - контролен регистър
   twiCommit(0x2e); //Изпращане на стойност 0х2е към контролния регистър. Тази стойност показва, че искаме да измерим температурата
   twiStop(); // Изпращане на TWI STOP

   tempvalue = bmp_read16bit(0xf6,0xf7); // Четене на 2та регистъра 0xF6 (Старшите 8 бита) и 0xF7.

   //Пресмятане на температурата използвайки формулата от API-то на Бош, Прочетената информация от ADC-то на сензора и Калибриращите константи
   X1 = (((long) tempvalue - (long) bmp_AC6) * (long) bmp_AC5) >> 15;
   X2 = ((long) bmp_MC << 11) / (X1 + bmp_MD);
   B5 = X1 + X2;
   temperature = ((B5 + 8) >> 4);
      
   return temperature;

}

Автор:  Cekins [ Вто Ное 29, 2011 10:41 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

Да няма някакъв офсет - примерно 100 градуса в + за да може с unsigned да ти дава резултат и в отрицателните градуси. Тъй като гледам 18,7 (+100) градуса - тамън стайна температура :)

Автор:  klez [ Вто Ное 29, 2011 11:13 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

Ще направя някви измервания, но според дейташийта не видях да има такова нещо.

Сега стои на 132.5
в стаята ми едва ли е толкова...
като сложа пръст на него отива на 137.3.
А и с примерните стойности от дейташийта всичко излиза точно без офсет.

Автор:  Cino [ Сря Ное 30, 2011 12:00 am ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

къде чакаш 4,5мс(25,5мс) за конвертиране, не се вижда в функцията
гледам че има EOC пин, bmp_read16bit() ли го гледа

Автор:  Dimitar [ Сря Ное 30, 2011 12:12 am ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

Пич, темературата ти е сметната в стъпки от по 0.1 градус, т.е. това 132.5, дето го смяташ трябва да е 13.2 градуса. Просто го раздели на 10.
ПП. Много студено в тая твоята стая бе - аз ще умра от студ ако в стаята е 13 градуса :D .

Прикачени файлове:
temp.JPG
temp.JPG [ 68.79 KiB | Прегледано 2642 пъти ]
temp.JPG
temp.JPG [ 58.12 KiB | Прегледано 2642 пъти ]

Автор:  klez [ Сря Ное 30, 2011 3:13 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

Димитър, показанието е 1325, деля го на 10 и получавам 132.5 ;) мисля че го бях описал 2 поста по-нагоре

Цино, виж това с чакането... май наистина си прав че съм го пропуснал, довечера ще експериментирам пак, благодаря за забележката.

Автор:  miro_atc [ Сря Ное 30, 2011 3:22 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

Видях че едни променливи трябва да signed, други unsigned... При теб AC4 май не трябва да е с знак, провери си типовете. По възможност разкарай тайпкастването, това може да източник на грешка. Имаш умножение на число със знак, което си заместил с <<, което по принцип е правилно, но съм виждал и компилатори, които не правят разлика между logical и arithmetic shift.

А пък като имаш примерни стойности, просто ги ползвай вместо да четеш от чипа. Така ще видиш проблема в сметките ли е, или в това какво четеш...

Автор:  klez [ Сря Ное 30, 2011 3:26 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

заместването на умножението и деленитето със << и >> съм го взаимствал от API файла който идва със този сензор, там има примерни C, функции.
това с типовете на променливите мисля, че точно е проблема ама ще хвана първо да прочета пак някоя книжка за типовете и после ще продължавам да ръчкам. Иначе информация от регистрите си я чете, като сложа пръст на сензора се забелязва как стойността на 2та регистъра се променя...

Автор:  Dimitar [ Сря Ное 30, 2011 3:46 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

Сори, някак си съм го пропуснал тоя пост по-горе :) .

Автор:  klez [ Сря Яну 18, 2012 12:02 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

След няколко месеца борба имам леко развитие.

Променливата в която чета стойността от ADC-то за температура в дейташийта е описана като SIGNED. Вчера реших все пак да пренебрегна това и да я взема като Unsigned и Воала... всички сметки излизат перфектно.
Проблема е, че 1 от променливите си иска да е LONG а микроконтролера ми не може да ги поеме като Long ще трябва някой друг да пробвам :). Но на ръка като ги смятам поне вече са ОК.
Ще се мъча днеска да оптимизирам колкото се може повече кода че да я събера ама надали ще се получи ;). Една от работните и стойности е около 122 милиона

Автор:  klez [ Сря Яну 18, 2012 1:19 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

Изтрих някои работи дето не ползвам и се събират променливите сега обаче нещо.. На 2 от променливите има сметки които надхвърлят 65536 и там и на 2те места имам проблем.

Код:
UT=  33898  UNSIGNED

X1 = (UT - AC6) * AC5 / 32768
X2 = MC * 2048 / (X1 + MD)
B5 = X1 + X2
T=(B5 + 8) / 16


X1, X2, B5 са ми LONG (макар че B5 Няма нужда)

Ето сметките надолу разбити (на ръка):
--------------------------------------------------------------------
X1 = 7914 * 24929 / 32768
X1 = 197288106 / 32768
X1 = 6021

X2 = -11075 * 2048 / (6021 + 2432)
X2 = -22681600 / 8453
X2 = -2683

B5 = 6021 - 2683
B5 = 3338

T = (3338 + 8) / 16
T = 209 = 20.9 C - OK
----------------------------------------------------------------------
Код:
X1 = 6021;
X2 = -11075 * 2048 / (X1 + bmp_MD);
B5 = X1 + X2;
temperature = ((B5 + 8) >> 4);


Та тук Х1 директно съм го заменил със стойност.
Х2 като заменя '-11075 * 2048' със това което директно се получава (-22681600) и го направя: X2 = -22681600 / (X1 + bmp_MD) си го смята нормално.
Но оставя ли го да сметне -11075 * 2048 и показва 0


Декларирани променливи:
Код:
volatile short bmp_AC1,bmp_AC2,bmp_AC3;
volatile unsigned short bmp_AC4,bmp_AC5,bmp_AC6;
volatile short bmp_B1,bmp_B2,bmp_MB,bmp_MC,bmp_MD;

long X1, X2,B5;
unsigned long tempvalue;
int temperature;

Автор:  ps66 [ Сря Яну 18, 2012 2:05 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

сложи поне едно "L" ... че да знае компилатора какво искаш ...:
X2 = -11075 * 2048L / (6021 + 2432)

Автор:  klez [ Сря Яну 18, 2012 2:09 pm ]
Заглавие:  Re: Bosch BMP085, Някой ползвал ли е този Сензор?

Явно ще трябва още да чета;)
;) сега си играх със X1

Като му дам да сметне първата част: X1 = (tempvalue - bmp_AC6) с променливите си я смята перфектно
Като дам целия израз да сметне .. показва някаква стойност не каквато трябва.
Като заменя в целия израз само TEMPVALUE с число го смята пак като хората.

tempvalue е LONG, X1 също, а другите променливи в израза SHORT и там някъде се бърка щото съм малко глупав и не са ми ясни точно все още математическите изрази с различни по тип променливи :)

пробвах с (long)bmp_AC6 и (long)bmp_AC5
ама пак получава оная другата ст-ст


П.С.
Пробвах да копирам израза директно от BMP_API файла който дават от Бош:

Код:
    X1 = (((long) tempvalue - (long) bmp_AC6) * (long) bmp_AC5) >> 15;
    X2 = ((long) bmp_MC << 11) / (X1 + bmp_MD);
    B5 = X1 + X2;
   temperature = ((B5 + 8) >> 4);
   
   return X1;

Резултата е същият ;)

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/