|
atmega32 + HMC5883 (по i2c), подключение компаса к мк |
|
|
|
May 13 2012, 11:18
|

Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365

|
Добрый день! Возникла проблема при подключении к мк атмега32 компаса HMC5883. Устанавливаю состояние старт, а вот затем посылаю адрес для записи, в ответ на который получаю состояние регистра статуса twi равное 0х20, что означает: данные переданы, получен Not ack. Вот такие дела. Причем коды состояния я получаю только лишь при работе на частоте 1 МГц, на 8Мгц не могу получить даже состояние старт. Код прилагаю даже в двух вариантах. Также в архив положил даташит на компас. Вот участок кода где я проверяю статус: Код void HMC5843(void) { //unsigned char xh, xl, yh, yl, zh, zl; long xo, yo, zo; i2cSendStart(); i2cWaitForComplete(); i2cWrite_Address(0x3C); //write to HMC i2cWaitForComplete(); status_er = i2cGetStatus(); i2cWrite_Data(0x02); //mode register i2cWaitForComplete(); i2cWrite_Data(0x00); //continuous measurement mode i2cWaitForComplete(); //status_er = i2cGetStatus(); //i2cCheckForMT_SLA(); i2cSendStop(); Полезные ссылки: 1)http://www.seeedstudio.com/wiki/index.php?title=Twig_-_3-axis_Compass_v1.0b
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
(60 - 74)
|
May 23 2012, 11:45
|

Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365

|
Дак и LSB меняются, усиление меняешь дак они сильнее меняются. Надо вообщем прочитать про калибровку. Ну получается был глюк с продвижением указателя по регистрам, хотя может так и надо к каждому регистру по отдельности обращаться. Вот рабочий код. А еще как мне тип дабл по уарту передать(по уарту я могу передать 8 бит максимум)? Я же получу градусы по следующей формуле: angle= atan(y/x)* (180 / 3.14159265) +180; // angle in degrees где x = xl|xh << 8 y = yl|yh << 8 Это получится мне нужно градусы передать как два байта за раз, поскольку я сливаю старший и младший байты?
Сообщение отредактировал Kruftin - May 23 2012, 12:16
|
|
|
|
|
May 23 2012, 16:53
|

Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365

|
Вот нашел пример преобразования. Только надо чтобы число был в один байт. Вопрос в том получится(уместится) ли значение angle в один байт. У меня же angle меняется от 0 до 360 даже если я к целому преобразую, а в один байт влазит до 255
Сообщение отредактировал Kruftin - May 23 2012, 17:18
Эскизы прикрепленных изображений
|
|
|
|
|
May 23 2012, 18:49
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Kruftin @ May 23 2012, 19:53)  Вот нашел пример преобразования. Мутный пример какой-то. Цитата(Kruftin @ May 23 2012, 19:53)  Вот нашел пример преобразования. Только надо чтобы число был в один байт. Ну 360 не вместится, разве что на 2 поделить. Пример Код void SendToUart(unsigned char new_byte) { // посылка в порт } #include <stdio.h>
void SendAngle(double angle) { unsigned short tmp=(unsigned short)Value; char Buf[20]; unsigned char l=sprintf(Buf,"Angle=%d\n\r", tmp); for (char i=0; i<l; i++) { SendToUart(Buf[i]); }
|
|
|
|
|
May 24 2012, 05:29
|

Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365

|
Т.е. в массиве Buf будут лежать десятичные цифры? Если число 180.52, то в Buf[0]=1 Buf[1] = 8 Buf[3] = . Buf[4] = 5? Если да, то это круто). Или просто число будет разбито по байтам? Спасибо огромное ILYAUL и Артем!!!  Не знаю что бы я без вас делал. Поехал сейчас компас покупать. Код отредактировал маленько: Код void SendAngle(float angle) { unsigned short tmp=(unsigned short)angle; //преобразуем угол в целое число char Buf[20]; //создаем массив unsigned char l=sprintf(Buf,"Angle=%d\n\r", tmp); //записываем в буфер значение угла по цифрам unsigned char i = 0; for (i=0; i<l; i++) { USART_SendChar(Buf[i]);//выводим все по уарту } }
Сообщение отредактировал Kruftin - May 24 2012, 07:57
Эскизы прикрепленных изображений
|
|
|
|
|
May 24 2012, 17:57
|

Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365

|
Так вот только формула для определения севера неверная походу, хотя написана тут http://www.seeedstudio.com/wiki/index.php?...s_Compass_v1.0bПо ней получается, что значения меняются от 180 до 268, учитывая что по даташиту значения регистров меняются от 0xF800 to 0x07FF получается по формуле xv = xh << 8|xl; yv = zh << 8|zl; angle = atan2(yv,xv)*(180/3.14)+180; имеем от 180 до 268 значения угла. В даташите вот ни слова нету как вычислить угол. Но компас вроде как верно работает. Хотя если считать как angle = atan2(yv,xv) то можно получать значения от 0 до 90 со странные перескоками с 30 на 60 и т.д. Поскольку нету отрицательных значений. Режим postive и negative bias как я понял для самотестирования. Сделать компас под выдачу нормальных данных так и не удалось и в даташите про расчет углов ничего вроде как нету. Смотрел пример расчета и калибровки для ардуино, так вот чето не все понял. Мда столько времени на него потратил, а он самый последний шаг сделать не получается. Код для ардуино приложил.
Сообщение отредактировал Kruftin - May 25 2012, 12:45
|
|
|
|
|
May 31 2012, 13:06
|

Частый гость
 
Группа: Участник
Сообщений: 115
Регистрация: 30-05-11
Из: Екатеринбург
Пользователь №: 65 365

|
Мда, на данный момент я получаю правдивые значения углов в диапазоне от 0 до 270 градусов, в оставшемся компас выдает скачущие и неверные данные. Правдивыми являются данные angle от 0 до -135, это результат atan2(yv,xv)*180/pi, где xv = (xh << 8)|xl; yv = (yh << 8)|yl; Причем относительно реального севера нулевая отметка смещена градусов на 30, но это не проблема, главное что изменение градусов он показывает верно(правда надо умножить значение на 2) но только в диапазоне от 0 до 270 градусов. Похоже это баг компаса моего, либо надо поиграть усилением, но ведь на 75% значений при вращении оно не влияет. Код на сегодня приложил. P.S. Хотя судя по примеру для ардуино я должен получать сразу значение от - 180 до 180, не умножая на два.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|