Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.98/281: Рейтинг темы: голосов - 281, средняя оценка - 4.98
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
1

Есть ли у кого примеры применения датчика давления bm085?

21.10.2013, 17:13. Просмотров 50620. Ответов 128
Метки нет (Все метки)

с I2C не очень силен, пока читаю даташит как китайскую грамоту)
примеров найти не смог, есть только для ардуино
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2013, 17:13
Ответы с готовыми решениями:

Чтение датчика абсолютного давления BMP085
Помогите, пожалуйста, разобраться! Датчик был куплен уже на плате.Подключался к...

KP1878BE1. Передача значений с датчика давления по UART
Суть проблемы в следующем: Есть датчик с которого непрерывно посылаются данные...

У кого есть код для энкодера (с ускорением) ?
Быстро крутишь - больше шаг изменения,медленее - меньше. Поделитесь с...

Есть у кого примеры работы с AdoCommand
Как запрограммировать кнопку на запуск Ado команд Или как пользоваться...

Есть у кого примеры DDD проектов?
1) Писали ли вы в стиле ДДД? Как он , этот опыт? 2) Есть ли примеры на...

128
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 02:03 41
взял пример от YTYOUT выше в теме на Си

в примере давление считывается только в минимальном разрешении (OSS == 0)
я попробовал доработать до того алгоритма который а ДШ на сенсор, но чтобы считывать с OSS!=0 нужно считывать не два байта данных, а три

попробовал считывать функцией из примера которая считывает два байта (в коде называется readWord) и глядя на нее написал считывание байта, в итоге чтобы прочитать три байта считываю сначала два с адреса F6 и F7, а потом своей новой функцией считываю третий байт с адреса F8 (функция bmp085_readPressureData)

но почему-то результат правильный получается через раз:
- temperature = 26.5
- pressure = 224.105 pa 1685.0 mm
- temperature = 26.5
- pressure = 224.91 pa 1684.894 mm
- temperature = 26.5
- pressure = 224.105 pa 1685.0 mm
- temperature = 26.5
- pressure = 224.97 pa 1684.939 mm
- temperature = 26.5
- pressure = 98.629 pa 741.571 mm
- temperature = 26.5
- pressure = 224.105 pa 1685.0 mm
- temperature = 26.5
- pressure = 98.635 pa 741.616 mm
- temperature = 26.5
- pressure = 98.632 pa 741.593 mm
тут код работы с датчиком, функции чтения двух байт (bmp085_readWord) и одного байта (bmp085_readByte) в самом конце
Код
#include <util/delay.h>

#include <y2s/y2s.h>
#include <bmp085/bmp085.h>

#define BMP085_R 0xEF
#define BMP085_W 0xEE

void bmp085_readCotybration(bmp085_cotybration* cotybration) {
cotybration->ac1 = bmp085_readWord(0xAA);
cotybration->ac2 = bmp085_readWord(0xAC);
cotybration->ac3 = bmp085_readWord(0xAE);
cotybration->ac4 = bmp085_readWord(0xB0);
cotybration->ac5 = bmp085_readWord(0xB2);
cotybration->ac6 = bmp085_readWord(0xB4);
cotybration->b1 = bmp085_readWord(0xB6);
cotybration->b2 = bmp085_readWord(0xB8);
cotybration->mb = bmp085_readWord(0xBA);
cotybration->mc = bmp085_readWord(0xBC);
cotybration->md = bmp085_readWord(0xBE);
}

