Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 14:10:39

По моему опыту всё работало замечательно.
Для начала надо исключить ошибки, тем более библиотеки самописные.
Всё что написали вы тоже не имеет ничего общего с опытом. Или вы встречали конкретно такую ситуацию?
Вы не помогли решить проблему, а тоже предлагаете анализировать.
Не понимаю что вам не нравится?

Вы не решили проблему, я не решил.
Вы предложили снять карту.
Я предложил начать с того чтобы убедиться в правильности подключения и работы библиотек, задействовав другие датчики висящие на этой же шине.
Я привык решать проблемы последовательно, а не тыкая пальцем в небо. Собственно это и предлагаю.

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 14:19:23

Перечитайте свои посты и угомонитесь.
Надеюсь, сейчас уже знаете что такое ID (chip identification number)...

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 14:31:53

При чём здесь ID? Чего вы к нему прицепились? Работая с данным датчиком нет необходимости считывать его ID, я никогда этой ерундой не занимался и не обращал внимание. В моих устройствах не было и не могло быть что на шину будет установлено устройство с таким же адресом, но другое.
При этом, имея ошибки в самописной библиотеке или проблемные устройства висящие на той же шине можно считать что угодно.
Хотите из личного? Попадались устройства которые отвечали на адреса не соответствующие даташиту. А так же попадались устройства которые слали мусор когда считывали не с них, а с других устройств.

Что может быть проще имея 3 датчика на одной шине и на одной этой плате, проверить другие два тоже? Если с ними нет никаких проблем, значит проблема в BMP. Логично что сначала надо исключить данную ситуацию. Иначе считывая карту можно считать что угодно.

сегодня решил считать id чипа, он оказался 68h(0b01011000), а по datasheet должен быть 58h(0b01101000).

Вам, лично по своему опыту, есть что сказать?

Перечитав ваши посты я понял что вам нечего сказать.

Вы предложили считать карту. Я предложил поработать с остальными двумя датчиками, дабы убедиться что проблема именно в BMP.
Что не так то?

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 14:45:47

Если я вас правильно понял, вы почти утверждаете, что поскольку DESIER пользуется самописной библиотекой - там есть ошибки.
Не слишком ли смелое предположение? Вы видели его текст программы?
AndTer писал(а):Хотите из личного? Попадались устройства которые отвечали на адреса не соответствующие даташиту. А так же попадались устройства которые слали мусор когда считывали не с них, а с других устройств.
Конечно хочу. Логи с логического анализатора и подробное описание этих багов (включая фото железа и монтажа) в студию! Так же, не забудьте приложить "картинку что на шине" с осциллографа.

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 14:56:12

Вы игнорируете все мои вопросы ПО ДЕЛУ в ваш адрес:

сегодня решил считать id чипа, он оказался 68h(0b01011000), а по datasheet должен быть 58h(0b01101000).

Первый вопрос: Вам, лично по своему опыту, есть что сказать?
Вы встречали такую ситуацию? Перечитав ваши посты я понял что вам нечего сказать.

Вы предложили считать карту. Я предложил поработать с остальными двумя датчиками, дабы убедиться что проблема именно в BMP.
Второй вопрос: Что не так то?

Не слишком ли смелое предположение? Вы видели его текст программы?


Я не утверждал что там есть ошибки. Но и вы не можете утверждать что их там нет. Третий вопрос: вы видели текст его программы?
Что может быть проще, обратиться к другим двум устройствам? Четвёртый вопрос: Каким образом этот совет вам претит?


Логи с логического анализатора и подробное описание этих багов (включая фото железа и монтажа) в студию! Так же, не забудьте приложить "картинку что на шине" с осциллографа.

А может что-то ещё нужно? Вы пишите, не стесняйтесь. Но только давайте будем последовательны, сначала ответьте на мои вопросы.

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 15:07:33

AndTer, Вы невнимательно читали сообщения :
вариант неправильного чтения данных не может быть, на этой же шине сидят часы DS3231 и дисплей (на который я вывожу все данные) SSD1306.

