№11 / 2018 / статья 2

Как работать с MEMS-акселерометром. Пошаговое руководство на основе LIS3DHH

Вячеслав Гавриков (г. Смоленск)

Данная статья посвящена вопросам использования MEMS-акселерометров на примере LIS3DHH от STMicroelectronics. Основная ее часть является переводом руководства, в котором рассматриваются особенности различных рабочих режимов, в том числе – с использованием встроенного буфера FIFO, а также процесс самокалибровки.

В настоящее время акселерометры применяются в широком спектре приложений: робототехника [1], энергетические установки [2], портативная электроника [3], промышленное оборудование, бытовая техника, игрушки, медицинские импланты и так далее. Внедрение акселерометров и других МЭМС-датчиков носит массовый характер. Исследования показывают, что отечественные разработчики также активно применяют инерционные датчики [4].

В сегменте акселерометров для коммерческих приложений уже не первый год лидирует компания STMicroelectronics, номенклатура которой насчитывает более тридцати датчиков (таблица 1).

Такое многообразие моделей объясняется просто – в каждом конкретном случае требования к акселерометрам отличаются. В одних задачах важно иметь максимальную точность, в других требуется минимальная стоимость, в третьих на первое место выходят параметры потребления и так далее. Это хорошо заметно на диаграмме распределения продуктов от STMicroelectronics (рисунок 1). Например, для сверхточного определения углов наклона в инклинометрах используются датчики LIS3DHH, которые обладают высокой стабильностью и отличными шумовыми характеристиками. Акселерометры H3LIS331DL используются для измерения ударных нагрузок, для чего необходим широкий диапазон ускорений до ±400 g.

Рис. 1. Приложения для акселерометров STMicroelectronics

Рис. 1. Приложения для акселерометров STMicroelectronics

Таблица 1. Номенклатура акселерометров STMicroelectronics

Наименование Тип Оси Диапазон, g Iпотр, тип., мА Iпотр, мин., мА Корпус Uпит, В
AIS1120SX Цифровой X ±120 4,5 SO-8 3,1…3,5
AIS1200PS Цифровой X, Y ±200 4 SO-16 5…16
AIS2120SX Цифровой X, Y ±120 6 SO-8 3,1…3,5
AIS326DQ Цифровой X, Y, Z ±2; ±6 0,67 0,002 QFPN 28
7x7x1,9 мм
3…3,6
AIS328DQ Цифровой X, Y, Z ±2; ±4; ±8 0,25 QFN 24
4x4x1,8 мм
2.4…3,6
AIS3624DQ Цифровой X, Y, Z ±6; ±12; ±24 0,001 QFN 24
4x4x1,8 мм
2,4…3,6
H3LIS100DL Цифровой X, Y, Z ±100 0,001 LLGA
16 3x3x1,0 мм
2,16…3,6
H3LIS200DL Цифровой X, Y, Z ±100; ±200 0,001 LLGA
16 3x3x1,0 мм
2,16…3,6
H3LIS331DL Цифровой X, Y, Z ±100; ±200, ±400 0,3 LLGA 16
3x3x1,0 мм
2,16…3,6
IIS2DLPC Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,011 0,0005 LGA
2x2x0.7
1,71…3,6
IIS2DH Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,011 0,0005 VFLGA
2x2x1 мм
1,71…3,6
IIS328DQ Цифровой X, Y, Z ±2; ±4; ±8 0,001 QFN 24
4x4x1,8 мм
2,4…3,6
IIS3DHHC Цифровой X, Y, Z ±2,5 0,011 0,0005 LGA
5x5x1,7 мм
1,71…3,6
LIS25BA Цифровой X, Y, Z ±3,85 2,13 0,205 VFLGA
2,5×2,5×0,86 мм
1,71…1,99
LIS2DE Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,011 0,0005 LGA 14
2x2x1,0 мм
1,71…3,6
LIS2DE12 Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,011 0,0005 VFLGA
2x2x1 мм
1,71…3,6
LIS2DH Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,011 0,0005 LGA 14
2x2x1,0 мм
1,71…3,6
LIS2DH12 Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,011 0,0005 VFLGA
2x2x1 мм
1.71…3,6
LIS2DS12 Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,018 0,0005 VFLGA
2x2x0,86 мм
1,62…1,98
LIS2DW12 Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,009 0,0005 LGA
2x2x0,7 мм
1,62…3,6
LIS2HH12 Цифровой X, Y, Z ±2; ±4; ±8; 0,018 0,0005 VFLGA
2x2x1 мм
1,71…3,6
LIS302DL Цифровой X, Y, Z ±2; ±8 0,3 0,001 LGA 14
3x5x0,9 мм
2,16…3,6
LIS331DLH Цифровой X, Y, Z ±2; ±4; ±8 0,25 LLGA 16
3x3x1,0 мм
2,16…3,6
LIS331HH Цифровой X, Y, Z ±6; ±12; ±24 0,25 0,001 LLGA 16
3x3x1,0 мм
2,16…3,6
LIS332AR Аналоговый X, Y, Z ±2 0,3 0,001 LLGA 16
3x3x1,0 мм
2,16…3,6
LIS344ALH Аналоговый X, Y, Z ±2; ±6 0,68 LLGA 16
4x4x1,5 мм
2,4…3,6
LIS3DE Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,011 0,0005 LLGA 16
3x3x1,0 мм
1,71…3,6
LIS3DH Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,011 0,0005 LLGA 16
3x3x1,0 мм
1.71…3,6
LIS3DHH Цифровой X, Y, Z ±2,5 2,5 LGA 16
5x5x1,7 мм
1,71…3,6
LIS3DSH Цифровой X, Y, Z ±2; ±4; ±6; ±8; ±16 0,25 0,002 LLGA 16
3x3x1,0
1,71…3,6
LIS3LV02DL Цифровой X, Y, Z ±2; ±6 0,65 0,001 LGA 16
4,4×7,5×1,0 мм
2,16…3,6
MIS2DH Цифровой X, Y, Z ±2; ±4; ±8; ±16 0,002 0,0005 VFLGA
2x2x1 мм
1,71…3,6

