По моему опыту всё работало замечательно. Для начала надо исключить ошибки, тем более библиотеки самописные. Всё что написали вы тоже не имеет ничего общего с опытом. Или вы встречали конкретно такую ситуацию? Вы не помогли решить проблему, а тоже предлагаете анализировать. Не понимаю что вам не нравится?
Вы не решили проблему, я не решил. Вы предложили снять карту. Я предложил начать с того чтобы убедиться в правильности подключения и работы библиотек, задействовав другие датчики висящие на этой же шине. Я привык решать проблемы последовательно, а не тыкая пальцем в небо. Собственно это и предлагаю.
_________________ Глупый не задает вопросы. Глупый и так все знает.
При чём здесь ID? Чего вы к нему прицепились? Работая с данным датчиком нет необходимости считывать его ID, я никогда этой ерундой не занимался и не обращал внимание. В моих устройствах не было и не могло быть что на шину будет установлено устройство с таким же адресом, но другое. При этом, имея ошибки в самописной библиотеке или проблемные устройства висящие на той же шине можно считать что угодно. Хотите из личного? Попадались устройства которые отвечали на адреса не соответствующие даташиту. А так же попадались устройства которые слали мусор когда считывали не с них, а с других устройств.
Что может быть проще имея 3 датчика на одной шине и на одной этой плате, проверить другие два тоже? Если с ними нет никаких проблем, значит проблема в BMP. Логично что сначала надо исключить данную ситуацию. Иначе считывая карту можно считать что угодно.
Если я вас правильно понял, вы почти утверждаете, что поскольку DESIER пользуется самописной библиотекой - там есть ошибки. Не слишком ли смелое предположение? Вы видели его текст программы?
AndTer писал(а):
Хотите из личного? Попадались устройства которые отвечали на адреса не соответствующие даташиту. А так же попадались устройства которые слали мусор когда считывали не с них, а с других устройств.
Конечно хочу. Логи с логического анализатора и подробное описание этих багов (включая фото железа и монтажа) в студию! Так же, не забудьте приложить "картинку что на шине" с осциллографа.
Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy.
сегодня решил считать id чипа, он оказался 68h(0b01011000), а по datasheet должен быть 58h(0b01101000).
Первый вопрос: Вам, лично по своему опыту, есть что сказать? Вы встречали такую ситуацию? Перечитав ваши посты я понял что вам нечего сказать.
Вы предложили считать карту. Я предложил поработать с остальными двумя датчиками, дабы убедиться что проблема именно в BMP. Второй вопрос: Что не так то?
Не слишком ли смелое предположение? Вы видели его текст программы?
Я не утверждал что там есть ошибки. Но и вы не можете утверждать что их там нет. Третий вопрос: вы видели текст его программы? Что может быть проще, обратиться к другим двум устройствам? Четвёртый вопрос: Каким образом этот совет вам претит?
Логи с логического анализатора и подробное описание этих багов (включая фото железа и монтажа) в студию! Так же, не забудьте приложить "картинку что на шине" с осциллографа.
А может что-то ещё нужно? Вы пишите, не стесняйтесь. Но только давайте будем последовательны, сначала ответьте на мои вопросы.
_________________ Глупый не задает вопросы. Глупый и так все знает.
К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ.
Цеплять их не надо, они на одной плате с BMP280. К ним надо просто обратиться. Их правильная работа это проверка всей платы и питания этих устройств. Самописный код иногда преподносит сюрпризы. И он может слать/принимать разное в зависимости от разных данных. Это тоже из далёкого практического прошлого. Эта простая проверка гарантирует правильный фокус в дальнейшем.
_________________ Глупый не задает вопросы. Глупый и так все знает.
Цеплять их не надо, они на одной плате с BMP280. К ним надо просто обратиться. Их правильная работа это проверка всей платы и питания этих устройств. Самописный код иногда преподносит сюрпризы. И он может слать/принимать разное в зависимости от разных данных. Это тоже из далёкого практического прошлого. Эта простая проверка гарантирует правильный фокус в дальнейшем.
Всего на шине у меня ведущий микроконтроллер Atmega2560 и 6 ведомых устройств. 1: Дисплей SSD1306. Работает исправно так как я на него и вывожу все данные (по uart в компьютер я не передаю ничего). 2: Часы DS3231 и память AT24C128 на одной плате. Часы отлично функционируют, к памяти не обращался. 3: BMP280 датчик давления и температуры, HDC1080 датчик влажности и температуры, CCS811 датчик CO2 и VCO находятся на своей отдельной плате. С BMP280 соответственно пытаюсь разобраться, к остальным двум еще не обращался.
Вот эта функция у меня читает один байт данных из области памяти датчика. При вызове функции TWI_Start(адрес устройства); контролируется ответ от устройств ASK/NASK. Если датчик не ответил бы, мне бы выдало ошибку, а то что я каким то образом с указанным адресом обращаюсь на самом деле к какому то другому датчику я считаю не реальным.
_________________ Я, конечно, могу вести себя нормально. Но чёрт возьми - это ведь так скучно.
Всем привет. Я частично разобрался с датчиком. Не правильно делал инициализацию, после настройки датчика делал chip reset и соответственно данные не обновлялись. Сырые данные с регистров читаются, показания меняются при воздействии на датчик. Вот только обработать не получается, калибровочные данные почему то все по нулям.
_________________ Я, конечно, могу вести себя нормально. Но чёрт возьми - это ведь так скучно.
Разобрался. Во все виноват опять 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();
Приветствую всех! Ни кто не сталкивался с такой бодягой - Датчик BME280, прицепил на STM32f100, протокол I2C, все вычисления по даташиту... НО при положительных температурах все хорошо. Как только переваливается за 0 - температура "409", давление вообще ерунда какая то... С температурой решил примерно так же как у DS18B20 (вставка в стандартный код):
passer_by, так не прокатит. Вы применив расчет схожий с DS18B20 изменили показания температуры только на конечном выходе, то что вы видите. Но при расчетах с датчиками BOSCH по другому, там есть переменная t_fine, сырое значение температуры, которая потом передаётся в расчеты давления. Нужно искать ошибку в коде расчета.
P.S. А я решил свою проблему. Дело было в объединении принятых байт с датчика. Я передавал данные в функцию вот так, складывал значения:
passer_by, так не прокатит. Вы применив расчет схожий с DS18B20 изменили показания температуры только на конечном выходе, то что вы видите. Но при расчетах с датчиками BOSCH по другому, там есть переменная t_fine, сырое значение температуры, которая потом передаётся в расчеты давления. Нужно искать ошибку в коде расчета.
Да нет. Тут как раз все нормально. Я меняю выдачу температуры именно на выходе. Переменная t_fine рассчитывается ранее, до выдачи результата и на расчет давления ни как не влияет. Да ладно, бог с ним с давлением. Почему фирменный расчет глючит ... Такое ощущение, что я где то намудрил с форматами переменных. Типа переход с uint32_t на float?
_________________ Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Вот как раз 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; }
_________________ Я, конечно, могу вести себя нормально. Но чёрт возьми - это ведь так скучно.
Вы не совсем поняли, что я имел в виду. t_fine рассчитывается до расчета значение Т, которое возвращается для показа температуры. Его я и правлю. А не t_fine. Другой вопрос - из какого даташита вы привели пример? У меня совсем другие формулы расчета в даташите. Если можно скинте ссылку на этот даташит.
P.S. О! нашел - это с даташита на BMP280
_________________ Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Хм. Я брал формулы со страницы 23 этого даташита. До конца не листал. У Вас со страницы 49. Заявлено как "Alternative compensation formulas". Ну попробую с конвертировать под мою микруху, посмотрим. А Вы проверяли этот "Alternative compensation formulas" на работу в отрицательных температурах? Не глючит?
_________________ Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения