В самый неожиданный момент столкнулся с проблемой в своем проекте. Причем проблемой, которую я был уверен, что решил уже больше года назад, а тут она опять всплыла - очень демотивирует. У меня используется цифровой МЭМС гироскоп L3GD20 от ST. До этого во время всех тестов он жил на всевозможных внешних платках и его работа меня вполне устраивала. Один из основных параметров который мне наиболее важен - это смещение выходного значения от нуля в покое. То есть когда гироскоп лежит неподвижно - он все равно выдает некоторое значение, близкое к нулю, но не нулевое. И это значение вызывает накопление ошибки. До текущего момента я делал простую калибровку - считал среднее значение за некоторое время и потом просто его вычитал из всех измерений. Это довольно неплохо работало и в лучших случаях уход угла составлял всего несколько десятков градусов в час.
Однако, теперь он физически оказался внутри устройства и сразу всплыла проблема. Устройство греется. Греется микроконтроллер (да-да, STM32 работающий на 64 МГц нагревается до 40-45 градусов при комнатных 25). Греются и другие детали, в общем и целом температура может достигать 60-70 градусов. А при нагреве выходное значение гироскопа прилично уползает в сторону, что очень сильно сказывается на стабильности выходного угла. Вместо десятков градусов в час мы получаем сотни а то и тысячи.
Было решено провести исследование зависимости нулевого значения от температуры. Построенный график оказался кривоват, но в целом стало ясно, что зависимость практически линейная. Кроме того нашлось исследование другого гироскопа но похожего:
https://forum.sparkfun.com/viewtopic.php?f=14&t=31992Там тоже видно, что зависимость почти линейная, особенно для оси Z (которая у меня используется как основная).
Посчитал зависимость нулевого смещения от температуры, получилось, что оно чуть больше заявленного в даташите 0.04 dps/C вместо обещанных 0.03 dps/C. Ввел поправочный коэффициент и построил долговременные графики изменения среднего значения от температуры, с учетом поправки и без нее. В целом результат получился не такой уж и плохой, с поправкой оно явно лучше, чем без. Но выявилась очень забавная странность.
На картинке, сверху - голубым цветом показано среднее значение без какой либо обработки. Красным - с введением компенсирующего слагаемого, рассчитанного на основе температуры. На нижнем графике температура в градусах Цельсия. Сначала гироскоп был нагрет электроникой, потом был охлажден вентилятором, потом вентилятор был выключен. Одна клетка по горизонтали - одна минута. Каждая точка - усреднение 1000 значений с гироскопа + скользящее среднее по 25 точкам.
Видно, что на ровных участках компенсация работает не плохо, приводя итоговое значение близко к нулю. Однако на переходных участках происходит нечто странное. особенно на участке повышения температуры - среднее значением сначала начинает падать, потом резко возрастает и потом также резко падает. Интересна природа этого выброса. Скорее всего она чисто механическая, но тем не менее.
Встает вопрос что делать дальше. Может вообще к черту обрезать все значения меньше +/- 50 ? Это внесет определенную погрешность при интегрировании, вопрос большую ли. Зато при нахождении в покое ошибка будет нулевая. Также интересен вопрос - насколько стабильна характеристика гироскопа со временем. Можно ли зашить калибровочное значение с учетом температурной компенсации железно или же придется его иногда перекалибровывать, что весьма непросто, т.к. калибровку нужно производить при разных температурах.
У кого есть какие интересные мысли/предложения по теме?
UPD:
Забавная вещь. Оказывается наличие маленькой пластиковой коробочки, которая частично надевается на плату с гироскопом (причем сам гироскоп ей никак не закрывается) кардинальным образом влияет на поведение сигнала при резком изменении температуры, нагреве.
Слева - нагрев "голой" платы без пластмаски, справа - с ней. Лишнее чтобы не смущало замазал черным. Вот так-то.