Стоит отметить, что развитие акселерометров не стоит на месте и идет сразу по нескольким направлениям, в числе которых повышение точности и разрешения, уменьшение потребления и габаритных размеров, снижение шумов, улучшение температурной и долговременной стабильности. Эти тенденции хорошо видны на примере акселерометров LIS2D для коммерческих приложений (таблица 2). В данном случае каждая следующая модель (LIS2DE12  LIS2DH12 LIS2DS12 LIS2DW12) превосходила предшественника практически по всем параметрам.

Таблица 2. Развитие акселерометров LIS2D для коммерческих приложений

Параметр LIS2DW12 LIS2DS12 LIS2DH12 LIS2DE12
Корпус, мм 2x2x0,7
LGA-12
2x2x0,86
LGA-12
2x2x1
LGA-12
2x2x1
LGA-12
Диапазон ускорений, g ±2/ ±4/ ±8/ ±16 ±2/ ±4/ ±8/ ±16 ±2/ ±4/ ±8/ ±16 ±2/ ±4/ ±8/ ±16
Разрешение 5 режимов: Low power (12 бит),
4x High res (14 бит)
3 режима: Low power (10 бит), Normal (12 бит), High res (14 бит) 3 режима: Low power (8 бит), Normal (10 бит), High res (12 бит) 1 режим: Low power (8 бит)
Чувствительность, g·10-3 0,244 0,244 1 15,6
Плотность шума (±2g, 100 Гц) 90 мкg/√Гц 120 мкg/√Гц 220 мкg/√Гц 220 мкg/√Гц
Потребление в режиме ожидания, мкА 0,05 0,7 0,5 0,5
Потребление в режиме пониженного потребления (Low Power Mode), мкА 0,38 при 1,6 Гц,
3/16 при 50 Гц
2,5 при 1 Гц,
8 при 50 Гц
2 при 1 Гц,
6 при 50 Гц
2 при 1 Гц,
6 при 50 Гц
Потребление в нормальном режиме (Normal Mode), мкА 120 при 50 Гц 150 при 12,5…6400 Гц 11 при 50 Гц
Типовое смещение (0 g), g·10-3 ±20 ±30 ±40 ±100
Температурная зависимость смещения (0 g), g·10-3/°C ±0,2 ±0,3 ±0,5 ±0,5
Частота измерений однократный,
1,6 Гц…1,6 кГц
1 Гц…6,4 кГц 1 Гц…5,376 кГц
(Low power),
1 Гц…5,376 кГц
(Low power)
1 Гц…1,344 кГц (Normal, HR)
Полоса частот сигнала До ODR/2 До ODR/2 ODR/2 (LPM и NM), ODR/9 ODR/2
(Low power)
(HR)
Размер буфера FIFO 32 256 (14 бит), 768 версия XL 32 (10 бит) 32 (10 бит)
Внутреннее тестирование/Датчик температуры Есть/есть
(1 LSB/°C)
Есть/есть Есть/есть Есть/есть
Напряжение питания, В 1,62…3,6 1,62…1,98 1,71…3,6 1,71…3,6

Озвученные тенденции развития характерны не только для акселерометров, но и для комбинированных инерционных модулей. В частности, 6-осевые модули LSM6DSO превосходят предшественников LSM6DSL практически по всем ключевым параметрам, начиная от более малого потребления (0,55 мА против 0,65 мА в комбинированном режиме) и расширенного функционала (наличие встроенной машины состояний FSM), и заканчивая уровнем собственных шумов. В свою очередь LSM6DSO проигрывает новейшему инерционному модулю LSM6DSR по уровню стабильности и точности.

Совершенствование характеристик акселерометров еще более расширяет сферу их применения. Акселерометры перестали быть экзотикой, и есть основания полагать, что в ближайшем будущем умение работать с инерционными датчиками станет обязательным навыком для разработчиков электроники.

Чтобы максимально упростить освоение новых инерционных датчиков, ведущие производители создают различные руководства, программы, отладочные наборы и референсные решения. Большим подспорьем для разработчиков может стать бесплатная утилита AlgoBuilder (видео), которая позволяет задать и отладить алгоритм работы датчиков STMicroelectronics, не написав не единой строчки кода.

Если же принято решение писать программу вручную – следует обратиться к руководствам. В данной статье приводится перевод одного из таких руководств – «AN5139 Application note. LIS3DHH: three-axis digital output accelerometer. Rev.2.» от STMicroelectronics [5].

LIS3DHH представляет собой трехосевой цифровой акселерометр с SPI-интерфейсом и сверхмалым уровнем шумов 45 мкg/√Гц. Благодаря отличным шумовым характеристикам, великолепной температурной и долговременной стабильности датчик подходит для создания прецизионных инклинометров и измерительных инструментов, а также – для систем стабилизации платформ и антенн. Он позволяет проводить измерения в диапазоне ±2,5 g с частотой до 1100 Гц. В состав акселерометра входит цифровой сигнальный процессор с программируемым фильтром нижних частот. LIS3DHH имеет встроенный 32-уровневый буфер FIFO, который позволяет накапливать данные, тем самым сокращая количество циклов обмена между акселерометром и хост-процессором. Выпускается в керамическом корпусном исполнении (CC LGA) и способен работать в диапазоне температур -40…85°C.

Назначение выводов

Назначение выводов LIS3DHH представлено на рисунке 2 и пояснено в таблице 3.

Рис. 2. Назначение выводов

Рис. 2. Назначение выводов

Таблица 3. Назначение выводов

№ вывода Имя Функция
1 SPC Тактовый сигнал SPI
2 SDI Вход данных SPI
3 SDO Выход данных SPI
4 CS Выбор кристалла
5 INT2 Программируемое прерывание 2
6 INT1 Программируемое прерывание 1
7 Vdd_IO Питание портов ввода-вывода (рекомендуется для развязки использовать керамический конденсатор 100 нФ)
8 Vdd Питание (рекомендуется для развязки использовать керамический конденсатор 100 нФ и электролит 10 мкФ)
9 GND 0 В питания
10 Резерв Подключен к GND
11 Резерв Подключен к GND
12 Резерв Подключен к GND
13 Резерв Подключен к GND
14 Резерв Можно подключить к GND или оставить неподключенным
15 Резерв Можно подключить к GND или оставить неподключенным
16 Резерв Можно подключить к GND или оставить неподключенным

Регистры

Карта регистров акселерометра LIS3DHH представлена в таблице 4.

Таблица 4. Карта регистров LIS3DHH

Регистр Адрес Бит 7 Бит 6 Бит 5 Бит 4 Бит 3 Бит 2 Бит 1 Бит 0
WHO_AM_I 0Fh 0 0 0 1 0 0 0 1
CTRL_REG1 20h NORM_ MOD_EN IF_ADD_INC 0 0 BOOT SW_RESET DRDY_PULSE BDU
INT1_CTRL 21h INT1_DRDY INT1_BOOT INT1_OVR INT1_FSS5 INT1_FTH INT1_EXT 0 0
INT2_CTRL 22h INT2_DRDY INT2_BOOT INT2_OVR INT2_FSS5 INT2_FTH 0 0 0
CTRL_REG4 23h DSP_LP_ TYPE DSP_BW_ SEL ST2 ST1 PP_OD_ INT2 PP_OD_ INT1 FIFO_EN 1*
CTRL_REG5 24h 0 0 0 0 0 0 0 FIFO_SPI
_HS_ON
OUT_TEMP_L 25h Temp3 Temp2 Temp1 Temp0 0 0 0 0
OUT_TEMP_H 26h Temp11 Temp10 Temp9 Temp8 Temp7 Temp6 Temp5 Temp4
STATUS 27h ZYXOR ZOR YOR XOR ZYXDA ZDA YDA XDA
OUT_X_L_XL 28h D7 D6 D5 D4 D3 D2 D1 D0
OUT_X_H_XL 29h D15 D14 D13 D12 D11 D10 D9 D8
OUT_Y_L_XL 2Ah D7 D6 D5 D4 D3 D2 D1 D0
OUT_Y_H_XL 2Bh D15 D14 D13 D12 D11 D10 D9 D8
OUT_Z_L_XL 2Ch D7 D6 D5 D4 D3 D2 D1 D0
OUT_Z_H_XL 2Dh D15 D14 D13 D12 D11 D10 D9 D8
FIFO_CTRL 2Eh FMODE2 FMODE1 FMODE0 FTH4 FTH3 FTH2 FTH1 FTH0
FIFO_SRC 2Fh FTH OVRN FSS5 FSS4 FSS3 FSS2 FSS1 FSS0
* – для правильной работы устройства требуется установить «1» в данном бите.

Режимы работы

LIS3DHH может находиться в одном из двух основных состояний:

  • в режиме пониженного потребления (Power-Down mode);
  • в обычном режиме (NormalMode).

После включения питания (последовательность подачи питания приведена в документации) LIS3DHH выполняет процедуру загрузки калибровочных данных длительностью 10 мс. После ее завершения акселерометр автоматически переходит в режим пониженного потребления.

Когда датчик находится в режиме пониженного потребления, практически все внутренние блоки отключены. Цифровой SPI-интерфейс остается активным, чтобы обеспечить связь с управляющим микроконтроллером. В этом состоянии содержимое регистров управления сохраняется, а регистры выходных данных не обновляются, то есть в них хранятся данные, записанные непосредственно перед переходом в режим пониженного потребления.

Для перевода LIS3DHH в активный режим необходимо записать «1» в бит NORM_MOD_EN регистра CTRL_REG1. При этом акселерометр начинает измерение векторов ускорения с частотой до 1100 Гц. Диапазон измерений для LIS3DHH составляет ±2,5 g.

Цепи фильтрации акселерометра

Измерительная цепь акселерометра состоит из двух основных блоков: АЦП и цифрового фильтра нижних частот (рисунок 3).

Рис. 3. Измерительная цепь акселерометра

Рис. 3. Измерительная цепь акселерометра

Желаемый тип фильтра (КИХ или БИХ), а также его полоса пропускания (235 или 440 Гц) определяются, соответственно, битами DSP_LP_TYPE и DSP_BW_SEL регистра CTRL_REG4. В таблице 5 приведены все возможные конфигурации и относительное время установления, измеренное в числе отброшенных отсчетов. Для правильной работы рекомендуется отбросить указанное число отсчетов после выхода из режима пониженного потребления, а также после изменения параметров фильтра, если настройка производилась «на лету».

Таблица 5. Варианты конфигурации фильтра нижних частот

DSP_LP_TYPE DSP_BW_SEL Фильтр Полоса пропускания, Гц Время установления (количество отброшенных отсчетов)*
0 0 КИХ-фильтр с линейной фазовой характеристикой 440 1
1 КИХ-фильтр с линейной фазовой характеристикой 235 2
1 0 БИХ-фильтр с нелинейной фазовой характеристикой 440 2
1 БИХ-фильтр с нелинейной фазовой характеристикой 235 4
* – время установления составляет @ 99% от конечного значения.

Загрузка калибровочных данных и программный сброс

После включения питания LIS3DHH выполняет процедуру загрузки калибровочных данных (boot procedure) длительностью 10 мс. После ее завершения датчик автоматически переходит в режим пониженного потребления. В процессе загрузки регистры акселерометра недоступны.

Данные калибровки можно загружать повторно. Для этого требуется записать «1» в бит BOOT регистра CTRL_REG1.

Для выполнения повторной процедуры загрузки не требуется отключать и включать питание. Поэтому содержимое регистров управления не изменяется, и режим работы остается прежним. Если же требуется программный сброс всех регистров управления, то следует записать «1» в бит SW_RESET регистра CTRL_REG1. Процедура SW_RESET длится 5 мкс. О ее окончании можно судить по состоянию бита SW_RESET в регистре CTRL_REG1: после завершения процедуры в этот бит автоматически записывается «0».

В процессе программного сброса следующие регистры принимают значения по умолчанию: CTRL_REG1, INT1_CTRL, INT2_CTRL, CTRL_REG4, CTRL_REG5 и FIFO_CTRL.

Для мониторинга состояния загрузки калибровочных данных можно использовать выводы прерываний. Для этого следует записать «1» в бит INT1_BOOT регистра INT1_CTRL или в бит INT2_BOOT регистра INT2_CTRL. В результате в процессе загрузки на соответствующем выводе будет наблюдаться высокий сигнал, а после окончания загрузки на выводе появится низкое напряжение.

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

  • запишите «1» в бит SW_RESET регистра CTRL_REG1;
  • подождите 5 мкс (или дождитесь, пока бит SW_RESET регистра CTRL_REG1 автоматически не будет сброшен в «0»);
  • запишите «1» в бит BOOT регистра CTRL_REG1;
  • подождите 10 мс.

Во избежание конфликтов не допускается одновременное выполнение загрузки калибровочных данных (boot) и программный сброс SW_RESET. То есть, прежде чем начать загрузку калибровочных данных, следует дождаться окончания программного сброса.

Чтение выходных данных

Последовательность запуска

При включении питания LIS3DHH автоматически загружает калибровочные данные из встроенной Flash-памяти во внутренние регистры. После завершения загрузки акселерометр автоматически переходит в режим пониженного потребления.

Чтобы включить акселерометр и начать измерения, необходимо активировать обычный режим работы (Normal Mode). Для этого следует установить «1» в бите NORM_MOD_EN регистра CTRL_REG1.

Для инициализации акселерометра можно использовать следующую последовательность действий:

  • записать значение “C0h” в регистр CTRL_REG1 для включения нормального режима работы и активации функции автоинкремента адреса при чтении данных;
  • записать значение “01h” в регистр CTRL_REG4 для правильной работы устройства;
  • записать значение “80h” в регистр INT1_CTRL для разрешения прерываний по готовности данных на выводе INT1.

Использование регистра состояния

Регистр STATUS_REG используется для отображения готовности новых данных. Если бит ZYXDA = 1, это означает, что новые данные готовы к считыванию.

Вычитывание новых данных производится в следующей последовательности:

  • считайте содержимое регистра STATUS_REG;
  • если ZYXDA = 0, повторите шаг 1;
  • считайте содержимое регистра OUTX_L_XL;
  • считайте содержимое регистра OUTX_H_XL;
  • считайте содержимое регистра OUTY_L_XL;
  • считайте содержимое регистра OUTY_H_XL;
  • считайте содержимое регистра OUTZ_L_XL;
  • считайте содержимое регистра OUTZ_H_XL;
  • обработайте данные;
  • перейдите к шагу 1.

Использование сигнала готовности к передаче данных

Датчик LIS3DHH может быть сконфигурирован таким образом, чтобы сигнал о наличии новых данных поступал на выводы INT1 или INT2.

Как уже было сказано выше, сигнал готовности к передаче данных представлен битом ZYXDA в регистре STATUS. Этот сигнал можно перенаправить на вывод INT1, установив бит INT1_DRDY в регистре INT1_CTRL или на вывод INT2, установив бит INT2_DRDY в регистре INT2_CTRL.

При появлении новых данных на выводах INT1 или INT2 формируется напряжение высокого уровня. При этом сигнал готовности может защелкиваться или иметь импульсную форму. Если в бите DRDY_PULSE регистра CTRL_REG1 установлен «0» (значение по умолчанию) – то сигнал готовности защелкивается и сбрасывается только после вычитывания одного из регистров данных – 29h, 2Bh и 2Dh (рисунок 4). Если в бите DRDY_PULSE регистра CTRL_REG1 присутствует «1» – то сигнал готовности представляется в виде импульса длительностью около 227 мкс. Импульсный режим не применяется к биту ZYXDA, который всегда защелкивается в регистре Status.

Рис. 4. Сигнал готовности данных DRDY

Рис. 4. Сигнал готовности данных DRDY

