Перейти к содержанию
    

Проблема с чтением температуры из LSM303AGR

Приветствую!

 

Случилось мне познакомиться с датчиком 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!

 

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

 

Спасибо!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

1. Для проверки что есть новая инфа есть регистр STATUS_REG_AUX (стр 46.) в котором выставляются флаги прихода новой температуры. Они обновляются?

2. Попробуйте читать заведомо реже частоты оцифровки. Например одно чтение по нажатию кнопки.

3. В даташите написано пререлиз. Т.е. вполне могут быть ошибки и стоит связаться с производителем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бит BDU bit in CTRL_REG4_A (23h) выставляете перед каждым чтение регистров? Или наоборот его надо сбрасывать, дожидаться бита TDA в регистре STATUS_REG_AUX_A (07h), выставлять бит BDU и только тогда читать.

 

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

 

И еще, в TEMP_EN[1:0] надо записывать 0х03, т.е. 2 единицы.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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). Значимых отличий не увидел.

 

Бит BDU bit in CTRL_REG4_A (23h) выставляете перед каждым чтение регистров? Или наоборот его надо сбрасывать, дожидаться бита TDA в регистре STATUS_REG_AUX_A (07h), выставлять бит BDU и только тогда читать.

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

 

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

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

 

И еще, в 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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Либо какой-то байт надо сдвинуть, либо что-то не так с Big/Little Endian. \

А может быть какие-то биты надо отбрасывать - они еще что-нибудь обозначают.

Еще можно поискать у ST аналогичный сенсор c измерением температуры и посмотреть как они измеряют, возможно там формула пересчета.

Еще может выдавать в дополнительном коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Либо какой-то байт надо сдвинуть, либо что-то не так с Big/Little Endian. \

А может быть какие-то биты надо отбрасывать - они еще что-нибудь обозначают.

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

 

Еще можно поискать у ST аналогичный сенсор c измерением температуры и посмотреть как они измеряют, возможно там формула пересчета.

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

 

Еще может выдавать в дополнительном коде.

Конечно, ведь 0xFF представляет из себя -1. Причем они специально пишут, что этот байт - целое со знаком. Темный лес...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если поменять температуру? Чашку с чаем на него? Или кусок льда? Будет что-то меняться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...