Гироскопические муки с Pololu LPR550AL

Дата публикации: Sep 10, 2012 5:46:10 PM

Согласно этим данным, для преобразования выходного сигнала датчика в конкретную величину скорости вращения вокруг оси X следует использовать известную формулу:

gyr_x = (gyr_raw * 3.3 / 1023 - 1.23) / 0.0005

здесь gyr_raw - сигнал с датчика,

3.3 - опорное напряжение,

1023 - разрядность АЦП (10 разрядов),

1.23 - напряжение покоя (для LPR550AL),

0.0005 - чувствительность датчика в вольтах.

Таким образом, в состоянии покоя на выходе датчика должно получиться значение:

gyr_raw = (0 * 0.0005 + 1.23) * 1023 / 3.3 = 381.3

И это значение подтверждается опытными данными на двух платформах, ORduino и mbed. Теперь повернем датчик, положим, со скоростью 180гр/сек в положительном направлении. На выходе гироскопа планируется получить следующее значение:

gyr_raw = (180 * 0.0005 + 1.23) * 1023 / 3.3 = 409.2

И вот тут то обнаруживается проблема. Фактически, АЦП микроконтроллера выдает нам не 410, а все 665. Другими словами сигнал занимает большую часть диапазона, хотя датчик повернулся всего лишь со скоростью +180гр/с из возможных +2000гр/с.

Наиболее простым решением в данном случае стало масштабирование сигнала, путем умножения на некоторый коэффициент K. Величина данного множителя в моем случае составила K = 0.2 (вычислена экспериментально). Таким образом исходная формула приняла вид:

gyr_x = (gyr_raw * 3.3 / 1023 - 1.23) * 0.2 / 0.0005

Используя коэффициент, удается снять с датчика реальные показания угловой скорости. Однако указанное решение не поможет в случае если датчик будет поворачиваться быстрее 430гр/сек.

Причины такого поведения гироскопа Pololu LPR550AL остаются неясными. Возможно это проблема конкретного экземпляра, а может быть имеются какие-то тонкости в подключении к АЦП которые я не учел. В любом случае, такие сложные устройства как гироскоп или акселерометр лучше всего иметь в виде одного модуля со встроенными АЦП и цифровым внешним интерфейсом, например I2C.