работа с гироскопом ITG3200 и акселерометром BMA180

MAFia
Offline
Зарегистрирован: 26.10.2011

Доброго времени суток!

При работе над своим проектом столкнулся с проблемой: прочитать данные с вышеназванных датчиков я-то прочитал, но что дальше делать с этими циферками не знаю.

Во-первых, в чем они измеряться? (в долях от измеряемого диапазона?)

Во-вторых. Сырые данные (по 3-м осям) отличны от нуля в состоянии покоя, значит нужно ввести поправку. С гиром все ясно - в состоянии покоя должны быть нули. А вот с акселем по оси Z? Насколько я понимаю (по опыту эксплуатирования квадрокоптера на таких же датчиках), что аксель нуждается в калибровке, т.е берем значение по оси Z в состоянии покоя за 1G, потом соответственно ускорение по всем осям считаем пропорционально этому значению. Но т.к показания осей X и Y в состоянии покоя отличны от нуля, то нужно ввести поправку. Но ведь логично, что и по Z значение ОТЛИЧНО ОТ 1G. Т.е его нельзя принимать бех поправки за 1G. Или нет??? И если мы не знаем ни откланение от нуля, ни сколько должен быть 1G, что делать???

Вообщем, я совсем запутался, подскажите, знающие люди, пожайлуста!

leshak
Offline
Зарегистрирован: 29.09.2011

MAFia пишет:
Доброго времени суток!

 
При работе над своим проектом столкнулся с проблемой: прочитать данные с вышеназванных датчиков я-то прочитал, но что дальше делать с этими циферками не знаю.
 

Во-первых, в чем они измеряться? (в долях от измеряемого диапазона?)

Скорее всего. Точный ответ стоит искать в даташите на датчики. Но не обязательно. см. ниже. При желании можно хоть в "попугаи" переводить сырые значения.

 

MAFia пишет:
Во-вторых. Сырые данные (по 3-м осям) отличны от нуля в состоянии покоя, значит нужно ввести поправку. С гиром все ясно - в состоянии покоя должны быть нули. А вот с акселем по оси Z? Насколько я понимаю (по опыту эксплуатирования квадрокоптера на таких же датчиках), что аксель нуждается в калибровке, т.е берем значение по оси Z в состоянии покоя за 1G, потом соответственно ускорение по всем осям считаем пропорционально этому значению. Но т.к показания осей X и Y в состоянии покоя отличны от нуля, то нужно ввести поправку. Но ведь логично, что и по Z значение ОТЛИЧНО ОТ 1G. Т.е его нельзя принимать бех поправки за 1G. Или нет??? И если мы не знаем ни откланение от нуля, ни сколько должен быть 1G, что делать??? Вообщем, я совсем запутался, подскажите, знающие люди, пожайлуста!

Не претендую на "знающиего", банальный здравый смысл.
Представте себе что вы сами делаете простейший аксель. Это будет растянутая пружинка, в центре которой прикреплен грузик. Концы пружинки привинчены к какой-то линейке (или даже чистой пластине).
Теперь нужно вспомнить школу и лабораторку "градуировка динамометра". Тут все "аналогично".
Положили линейку горизонтально - отметили положение грузика. Это наш "ноль".
Поставили вертикально - на грузик действиет 1G - поставили отметку и подписали "1G"
Перевернули (но опять "вертикально") - поставили отметку "-1G".
Если пружина качественная - растояния от нул до 1G и -1G - одинаковое.
Откладываем такие-же растояния далье 2G,3G,4G, -2G,-2G,-4G.
Разбиваем отрезок 0-1G на десять частей... (что-бы доли считывать).
Если хотим мерять не в G, а в системе СИ, ну значет на засечки пишем 9.8 m/с^2. Меряем растояние до нуля, делим на 9,8 умножаем на 10-ть. Получившуюся длину откладываем от нуля. Подписываем 10 m/c^2, делим отрезок на десять частей. Каждая часть - 1 m/c^2
 
 
 
Делаем, аналогично, еще три таких линейки. Соединяем их все "ортогональным базисом" (все между собой имеют 90-градосов) - получили "трех-осевой аксель".
 
Теперь возвращаемся к нашим датчикам.
Делаем с ними все тоже самое.
Располагаем какую-то из осей горизонтально. Читаем показание датчика. Это и есть его "ноль".
Ориентируем эту ось вертикально. Читаем показание. Это и будет 1G (или -1G смотря как мы оси выбрали).  Он же 9,80665 м/с^2
Ну собственно для этой оси - все. Если датчики "линейны" (99.9% вероятность этого), то теперь мы можем любое "сырое значение" этой оси пересчитать в G. (через две точки всегда можно провести одну прямую).
 
Дальше можем либо понадеятся что датчики X,Y,Z - ведут себя одинаково и использовать эти же числа и для других осей. Либо, если датчики имеют погрешности изготовления, повторить процедуру для двух других осей.
"Откалибровать" каждую ось отдельно.
 
leshak
Offline
Зарегистрирован: 29.09.2011

На примере "цифр":

Дано: при нулевом ускорении  датчик возвращает 600. При 1G дает 700.

Вопрос:  какое ускорение означает показание 800? какое ускорение означает показание 450?

MAFia
Offline
Зарегистрирован: 26.10.2011

"Дальше можем либо понадеятся что датчики X,Y,Z - ведут себя одинаково и использовать эти же числа и для других осей. Либо, если датчики имеют погрешности изготовления, повторить процедуру для двух других осей.

"Откалибровать" каждую ось отдельно." (сорри, цитата не хочет вставляться)

Единственное в чем я уверен из всей этой мороки с датчиками - так это то, что по разным осям нулевое значение отличается. А вот масштаб должен быть одинаков (посмотрел код MultiWii... Не все понял касательно датчиков, но насколько я разобрался коэффициент пропорциональности для осей один)

MAFia
Offline
Зарегистрирован: 26.10.2011

На примере цифр:

k=700-600 = 100

800: a=(800-600)/k = 2G

450: a=(450-600)/k = -1.5G