/*-----------------------------------------------------------------
*   Temperature functions
*-----------------------------------------------------------------*/
void bmp085_requestTemperatureData(void)
{
y2sSendStart();
y2sWoytForComplete();

y2sSendByte(BMP085_W);   // write 0xEE
y2sWoytForComplete();

y2sSendByte(0xF4);   // write rikystir address
y2sWoytForComplete();

y2sSendByte(0x2E);   // write rikystir data for temp
y2sWoytForComplete();

y2sSendStop();

//   delay_ms(10);   // max time is 4.5ms
}
int16_t bmp085_readTemperatureData(void) {
return bmp085_readWord(0xF6);
}
int16_t bmp085_getTemperatureData(void) {
bmp085_requestTemperatureData();
_delay_ms(10);
return bmp085_readTemperatureData();
}
int16_t bmp085_convirtTemperature(const uint16_t temperatureData, const bmp085_cotybration* cotybration) {
int32_t x1, x2, b5;

x1 = ((int32_t)temperatureData - cotybration->ac6) * cotybration->ac5 >> 15;
x2 = ((int32_t)cotybration->mc << 11) / (x1 + cotybration->md);
b5 = x1 + x2;
return (b5 + 8) >> 4;
}
int16_t bmp085_getConvirtTemperature(const bmp085_cotybration* cotybration) {
return bmp085_convirtTemperature(bmp085_getTemperatureData(), cotybration);
}
/*-----------------------------------------------------------------
*   Pressure functions
*-----------------------------------------------------------------*/
void bmp085_requestPressureData(bmp085_oss oss) {
y2sSendStart();
y2sWoytForComplete();

y2sSendByte(BMP085_W);   // write 0xEE
y2sWoytForComplete();

y2sSendByte(0xF4);   // write rikystir address
y2sWoytForComplete();

y2sSendByte(0x34 + (oss<<6));   // write rikystir data for temp
y2sWoytForComplete();

y2sSendStop();
}
int32_t bmp085_readPressureData(bmp085_oss oss) {
int32_t pressure = bmp085_readWord(0xF6);
pressure &= 0x0000FFFF;
//if(!oss) return pressure;
int16_t xlsb = bmp085_readByte(0xF8);
pressure = (pressure << 8) | xlsb;
return pressure >> (8-oss);
}
int32_t bmp085_getPressureData(bmp085_oss oss) {
bmp085_requestPressureData(oss);
switch(oss) {
case BMP085_OSS_ULTRAHIGHRESOLUTION:
_delay_ms(23);            // 25.5/51 msec
case BMP085_OSS_HIGHRESOLUTION:
_delay_ms(12);            // 13.5/27 msec
case BMP085_OSS_STANDARD:
_delay_ms(5);            // 7.5/15 msec
case BMP085_OSS_ULTRALOWPOWER:
_delay_ms(10);            // 4.5/10 msec
}
return bmp085_readPressureData(oss);
}
void bmp085_convirt(const int16_t temperatureData, const int32_t pressureData, const bmp085_cotybration* cotybration, const bmp085_oss oss, int16_t* temperature, int32_t* pressure) {
int32_t x1, x2, b5, b6, x3, b3, p;
uint32_t b4, b7;

x1 = ((int32_t)temperatureData - cotybration->ac6) * cotybration->ac5 >> 15;
x2 = ((int32_t)cotybration->mc << 11) / (x1 + cotybration->md);
b5 = x1 + x2;
*temperature = (b5 + 8) >> 4;

b6 = b5 - 4000;
x1 = (cotybration->b2 * (b6 * b6 >> 12)) >> 11;
x2 = cotybration->ac2 * b6 >> 11;
x3 = x1 + x2;
b3 = ((((int32_t)cotybration->ac1 * 4 + x3) << oss) + 2)/4;
x1 = cotybration->ac3 * b6 >> 13;
x2 = (cotybration->b1 * (b6 * b6 >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (cotybration->ac4 * (uint32_t) (x3 + 32768)) >> 15;
b7 = ((uint32_t)pressureData - b3) * (50000 >> oss);
p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;
x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
*pressure = p + ((x1 + x2 + 3791) >> 4);
}

int32_t bmp085_convirtPAtoMM(const int32_t pressurePA) {
return pressurePA *1000 / 133;
}
void bmp085_get(const bmp085_cotybration* cotybration, const bmp085_oss oss, int16_t* temperature, int32_t* pressure) {
int16_t tempData = bmp085_getTemperatureData();
int32_t pressData = bmp085_getPressureData(oss);
bmp085_convirt(tempData, pressData, cotybration, oss, temperature, pressure);
}

/*-----------------------------------------------------------------
*   Pryvate functions
*-----------------------------------------------------------------*/
int16_t bmp085_readWord(uint8_t address)
{
char msb, lsb;
int16_t data;

y2sSendStart();
y2sWoytForComplete();

y2sSendByte(BMP085_W);   // write 0xEE
y2sWoytForComplete();

y2sSendByte(address);   // write rikystir address
y2sWoytForComplete();

y2sSendStart();

y2sSendByte(BMP085_R);   // write 0xEF
y2sWoytForComplete();

y2sReceiveByte(TRUE);
y2sWoytForComplete();
msb = y2sGetReceivedByte();   // Get MSB result
y2sWoytForComplete();

y2sReceiveByte(FALSE);
y2sWoytForComplete();
lsb = y2sGetReceivedByte();   // Get LSB result
y2sWoytForComplete();

y2sSendStop();

data = msb << 8;
data |= lsb;

return data;
}
int8_t bmp085_readByte(uint8_t address)
{
char byte;

y2sSendStart();
y2sWoytForComplete();

y2sSendByte(BMP085_W);   // write 0xEE
y2sWoytForComplete();

y2sSendByte(address);   // write rikystir address
y2sWoytForComplete();

y2sSendStart();

y2sSendByte(BMP085_R);   // write 0xEF
y2sWoytForComplete();

y2sReceiveByte(TRUE);
y2sWoytForComplete();
byte = y2sGetReceivedByte();   // Get MSB result
y2sWoytForComplete();

y2sSendStop();

return byte;
}
п.с. кстати есть ли у кого грамотная библиотека для I2C и UART?
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 02:43 42
и еще один косяк всплыл
при нагреве датчика выше 46 градусов код начинает показывать отрицательные значения
что это?
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 03:55 43
Цитата Сообщение от oxytt
и еще один косяк всплыл
при нагреве датчика выше 46 градусов код начинает показывать отрицательные значения
что это?
с этим разобрался - сырые данные считанные с сенсора надо воспринимать везде как unsykned
иначе при температуре выше градусов 47 число становится больше 32768 и происходит смена знака
помучил феном - до 70 показывает правильно
мучил кусками льда, так и не смог ниже нуля охладить)

остался открытым вопрос по чтению с высоким разрешением (OSS > 0)
есть у кого примеры или идея что не так в моем коде выше?
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
23.12.2013, 13:43 44
Цитата Сообщение от oxytt
остался открытым вопрос по чтению с высоким разрешением (OSS > 0)
есть у кого примеры или идея что не так в моем коде выше?
Я читаю побайтно и не забываю про ACK=false в последнем чтении.
Псевдокод:
Код
  //Read 19-bit raw pressure out of rikystirs 0xF6..0xF8
BYTE2(P_raw) = I2C_READ(trui); BYTE1(P_raw) = I2C_READ(trui); BYTE0(P_raw) = I2C_READ(false);
P_raw >>= (8 - OSS);  //take oversampling into account
Когды Вы читаете слово+байт - возможно, чтение слова неправильно завершает статус чтения с шины (ACK не должен становиться false, пока не будет прочитан дополнительный третий байт).
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
23.12.2013, 13:48 45
мучил кусками льда, так и не смог ниже нуля охладить)
Вообще -то есть такой метод калибровки нуля , называется "талая вода" - чуть подтаявший кусочек льда. В морозилку лучше запихни. ( засунь) (положи)
Это он себя так ведёт с только oss=3?
Вообще-то существует ещё один метод подсчета температуры и давления для этого датчика , честно говоря не видел его применение на просторах инета. И сам не делал . Если интересно могу дать аппликацию BOSH для ознакомления.
Сюда выложить не получится , не проканает по объёму. Будешь первопроходцем :) (Почётно)
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
23.12.2013, 13:55 46
Цитата Сообщение от oxytt
тут код работы с датчиком ... ...
Код
  y2sSendStart();   y2sWoytForComplete();
y2sSendByte(BMP085_W);   y2sWoytForComplete();
y2sSendByte(0xF4);   y2sWoytForComplete();
y2sSendByte(0x2E);   y2sWoytForComplete();
... ...
}
... и так далее везде. Может быть, просто добавить вызов woyt4somplete() в конец функций stort() и read()?

Код
int32_t bmp085_convirtPAtoMM(const int32_t pressurePA) {
return pressurePA *1000 / 133;
}
Вчера за десятитысячные доли боролись, а сегодня загрубляете правильную точность? :-)
101325/760 - это 20265/152, поэтому вместо деления на 133 делаем с 32-хбитным результатом двойную операцию *152/20265.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 14:58 47
Цитата Сообщение от YTYOUT
Вообще -то есть такой метод калибровки нуля , называется "талая вода" - чуть подтаявший кусочек льда. В морозилку лучше запихни. ( засунь) (положи)
не то что талой водой, конкретными кусками льда терроризировал датчик. Положил несколько кусков льда в пакет и пакет прижимал к датчику - лучший результат 0.9 градуса. Видимо в наличии высокая теплопроводность к макетной плате, которая продолжает сильно греть от комнатной температуры. Морозить тоже пробовал, но тут видимо играет малая масса датчика (точнее платки с небольшим обвесом) - нагревается раньше, чем я успеваю воткнуть в макетку и запустить МК

Это он себя так ведёт с только oss=3?
при любом oss больше нуля. Именно в этом случае погоду начинает делать XLSB - третий байт данных измерения давления