Использование функции обновления данных BDU

Если чтение выходных данных происходит очень редко и не требует синхронизации с битом ZYXDA в регистре STATUS или с сигналом DRDY, подключенным к выводам INT1/INT2, то настоятельно рекомендуется записать «1» в бит BDU (Block Data Update) регистра CTRL_REG1.

Эта функция позволяет защититься от путаницы при считывании старшего и младшего байтов данных. Например, при активации BDU регистры, относящиеся к каждому каналу, всегда содержат самые актуальные данные, измеренные устройством, но в случае чтения одного из пары регистров (то есть OUTX_H_XL (G) и OUTX_L_XL (G) OUTY_H_XL (G) и OUTY_L_XL (G), OUTZ_H_XL (G) и OUTZ_L_XL (G)), содержимое второго регистра блокируется до тех пор, пока не будут прочитаны оба регистра – старший и младший.

Обратите внимание: функция BDU гарантирует лишь то, что данные регистров старшего и младшего байтов будут относиться к одному и тому же отсчету. Однако при медленном считывании данных может возникнуть ситуация, когда, например, при чтении отсчета результаты измерений по осям X и Y относятся к моменту T1, а показания по оси Z – к моменту T2.

Интерпретация выходных данных

Разрядность измерений LIS3DHH составляет 16 бит. Измеренные и оцифрованные значения ускорений разбиваются на два байта и помещаются в регистры OUTX_H_XL, OUTX_L_XL, OUTY_H_XL, OUTY_L_XL, OUTZ_H_XL и OUTZ_L_XL. То есть полный результат измерения для каналов X, Y, Z определяется содержимым пары регистров OUTX_H_XL & OUTX_L_XL, OUTY_H_XL & OUTY_L_XL, OUTZ_H_XL & OUTZ_L_XL.

Стоит отметить, что для ускорения процесса чтения в LIS3DHH по умолчанию активирована функция зацикленного инкрементирования адресов. То есть при выполнении нескольких циклов чтения адрес регистра данных автоматически увеличивается от 28h до 2Dh, а затем вновь сбрасывается в 28h.

Обратите внимание: для активации функции автоинкремента в бите IF_ADD_INC регистра CTRL_REG1 должна быть записана «1».

Примеры интерпретации выходных данных

В таблице 6 представлены примеры интерпретации данных, полученных при измерении ускорений.

Приведенные значения указаны для случая идеальной калибровки (при отсутствии смещения, ошибки усиления и так далее).

Таблица 6. Соответствие между данными регистров и приложенными ускорениями

Значение ускорения Адрес регистра
OUTX_H_XL (29h) OUTX_L_XL (28h)
0 g 00h 00h
350 mg 11h FDh
1 g 33h 66h
-350 mg EEh 03h
-1 g CCh 9Ah

FIFO-буфер

Чтобы освободить управляющий процессор от постоянного полинга данных и в то же время избежать потерь информации, в LIS3DHH реализован FIFO-буфер для хранения результатов измерений по всем трем каналам X, Y и Z.

FIFO-буфер может работать в одном из пяти различных режимов: Bypass mode, FIFO mode, Continuous mode, Bypass-to-Continuous и Continuous-to-FIFO mode. Это гарантирует высокий уровень гибкости при разработке приложений:

Для индикации заполнения и переполнения буфера могут использоваться прерывания, формируемые на выводах INT1 или INT2. Вывод INT1 может быть настроен на вход, чтобы активировать функцию защелкивания данных по сигналу от внешнего источника при работе в режимах Continuous-to-FIFO и Bypass-to-Continuous.

Описание FIFO-буфера

FIFO-буфер способен хранить до 32 отсчетов.

Каждый отсчет состоит из 6 байтов (Xl, Xh, Yl, Yh, Zl и Zh). Частота формирования новых отсчетов составляет 1100 Гц.

Каждый новый отсчет помещается в пустой слот FIFO-буфера до тех пор, пока буфер не будет заполнен. После заполнения буфера сбор данных может быть остановлен либо новые данные могут записываться поверх наиболее старых.

В таблице 7 представлен пример полного заполнения FIFO-буфера при хранении 32 отсчетов: от нулевого до тридцать первого. В таблице 8 представлен следующий шаг: нулевой отсчет был перезаписан при получении нового тридцать второго отсчета. После этого в регистрах данных доступен наиболее старый из оставшихся отсчетов – первый.

Таблица 7. Структура FIFO-буфера при хранении 32 отсчетов

Регистр 28h 29h 2Ah 2Bh 2Ch 2Dh
Xl Xh Yl Yh Zl Zh
FIFO Содержимое FIFO
FIFO(0) Xl(0) Xh(0) Yl(0) Yh(0) Zl(0) Zh(0)
FIFO(1) Xl(1) Xh(1) Yl(1) Yh(1) Zl(1) Zh(1)
FIFO(2) Xl(2) Xh(2) Yl(2) Yh(2) Zl(2) Zh(2)
FIFO(3) Xl(3) Xh(3) Yl(3) Yh(3) Zl(3) Zh(3)
FIFO(30) Xl(30) Xh(30) Yl(30) Yh(30) Zl(30) Zh(30)
FIFO(31) Xl(31) Xh(31) Yl(31) Yh(31) Zl(31) Zh(31)

Таблица 8. После переполнения FIFO-буфера нулевой отсчет был перезаписан

Регистр 28h 29h 2Ah 2Bh 2Ch 2Dh
Xl Xh Yl Yh Zl Zh
FIFO Содержимое FIFO
FIFO(0) Xl(1) Xh(1) Yl(1) Yh(1) Zl(1) Zh(1)
FIFO(1) Xl(2) Xh(2) Yl(2) Yh(2) Zl(2) Zh(2)
FIFO(2) Xl(3) Xh(3) Yl(3) Yh(3) Zl(3) Zh(3)
FIFO(3) Xl(4) Xh(4) Yl(4) Yh(4) Zl(4) Zh(4)
FIFO(31) Xl(32) Xh(32) Yl(32) Yh(32) Zl(32) Zh(32)

Регистры управления FIFO-буфером

Контроль и управление работой FIFO-буфера производится с помощью двух регистров. Регистр FIFO_CTRL позволяет включать и настраивать FIFO-буфер, а регистр FIFO_SRC предоставляет информацию о его состоянии.

Ряд регистров используется для настройки прерываний, связанных с работой FIFO-буфера Подробнее об этом читайте в разделе «Прерывания при работе с FIFO-буфером».

FIFO_CTRL (2Eh)

Регистр FIFO_CTRL определяет режим работы буфера (таблица 9). После сброса по умолчанию устанавливается режим Bypass mode, при котором FIFO-буфер отключен. Активация буфера происходит при установке любого другого режима работы (FIFO mode, Continuous mode, Bypass-to-Continuous и Continuous-to-FIFO mode).

Таблица 9. Регистр FIFO_CTRL

b7 b6 b5 b4 b3 b2 b1 b0
FMODE2 FMODE1 FMODE0 FTH4 FTH3 FTH2 FTH1 FTH0

Биты FMODE [2: 0] определяют режим работы FIFO-буфера:

  1. FMODE [2: 0] = 000b: Bypass mode (FIFO выключен);
  2. FMODE [2: 0] = 001b: режим FIFO;
  3. FMODE [2: 0] = 011b: режим Continuous mode;
  4. FMODE [2: 0] = 100b: режим Bypass-to-Continuous;
  5. FMODE [2: 0] = 110b: режим Continuous-to-FIFO.

Назначение битов FTH [4: 0] рассмотрено в разделе «Порог заполнения FIFO-буфера».

FIFO_SRC (2Fh)

Регистр FIFO_SRC предоставляет информацию о статусе FIFO-буфера (таблица 10). FIFO_SRC обновляется каждый раз при появлении нового отсчета и при вычитывании данных.

Таблица 10. Регистр FIFO_CTRL

b7 b6 b5 b4 b3 b2 b1 b0
FTH OVRN FSS5 FSS4 FSS3 FSS2 FSS1 FSS0

Бит FTH устанавливается, когда превышен порог заполнения буфера. Порог заполнения определяется содержимым битов FTH [4: 0] регистра FIFO_CTRL. Состояние бита FTH можно перенаправить к выводам INT1 и INT2 (подробнее – в разделе «Прерывания при работе с FIFO-буфером»).

Бит OVRN устанавливается при переполнении буфера, когда происходит перезапись новых данных отсчета поверх информации более старого отсчета. Это значит, что буфер FIFO содержит 32 непрочитанных отсчета. Бит OVRN сбрасывается при чтении отсчета.

Биты FSS [5: 0] регистра FIFO_SRC используются для индикации заполнения буфера. Например, 000000b означает, что FIFO пуст, 100000b означает наличие 32 отсчетов, то есть полное заполнение FIFO-буфера. Бит FSS5 также может быть перенаправлен на контакты прерываний (смотрите раздел «Прерывания при работе с FIFO-буфером»).

Содержимое регистра FIFO_SRC обновляется синхронно с операциями чтения и записи с участием буфера (таблица 11).

Таблица 11. Поведение FIFO_SRC при пороге заполнения FTH [4: 0] = 15

FTH OVR FSS Количество невычитанных отсчетов Время
0 0 0 0 t0
0 0 1 1 t0 +  1/ODR
0 0 10 2 t0 +  2/ODR
0 0 1110 14 t0 +  14/ODR
1 0 1111 15 t0 +  15/ODR
1 0 11111 31 t0 +  31/ODR
1 0 100000 32 t0 +  32/ODR
1 1 100000 33 t0 +  33/ODR

Прерывания при работе с FIFO-буфером

При работе с FIFO-буфером существуют три события, которые могут быть использованы в качестве источников прерываний:

  • достижение заданного порога заполнения буфера (FIFO threshold);
  • полное заполнение буфера (FIFO full);
  • переполнение буфера (FIFO overrun).

Все прерывания могут быть перенаправлены на контакты INT1 и INT2.

Достижение порога заполнения буфера (FIFO threshold)

Формирование прерывания при частичном заполнении буфера является программируемой функцией акселерометра. Порог заполнения для генерации прерывания может принимать значение от 0 до 31 и определяется содержимым битов FTH [4: 0] регистра FIFO_CTRL.

Если количество записей в FIFO-буфере (FSS [5:0]) больше или равно значению, запрограммированному в FTH [4: 0] – происходит автоматическая установка бита FTH регистра FIFO_SRC.

Содержимое FSS [5: 0] увеличивается на 1 при появлении нового отсчета и уменьшается на 1 каждый раз, когда пользователь считывает данные.

Флаг по превышению порога заполнения (бит FTH) может быть перенаправлен на контакты INT1 и INT2 и использоваться в качестве прерывания для управляющего процессора. Для активации этой функции необходимо записать «1» в бит INT1_FTH регистра INT1_CTRL или в бит INT2_FTH регистра INT2_CTRL.

Заполнение буфера (FIFO full)

LIS3DHH может быть настроен на генерацию прерываний при полном заполнении FIFO-буфера. Для этого нужно записать «1» в бит INT1_FSS5 регистра INT1_ CTRL или в бит INT2_FSS5 регистра INT2_ CTRL. Чтобы избежать потери данных, необходимо успевать считывать данные из буфера до поступления нового отсчета.

Переполнение буфера (FIFO overrun)

LIS3DHH может быть настроен на генерацию прерываний при переполнении FIFO-буфера. Для этого необходимо записать «1» в бит INT1_OVRN регистра INT1_CTRL или в бит INT2_OVRN регистра INT2_CTRL.

Режимы работы FIFO-буфера

Для активации FIFO-буфера необходимо записать «1» в бит FIFO_EN регистра CTRL_REG4. После этого буфер может быть настроен для работы в пяти разных режимах. Выбор режима производится с помощью битов FMODE [2: 0] регистра FIFO_CTRL. Наличие нескольких режимов обеспечивает высокий уровень гибкости и расширяет функционал конечного устройства.

Основные особенности режимов Bypass, FIFO, Continuous, Continuous-to-FIFO и Bypass-to-Continuous описаны далее.

Режим Bypass mode

При активации режима Bypass mode FIFO-буфер отключается. Содержимое буфера очищается, выходные регистры хранят последний отсчет (0x28 — 0x2D). Буфер FIFO остается пустым до тех пор, пока не будет выбран другой режим.

Режим Bypass mode активируется при записи 000b в поле FMODE [2: 0] регистра FIFO_CTRL. Этот режим необходимо использовать в качестве промежуточного состояния для остановки и очистки буфера, прежде чем переключаться на другой режим работы. Здесь еще раз стоит подчеркнуть, что при выборе Bypass mode содержимое буфера полностью удаляется.

Режим FIFO mode

В режиме FIFO mode при выполнении измерений данные помещаются в буфер, пока он полностью не заполнится. Затем сбор данных прекращается, а содержимое FIFO остается неизменным до тех пор, пока не будет выбран другой режим.

Режим FIFO mode активируется при записи 001b в поле FMODE [2: 0] регистра FIFO_CTRL.

При работе в режиме FIFO mode содержимое счетчика FSS [5: 0] отображает число хранимых в буфере отсчетов. При полном заполнении буфера происходит установка флага OVRN, после чего необходимо произвести последовательное чтение всех 32 отсчетов. При этом скорость считывания не так важна, так как сбор данных остановлен и риск перезаписи уже накопленных данных отсутствует. Перед перезапуском режима FIFO mode необходимо сначала активировать режим Bypass mode.

При использовании режима FIFO mode буфер начинает собирать данные и последовательно заполняет все 32 слота (от F0 до F31) с выбранной скоростью измерений (рисунок 5). Если при полностью заполненном буфере поступает новый отсчет, устанавливается бит OVRN, а накопление данных прекращается. Пользователь может вычитать содержимое FIFO в любое время, не боясь потерять данные. Возобновление работы буфера возможно только после промежуточной активации режима Bypass mode. Бит OVRN сбрасывается при чтении первого отсчета. Активация режима Bypass mode очищает содержимое буфера и позволяет пользователю снова запустить режим FIFO mode.

Рис. 5. Работа буфера в режиме FIFO mode

Рис. 5. Работа буфера в режиме FIFO mode

Если пользователь успевает считывать данные из буфера до возникновения переполнения, то FIFO продолжает работу. Например, если чтение данных FIFO синхронизировано с изменением счетчика FSS5, то возможно непрерывное накопление/считывание данных.

Режим Continuous mode

При использовании режима Continuous mode накопление данных не останавливается после заполнения буфера и новые отсчеты записываются поверх старых. Перезапись идет до тех пор, пока не будут освобождены слоты буфера при вычитывании старых отсчетов. В данном случае скорость вычитывания данных очень важна – пустые слоты должны появляться быстрее, чем новые отсчеты. Для остановки работы буфера необходимо активировать режим Bypass mode.

Как показано на рисунке 6, при использовании Continuous mode буфер FIFO непрерывно заполняется отсчетами (от F0 до F31). Когда буфер полностью заполнен, бит FSS5 принимает значение «1», после чего, чтобы избежать потери данных, управляющий процессор должен максимально быстро вычитать содержимое буфера FIFO (32×6 байтов). О порядке вычитывания содержимого буфера будет рассказано в разделе «Считывание данных из FIFO-буфера».

Рис. 6. Режим Continuous mode

Рис. 6. Режим Continuous mode

Когда акселерометр получает команду чтения, содержимое выходных регистров переносится в регистр SPI, а самое старое значение из FIFO-буфера помещается в выходные регистры для дальнейшего чтения.

Пользователь может синхронизировать считывание данных из FIFO с сигналом FSS5 или с сигналом FTH. В последнем случае речь идет о контроле частичного заполнения буфера в соответствии с пороговым значением, заданным в поле FTH [4: 0] регистра FIFO_CTRL.

Режим Continuous-to-FIFO mode

Этот режим представляет собой комбинацию описанных выше режимов Continuous mode и FIFO. При активации режима Continuous-to-FIFO mode FIFO-буфер начинает работать точно так же, как и в режиме Continuous mode, и переключается в режим FIFO mode при появлении управляющего сигнала на выводе INT1. Вывод INT1 должен быть настроен как вход. Для этого необходимо записать «1» в бит INT1_EXT регистра INT1_CTRL.

