Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.07.2012, 13:49
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
HMC5883 Компас
Нашел на просторах интернет-аукциона интересный чип. Это интегральный компас с интерфейсом I2c и точностью 1-2 градуса. Описание прилагаю.
Купить можно отдельно чип по цене $4.45, а так же и готовую плату не на много дороже.
В этой теме будем разбираться, как с ним работать. Для продвинутых товарищей тема особого интереса не представляет и уж тем более не обойдется без жгучих издевок Станислава. Но все же.
Итак, для запуска нам понадобится работать с переферией I2c. Мне было проще прилепить самодельную плату на демоборд с ARM STM32F103VC на борту. Кому-то будет сподручнее PIC. Существует вероятность так же появления в теме ярых фанатов Меги. Так что уровень интерфейса мы опустим и сразу перейдем к протоколу.
Итак, в данном чипе используется как класическая адресация к нужному регистру при помощи указателя, так и быстрый доступ сразу с интересующих нас данных. При первом включении надо убедится, что микросхема подключена правильно и интерфейс работает исправно. Для этого надо прочитать содержимое регистров идентификации чипа. Сделать это можно классическим образом - через указатель.
- I2c START
- I2c address 0x3C (write)
- I2c Send Byte 0x10 //указатель на первый ID регистр А
- I2c Repeat START
- I2c Read Byte + ACK //читаем содержимое ID-A
- I2c Read Byte + ACK //читаем содержимое ID-B
- I2c Read Byte + NACK //читаем содержимое ID-C
- I2c STOP
Сравниваем с мануалом. Должно получится 0x48, 0x34, 0x33.
Если получилось, идем дальше. Начальная конфигурация.
Для начальной конфигурации достаточно записать в регистр MODE значение 0x00. После этого чип начинает работать. Настройки по-умолчанию вполне годятся для большинства задач.
Для STM32 код выглядит так:
Код:
|
unsigned char I2C_Write_Byte (I2C_TypeDef* I2Cx, unsigned char i2c_address, unsigned char i2c_pointer, unsigned char data)
{
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
I2C_GenerateSTART (I2Cx, ENABLE);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2Cx, i2c_address, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2Cx, i2c_pointer);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2Cx, data);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2Cx, ENABLE);
delay_ms(5);
return 0;
} |
Код не самый оптимальный. В том плане, что если сигнала ACK не последует, программа зависнет в вечном ожидании. Но для начала сгодится.
Дальше нужно дождаться данных. Для этого можно либо подождать фиксированное время, либо дождаться логической единички на пине RDY, но я предпочитаю опрашивать бит RDY(0) STATUS регистр на предмет готовности.
Как я уже писал, данные принимаются по упрощенному алгоритму.
- I2c START
- I2c address 0x3D (read)
- I2c read + ACK x5 раз
- I2c read + NACK х1 раз
- I2c STOP
В итоге имеем 6 байт. Старший и младший байты координаты Х. Далее Z и Y.
Далее, при помощи тригонометрии можно получить угол. Это я рассмотрю в следующий раз. В принципе, примеры под ардуино свободно гуглятся.
Свои коды так же прилагаю кому интересно.
Микросхема интересная, призываю участников к обсуждению.
Надеюсь, на следующей неделе допишу анимацию и выложу видео.
Последний раз редактировалось Easyrider83; 27.07.2012 в 15:27.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
02.06.2013, 01:42
|
|
Прохожий
Регистрация: 02.06.2013
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: HMC5883 Компас
Подойдет ли твоя программа на STM32F103VET6, и если нет что надо будет поменять?
|
|
|
Сказали "Спасибо" michail777
|
|
|
02.06.2013, 08:02
|
|
Частый гость
Регистрация: 08.08.2008
Сообщений: 34
Сказал спасибо: 12
Сказали Спасибо 16 раз(а) в 10 сообщении(ях)
|
Re: HMC5883 Компас
Собирал компас на магнитомодуляционных датчиках по техзаданию. Необходимая точность плюс-минус 1 градус и оказалось:
1. Заявленная точность зависит в худшую сторону от самого магнитного поля Земли, которое пульсирует с амплитудой до нескольких процентов. Спектр частот до килогерца. Магнитные бури это как раз про этот случай.
2. Двухкоординатный магнитометр будет иметь ещё большую погрешность из-за аппаратной погрешности, вызванной промежутком времени между отсчётами, во время которых амплитуда и вектор магнитного поля будут уже другими.
3. Разработку нужно проводить с учётом требований метрологии. Наладку-калибровку проводить на стенде, где магнитное поле постоянно по амплитуде и направлению.
4. Элементы электроники практически могут намагничиваться и вносят дополнителную погрешность. Их нужно проверять на восприимчивость к магнитному полю при помощи магнита. Например, выводы микросхем и транзисторов намагничиваются и вносят дополнителную погрешность.
|
|
|
Сказали "Спасибо" vla-serenkov
|
|
|
29.06.2013, 16:34
|
|
Частый гость
Регистрация: 09.02.2013
Сообщений: 22
Сказал спасибо: 7
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: HMC5883 Компас
напишу и в этой теме: датчик подключаю, настройки устанавливаю согласно даташита, удачно считываю Identification register A,B,C. т.е. Работа по I2C правильная, данные получаю корректные. Теперь задам вопрос по получению данных по координатам осей: на плате нарисованы X и Y стрелочки, Z - точка. Стрелкой X направляю примерно на север. С платы получаю только данные без математики и обработки. 255-167-255-67-0-1. Согласно даташиту, данные считываются как X,Z,Y. Здесь: x[0]=255, x[1]=167, z[0]=255, z [1]=67, y[0]=0, y[1]=1. Стоит чуть повернуть плату (ось вращения совпадает с осью X) и данные искажаются x[0]=255, x[1]=167, z[0]=255, z[1]=67, y[0]=255, y[1]=254. Далее попытаемся сосчитать угол x=255*256+167=65447 y=255*256+254=65534 Однако согласно даташита значение X,Y,Z должно лежать в пределах 0x07FF‹значение‹0xF800
(2047‹значение‹63488 ) где что у меня не так? Далее при повороте с юга на восток изменяется значения только младших байтов X и Y. Правильно ли это?
|
|
|
Сказали "Спасибо" aalleexxaa
|
|
|
29.06.2013, 16:54
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: HMC5883 Компас
Я поэтому и больше не мучился с этим компасом, что начал получать с него значения, которые мне ни о чем не говорили ))
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
29.06.2013, 23:38
|
|
Вид на жительство
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
|
Re: HMC5883 Компас
Цитата:
|
X,Y,Z должно лежать в пределах 0x07FF‹значение‹0xF800
(2047‹значение‹63488 )
|
что не есть верно.
0x07FF‹значение‹0xF800 в переводе в знаковый
2047 ... -2048
|
|
|
Сказали "Спасибо" Alecsej
|
|
|
30.06.2013, 12:55
|
|
Частый гость
Регистрация: 09.02.2013
Сообщений: 22
Сказал спасибо: 7
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: HMC5883 Компас
тогда, по моей полученной строке, значения лежат в пределах -255..255
а где скрываются другие значения +-1790?
|
|
|
Сказали "Спасибо" aalleexxaa
|
|
|
30.06.2013, 13:39
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,772 раз(а) в 5,896 сообщении(ях)
|
Re: HMC5883 Компас
Не смотрел конкретно, но, обычно, повышенная разрядность результата измерений настраивается, а по умолчанию - 8 бит. Посмотрите в ДШ.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
30.06.2013, 16:26
|
|
Частый гость
Регистрация: 09.02.2013
Сообщений: 22
Сказал спасибо: 7
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: HMC5883 Компас
может кто скинуть свои конкретные данные, которые получаете в зависимости от напарвления (хотя бы по четырем сторонам света) с модуля без расчетов с описанием настроек регистров, которые используете?
используете ли вы magnetic declination при корректировке угла направления, как это используется в библиотеке для ardunio?
Последний раз редактировалось aalleexxaa; 30.06.2013 в 17:18.
|
|
|
Сказали "Спасибо" aalleexxaa
|
|
|
30.06.2013, 17:37
|
|
Вид на жительство
Регистрация: 10.08.2005
Сообщений: 385
Сказал спасибо: 0
Сказали Спасибо 161 раз(а) в 140 сообщении(ях)
|
Re: HMC5883 Компас
Цитата:
|
тогда, по моей полученной строке, значения лежат в пределах -255..255
а где скрываются другие значения +-1790?
|
По умолчанию диапазон +/- 1.3 гаусс, 1092 разряда на гаусс.
Для средних широт напряженность магнитного поля Земли .5 Га, так что должно получатся примерно -512 ... 512.
Цитата:
|
Не смотрел конкретно, но, обычно, повышенная разрядность результата измерений настраивается, а по умолчанию - 8 бит. Посмотрите в ДШ.
|
а разрядность там всегда одна 12 бит.
|
|
|
Сказали "Спасибо" Alecsej
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Компас v.8 3D
|
Lipa |
Proteus, KiCAD и другие ECAD |
10 |
04.04.2010 17:07 |
Компас 3D V10+
|
algenkel |
Proteus, KiCAD и другие ECAD |
14 |
29.09.2009 13:09 |
[Решено] КОМПАС V.8 3D
|
Лего |
Proteus, KiCAD и другие ECAD |
5 |
17.08.2006 19:43 |
Компас
|
Dozer |
Измерительное оборудование |
4 |
05.07.2005 11:28 |
Компас
|
CD_Eater |
Измерительное оборудование |
5 |
26.08.2004 17:45 |
Часовой пояс GMT +4, время: 08:34.
|
|