Главная » Статьи » Как подключить

Работа с магнитометром HMC5883L
 Сегодня будет описание работы одного очень интересного датчика - магнитометра HMC5883L. Как видно из названия этот датчик измеряет магнитное поле, причем делает это в трех осях. Это дает возможность получать трехмерную картину направленности магнитного поля и его величину. А если проще, то с помощью этого датчика можно собрать свой цифровой компас. Интересно как с ним работать? Тогда читаем дальше!

 HMC5883L достаточно распространенный и недорогой датчик, для общения с микроконтроллером используется стандартный
I2C интерфейс.
 Чип выпускается в крошечном 16-и выводном корпусе LPCC
размерами 3х3 мм. 







 Обозначение выводов:

  1. SCL - вход тактирования шины I2C
  2. VDD - вход для подключения питания (кормится эта козявка напряжением в диапазоне 2,16-3,6 вольт)
  3. не используется
  4. S1 - дополнительное питание для портов ввода/вывода. Подключается напрямую к выводу VDDIO
  5. не используется
  6. не используется
  7. не исползуется
  8. SETP - первый вход для подключения керамического конденсатора на 0,22uF
  9. GND - земля
  10. С1 - еще один вход для подключения конденсатора. Электролитичиского или танталового на 4,7uF (другой конец конденсатора подключается к земле)
  11. GND - земля
  12. SETC - второй вход для подключения керамического конденсатора на 0,22uF
  13. VDDIO - вход для подключения напряжения которое будет на портах ввода/вывода
  14. не используется
  15. Выход прерывания, когда данные готовы на этом выводе появляется логическая 1
  16. SDA - линия данных интерфейса I2C

 В общем обвязка у сенсора минимальная, всего два конденсатора. Не считая двух pullup резисторов, необходимых для шины I2C. В простейшем случае, когда порты ввода/вывода запитаны напряжением питания схемы и не используется вывод прерывания, схема подключения будет выглядеть так:




 Работа по шине I2C

 Как и любое устройство, работающее по интерфейсу I2C, датчик имеет свой собственный уникальный адрес для работы. HMC5883L присвоен адрес 0х1E. С восьмым битом записи/чтения адрес будет 0х3D для чтения и 0х3C для записи.


Карта регистров датчика представлена в таблице ниже:



 Как видно, для настройки датчика доступны регистры
(это те куда мы можем что-то записать) находящиеся на адресах 00 (configuration register A), 01 (configuration register B) и 02 (mode register).  





Configuration Register A (CRA)



 Первый из доступных, для настройки датчика, регистров. Каждый бит имеет свое имя, для того чтобы было видно с каким еще битом в регистре он связан (например, биты CRA6 и CRA5 имеют общее имя MA1 и MA0 соответственно, так как отвечают за один и тот же параметр)

CRA7 - зарезервированный бит и пока не используется
CRA6|CRA5 - устанавливают число замеров (семплов) перед выдачей результата измерения.


эти биты могут принимать значения: 00 = 1(Default);  01 = 2;  10 = 4;  11 = 8


Пример: чтобы установить 4 семпла записываем в CRA6 единицу, a в CRA5 ноль.


CRA4|CRA3|CRA2 - устанавливают с какой скоростью будут записываться данные в регистры считывания данных (Data Output Registers).
000 - 0,75 Гц
001 - 1,5 Гц
010 - 3 Гц
011 - 7,5 Гц
100 - 15 Гц (дефолтное значение)
101 - 30 Гц
110 - 75 Гц
111 - зарезервировано


Пример: для того чтобы увеличить скорость записи данных до 75 Гц записываем в CRA4 единицу, в CRA3 единицу, в CRA2 ноль.



CRA1|CRA0 - настраивают тип измерения. Тут какие-то технические заморочки с импедансом в  магниторезистивной нагрузке датчика в каждой из осей. Не стал разбираться в деталях, оставил значение регистров по умолчанию (00 - нормальный режим измерения) .
  

Пример: настроим полностью регистр А, установим количество семплов равным 8 , скорость записи данных 3 Гц, нормальный тип измерения. Для этого мы должны отправить в регистр 8 бит данных, в двоичном представлении это будет: &b01101000.




Configuration Register B (CRB)



 

 В регистре B настраивается чувствительность датчика к магнитному полю. За эти установки отвечают биты CRB7|CRB6|CRB5. Остальные 5 бит не используются, но для корректной работы они должны быть забиты нулями. 

 Зависимость чувствительности (Lsb/Gauss) датчика от установленных битов CRB7|CRB6|CRB5 
000 -1370
001 -1090 (дефолтное значение)
010 - 820
011 - 660
100 - 440
101 - 390
110 - 330
111 - 230

Пример: установим максимальную чувствительность датчика, для этого отправим в регистр B бинарное значение &b00000000





Mode Register (MR)




В последнем оставшемся в нашем распоряжении регистре, настраиваются такие параметры как скорость работы на шине I2C и режим работы датчика.
 Высокоскоростной режим работы I2C (3400 кГц) устанавливается записью в бит MR7 единицы.
MD1|MD0 устанавливают режим работы датчика:
00 - режим непрерывного измерения.
01 - режим единичного измерения (в этом режиме датчик работает умолчанию). После измерения и записи результата в регистр вывода данных датчик уходит в режим ожидания (Idle)
10 - погружает датчикв режим ожидания. Потребление в этом режиме падает до 2 мкА
11 - также погружает датчик в режим ожидания.

Пример: установим высокоскоростное соединение датчика с микроконтроллером на скорости 3400кГц и запустим режим непрерывного измерения. Для этого запишем в регистр бинарное значение &b10000000.


 Измеренные по трем осям данные забираются из соответствующих регистров, для каждой из осей данные состоят из двух байт - старшего и младшего. Для получения результата их необходимо сложить, но это уже очевидные вещи поэтому приступим непосредственно к коду и железу.
 
 Для того чтобы самостоятельно не паять эту букашку купил на ebay вот такую готовую платку:

  
 Обошлась она мне в 5$ и помимо минимально необходимой обвязки содержит стабилизатор питания и схему преобразователя уровней. Поэтому эту платку можно подключать к 5-и вольтовой схеме без опаски спалить сенсор.

 Подключается плата с датчиком напрямую к микроконтроллеру, подтягивающие резисторы ставить не нужно, они уже имеются на плате:



 Исходник в Bascom-AVR для работы с датчиком HMC5883L. В программе данные полученные с датчика (значение магнитного поля на каждой из осей и рассчитанный угол относительно севера) отправляются в терминал.

$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 150
$baud = 9600

'переменные и констаннты
Dim Hmc_x As Integer
Dim Hmc_xl As Byte At Hmc_x + 0 Overlay
Dim Hmc_xh As Byte At Hmc_x + 1 Overlay

Dim Hmc_y As Integer
Dim Hmc_yl As Byte At Hmc_y + 0 Overlay
Dim Hmc_yh As Byte At Hmc_y + 1 Overlay

Dim Hmc_z As Integer
Dim Hmc_zl As Byte At Hmc_z + 0 Overlay
Dim Hmc_zh As Byte At Hmc_z + 1 Overlay


Dim X As Single
Dim Y As Single
Dim Z As Single
Dim Angle As Single
Dim Angle_str As String * 6


Const Hmc_w = &H3C                           'адрес датчика + бит записи
Const Hmc_r = &H3D                           'адрес датчика + бит чтения

'конфигурация I2C
Config Scl = Portc.0                         'линия тактовых импульсов
Config Sda = Portc.1                         'линия данных
I2cinit

Gosub Hmc_setup

'ГЛАВНЫЙ ЦИКЛ
Do

Gosub Hmc_read

= Hmc_x
= Hmc_y
= Hmc_z

Angle = Atn2(, X)
Angle = Angle * 57.2957795                   ' (180 / 3.141592)
Angle = Angle + 180


Angle_str = Fusing(angle , "#.#")
Angle_str = Angle_str + "°"

'выводим данные в терминал
 Print "x:  " ; X ; "       ";
 Print "y:  " ; Y ; "       ";
 Print "z:  " ; Z ; "       ";
 Print "Angle:  " ; Angle_str
 Print

Waitms 500
Loop


End


'инициализация магнитометра и его настройка
Hmc_setup:
   I2cstart
    I2cwbyte Hmc_w
    I2cwbyte &H00                       'записываем с нулевого адреса
    I2cwbyte &B01011000                 'регистр А. 4 сэмпла, 75Гц, нормальный режим
    I2cwbyte &H00100000                 'регистр B.усиление 1090 (по умолчанию)
    I2cwbyte &H00000000                 'устанавливаем режим постоянного измерения
   I2cstop
Return


'чтение данных
Hmc_read:
   I2cstart
    I2cwbyte Hmc_w
    I2cwbyte &H03                 'начинаем читать данные с регистра хранения данных
   I2cstart
    I2cwbyte Hmc_r
    I2crbyte Hmc_xh , Ack               'читаем старший байт x
    I2crbyte Hmc_xl , Ack               'читаем младший байт x
    I2crbyte Hmc_zh , Ack               'читаем старший байт z
    I2crbyte Hmc_zl , Ack               'читаем младший байт z
    I2crbyte Hmc_yh , Ack               'читаем старший байт y
    I2crbyte Hmc_yl , Nack              'читаем младший байт y
   I2cstop
