jur 0 24 апреля, 2018 Опубликовано 24 апреля, 2018 · Жалоба Приветствую! Случилось мне познакомиться с датчиком 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 29 24 апреля, 2018 Опубликовано 24 апреля, 2018 · Жалоба Друзья, помогите разобраться, пожалуйста! Датчик не знаю но что можно проверить накидаю. 1. Для проверки что есть новая инфа есть регистр STATUS_REG_AUX (стр 46.) в котором выставляются флаги прихода новой температуры. Они обновляются? 2. Попробуйте читать заведомо реже частоты оцифровки. Например одно чтение по нажатию кнопки. 3. В даташите написано пререлиз. Т.е. вполне могут быть ошибки и стоит связаться с производителем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 81 24 апреля, 2018 Опубликовано 24 апреля, 2018 · Жалоба Бит BDU bit in CTRL_REG4_A (23h) выставляете перед каждым чтение регистров? Или наоборот его надо сбрасывать, дожидаться бита TDA в регистре STATUS_REG_AUX_A (07h), выставлять бит BDU и только тогда читать. Попробуйче читать без автоинкремента - каждый байт по отдельности. И еще, в TEMP_EN[1:0] надо записывать 0х03, т.е. 2 единицы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 24 апреля, 2018 Опубликовано 24 апреля, 2018 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 81 24 апреля, 2018 Опубликовано 24 апреля, 2018 · Жалоба Но что за чертовщина с данными?! Почему так холодно, а я не мерзну?! :-) И почему значение температуры "вылезает" в младший байт?... Либо какой-то байт надо сдвинуть, либо что-то не так с Big/Little Endian. \ А может быть какие-то биты надо отбрасывать - они еще что-нибудь обозначают. Еще можно поискать у ST аналогичный сенсор c измерением температуры и посмотреть как они измеряют, возможно там формула пересчета. Еще может выдавать в дополнительном коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jur 0 24 апреля, 2018 Опубликовано 24 апреля, 2018 · Жалоба Либо какой-то байт надо сдвинуть, либо что-то не так с Big/Little Endian. \ А может быть какие-то биты надо отбрасывать - они еще что-нибудь обозначают. Черт его знает, глядя на эту документацию, - все может быть. Однако, если верить тому, что значение температуры хранится в старшем байте, то endianess тут не при чем. Равно как и отбрасывание каких-то битов. Еще можно поискать у ST аналогичный сенсор c измерением температуры и посмотреть как они измеряют, возможно там формула пересчета. Попробую, конечно, но надежда слаба... Еще может выдавать в дополнительном коде. Конечно, ведь 0xFF представляет из себя -1. Причем они специально пишут, что этот байт - целое со знаком. Темный лес... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 25 апреля, 2018 Опубликовано 25 апреля, 2018 · Жалоба А если поменять температуру? Чашку с чаем на него? Или кусок льда? Будет что-то меняться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться