|
|
  |
Проблема с чтением температуры из LSM303AGR, Странные значения температуры |
|
|
|
Apr 24 2018, 06:41
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Приветствую! Случилось мне познакомиться с датчиком 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! Друзья, помогите разобраться, пожалуйста! Спасибо!
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Apr 24 2018, 07:25
|
Знающий
   
Группа: Свой
Сообщений: 779
Регистрация: 3-01-05
Из: Минск
Пользователь №: 1 783

|
Цитата(jur @ Apr 24 2018, 09:41)  Друзья, помогите разобраться, пожалуйста! Датчик не знаю но что можно проверить накидаю. 1. Для проверки что есть новая инфа есть регистр STATUS_REG_AUX (стр 46.) в котором выставляются флаги прихода новой температуры. Они обновляются? 2. Попробуйте читать заведомо реже частоты оцифровки. Например одно чтение по нажатию кнопки. 3. В даташите написано пререлиз. Т.е. вполне могут быть ошибки и стоит связаться с производителем.
|
|
|
|
|
Apr 24 2018, 09:35
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(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
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Apr 24 2018, 10:06
|
Гуру
     
Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925

|
Цитата(jur @ Apr 24 2018, 16:35)  Но что за чертовщина с данными?! Почему так холодно, а я не мерзну?! :-) И почему значение температуры "вылезает" в младший байт?... Либо какой-то байт надо сдвинуть, либо что-то не так с Big/Little Endian. \ А может быть какие-то биты надо отбрасывать - они еще что-нибудь обозначают. Еще можно поискать у ST аналогичный сенсор c измерением температуры и посмотреть как они измеряют, возможно там формула пересчета. Еще может выдавать в дополнительном коде.
|
|
|
|
|
Apr 24 2018, 14:04
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(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. Причем они специально пишут, что этот байт - целое со знаком. Темный лес...
--------------------
MPEG-4 - в массы!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|