Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с чтением температуры из LSM303AGR
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
jur
Приветствую!

Случилось мне познакомиться с датчиком LSM303AGR. Для экспериментов мы купили платку STEVAL-MKI172V1, очень удобно.

Присоединил к микроконтроллеру, соединил все это с PC и начал ковыряться. Надо сказать, документация на это дело совершенно безобразная... Что дока на микросхему, что Application Note.

В конце концов я это дело запустил, акселерометр с магнетометром прочитал, читаю температуру. А вот тут начинаются странности. Вот что написано в даташите на микросхему:

4.5 Temperature sensor
The LSM303AGR is supplied with an internal temperature sensor. Temperature data
can be enabled by setting the TEMP_EN[1:0] bits to ‘1’ in the TEMP_CFG_REG_A (1Fh)
register.

To retrieve the temperature sensor data the BDU bit in CTRL_REG4_A (23h)
must be set to ‘1’. Both the OUT_TEMP_L_A (0Ch), OUT_TEMP_H_A (0Dh)
registers must be read.

Temperature data is stored inside OUT_TEMP_H as two’s complement data in 8-bit format
left-justified.

Далее в таблице Table 4. Temperature sensor characteristics написано, что формат данных 1 digit/°C. Запускаю считывание тепмературы. Вручную, нажимая кнопку в моем тестовом приложении. Смотрю на считанные данные. И вот что я вижу (адрес регистра 0x8C - это OUT_TEMP_L_A но с добавленным старшим битом автоинкремента, чтобы можно было прочитать два байта подряд):

Код
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 00 FF
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 00 FF
--- Тут я прикоснулся пальцем к микросхеме
I2C Read:  dev_address 0x19, reg_address 0x8C, data: C0 01
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 00 03
I2C Read:  dev_address 0x19, reg_address 0x8C, data: C0 03
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 00 04
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 80 04
I2C Read:  dev_address 0x19, reg_address 0x8C, data: C0 04
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 00 05
--- Тут я палец убрал, микросхема начала остывать
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 00 04
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 00 03
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 80 02
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 40 02
I2C Read:  dev_address 0x19, reg_address 0x8C, data: C0 01
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 80 01
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 00 01
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 80 00
I2C Read:  dev_address 0x19, reg_address 0x8C, data: 80 00
I2C Read:  dev_address 0x19, reg_address 0x8C, data: C0 FF
I2C Read:  dev_address 0x19, reg_address 0x8C, data: C0 FF

Вот что странно. Почему-то младший байт тоже заметно и согласованно меняется. А ведь в документации английским по белому написано: "Temperature data is stored inside OUT_TEMP_H". Так как же понимать полученные результаты? И почему, елки палки, температура держится в районе 0 градусов?! Поверьте, я работаю в помещении, температура примерно 22-23 градуса, а никак не нулевая или -1!

Друзья, помогите разобраться, пожалуйста!

Спасибо!
MegaVolt
Цитата(jur @ Apr 24 2018, 09:41) *
Друзья, помогите разобраться, пожалуйста!

Датчик не знаю но что можно проверить накидаю.

1. Для проверки что есть новая инфа есть регистр STATUS_REG_AUX (стр 46.) в котором выставляются флаги прихода новой температуры. Они обновляются?
2. Попробуйте читать заведомо реже частоты оцифровки. Например одно чтение по нажатию кнопки.
3. В даташите написано пререлиз. Т.е. вполне могут быть ошибки и стоит связаться с производителем.
HardEgor
Бит BDU bit in CTRL_REG4_A (23h) выставляете перед каждым чтение регистров? Или наоборот его надо сбрасывать, дожидаться бита TDA в регистре STATUS_REG_AUX_A (07h), выставлять бит BDU и только тогда читать.

Попробуйче читать без автоинкремента - каждый байт по отдельности.

И еще, в TEMP_EN[1:0] надо записывать 0х03, т.е. 2 единицы.
jur
Цитата(MegaVolt @ Apr 24 2018, 10:25) *
1. Для проверки что есть новая инфа есть регистр STATUS_REG_AUX (стр 46.) в котором выставляются флаги прихода новой температуры. Они обновляются?
2. Попробуйте читать заведомо реже частоты оцифровки. Например одно чтение по нажатию кнопки.
3. В даташите написано пререлиз. Т.е. вполне могут быть ошибки и стоит связаться с производителем.

1. Да, обновляются. Я написал командный файл, в котором записана последовательность команд записи/считывания I2C. Есть команда сделать паузу. Так вот, я читаю STATUS_REG_AUX и вижу, что бит готовности данных температуры установлен. Читаю два байта температуры (без автоинкремента, просто два отдельных чтения). Затем несколько раз снова читаю STATUS_REG_AUX (с интервалом ~20 мсек) и вижу, что он сначала сброшен, а потом снова устанавливается. (Микросхема работает в Continuous mode.)

2. Сделано с помощью командного файла. (Я сочинил в своей тестовой программе простейший интерпретатор.) Все то же самое.

3. У меня есть отдельный PDF на эту микросхему. Он уже не пререлизный (Revision 9, 09-Sep-2016). Значимых отличий не увидел.

Цитата(HardEgor @ Apr 24 2018, 10:27) *
Бит BDU bit in CTRL_REG4_A (23h) выставляете перед каждым чтение регистров? Или наоборот его надо сбрасывать, дожидаться бита TDA в регистре STATUS_REG_AUX_A (07h), выставлять бит BDU и только тогда читать.

Этот бит выставлен и не меняется, т.к. Continuous mode. Я вставил чтение этого регистра для проверки.

Цитата(HardEgor @ Apr 24 2018, 10:27) *
Попробуйче читать без автоинкремента - каждый байт по отдельности.

Да, я попробовал. Один хрен...

Цитата(HardEgor @ Apr 24 2018, 10:27) *
И еще, в TEMP_EN[1:0] надо записывать 0х03, т.е. 2 единицы.

Да, разумеется.

Но что за чертовщина с данными?! Почему так холодно, а я не мерзну?! :-) И почему значение температуры "вылезает" в младший байт?...

P.S. Кстати, я читаю регистры идентификации акселерометра и магнитометра. Они полностью соответствуют документации:

Код
read_register():  device addr 0x19, addr 0x0F, data = 0x33
read_register():  device addr 0x1E, addr 0x4F, data = 0x40

HardEgor
Цитата(jur @ Apr 24 2018, 16:35) *
Но что за чертовщина с данными?! Почему так холодно, а я не мерзну?! :-) И почему значение температуры "вылезает" в младший байт?...

Либо какой-то байт надо сдвинуть, либо что-то не так с Big/Little Endian. \
А может быть какие-то биты надо отбрасывать - они еще что-нибудь обозначают.
Еще можно поискать у ST аналогичный сенсор c измерением температуры и посмотреть как они измеряют, возможно там формула пересчета.
Еще может выдавать в дополнительном коде.
jur
Цитата(HardEgor @ Apr 24 2018, 13:06) *
Либо какой-то байт надо сдвинуть, либо что-то не так с Big/Little Endian. \
А может быть какие-то биты надо отбрасывать - они еще что-нибудь обозначают.

Черт его знает, глядя на эту документацию, - все может быть. Однако, если верить тому, что значение температуры хранится в старшем байте, то endianess тут не при чем. Равно как и отбрасывание каких-то битов.

Цитата(HardEgor @ Apr 24 2018, 13:06) *
Еще можно поискать у ST аналогичный сенсор c измерением температуры и посмотреть как они измеряют, возможно там формула пересчета.

Попробую, конечно, но надежда слаба...

Цитата(HardEgor @ Apr 24 2018, 13:06) *
Еще может выдавать в дополнительном коде.

Конечно, ведь 0xFF представляет из себя -1. Причем они специально пишут, что этот байт - целое со знаком. Темный лес...
MegaVolt
А если поменять температуру? Чашку с чаем на него? Или кусок льда? Будет что-то меняться?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.