У него уже есть 3 устройства на шине и все остальные работают (одновременно) исправно.
Какой смысл цеплять ему ещё датчики на шину ?

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 15:21:58

У меня готовая китайская плата CJMCU-8128.


Она? https://www.banggood.com/ru/CJMCU-8128- ... 67432.html

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 15:22:41

Цеплять их не надо, они на одной плате с BMP280. К ним надо просто обратиться.
Их правильная работа это проверка всей платы и питания этих устройств.
Самописный код иногда преподносит сюрпризы. И он может слать/принимать разное в зависимости от разных данных. Это тоже из далёкого практического прошлого.
Эта простая проверка гарантирует правильный фокус в дальнейшем.

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 16:20:34

У меня готовая китайская плата CJMCU-8128.


Она? https://www.banggood.com/ru/CJMCU-8128- ... 67432.html

Да, именно такая. Только от другого продавца.

Добавлено after 42 minutes 29 seconds:
Цеплять их не надо, они на одной плате с BMP280. К ним надо просто обратиться.
Их правильная работа это проверка всей платы и питания этих устройств.
Самописный код иногда преподносит сюрпризы. И он может слать/принимать разное в зависимости от разных данных. Это тоже из далёкого практического прошлого.
Эта простая проверка гарантирует правильный фокус в дальнейшем.

Всего на шине у меня ведущий микроконтроллер Atmega2560 и 6 ведомых устройств.
1: Дисплей SSD1306. Работает исправно так как я на него и вывожу все данные (по uart в компьютер я не передаю ничего).
2: Часы DS3231 и память AT24C128 на одной плате. Часы отлично функционируют, к памяти не обращался.
3: BMP280 датчик давления и температуры, HDC1080 датчик влажности и температуры, CCS811 датчик CO2 и VCO находятся на своей отдельной плате. С BMP280 соответственно пытаюсь разобраться, к остальным двум еще не обращался.

Код:
char RDB (unsigned char addr)
{
   char t = 0;
   TWI_Start(0xEC);
   TWI_WriteData(addr);
   TWI_Stop();
   TWI_Start(0xED);
   t = TWI_ReadData();
   TWI_Stop();
   return t;
}

Вот эта функция у меня читает один байт данных из области памяти датчика. При вызове функции TWI_Start(адрес устройства); контролируется ответ от устройств ASK/NASK. Если датчик не ответил бы, мне бы выдало ошибку, а то что я каким то образом с указанным адресом обращаюсь на самом деле к какому то другому датчику я считаю не реальным.

Re: BMP280, датчик давления и температуры

Вт сен 18, 2018 19:00:18

DESIER, Загляните в ЛС.

Re: BMP280, датчик давления и температуры

Ср ноя 21, 2018 14:28:16

Всем привет. Я частично разобрался с датчиком. Не правильно делал инициализацию, после настройки датчика делал chip reset и соответственно данные не обновлялись. Сырые данные с регистров читаются, показания меняются при воздействии на датчик. Вот только обработать не получается, калибровочные данные почему то все по нулям.

Re: BMP280, датчик давления и температуры

Сб ноя 24, 2018 11:33:35

Разобрался. Во все виноват опять chip reset. Вот такая получилась инициализация. Проблема осталась с расчетом, давление сильно смещено на 50 кПа. Пока еще не нашел в чем причина.
Код:
void Initial_BMP280()
{
   while((id() != CHIP_ID) && !status());
   BMP280_Start(WRITE);
   TWI_WriteData(0x88); // начальный адрес для чтения калибровочных бит
   BMP280_Start(READ);
   for (uint8_t i = 0; i<26; i++)
   {
      if (i==25) dig[i] = TWI_ReadData(NACK);
      else dig[i] = TWI_ReadData(ACK);
   }
   BMP280_Start(WRITE);
   TWI_WriteData(0xF4); // ctrl_meas register
   TWI_WriteData(0xB7);
   BMP280_Start(WRITE);
   TWI_WriteData(0xF5); // config register
   TWI_WriteData(0x80);
   TWI_Stop();
   
   dig_T1 = (dig[1] << 8) | dig[0];
   dig_T2 = (dig[3] << 8) | dig[2];
   dig_T3 = (dig[5] << 8) | dig[4];
   dig_P1 = (dig[7] << 8) | dig[6];
   dig_P2 = (dig[9] << 8) | dig[8];
   dig_P3 = (dig[11] << 8) | dig[10];
   dig_P4 = (dig[13] << 8) | dig[12];
   dig_P5 = (dig[15] << 8) | dig[14];
   dig_P6 = (dig[17] << 8) | dig[16];
   dig_P7 = (dig[19] << 8) | dig[18];
   dig_P8 = (dig[21] << 8) | dig[20];
   dig_P9 = (dig[23] << 8) | dig[22];
}

Re: BMP280, датчик давления и температуры

Ср ноя 28, 2018 16:37:21

Приветствую всех!
Ни кто не сталкивался с такой бодягой - Датчик BME280, прицепил на STM32f100, протокол I2C, все вычисления по даташиту...
НО при положительных температурах все хорошо. Как только переваливается за 0 - температура "409", давление вообще ерунда какая то...
С температурой решил примерно так же как у DS18B20 (вставка в стандартный код):
Код:
   temper_float = ((temper_int * 5 + 128) >> 8);
   temper_float /= 100.0f;
      if(temper_float>100)                           //если температура <0
   {
      temper_float =409 - temper_float;
      temper_float = -temper_float;                  //Маркировка отрицательной температуры
   }
     return temper_float;

А вот с давлением ума не дам :cry: Или я вообще не туда капаю?

Re: BMP280, датчик давления и температуры

Ср ноя 28, 2018 16:53:37

passer_by, так не прокатит. Вы применив расчет схожий с DS18B20 изменили показания температуры только на конечном выходе, то что вы видите. Но при расчетах с датчиками BOSCH по другому, там есть переменная t_fine, сырое значение температуры, которая потом передаётся в расчеты давления. Нужно искать ошибку в коде расчета.

P.S. А я решил свою проблему. Дело было в объединении принятых байт с датчика.
Я передавал данные в функцию вот так, складывал значения:
Код:
bmp280_compensate_T(((int32_t)ptd[3]<<12) + ((int32_t)ptd[4]<<4) + ((int32_t)ptd[5]>>4));

А нужно было через логическое или:
Код:
bmp280_compensate_T(((int32_t)ptd[3]<<12) | ((int32_t)ptd[4]<<4) | ((int32_t)ptd[5]>>4));

В общем у меня все теперь заработало.

Re: BMP280, датчик давления и температуры

Ср ноя 28, 2018 17:07:21

passer_by, так не прокатит. Вы применив расчет схожий с DS18B20 изменили показания температуры только на конечном выходе, то что вы видите. Но при расчетах с датчиками BOSCH по другому, там есть переменная t_fine, сырое значение температуры, которая потом передаётся в расчеты давления. Нужно искать ошибку в коде расчета.

Да нет. Тут как раз все нормально. Я меняю выдачу температуры именно на выходе. Переменная t_fine рассчитывается ранее, до выдачи результата и на расчет давления ни как не влияет.
Да ладно, бог с ним с давлением. Почему фирменный расчет глючит ... Такое ощущение, что я где то намудрил с форматами переменных. Типа переход с uint32_t на float?

Re: BMP280, датчик давления и температуры

Ср ноя 28, 2018 17:14:36

Вот как раз t_fine влияет на давление. У вас где-то косяк до расчета t_fine. Вы как бы замаскировали проблему, но не устранили её.
Вот код расчета из datashee на датчик. Посмотрите внимательно на функцию расчета давления. И при расчете влажности она тоже участвует.
Код:
// Returns temperature in DegC, double precision. Output value of “51.23” equals 51.23 DegC.
// t_fine carries fine temperature as global value
BME280_S32_t t_fine;
double BME280_compensate_T_double(BME280_S32_t adc_T)
{
double var1, var2, T;
var1 = (((double)adc_T)/16384.0 – ((double)dig_T1)/1024.0) * ((double)dig_T2);
var2 = ((((double)adc_T)/131072.0 – ((double)dig_T1)/8192.0) *
(((double)adc_T)/131072.0 – ((double) dig_T1)/8192.0)) * ((double)dig_T3);
t_fine = (BME280_S32_t)(var1 + var2);
T = (var1 + var2) / 5120.0;
return T;
}
// Returns pressure in Pa as double. Output value of “96386.2” equals 96386.2 Pa = 963.862 hPa
double BME280_compensate_P_double(BME280_S32_t adc_P)
{
double var1, var2, p;
var1 = ((double)t_fine/2.0) – 64000.0;
var2 = var1 * var1 * ((double)dig_P6) / 32768.0;
var2 = var2 + var1 * ((double)dig_P5) * 2.0;
var2 = (var2/4.0)+(((double)dig_P4) * 65536.0);
var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;
var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);
if (var1 == 0.0)
{
return 0; // avoid exception caused by division by zero
}
p = 1048576.0 – (double)adc_P;
p = (p – (var2 / 4096.0)) * 6250.0 / var1;
var1 = ((double)dig_P9) * p * p / 2147483648.0;
var2 = p * ((double)dig_P8) / 32768.0;
p = p + (var1 + var2 + ((double)dig_P7)) / 16.0;
return p;
}
// Returns humidity in %rH as as double. Output value of “46.332” represents 46.332 %rH
double bme280_compensate_H_double(BME280_S32_t adc_H);
{
double var_H;
var_H = (((double)t_fine) – 76800.0);
var_H = (adc_H – (((double)dig_H4) * 64.0 + ((double)dig_H5) / 16384.0 * var_H)) *
(((double)dig_H2) / 65536.0 * (1.0 + ((double)dig_H6) / 67108864.0 * var_H *
(1.0 + ((double)dig_H3) / 67108864.0 * var_H)));
var_H = var_H * (1.0 – ((double)dig_H1) * var_H / 524288.0);
if (var_H > 100.0)
var_H = 100.0;
else if (var_H < 0.0)
var_H = 0.0;
return var_H;
}

Re: BMP280, датчик давления и температуры

Ср ноя 28, 2018 17:24:53

Вы не совсем поняли, что я имел в виду. t_fine рассчитывается до расчета значение Т, которое возвращается для показа температуры. Его я и правлю. А не t_fine.
Другой вопрос - из какого даташита вы привели пример? У меня совсем другие формулы расчета в даташите. Если можно скинте ссылку на этот даташит.

P.S. О! нашел - это с даташита на BMP280

Re: BMP280, датчик давления и температуры

Ср ноя 28, 2018 21:05:55

Я тогда вообще ничего не понимаю где вы и что изменяете. Расчет я брал вот из этого datasheet, BME280.
Почти в конце документа все функции описаны.
Вложения
BME280.pdf
(1.85 MiB) Скачиваний: 303

Re: BMP280, датчик давления и температуры

Чт ноя 29, 2018 04:45:42

Хм. Я брал формулы со страницы 23 этого даташита. До конца не листал. У Вас со страницы 49. Заявлено как "Alternative compensation formulas". Ну попробую с конвертировать под мою микруху, посмотрим.
А Вы проверяли этот "Alternative compensation formulas" на работу в отрицательных температурах? Не глючит?

Re: BMP280, датчик давления и температуры

Чт ноя 29, 2018 07:06:46

А Вы проверяли этот "Alternative compensation formulas" на работу в отрицательных температурах? Не глючит?

В отрицательных не проверял, у меня не предусмотрена работа на улице. А для эксперимента пока нет возможности вынести датчик на улицу.
Ответить