Существуют дешевые приборы для измерения ускорения — акселерометры. В этом тексте я написал о своем опыте работы с широко распространенным акселерометром LIS3DHTR. Это трёх-осевой цифровой 8/10/12-битный MEMS акселерометр с перегрузкой до 16g, точностью +- 40mg и управлением по интерфейсу I2C (или SPI).
Итак, танцуем от печки…
Теория
Чтобы взять и начать работать с измериловкой надо сперва вспомнить некоторый теоретический минимум из метрологии. Справедливости ради, надо сразу сказать, что все наши средства измерения на самом деле показывают абстрактные сигналы. Да… Слоны, попугаи и т. п. Наша же задача, как инженеров, правильно интерпретировать эти сигналы до приемлемой для нас погрешности и точности.
Ускорение (Acceleration)- векторная физическая величина, определяющая быстроту изменения скорости тела, то есть первая производная от скорости по времени. Показывает на сколько изменяется вектор скорости в единицу времени. С точки зрения математики — ускорение — это производная скорости по времени.
Размерность ускорения — это метр на секунду в квадрате [м/с^2]. В технике чаще ускорение измеряют в единицах g, где g — это ускорение свободного падения.
Чувствительность (Sensitivity) — отношение изменения выходного сигнала (у нас код ADC) измерителя к вызывающему его изменение измеряемой величины(у нас g). Абсолютную чувствительность определяют по формуле (2).
dy — изменение(приращения) выходного сигнала измерителя. В нашем случае десятичное число на выходе ADC.
dx — изменение(приращение) измеряемой величины. В нашем случае ускорения.
По сути чувствительность — это коэффициент усиления датчика. Чем выше чувствительность, тем, с одной стороны, лучше для нас, ибо накой нам нужен датчик, который никак не реагирует на изменение физической величины? При нулевой чувствительности, что угодно превращается в датчик ускорения. Хоть ведро…
Также нам не нужен датчик, зашкаливающий от малейшего колебания. Перегиб в обе стороны — плохо. Лучше, когда чувствительность такая, что интересующий нас диапазон физической величины равномерно и полноценно укладывается в диапазон измерений датчика.
Погрешность (Observational error) — отклонение измеренного значения величины от её истинного (действительного) значения. Единица измерений совпадает с измеряемой величиной.
Точность (precision) — отдельные измерения могут сильно отличаться друг от друга. Это показывает ширина кривой распределения. Степень такого разброса данных и называется точностью измерения. Единица измерения точности совпадает с размерностью измеряемой величины. В нашем случае это g.
Целое число — расширение множества натуральных чисел, получаемое добавлением к нему нуля и отрицательных чисел. (-4 -3 -2 -1 0 1 2 3 4 5)
Натуральное число — числа, возникающие естественным образом при счёте (1, 2, 3, 4, 5, 6, 7 и так далее). Последовательность всех натуральных чисел, расположенных в порядке возрастания, называется натуральным рядом
Аппаратная часть
На первый взгляд даже не верится, что с помощью этой малютки можно измерять вектор ускорения. Если просто любоваться на микросхему LIS3DHTR, то можно заметить, что на корпусе написано 8308 C3H 4QW JA.
На других электронных платах иногда встречается маркировка 8925 C3H 0GVUO
Судя по форумам эту маркировку надо понимать так
В первом приближении акселерометр LIS3DH можно рассматривать так.
Распиновка чипа такая
Стоит заметить, что входной пин 7 (SA0) аппаратно определяет самый младший разряд в I2C адресе микросхемы на шине I2C. Таким образом, на одну I2C шину можно пристегнуть максимум два экземпляра микросхемы LIS3DH. В моём случае, к SA0 пину подведено напряжение 3.3 V. А это значит, что 7ми битный I2C адрес будет иметь вот такой бинарный шаблон xxx_xxx1. Остальные двоичные разряды уточним в спеке чуть позже…
Во втором приближении, внутри можно заметить микро электронно-механическую систему MEMS, микромеханику. Тут вмонтированы конденсаторы (по два на ось) и их ёмкости меняется в зависимости от действующего извне ускорения.
Прям как безмен-весы для взвешивания клюквы. Ещё внутри ASICа видно датчик температуры, мультиплексоры, операционный усилитель, АЦП, управляющую цепь, SPI-трансивер, I2C-трансивер и очередь на 32 семпла. Это очень сложное изделие как будто с другой планеты.
В электронике вообще абсолютно все датчики — это просто какой-то ADC(АЦП) к которому, как собака на поводке пристёгнута какая-то аналоговая электрическая цепочка. Даже GPIO можно интерпретировать как однобитный ADC.
То как акселерометр воплощен в натуре нам, конечно же в datasheet(те) не напишут и не покажут, так как MEMS структуры — это боевая информация.
Зато культовый автор Lisin YT химическим образом раскрыл структуру другого похожего акселерометра MPU6050. И там было просто нечто… Не иначе как инопланетные технологии…
Подозреваю, что внутри lis3dh тоже что-то похожее.
Программная часть
На шине I2C адрес микросхемы имеет вот такой шаблон 0b001100x. Для моей электронной платы получается 0b0011001. 0b0011001=0b 001_1001=0x19.
Теперь надо вспомнить, что такое интерфейс I2C. Это синхронный последовательный полудуплексный, двух проводной способ передачи бинарных данных с топологией общая шина. Данные передаются старшим битом вперед (MSB) в формате big endian.
В моём случае калейдоскоп I2C адресов получается 0x19(базовый) 0x32(запись) 0x33(чтение).
Сканирование шины I2C показывает как раз вариации базового адреса 0x19. Это хорошая новость. Значит ASIC подает признаки жизни.
У микросхемы LIS3DH присутствует аж 42 восьмибитных I2C регистра для конфигурации и диагностики. После инициализации вычитывание содержимого регистров показывает вот такие значения.
Переменных для конфигураций и метаданных внутри очень много. Однако основные битовые поля для большинства приложений это вот эти конфигурационные переменные. Остальные поля регистров акселерометра можно оставить в значениях по умолчанию, которые применяются при подаче электропитания и семплы всё равно будут появляться.
Как и любая другая цифровая микросхема, акселерометр выдает результат в виде последовательности целых чисел — семплов. Надо отметить, что один семпл с измерением ускорения хранятся сразу в двух I2C регистрах: старшем и младшем. Причем выровнен семпл влево (<—). Вот так это выглядит для 12 бит режима.
Поэтому семпл надо корректно извлечь. Прочитав семпл его надо преобразовать из попугаев в ускорение. Для этого надо домножить целое число на значение меж кодового перехода. Так мы и получаем значение перегрузки в единицах g. Для этого в спеке представлена Look Up таблица №4.
Как можно заметить, самая высокая чувствительность в режиме 2g 12bit.
Теперь включаю лог и измерения сыплются прямо в UART CLI
Вот и получилось завести акселерометр. Успех.
Статистический анализ
Я записал выборку одного и того же измерения 5281 раз. Вычислил мат ожидание и среднеквадратическое отклонение. Получил такие результаты
Величина |
Значение |
единица измерения |
Spread |
0.372 |
g |
MIN |
0.384 |
g |
MAX |
0.756 |
g |
Expected Value |
0.56317288 |
g |
Variance (Дисперсия) |
0.0016035521 |
— |
Standard Deviation (Среднеквадратическое отклонение) |
0.040044377 |
g |
Вот такая вышла гистограмма
Из СКО можно сделать вывод, что точность LIS3DH акселерометра составляет +/- 40 mg. В этом плане ST не обманули. В спеке тоже указана точность 40mg.
87% всех измерений на расстоянии 20mg от мат ожидания. Остальное, наверное, промахи.
Достоинства ASIC LIS3DHR
++Есть регистр ID (WHO_AM_I), который всегда показывает значение 0x33. Так можно сделать автотест тест пропай электронной платы.
Недостатки ASIC LIS3DHR
—Не ясно как измерить в метрах на секунду в квадрате. Устройство выдает значения по шкале g. Дело в том, что у всех свой g. По мере увеличения широты g возрастает.
Приложения акселерометра LIS3DHR
1—Можно сделать автомобильную или велосипедную фару, которая сама станет загораться в красный свет при замедлении прибора.
2—Определение наклона столбов для линий электро-передач. Чтобы знать куда вызывать ремонтную бригаду.
3—Автоматическая ориентация экрана на мобильных устройствах (телефонах планшетах), датчик переворота автомобиля в телематических блоках.
4—При должной цифровой обработке можно сделать шагомер.
5—Я видел кубики-таймеры, которые сами понимали на какой грани они лежат и тем самый отсчитывают нужное время, потом издают звук.
6—Очень точным акселерометром можно оценивать широту, где происходит изменение.
7—Если интегрировать ускорение, получится скорость. Интегрируя скорость получаем путь. Вот и выходит, что из акселерометра можно сделать инерциальную навигационную систему.
8—Можно сделать датчик свободного падения. Например для автоматического открытия парашюта или для парковки хрупких считывающих вилок в жестких дисках при падении LapTop(а).
9—Гироскутеры, сигвеи, квадрокоптеры и моноколёса используют акселерометр для стабилизации своей оси.
10—Электронные строительные уровни используют акселерометры.
11—Акселерометр можно использовать как кнопку. При помощи вздергивания устройства выполнить какое-н действие.
12—На акселерометрах делают датчик открытия\закрытия крышки-экрана у LapTop(ов).
Итоги
В сухом остатке мне удалось научиться пользоваться акселерометром LIS3DH. Конфигурировать ASIC и читать вектор ускорения. Измеренная точность LIS3DH акселерометра составляет +/- 40 mg. (разрешение 12 bit, диапазон -/+16g). Раз точность 40mg, то в текстовый лог ускорений имеет смысл писать только первые две цифры после запятой. На третью цифру можно вообще не смотреть — там уже просто мусор.
1—В результате работы с разными акселерометрами на разных платах я понял на будущее одну вещь, если на плате заложен акселерометр, то следует указывать шелкографией направление осей X и Y, Z.
Иначе без этого проблематично потом отлаживать прошивку.
2—Также я настоятельно не рекомендую схемотехникам подключать акселерометр по интерфейсу I2C. I2C это общий коллектор. I2C Slave возьмет и в случайное время притянет SCL или SDA в GND. И тут никакая ваша прошивка не починит баг на стороне ASICа. Лучше подключать акселерометр по SPI, чип LIS3DH как раз поддерживает интерфейс SPI. Дело в том, что I2C шина имеет свойство зависать, да так, что помогает только перезагрузка по питанию всей электронной платы! Интерфейс I2C намного, намного сложнее, чем интерфейс SPI. А все сложное ломается как раз в самую первую очередь. Понимаете… По опыту I2C — это самый ненадежный проводной интерфейс.
Надеюсь этот текст поможет другим понять, как работать с акселерометрами.
Словарь
Акроним |
Расшифровка |
I2C |
Inter-Integrated Circuit |
SPI |
Serial Peripheral Interface |
MSB |
most significant bit |
MEMS |
micro-electromechanical systems |
Ссылки
№ |
Гиперссылка |
1 |
|
3 |
|
2 |
Архитектура Хорошо Поддерживаемого драйвера для I2C/SPI/MDIO Чипа |
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
Вопросы
1—Как преобразовать измеренные акселерометром значение перегрузки (g) в метры на секунды в квадрате, если ускорение свободного падения везде на земном шаре разное и увеличивается при возрастании широты?
2—Какой тип ADC внутри акселерометра? SAR ADC? дельта-сигма АЦП? flash ADC?
3—Как надо калибровать акселерометр?
ссылка на оригинал статьи https://habr.com/ru/articles/851180/
Добавить комментарий