Таким образом, изначально в режиме Continuous-to-FIFO mode буфер накапливает отчеты и, в случае переполнения, перезаписывает старые данные. После прихода управляющего сигнала происходит переключение на режим FIFO mode, в котором при заполнении буфера происходит установка бита OVRN, а FIFO прекращает сбор данных (рисунок 7).

Рис. 7. Режим Continuous-to-FIFO mode

Рис. 7. Режим Continuous-to-FIFO mode

Режим Bypass-to-Continuous mode

Этот режим представляет собой комбинацию описанных выше режимов Bypass и Continuous mode. В режиме Bypass-to-Continuous буфер FIFO изначально неактивен и находится в состоянии Bypass mode до тех пор, пока на выводе INT1 не появится управляющий сигнал. Вывод INT1 необходимо настроить на вход, для этого требуется записать «1» в бит INT1_EXT регистра INT1_CTRL.

В режиме Bypass mode FIFO-буфер пуст. При возникновении управляющего сигнала буфер переходит в режим Continuous mode с потоковым накоплением данных (рисунок 8).

Рис. 8. Режим Bypass-to-Continuous mode

Рис. 8. Режим Bypass-to-Continuous mode

Считывание данных из FIFO-буфера

При использовании любого режима работы, за исключением Bypass mode, при вычитывании выходных регистров (от 28h до 2Dh) пользователь получает самый ранний отсчет, хранящийся в FIFO.

Всякий раз, когда считываются выходные регистры, их содержимое перемещается в выходной буфер SPI. После этого слоты FIFO сдвигаются на один уровень, чтобы освободить место для приема нового отсчета. При этом старый отсчет из буфера загружается в выходные регистры.

Все содержимое FIFO-буфера может быть получено путем считывания всех 32 слотов.

Данные могут считываться из буфера в различных форматах, например, 192 однобайтовых цикла чтения, 32 цикла чтения по 6 байтов, 1 цикл чтения 192 байта и так далее. Это позволяет обеспечить дополнительную гибкость.

Для получения полного содержимого буфера рекомендуется применять многобайтовое чтение (вплоть до 192 байтов данных за раз), чтобы максимально ускорить процесс обмена. Это можно сделать с помощью функции автоматического инкремента адреса. Для ее активации необходимо записать «1» в бит IF_ADD_INC регистра CTRL2. При достижении адреса 0x2D счетчик возвращается к значению 0x28.

Обратите внимание: рекомендуется установить бит FIFO_SPI_HS_ON регистра CTRL_REG5 для тактовых частот SPI выше 6 МГц.

Датчик температуры

LIS3DHH оснащен встроенным датчиком температуры окружающей среды.

Если акселерометр находится в режиме пониженного потребления, датчик температуры также выключен. Если акселерометр находится в нормальном режиме – частота измерений температуры обычно составляет 68,75 Гц (ODR/16).

Полученный 12-битный результат хранится в регистрах OUT_TEMP_H и OUT_TEMP_L (с левым выравниванием). Чувствительность измерений составляет 16 LSB/°C. Нулевое значение соответствует 25°C.

Пример расчета температуры

В таблице 12 представлены примеры расчета температуры окружающей среды на основе данных, полученных с помощью встроенного датчика температуры. Приведенные значения указаны для случая идеальной калибровки (при отсутствии смещения, ошибки усиления и прочего).

Таблица 12. Определение температуры с помощью встроенного датчика

Температура, °C Адрес регистра
OUT_TEMP_H (26h) OUT_TEMP_L (25h)
0 E7h 00h
25 00h 00h
50 19h 00h

Самотестирование

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

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

Запуск функции самотестирования производится с помощью битов ST[1:0] регистра CTRL_REG4. При записи 00b в поле ST [1:0] самотестирование отключается. Включение функции производится при записи 01b (самодиагностика положительного знака) или 10b (самодиагностика отрицательного знака).

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

Процедура самотестирования состоит из четырех этапов, это:

  • включение акселерометра;
  • усреднение 5 выборок перед включением самотестирования;
  • усреднение 5 образцов после включения самопроверки;
  • вычисление абсолютной разности показаний для каждой оси и проверка того, что она попадает в заданный диапазон. Минимальные и максимальные значения приведены в документации.

Полная процедура самопроверки представлена на рисунке 9.

Рис. 9. Процедура самотестирования акселерометра

Рис. 9. Процедура самотестирования акселерометра

Литература

  1. Bill Giovino. Robots Assume the Position with Sensors, EIU, April, 2018, Mouser Electronics;
  2. Barry Manz. Wind Turbines: Tiny Sensors Play Big Role, EIU, April, 2018, Mouser Electronics;
  3. Morrie Goldman. Sensor Fusion Comes of Age, EIU, April, 2018, Mouser Electronics;
  4. Д.М.Урманов. Концепция по развитию производства МЭМС-изделий в России на период до 2017 г.;
  5. AN5139 Application note. LIS3DHH: three-axis digital output accelerometer. Rev.2. STMicroelectronics, 2018;
  6. st.com.

Наши информационные каналы

О компании ST Microelectronics

Компания STMicroelectronics является №1 производителем электроники в Европе. Компоненты ST широко представлены в окружающих нас потребительских товарах – от iPhone до автомобилей разных марок. Лидеры индустриального рынка выбирают компоненты ST за их надежность и выдающиеся технические параметры. В компании ST работает 48 000 сотрудников в 35 странах. Производственные мощности расположены в 12 странах мира. Более 11 тысяч сотрудников заняты исследованиями и разработками – инновационное лидерство ...читать далее