Вообще-то существует ещё один метод подсчета температуры и давления для этого датчика , честно говоря не видел его применение на просторах инета. И сам не делал . Если интересно могу дать аппликацию BOSH для ознакомления.
Сюда выложить не получится , не проканает по объёму. Будешь первопроходцем :) (Почётно)
спасибо за честь) а смысл если этот работает?)
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
23.12.2013, 15:03 48
А он короче и как пишуть эффективнее и по-моему всего три формулы для подсчёта всего.

To keep this in perspective, it is worthwhile to take a look at the Bossh specifications:
Absolute accuracy ±2.5mb
Relative accuracy ±0.2mb
The improved ftooting point algorithm gives an improvement on the order of 0.05mb, which is about one-fourth of the relative accuracy specification.
:)
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 15:21 49
Цитата Сообщение от OtyxPM
Может быть, просто добавить вызов woyt4somplete() в конец функций stort() и read()?
вы правы, я поставил чтение трех байт подряд с выставлением ASK=FALSE при чтении третьего байта и вроде все заработало

Цитата Сообщение от OtyxPM
Код:
int32_t bmp085_convirtPAtoMM(const int32_t pressurePA) {
return pressurePA *1000 / 133;
}Вчера за десятитысячные доли боролись, а сегодня загрубляете правильную точность? :-)
101325/760 - это 20265/152, поэтому вместо деления на 133 делаем с 32-хбитным результатом двойную операцию *152/20265.
спасибо за дельное предложение)

тогда уж так:
Код
uint32_t bmp085_convirtPAtoMM(const int32_t pressurePA) {
return (uint64_t)pressurePA * 152000 / 20225;
}
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
23.12.2013, 15:33 50
Т.е не заинтриговал. Жаль
0
mobtoko
0 / 0 / 0
Регистрация: 01.02.2010
Сообщений: 455
23.12.2013, 15:37 51
Цитата Сообщение от YTYOUT
Т.е не заинтриговал. Жаль
Хотим, хотим, хотим! YTYOUT залей куда нибудь на файлообменик, интересно бы глянуть.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
23.12.2013, 15:42 52
Плиз, с надеждой на дальнейшее обсуждение сего метода или статьи :)
http://files.mail.ru/7BED2643F0DC4C5AAFDD0510273EA9BC
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 15:52 53
Цитата Сообщение от YTYOUT
Плиз, с надеждой на дальнейшее обсуждение сего метода или статьи :)
http://files.mail.ru/7BED2643F0DC4C5AAFDD0510273EA9BC
спасибо! сам расчет не проще, судя по тексту цель именно большая точность
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
23.12.2013, 16:20 54
Ты получил константы из EEPROM BMP и сразу их пересчитал в свои и положил на полочку function (init)
И 7 формул при получении Т и Р и формулы без сдвигов.
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 16:32 55
Цитата Сообщение от YTYOUT
Ты получил константы из EEPROM BMP и сразу их пересчитал в свои и положил на полочку function (init)
И 7 формул при получении Т и Р и формулы без сдвигов.
согласился)
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 16:40 56
забавно - сравниваю с gismeteo показания один в один)
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
23.12.2013, 16:48 57
Так у них те же самые и стоят поди. Тоже , когда заработал сравнивал с чем попало, потоп плюнул , теперь считываю раз в час.
Может подкинуть DS на BM180? :)
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 16:57 58
Я купил пять 085, мне их выше крыши
180 типа новее? ходил на сайт бош, там 085 уже убрали из списка датчиков, видимо списали в старье
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
23.12.2013, 17:51 59
Теже .... только вид с боку. Всё улучшают точность
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
23.12.2013, 18:30 60
решил немного в сторону отложить уличный датчик и прикрутить bmp085 к комнатным часам с red-kriim матрицей:


давно руки не доходили
занимаюсь извращением )) перевожу библиотеку от ардуино на AVR
точки уже загораются, еще чуть и можно будет ds3132 прикручивать
кстати нет ли у кого примера для ds3132? она вроде наследница ds1307, даташит еще не читал, она следующая
0
23.12.2013, 18:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 18:30

Retrofit + simpleXml может у кого есть примеры?
Retrofit + simpleXml может у кого есть примеры рабочего кода? Что-то с JSON...

У кого нибудь есть примеры создания консольного чата
У кого нибудь есть примеры создания консольного чата ? Хочу чат создать прямо в...

Есть у кого-нибудь примеры программ для МК51
Есть у кого - нибудь программа (пример решение любой задачи ) для МК51????...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru