Существуют дешевые приборы для измерения ускорения - акселерометры. В этом тексте я написал о своем опыте работы с широко распространенным акселерометром 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--Электронные строительные уровни используют акселерометры.
Итоги
В сухом остатке мне удалось научиться пользоваться акселерометром LIS3DH. Конфигурировать ASIC и читать вектор ускорения. Измеренная точность LIS3DH акселерометра составляет +/- 40 mg. (разрешение 12 bit, диапазон -/+16g). Раз точность 40mg, то в текстовый лог ускорений имеет смысл писать только первые две цифры после запятой. На третью цифру можно вообще не смотреть - там уже просто мусор.
1--В результате работы с разными акселерометрами на разных платах я понял на будущее одну вещь, если на плате заложен акселерометр, то следует указывать шелкографией направление осей X и Y, Z.
Иначе без этого проблематично потом отлаживать прошивку.
2--Также я настоятельно не рекомендую схемотехникам подключать акселерометр по интерфейсу I2C. Лучше подключать акселерометр по 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--Как надо калибровать акселерометр?
Комментарии (63)
Andy_Big
22.10.2024 17:26"Стандартное («нормальное») значение, принятое при построении систем единиц, составляет 9,80665 м/с" (с) Википедия.
Дело в том, что I2C шина имеет свойство зависать, да так, что помогает только перезагрузка по питанию.
Это не шина имеет такое свойство, а конкретная ее реализация.
aabzel Автор
22.10.2024 17:26Тем не менее в спеке про константу 9,80665 ничего не сказано...
Andy_Big
22.10.2024 17:26Видимо, они считают, что ±0.02g не погоды не делают при том, что погрешность нуля датчика ±0.04g, поэтому можно не уточнять значение g до четвертого знака после запятой, а положиться на общепринятые 9.8 м/с2.
seyko2
22.10.2024 17:26Логично предположить, что величина g - это ускорение свободного падения в точке измерения: там же вроде как грузик используется? Или я что-то пропустил?
PS: спасибо за описание
aabzel Автор
22.10.2024 17:26там же вроде как грузик используется
Да. Однако масса этого грузика при перемещении ASICа не меняется.
Yuri0128
22.10.2024 17:26Это не шина имеет такое свойство, а конкретная ее реализация.
Именно так. У меня несколько десятков проектов с i2с, - все там норм. Да и в каждом компе/ноуте и т.д есть шина i2c - и вроде ничего даже работает. Ну а про сервера (и их блоки питания) и вообще даже не заикаемся..
aabzel Автор
22.10.2024 17:26Вы наверное просто сами написали драйвер для аппаратного I2C трансивера.
А если брать стандартный от вендора, то могут быть осечки.Yuri0128
22.10.2024 17:26В большинстве случаев - сам. Но % так 30 - вполне себе библиотечные функции, не висло (при нормальной схемотехнике, при плохой разводке - было такое дело). Ну и я редко на 1 МГц гоняю шину.
Andy_Big
22.10.2024 17:26Но при чем тут сама шина-то? :)
aabzel Автор
22.10.2024 17:26Интерфейс I2C много сложнее, чем интерфейс SPI. А все сложное ломается как раз в первую очередь.
Yuri0128
22.10.2024 17:26Чем? Апаратно - там 2 провода. У SPI - 3/4. Протокольно - да, сложнее. Скорости передачи меньше значительно (я на SPI достигал 62,5 МГц, на i2c - где-то пробегало что-то на 4 МГц, но,типично, 100-400 кГц, много реже 1 МГц). Ну и на SPI есть дуплекс. И QSPI.
randomsimplenumber
22.10.2024 17:26Вы наверное просто сами написали драйвер для аппаратного I2C трансивера.А если брать стандартный от вендора, то могут быть осечки.
Вендор, который знает о своем продукте буквально все, не может. Зато мимо крокодил, на помойке datasheet нашедший, тот может. Чудеса какие то.
aabzel Автор
22.10.2024 17:26Вы не забывайте, что производители микроконтроллеров это не софтверные компании, а железячники. Я сам в такой работал и прекрасно знаю их внутреннюю кухню.
Hal там пишут либо студенты ,либо аутсорсинг.
Поэтому нет ни тестов ни скриптов сборки. Глядя на исходники , становится очевидно, что авторы кода даже не знают, что такое конечный автомат.
Поэтому Hal от вендора чипа- это обычно Филькина грамота.
man55
22.10.2024 17:26Вы не поверите, но во всех изделиях, критичнее поделок с Али нормальные люди так и делают (пишут софт самостоятельно). А виснет I2C только у тех, у кого ардуино головного мозга и слепая вера в HAL от ST и т.п.
Andy_Big
22.10.2024 17:26У меня несколько десятков проектов с i2с, - все там норм.
Аналогично. Месяцы и даже года непрерывной работы.
Ну а про сервера (и их блоки питания) и вообще даже не заикаемся..
Да практически любой ноутбук имеет связь с контроллером батареи по шине SMBus, которая по сути - I2C :)
aabzel Автор
22.10.2024 17:26Ну а про сервера (и их блоки питания) и вообще даже не заикаемся..
На серверах не совсем I2C, а SMbus и PMbus.
Yuri0128
22.10.2024 17:26SMbus
это практически тот-же i2c, еще и с более низким уровнем шины (3,3В), что делает ее менее защищенной, в общем-то.
PMbus
Это фактически SMbus. Собственно у меня есть проекты, где диагностика и управление блоками питания по ней идет. С контроллера юзается i2c модуль.
Вот CAN и uCAN - эт посложнее уже, но она диф, поэтому там лучше помехозащищеность. И ее длиннее можно делать.
aabzel Автор
22.10.2024 17:26Это фактически SMbus. Собственно у меня есть проекты, где диагностика и управление блоками питания по ней идет.
SMbus определяет какой-н общий протокол и форматы пакетов для всех микросхем вне зависимости от вендора?
aabzel Автор
22.10.2024 17:26Это не шина имеет такое свойство, а конкретная ее реализация.
Наверное Луна-25 разбилась как раз потому, что зависла шина I2C на которой висел акселерометр.
Yuri0128
22.10.2024 17:26Там просто дорожка питания к акселерометру отгорела.
aabzel Автор
22.10.2024 17:26Там просто дорожка питания к акселерометру отгорела.
Это по обломкам определили?
aabzel Автор
22.10.2024 17:26Что за формулировка.?..Это как? Сами по себе дорожки не отгорают.
Это проводник, а не квантовая частица.
Andy_Big
22.10.2024 17:26Или потому что прошивку писал программист, для которого I2C - это сложно и у которого она виснет :)
Indemsys
22.10.2024 17:26Акселерометры используемые для стабилизации работают по SPI в реальном времени.
По I2C работают акселерометры с микропотреблением и глубоким FIFO для носимых гаджетов.aabzel Автор
22.10.2024 17:26Вообще показания акселерометра было бы лучше передавать непрерывно, как звук по интерфейсу TDM (Time Division Multiplexing). Передавать как трёхканальный звук. Ведь ускорение это же непрерывная величина.
Какой смысл измерять мгновенное ускорение? Разве, что для статических измерений типа наклон столба.
Indemsys
22.10.2024 17:26Да, ускорение – это непрерывная величина, но в цифровых системах данные всегда дискретизируются, будь то звук или показания акселерометра. В этом смысле акселерометр работает аналогично микрофону, измеряя физические величины с определенной частотой выборки. Однако передача данных по интерфейсу, как TDM, предполагает высокие требования к пропускной способности и, возможно, избыточна для многих задач.
Мгновенные значения ускорения имеют смысл, когда мы рассматриваем динамические процессы, такие как шаги, удары, вибрации и т.п. Даже для статических измерений, как наклон, важны не только текущие, но и прошлые значения, чтобы оценить изменения со временем. Преимущества дискретных измерений в том, что они дают возможность эффективной обработки и анализа данных, как, например, выделение особенностей движения или других паттернов.
Передача данных в виде 'трёхканального звука' возможна, но это больше вопрос удобства интерфейса и способа обработки. К тому же в системах с низким энергопотреблением, таких как носимые устройства, часто важна не только точность данных, но и экономия ресурсов (памяти, пропускной способности и энергии), что и достигается за счет использования оптимизированных алгоритмов обработки дискретных значений.
almaz1c
22.10.2024 17:26Здесь может иметься ввиду "clock stretching", являющийся частью спецификации I2C шины, когда ведомое устройство именно "подвешивает" шину в случае неготовности данных. Как раз всякие IMU грешат подобным.
Подобное наблюдается, например с BNO055 и малинкой.
Andy_Big
22.10.2024 17:26Так не нужно запрашивать данные когда они еще не готовы. Как правило, устройства имеют регистр статуса, в котором в том числе отражается и готовность данных.
И он что, настолько жестко вешается, что ничего кроме отключения питания не выводит его из этого состояния? Тоже как-то слабо верится. Но даже если так, то это все равно не свойство шины, а криво спроектированный девайс :)
Indemsys
22.10.2024 17:26Но даже если так, то это все равно не свойство шины, а криво спроектированный девайс :)
А вот это глубокое заблуждение.
I2C единственная в своем роде шина, где на уровне официальной доки признается факт ее зависания.
Например в одном из мануалов читаем:36.12
Bus HangingIf the clock signals from the master and slave devices are out of synchronization because of noise or other factors, the I2C bus might hang with a fixed level on the SCLn or SDAn line. To manage bus hanging, the IIC has:
- A timeout function to detect hanging by monitoring the SCLn line
- A function for the output of an extra SCL clock cycle to release the bus from a hung state because of clock signals being out of synchronization
- The IIC reset function
- An internal reset function.
Т.е. как минимум будете встречать частые очень длительные таймауты.
По опыту, мониторинг SCL приводит к ложноположительным ошибкам. Мониторинг SCL приходится отключать. Экстраклок на SCL вооще непонятный финт. Когда его надо делать и сколько раз? Выходит что сброс единственный надежный вариант. А если завис слэйв, то сбрасывать надо уже питание.
AndreyPS
22.10.2024 17:26Использовал такие акселерометры в качестве датчика вибрации.
Минусы:
Нет внешнего тактирования.
По даташиту частота измерения 400 Гц, но может выдавать и 395, и 405 Гц.
Побороли путём измерения времени между прерываниями от FIFO.Слабый антиалайзинговый фильтр.
Никак не исправить.Довольно шумный на небольших значениях ускорения.
Ловить сотые в константе g нет никакого смысла.Плюсы:
Прибор получается дешёвый.
Акселерометр цепляется напрямую к микропроцессору.aabzel Автор
22.10.2024 17:26Довольно шумный на небольших значениях ускорения
Я посчитал СКО на выборке 5k измерений. Точность LIS3DH получилась +/-40mg
aabzel Автор
22.10.2024 17:26Раз точность 40mg, то в текстовый лог ускорений имеет смысл писать только первые две цифры после запятой. На третью цифру можно вообще не смотреть - там уже просто мусор.
f-tech
22.10.2024 17:26Несколько уточнений по тексту.
Чем выше чувствительность, тем лучше для нас
Лучше, когда чувствительность такая, что интересующий нас диапазон физической величины оптимально укладывается в диапазон измерений датчика. Нам не нужен датчик, который не реагирует на существенное изменение параметра, и не нужен датчик, зашкаливающий от малейшего колебания. Перегиб в обе стороны - плохо.
Данные передаются младшим битом вперед
Все-таки наоборот, MSB First: на шину вначале выталкивается старший бит.
Линия SCL у девайса тоже 'io', она не чистый вход: slave-устройство может приостановить тактирование, удерживая SCL в низком уровне, если не успевает подготовить данные для передачи (благодаря clock stretching).
В табличке с чувствительностью mg/digit наверное опечатки? Я имею в виду значения 192, 48 и две двойки в High-resolution.
RealBeria
всегда восхищался внутренним строением подобных микросхем - симбиоз электроники и механики созданый в кремнии на нанометровых масштабах.
aabzel Автор
aabzel Автор
Красота несусветная