Return




 А так выглядят данные отправленные в терминал










Документация на датчик HMC5883L (PDF)




Категория: Как подключить | Добавлено: 20.09.2013
Просмотров: 45865 | Комментарии: 14 | Теги: HMC5883L | Рейтинг: 5.0/3
Всего комментариев: 14
14 sany2   (30.11.2014 11:33) [Материал]
Что-то как-то непонятно он работает.Как я понимаю север-юг измеряет ось X.Но стоит датчик отклонить по Y,значения по X уходят чёрти куда.Компас по таким данным не сделать.Надо дальше рыть...

+1  
13 RD3AVJ   (05.09.2014 00:57) [Материал]
Scorpushka тут  http://avrproject.ru/forum/9-122-1189-16-1358112753 и по ссылке на mselec там же wink

12 Scorpushka   (30.08.2014 16:24) [Материал]
повторил на меге2560
работает

но не сразу. до этого от старого проекта остались
$hwstack = 16
$swstack = 16
$framesize = 16
с ними не работало-выдавало одни и те же измерения.
поставил из этой статьи -заработало

где популярно расписано что это за параметры?

11 exersizze   (22.09.2013 23:34) [Материал]
kip96, ну для горизонта лучше акселерометр использовать. Не знаю насколько линии магнитного поля земли параллельны поверхности, наверняка есть перегибы магнитных полей и аномалии.

10 top   (21.09.2013 11:52) [Материал]
"At Hmc_x + 0 Overlay" и "At Hmc_x + 1 Overlay" - здесь плюс ноль и плюс один соответственно это позиция байта из двухбайтной переменной Hmc_x??

UPD: не заметил. ответ на вопрос есть ниже)

9 kip96   (21.09.2013 11:36) [Материал]
exersizze, как горизонт вычислить, не пробывал? Как вариант, сделать "строительрый уровень"

+2   Спам
8 exersizze   (21.09.2013 08:13) [Материал]
Конкретно эта плата может работать и подключаться к 5 вольтам, а что касается самого датчика то в документации на него ничего про толерантность не нашел. Думаю что сгорит,  иначе бы китайцы не заморачивались бы со схемой согласования. 
Что касается этого 

Код
Dim Hmc_x As Integer  
Dim Hmc_xl As Byte At Hmc_x + 0 Overlay  
Dim Hmc_xh As Byte At Hmc_x + 1 Overlay


Это объявление переменных и указание адреса в sram  памяти микроконтроллера, куда эта переменная должна будет записываться. Переменная Hmc_x объявлена как integer и занимает два байта. А две следующих переменных Hmc_xl и Hmc_xhбудут записываться в область первой переменной, т.е. автоматически склеиваться в одну двухбайтную переменную Hmc_x.

7 vikov   (20.09.2013 23:27) [Материал]
Добрый день! Подскажите пожалуйста плата МК тоже должна питаться 3 в или выводы магнитометра толерантны к 5 в как у nrf24l01? В исходнике определения переменных строка At Hmc_x + 0 Overlay что обозначает?

+1   Спам
6 Aleks8383   (20.09.2013 14:59) [Материал]
для RD3AVJ
Как куда,ты же радиолюбитель :) Прикручиваем к поворотке антенны и смотроим куда она направлена.

5 pchela5   (20.09.2013 11:25) [Материал]
>> To 4 RD3AVJ
>> Куда еще втюхать - я даже не представляю)))

Игрушку сделать, чтобы голосом Табаки кричала: "А мы уйдем на север" ))) Ну и еще что-нибудь, если направление другое.

4 RD3AVJ   (20.09.2013 10:05) [Материал]
Очевидным плюсом девайса по сравнению с данными от ЖПС является независимость от погодных условий и постоянная готовность к мгновенным показаниям данных. Но вот область практического применения какая? Скорее всего, как часть модуля управления беспилотником при построении авиамодели с автопилотом. Куда еще втюхать - я даже не представляю)))

3 exersizze   (20.09.2013 09:10) [Материал]
Да, этот датчик ориентируется по магнитному полю. А жпс спутники привязаны именно к оси вращения земли и поэтому определение полярных точек не зависит никак от магнитных полюсов. Я так понимаю smile

2 RD3AVJ   (20.09.2013 08:47) [Материал]
Я так понял, что данный девайс будет показывать курс относительно магнитного севера, тогда как данные с GPS-чипа соответствуют показаниям географического севера? Так? Я немного запутался... wacko

1 Scorpushka   (20.09.2013 07:34) [Материал]
спасибо! надо заранее предупреждать о посылках!!!!!!!!!! )))

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация