t_fine используется в расчетах давления, а также влажности и качества воздуха, если датчик имеет эти плюшки, как температурный корректор. По этой причине в Вашем (и любом) коде температуру нужно считать в первую очередь, чтобы "оживить" эту переменную. Честно говоря, не в курсе, каков алгоритм расчетов внутри самого датчика. Да и зачем?
Только не смейтесь . . . Мне попался датчик для ардуино BMP280 и я хочу приспособить его к ПИК'у. SPI мне знаком, действия с 16разрядными числами тоже, datasheet ВМР прочитал от корки до корки. Если смогу сформулировать задачу, думаю справлюсь. Меня устроит самая низкая точность; просто интересно.
Все в моей метеостанции работало отлично, но ВМ280 начал выдавать отрицательное давление и влажность 100%... Кто-нибудь сталкивался с такими показателями ?
У меня после сброса питания измерение влажности не проходят и значения плавают около 72%. Но после второй инициализации (сбрасываю микроконтроллер) - измеряет корректно.
Считайте константы из датчика, затем сырые данные и результаты расчётов, чтобы было понятно, откуда может возникать ошибка.
Заголовок сообщения: Re: BMP280, датчик давления и температуры
Добавлено: Чт ноя 09, 2023 17:22:39
Открыл глаза
Зарегистрирован: Пн май 04, 2015 12:30:18 Сообщений: 68
Рейтинг сообщения:0
И еще раз про проблему отрицательных температур. Мне не понятно как 32 битном int может взяться 1 в 31 разряде при условии что данные с датчика приходят вообще в 20 битном виде?
Заголовок сообщения: Re: BMP280, датчик давления и температуры
Добавлено: Пт ноя 17, 2023 23:52:36
Открыл глаза
Зарегистрирован: Пн май 04, 2015 12:30:18 Сообщений: 68
Рейтинг сообщения:0
Проблема отрицательных температур - РЕШЕНА! И так, что бы понять, что и где меняет знак, я вывел данные из модуля в десятичном и двоичном коде (данные собраны с нескольких логов, которые были сгенерированы в разное время): СпойлерStart dig_T1 28409 0110111011111001 dig_T2 26591 0110011111011111 dig_T3 50 0000000000110010
T_raw 770881 00000000000010111100001101000001 Val1 513408 00000000000001111101010110000000 Val2 291 00000000000000000000000100100011 T_fine 513699 00000000000001111101011010100011 T 10033 00000000000000000010011100110001 P 749.301 H 0.000%
T_raw 722467 00000000000010110000011000100011 Val1 434830 00000000000001101010001010001110 Val2 208 00000000000000000000000011010000 T_fine 435038 00000000000001101010001101011110 T 8497 00000000000000000010000100110001 P 749.429 H 0.000%
T_raw 691286 00000000000010101000110001010110 Val1 384219 00000000000001011101110011011011 Val2 163 00000000000000000000000010100011 T_fine 384382 00000000000001011101110101111110 T 7507 00000000000000000001110101010011 P 749.231 H 0.000%
T_raw 615507 00000000000010010110010001010011 Val1 261235 00000000000000111111110001110011 Val2 75 00000000000000000000000001001011 T_fine 261310 00000000000000111111110010111110 T 5104 00000000000000000001001111110000 P 749.240 H 6.703%
T_raw 518922 00000000000001111110101100001010 Val1 104481 00000000000000011001100000100001 Val2 12 00000000000000000000000000001100 T_fine 104493 00000000000000011001100000101101 T 2041 00000000000000000000011111111001 P 745.099 H 25.223%
T_raw 457789 00000000000001101111110000111101 Val1 5258 00000000000000000001010010001010 Val2 0 00000000000000000000000000000000 T_fine 5258 00000000000000000001010010001010 T 103 00000000000000000000000001100111 P 745.393 H 21.098%
T_raw 455064 00000000000001101111000110011000 Val1 843 00000000000000000000001101001011 Val2 0 00000000000000000000000000000000 T_fine 843 00000000000000000000001101001011 T 16 00000000000000000000000000010000 P 745.409 H 21.790%
T_raw 454396 00000000000001101110111011111100 Val1 209690 00000000000111111111111100001001 Val2 0 00000000000000000000000000000000 T_fine 209690 00000000000111111111111100001001 T 40955 00000000000000001001111111111011 P 1154.772 H 0.000%
T_raw 453091 00000000000001101110100111100011 Val1 209478 00000000000111111111011011000100 Val2 0 00000000000000000000000000000000 T_fine 209478 00000000000111111111011011000100 T 40914 00000000000000001001111111010010 P 1155.549 H 0.000%
T_raw 451810 00000000000001101110010011100010 Val1 209271 00000000000111111110111010100111 Val2 0 00000000000000000000000000000000 T_fine 209271 00000000000111111110111010100111 T 40873 00000000000000001001111110101001 P 1156.318 H 0.000%
Как видно при переходе через ноль - появляется 1 в 20 разряде вычисляемой переменной Val1. Вот тут то и кроется корень зла. Это как раз и есть знаковый бит. Если в нём 1 - то температура отрицательная. Так же при переходе через 0 начинают врать давление и влажность. Максимум который что может вычислить модуль - это 188,5 градусов, а минимум -143 градуса (+/- с моими коэффициентами dig_T1 - dig_T3). Так же видно, что вычисляемая переменная Val2 - не может быть меньше 0. По этому я добавил в код следующую строчку:
Заголовок сообщения: Re: BMP280, датчик давления и температуры
Добавлено: Вс дек 17, 2023 17:16:00
Открыл глаза
Зарегистрирован: Пн май 04, 2015 12:30:18 Сообщений: 68
Рейтинг сообщения:0
Кто ни будь работал с этими модулями по SPI шине? Не понятно как работать с R/W регистрами? Посылка данных по SPI: Спойлерvoid BME280_send (uint8_t data) { PORTB &= ~(1<<PORTB2); //устанавливаем в 0 ножкe выбора устройства. SPDR = data; while(!(SPSR & (1<<SPIF))); //подождем пока данные передадутся } Чтение данных из регистра: Спойлерuint8_t BME280_read (uint8_t reg) { uint8_t Data_bme280; BME280_send(reg); BME280_send(0); Data_bme280=SPDR; PORTB |= 1<<PORTB2; asm ("NOP"); PORTB &= ~(1<<PORTB2); return Data_bme280; } А вот как организовать запись данных в регистр? По идее: BME280_send(reg); BME280_send(Data); PORTB |= 1<<PORTB2; asm ("NOP"); PORTB &= ~(1<<PORTB2); Но ведь это ничем не отличается от чтения данных из регистра....
Заголовок сообщения: Re: BMP280, датчик давления и температуры
Добавлено: Пн дек 18, 2023 13:59:40
Открыл глаза
Зарегистрирован: Пн май 04, 2015 12:30:18 Сообщений: 68
Рейтинг сообщения:0
К сожалению я читал перевод. Плохо понимаю по англицки. А перевод оказался не полным. Там заканчивается пунктом 6.2.2 (I2C шина)..... Полез в оригинал. И, таки да, при записи обнуляется старший бит адреса регистра.... Вот уже о чем не мог подумать. И еще, что бросилось в глаза - все адреса регистров начинаются с 88, а не с 0 т.е. 1 в старшем бите всегда присутствует. и ее обнуление - не приведет к путанице с адресами регистров. Теперь (для таких же как я) функция записи выглядит так: Спойлерvoid BME280_write (uint8_t reg, uint8_t data) { reg &=0x7F; BME280_send(reg); BME280_send(data); } И еще вопросы 1) стоит ли дергать CS после завершения записи? 2) оверсемплинг - повышает точность измерений и увеличивает время измерения? 3) Как работает БИХ фильтр? Производится несколько измерений и вычисляется достоверное?
Заголовок сообщения: Re: BMP280, датчик давления и температуры
Добавлено: Пн дек 18, 2023 20:32:22
Держит паяльник хвостом
Карма: 16
Рейтинг сообщений: 211
Зарегистрирован: Вс дек 02, 2012 16:58:33 Сообщений: 945 Откуда: от туда
Рейтинг сообщения:0
1) По даташиту CS опускается перед записью и поднимается после. Можно записывать несколько значений и потом поднимать CS. 2) да 3) лучше почитай мурзилку. Это фильтр с бесконечной импульсной функцией.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения