|
|
  |
atmega32 + HMC5883 (по i2c), подключение компаса к мк |
|
|
|
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
|
|
|