26.03.2017, 15:51
|
|
Прохожий
Регистрация: 26.03.2017
Сообщений: 7
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Адресация магнетометра 5883L
Добрый день!
Имеется магнитометр 5883L, на основе которого ребенок хочет сделать компас. Ребенок слишком рано увлекся электроникой и мне приходится помогать ему разбираться, хотя электроника и программирование - совсем не мои области, я биолог. Датчик нужно подключить к контроллеру из конструктора Fischertechnik по шине I2C. Язык программирования используется графический, есть два программных элемента для записи и чтения по I2C. Там указывается адрес устройства на шине, адрес регистра и значение, примерно как на картинке. Datasheet я изучил, но увы, в силу отсутствия базовых знаний просто не могу понять как правильно обращаться к датчику. Библиотеки Ardiuno изучал, но еще больше каши в голове.
Если можно, подскажите, как определить последовательность команд в формате HEX для переключения в режим Continuous measurment, а также адреса по которым считываются данные.
|
|
|
|
26.03.2017, 16:27
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Адресация магнетометра 5883L
По графическому языку тут вам уж точно наврядли кто подскажет - тут форум более глубокого уровня "копания", так сказать
А вот по магнетометру... В даташите https://cdn-shop.adafruit.com/datash...Compass_IC.pdf , на стр.2 написано, что адрес магнетометра на I2C-шине - для чтения из датчика - 0x3D, для записи в датчик - 0x3C. Свойства шины I2C подразумевают, что каждое устройство (а их может быть подключено несколько) на шине имеет свой адрес, и при обращении к устройству надо передать вначале его адрес, затем уже либо принимать из устройства, либо передавать в него что-то.
На стр.18 даташита написано, какие команды надо передать в магнетометр для правильного его включения.
То есть, собственно говоря, и указаны последовательность посылаемых байтов.
Например, в "(power-on) initialization process for “continuous-measurement mode”:
пункты 1, 2, 3 - это посылаемые байты для включения и настройки магнетометра (первый байт является как раз адресом устройства на шине, второй байт - адресом регистра внутри магнетометра, а третий - значением, записываемым в тот регистр)
затем пункт 4 - задержка на 6 мс,
и затем пункт 5 - цикл посылки байт (первый байт - адрес устройства на шине, второй байт - команда) и затем сразу прием 6 байт ответа, последовательно друг за другом (это будут 2-байтные данные по трем осям), затем отправка какой-то команды, ожидание 67 мс и повтор цикла.
Либо второй вариант, для однократного измерения.
Последний раз редактировалось NewWriter; 26.03.2017 в 16:50.
|
|
|
|
26.03.2017, 16:53
|
|
Прохожий
Регистрация: 26.03.2017
Сообщений: 7
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Адресация магнетометра 5883L
Дело не столько в графическом языке, а в моих знаниях, точнее в их отсутствии. Недавно мы подключили гироскоп BMI160, но в его datasheet были довольно четкие указания и мне удалось его запустить и настроить. Datasheet 5883 я изучил, но не могу разобраться с адресами. Само устройство имеет адрес 0x1e. Если я обращаюсь по нему, какие-то данные получить удается, если использую адреса 0x3C и 0x3D эффекта нет.
Еще прикреплю картинки, write - это попытка перехода в режим непрерывного чтения, read - получение данных по оси X (?). Если с записью, кажется, все в порядке, то чтение явно делается неправильно, также непонятно какие адреса отвечают за определенные оси. Кроме того, я весьма слабо представляю, что именно мне надо получать, LSB или MSB.
|
|
|
|
26.03.2017, 17:04
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Адресация магнетометра 5883L
Я ж уже написал. У устройства два адреса НА ШИНЕ, раздельные для записи в магнетометр и для чтения из него. То есть, включая и настраивая магнетометр, вы используете передачу адреса для записи (на шине), а начиная чтение данных, вы должны передать адрес (на шине) для чтения.
При чтении, после передачи команды, данные (судя по всему) приходят последовательно друг за другом, 6 байт - по 2 байта в каждой оси.
LSB и MSB - в данном случае означает видимо младший (LSB) и старший (MSB) байты значения по оси.
Внутренние адреса регистров, в которых хранятся измеренные значения, приведены на стр.11 в табл.2
Более подробно даташит я не читал
Последний раз редактировалось NewWriter; 26.03.2017 в 17:10.
|
|
|
|
26.03.2017, 17:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,047
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Адресация магнетометра 5883L
ИМХО чтение данных происходит в 2 этапа:
1. Запись в магнитометр по I2C адресу(поле адрес устройства) команды на чтение осей X, Y и Z (поле данные) по внутреннему адресу соотв. регистра магнитометра(поле расширенный адрес)
2. Чтение магнитометра по I2C адресу(отличается от адреса записи на младший бит - должен быть 0x1F) - магнитометр знает что от него ходят благодаря п. 1 и выдаёт данные.
Последний раз редактировалось dgrishin; 26.03.2017 в 17:55.
|
|
|
|
26.03.2017, 17:55
|
|
Прохожий
Регистрация: 26.03.2017
Сообщений: 7
Сказал спасибо: 1
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Адресация магнетометра 5883L
Не получается, по адресам чтения-записи блок просто висит, видимо не получая ответа. При обращении по 0x1e похож на работающий. Возможно блок записи сам добавляет нужный бит, не знаю.
Работая с BMI160 я привык к такой схеме, адрес - регистр - значение. На картинке в первом посте видно как сначала включается гироскоп (выход из сна), затем акселерометр, затем выбирается рабочий диапазон гироскопа. Да, я два месяца разбирался с гироскопом, но в этом случае я не могу найти соответствующих адресов. Табличку я конечно видел, верно ли, что для чтения X MSB надо читать по адресу 0x03 ?
Сообщение от dgrishin
|
ИМХО чтение данных данных происходит в 2 этапа:
1. Запись в магнитометр по I2C адресу(поле адрес устройства) команды на чтение осей X, Y и Z (поле данные) по внутреннему адресу соотв. регистра магнитометра(поле расширенный адрес)
2. Чтение магнитометра по I2C адресу(отличается от адреса записи на младший бит - должен быть 0x1F) - магнитометр знает что от него ходят благодаря п. 1 и выдаёт данные.
|
Звучит логично, вопрос только, соответствующий регистр это какой? А по пункту два мне вообще требуется перевод , не забывайте я биолог и влезаю в эту область только из-за ребенка...
|
|
|
|
26.03.2017, 18:22
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,121
Сказал спасибо: 2,569
Сказали Спасибо 11,944 раз(а) в 5,991 сообщении(ях)
|
Re: Адресация магнетометра 5883L
Сообщение от vladmed
|
При обращении по 0x1e похож на работающий
|
Естественно. Восьмибитный адрес 3C и 3D, а семибитный, без младшего, отвечающего за направление данных, будет как раз 1E. Причем, и для чтения, и для записи. Функции работы с ивасями сами добавят нужный младший.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
26.03.2017, 18:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,047
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Адресация магнетометра 5883L
Вот как он работает (мой предыдущий пост прошу считать неверным - навеяно I2C протоколом управления другой микросхемы)
To clock out the new data, send:
0x3D, and clock out DXRA, DXRB, DZRA, DZRB, DYRA, and DYRB located in registers 3 through 8. The HMC5883L will automatically re-point back to register 3 for the next 0x3D query.
Т. е. надо обратится по I2C адресу чтения (какой будет правильный ??) и прочитать 6 байт.
Последний раз редактировалось dgrishin; 26.03.2017 в 18:52.
|
|
|
|
26.03.2017, 21:01
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2010
Адрес: Днепр, Украина
Сообщений: 765
Сказал спасибо: 450
Сказали Спасибо 401 раз(а) в 282 сообщении(ях)
|
Re: Адресация магнетометра 5883L
Сообщение от vladmed
|
Само устройство имеет адрес 0x1e.
|
если ваш конструктор автоматически преобразует базовый 7 бит адрес 0x1E в реальные адреса 0x3C (при чтении) и 0x3D (при записи) - в это можно поверить .
Чтобы микросхема заработала должны быть выполнены следующие условия: на микросхему должно быть подано питание, микросхема должна быть подключена к шине I2C с подтягивающими к питанию резисторами, на шине не должно быть конфликта адресов - адреса 0x3C и 0x3D (или 0х1Е) не должны пересекаться с другими подключенными к шине устройствами.
После подачи питания микросхема включается в режим однократного преобразования. То есть - прочитали ВСЕ 6 регистров данных (по осям), пнули микросхему - она выполнит еще один цикл преобразования.
При этом диапазон значений измеряемого магнитного поля, скорость обмена на шине I2C, количество усреднений данных установлены в значения по умолчанию!.
Впечатление такое, что те, кто писал пример в даташите, ориентировались на правила какого то языка программирования, или чтото вроде Ардуино.
Вот здесь есть пример использования датчика с программой на BASCOM-AVR. Как раз в виде компаса. Если ваш конструктор преобразует адреса , то последовательность должна быть такая:
запись (I2C)0x1Е (extI2C)0x00 (data)0x70 {выборка по 8, 15 раз в сек}
запись (I2C)0x1Е (extI2C)0x01 (data)0x20 {м/поле +/- 1.3 Гаусс}
запись (I2C)0x1Е (extI2C)0x02 (data)0x00 {повторяющееся преобразование}
затем, следует выполнять повторяющуюся последовательность :
запись (I2C)0x1Е (extI2C)0x03 {готовимся работать с внутренним регистром 03 (первый регистр данных)}
чтение (I2C)0x1Е {первый регистр данных, старшая половина Х}
чтение (I2C)0x1Е {второй регистр данных, младшая половина Х}
чтение (I2C)0x1Е {третий регистр данных, старшая половина Z}
чтение (I2C)0x1Е {четвертый регистр данных, младшая половина Z}
чтение (I2C)0x1Е {пятый регистр данных, старшая половина Y}
чтение (I2C)0x1Е {шестой регистр данных, младшая половина Y}
превратить куски данных в чтото удобоваримое, высчитать угол к северу, например, подождать еще немного (пока закончится цикл измерения)
вернуться к началу последовательности.
---------------------------------------------
а можно просто включить все и выполнить последовательность:
запись 0х1Е 0х0А
чтение 0х1Е
чтение 0х1Е
Чтение 0х1Е
- прочитать три байта идентификации микросхемы. если все работает - вы получите 0х48 0х34 0х33.
Последний раз редактировалось GarryZZ; 27.03.2017 в 08:33.
|
|
|
|
26.03.2017, 21:12
|
|
Гражданин KAZUS.RU
Регистрация: 18.07.2010
Адрес: Днепр, Украина
Сообщений: 765
Сказал спасибо: 450
Сказали Спасибо 401 раз(а) в 282 сообщении(ях)
|
Re: Адресация магнетометра 5883L
работа с автоинкрементом внутренних адресов на совести ооболочки, если вдруг она такое дело не понимает - можно попробовать
чтение (I2C)0x1Е (extI2C)0x03 {первый регистр данных, старшая половина Х}
чтение (I2C)0x1Е (extI2C)0x04 {второй регистр данных, младшая половина Х}
чтение (I2C)0x1Е (extI2C)0x05 {третий регистр данных, старшая половина Z}
чтение (I2C)0x1Е (extI2C)0x06 {четвертый регистр данных, младшая половина Z}
чтение (I2C)0x1Е (extI2C)0x07 {пятый регистр данных, старшая половина Y}
чтение (I2C)0x1Е (extI2C)0x08 {шестой регистр данных, младшая половина Y}
и соответственно,
чтение (I2C)0x1Е (extI2C)0x0А {первый байт идентификации}
чтение (I2C)0x1Е (extI2C)0x0В {второй байт идентификации}
чтение (I2C)0x1Е (extI2C)0x0С {третий байт идентификации}
сразу после включения
|
|
|
Сказали "Спасибо" GarryZZ
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:06.
|
|