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

Реализация датчика движения на основе LIS2DH12 и LIS2DW12

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

Существует целый ряд приложений, в которых для уменьшения энергопотребления выход из режима ожидания осуществляется при физическом перемещении устройства. Например, пульт от телевизора может активизироваться только тогда, когда его берет пользователь. Для реализации подобной функции потребуется датчик движения. В данной статье мы рассмотрим особенности реализации датчиков движения на базе акселерометров LIS2DH12 и LIS2DW12 производства компании STMicroelectronics со встроенной функцией Wake-up.

Компания STMicroelectronics является лидером в области производства МЭМС-датчиков: акселерометров, гироскопов, микрофонов и прочих. Акселерометры серии LIS2xx (таблица 1) применяются в самых разных областях, начиная от промышленной и коммерческой электроники и заканчивая автомобильной техникой [1, 2]. Очень часто акселерометры используются в качестве датчиков движения для пробуждения устройств, находящихся в режиме ожидания.

Таблица 1. Характеристики акселерометров серии LIS2xx

Параметр LIS2DW12 LIS2DS12 LIS2HH12 LIS2DH12 LIS2DE12
Тип Цифровой Цифровой Цифровой Цифровой Цифровой
Корпус, размер, мм LGA-12, 2х2х0,7 LGA-12, 2х2х0,86 LGA-12, 2х2х0,7 LGA-12, 2х2х0,7 LGA-12, 2х2х0,7
Оси X, Y, Z X, Y, Z X, Y, Z X, Y, Z X, Y, Z
Диапазон, g ±2; ±4; ±8; ±16 ±2; ±4; ±8; ±16 ±2; ±4; ±8; ±2; ±4; ±8; ±16 ±2; ±4; ±8; ±16
Разрешение, бит 12/14 10/12/14 8/10/16 8/10/12 8
Чувствительность, макс., мg 0,244 0,244 0,061 1 15,6
Плотность шума, мкg/√Гц 90 120 140 750 1315
Iпотр в активном режиме, мин., мкА 0,38 2,5 50 2 2
Смещение, мg ±20 ±30 ±30 ±40 ±100
ODR Однократный/1,6…1600 Гц 1…6400 Гц 10…800 Гц 1…5376 Гц 1…5376 Гц
Uпит, В 1,62…3,6 1,62…1,98 1,71…3,6 1,71…3,6 1,71…3,6

В некоторых случаях выход из спящего режима должен происходить при физическом движении устройства. Например, пульт дистанционного управления находится в режиме ожидания и потребляет доли микроампер, когда лежит на столе. Если же пользователь берет его в руку, то происходит пробуждение и переход в рабочее состояние. Автомобильные системы можно пробуждать при возникновении вибраций после завода двигателя. Еще один пример – различные спортивные гаджеты, автоматически включающиеся при встряхивании или начале выполнения физических упражнений. Не стоит забывать и о таких устройствах как датчики взлома в системах безопасности.

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

Рис. 1. Использование датчика движения для уменьшения уровня потребления

Рис. 1. Использование датчика движения для уменьшения уровня потребления

Многие современные цифровые акселерометры становятся идеальными датчиками движения сразу по нескольким причинам:

  • обеспечение минимального уровня потребления даже в активном состоянии (сотни нА…единицы мкА);
  • наличие аппаратной функции пробуждения при обнаружении движения (Wake-up);
  • возможность цифровой настройки параметров пробуждения: порога срабатывания, минимального времени воздействия;
  • наличие различных режимов работы, например, работы с абсолютным и относительным смещением.

Примерами малопотребляющих акселерометров со встроенной функцией Wake-up являются микросхемы LIS2DH12 и LIS2DW12 производства STMicroelectronics. Рассмотрим особенности программной реализации датчиков движения на базе этих двух акселерометров.

Акселерометр LIS2DH12. Режимы работы и потребление

LIS2DH12 – трехосевой малопотребляющий акселерометр со встроенной функцией Wake-up. Он имеет несколько рабочих режимов (таблица 2): малопотребляющий режим (Low-power mode), нормальный режим (Normal mode) и режим повышенной производительности (High-resolution mode) [3]. Между собой они отличаются разрешением, полосой пропускания и потреблением.

Таблица 2. Режимы работы LIS2DH12

Режим работы CTRL_REG1 [3], бит Lpen CTRL_REG4 [3], бит HR Полоса пропускания, Гц Время включения, мс Чувствительность при ±2g, мg/разряд
Low-power (8-битное разрешение) 1 0 ODR/2 1 16
Normal (10-битное разрешение) 0 0 ODR/2 1,6 4
High-resolution (12-битное разрешение) 0 1 ODR/9 7/ODR 1

При использовании функции Wake-up потребление становится ключевым параметром, поэтому для работы следует выбирать режим Low-power с минимальным током потребления от 2 мкА при частоте опроса 1 Гц (таблица 3) [3].

Таблица 3. Потребление LIS2DH12 в различных рабочих режимах

Частота опроса Потребление в различных режимах, мкА
Low-power
(8-bit data output)
Normal
(10-bit data output)
High resolution
(12-bit data output)
1 2 2 2
10 3 4 4
25 4 6 6
50 6 11 11
100 10 20 20
200 18 38 38
400 36 73 73
1344 185 185
1620 100
5376 185

Отличительной чертой LIS2DH12 является возможность включения и отключения фильтра высоких частот HP. При отключении фильтра происходит измерение абсолютных величин ускорений. При активации фильтра постоянные ускорения удаляются и учитываются только динамические составляющие. Подробнее об этом будет рассказано ниже.

Еще одна особенность функции Wake-up в LIS2DH12 заключается в наличии логических функций «И» и «ИЛИ», которые позволяют создавать различные условия пробуждения с учетом индивидуальных показаний каждой оси, например:

  • формировать прерывание, когда обнаружено движение по оси Xили по оси Y;
  • формировать прерывание, когда обнаружено одновременное движение по оси Yи по оси Zи так далее.

Акселерометр LIS2DW12. Режимы работы и потребление

LIS2DW12 – еще один трехосевой малопотребляющий акселерометр со встроенной функцией пробуждения Wake-up производства ST.

LIS2DW12 имеет пять основных рабочих режимов, которые отличаются разрешением, частотой измерений, полосой пропускания, уровнем шумов и потреблением (таблица 4) [4].

Таблица 4. Режимы работы LIS2DW12

Параметр Режим работы
High Performance Mode Low-Power Mode 4 Low-Power Mode 3 Low-Power Mode 2 Low-Power Mode 1
Разрешение, бит 14 14 14 14 12
Частота опроса ODR, Гц 12,5…1600 1,6…200 1,6…200 1,6…200 1,6…200
Полоса пропускания BW, Гц ODR/2 (кроме 1600 Гц), ODR/4, ODR/10, ODR/20 180, ODR/4, ODR/10, ODR/20 360, ODR/4, ODR/10, ODR/20 720, ODR/4, ODR/10, ODR/20 3200, ODR/4, ODR/10, ODR/20
Шумы LOW_NOISE = 0 при ±2g,
ODR = 200 Гц, мкg/√ Гц
110 160 210 300 550
Шумы LOW_NOISE = 1 при ±2g,
ODR = 200 Гц, мкg/√ Гц
90 130 180 240 450

В самом экономичном режиме Low-Power Mode 1 с 12-битным разрешением ток потребления составляет всего 0,38 мкА при частоте опроса 1,6 Гц (LOW_NOISE = 0). Именно режим Low-Power Mode 1 является оптимальным выбором при использовании функции Wake-up (таблица 5) [4].

Таблица 5. Потребление LIS2DW12 в различных рабочих режимах

Частота опроса Потребление в различных режимах при 1,8 В, мкА
High Performance Low-Power 4 Low-Power 3 Low-Power 2 Low-Power 1
LOW_NOISE LOW_NOISE LOW_NOISE LOW_NOISE LOW_NOISE
0 1 0 1 0 1 0 1 0 1
ODR = 1,6 Гц 0,65 0,7 0,55 0,6 0,45 0,5 0,38 0,4
ODR = 12,5 Гц 90 120 4 5 2,5 3 1,6 2 1 1,1
ODR = 25 Гц 90 120 8,5 10 4,5 6 3 3,5 1,5 2
ODR = 50 Гц 90 120 16 20 9 11 5,5 7 3 3,5
ODR = 100 Гц 90 120 32 39 17,5 21,5 10,5 13 5 6
ODR = 200 Гц 90 120 63 77 34,5 42 20,5 25 10 12
ODR = 400, 800, 1600 Гц 90 120

Акселерометры LIS2DW12 имеют следующие варианты реализации функции пробуждения Wake-up:

  • работа без учета начального смещения с использованием фильтра высоких частот (HP) для устранения постоянных составляющих;
  • работа с отключенным фильтром HP и с учетом начального абсолютного смещения(режим Absolute reference mode);
  • работа с фильтром HP и относительным смещением (режим Relative reference mode).

Сравнение функционала акселерометров LIS2DH12 и LIS2DW12

Алгоритмы работы датчиков движения на базе LIS2DH12 и LIS2DW12 идентичны и включают в себя несколько этапов (рисунок 2): базовую инициализацию датчика (выбор диапазона измерений, разрядности и так далее), настройку функции Wake-up (установку пороговых значений, инициализацию прерываний и прочее), включение датчика (задание частоты опроса, разрешение прерываний и так далее), ожидание движения, генерацию прерывания при обнаружении движения.

Рис. 2. Базовый алгоритм работы системы с функцией пробуждения

Рис. 2. Базовый алгоритм работы системы с функцией пробуждения

Тем не менее, акселерометры LIS2DH12 и LIS2DW12 имеют индивидуальные особенности реализации функции Wake-up (таблица 6) [5]. Мы рассмотрим каждый из существующих режимов отдельно.

Таблица 6. Сравнение возможностей акселерометров LIS2DH12 и LIS2DW12

Особенности использования функции Wake-up LIS2DW12 LIS2DH12
Режим с ВЧ-фильтром (HP filter) + +
Режим с относительным смещением (Relative reference mode) +
Режим с абсолютным смещением (Absolute reference mode) +
Режим без ВЧ-фильтра (HP filter bypassed) +

Прежде чем перейти непосредственно к программам, необходимо еще раз отметить, что при использовании функции Wake-up рекомендуется настроить акселерометры на работу в режиме с минимальным уровнем потребления (таблица 7) [5]:

  • для LIS2DW12 — режим Low Power Mode 1 с разрешением 12 бит и частотой опроса 1,6 Гц;
  • для LIS2DW12 — режим Low Power Mode с частотой опроса 1 Гц.

Таблица 7. Конфигурации LIS2DH12 и LIS2DW12 с минимальным потреблением

Параметр LIS2DW12 LIS2DH12
Значения регистров CTRL1 = 0x10
CTRL4_INT1_PAD_CTRL = 0x20
WAKE_UP_THS = 0x02
WAKE_UP_DURATION = 0x00
CTRL7 = 0x20
CTRL_REG1 = 0x1F
CTRL_REG2 = 0x01
CTRL_REG3 = 0x40
INT1_CFG = 0x2A
INT1_THS = 0x10
INT1_DURATION = 0x00
Потребление, мкА 0,38 (Vdd = 1,8 В) 2 (Vdd = 2,5 В)

В ряде случаев требуется, чтобы система быстрее реагировала на движение. Для этого необходимо поднять частоту опроса. Однако уровень потребления при этом также вырастет, как это показано в таблицах 3 и 4.

Еще одной важной особенностью акселерометров LIS2DH12 и LIS2DW12 является встроенная подтяжка на входах SDO/SA0. Эти выводы не следует подключать к земле, так как это приведет к значительному увеличению потребляемого тока. Их следует оставить неподключенными или подключить к шине питания.

Использование LIS2DW12. Случай 1. Работа с фильтром высоких частот HP

При активации фильтра высоких частот HP функция Wake-up работает вне зависимости от исходной ориентации датчика. Дело в том, что из-за использования ВЧ-фильтра постоянная составляющая гравитационного ускорения удаляется автоматически, и пробуждение может спровоцировать только динамические ускорения с амплитудой выше заданного порогового уровня и с минимальной заданной длительностью (рисунок 3) [5].

Рис. 3. Характеристики пробуждения: пороговое значение и минимальная длительность ускорения

Рис. 3. Характеристики пробуждения: пороговое значение и минимальная длительность ускорения

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

  • настроить вывод INT1 для формирования прерывания при пробуждении (функция Wake-up): установить бит INT1_WU в регистре CTRL4_INT1_PAD_CTRL (адрес 23h);
  • установить желаемое пороговое ускорение: записать соответствующее значение битов WK_THS[5:0] в регистре WAKE_UP_THS (адрес 34h). При этом 1 LSB = 1/64 FS, где FS – используемый диапазон измерения акселерометра ±2g/±4g/±8g/±16g;
  • установить минимальную длительность движения: записать соответствующее значение битов WAKE_DUR[1:0] в регистре WAKE_UP_DUR (адрес 35h), где 1 LSB = 1 * 1/ODR, где ODR – заданная частота измерений;
  • установить частоту опроса ODR: записать соответствующее значение в поле ODR[3:0] регистра CTRL1 (адрес 31h);
  • установить режим пониженного потребления Low power mode 1: записать значение «00» в поле MODE[1:0] регистра CTRL1 (адрес 31h);
  • установить разрядность 12-бит: записать значение «00» в поле LP_MODE[1:0] регистра CTRL1 (адрес 31h);
  • разрешить прерывание: установить бит INTERRUPTS_ENABLE в регистре CTRL7 (адрес 3Fh).

Программный код инициализации будет иметь вид, представленный в листинге 1. Здесь и далее код является аппаратно-независимым и не раскрывает реализацию используемых функций.

Листинг 1. Инициализация LIS2DW12 при работе с фильтром высоких частот [5]

void LIS2DW12_INT1_handler(void)

{

print("Обнаружено прерывание\r\n");/* … */

}

int main(void)

{

init_MCU(); /* Инициализация микроконтроллера и портов ввода-вывода */

print("Начало выполнения программы\r\n");

/* Базовая инициализация датчика */

write_reg(0x21, 0x08); /* Работа с регистром CTRL2(21h). Запрет на перезапись регистра данных в момент чтения: BDU = 1. Запрет на инкремент адреса при чтении по I2C/SPI: IF_ADD_INC = 0 */

write_reg(0x25, 0x00); /* Работа с регистром CTRL6(25h). Диапазон +/-2g: FS[1:0] = 0. Полоса пропускания ODR/2: BW_FILT[1:0] = 0. Отключение малошумящего режима LOW_NOISE=0. При использовании функции Wake-up бит FDS роли не играет!*/

/* Настройка функции Wake-up */

write_reg(0x23, 0x20); /* Работа с регистром CTRL4_INT1_PAD_CTRL (23h). Активировать функцию Wake-up: INT1_WU = 1 */

write_reg(0x34, 0x01); /* Работа с регистром WAKE_UP_THS (34h). Задаем пороговое ускорение 1/64 от FS: WK_THS[5:0] = 1. */

write_reg(0x35, 0x00); /* Работа с регистром WAKE_UP_DUR (35h). Задаем минимальную длительность движения 16/ODR: WAKE_DUR[1:0] = 0. */

/* Запустить датчик */ 

write_reg(0x20, 0x50); /* Работа с регистром CTRL1(20h). Установить частоту опроса 100 Гц: ODR[3:0] = 0101, режим Low-Power mode 1: MODE[1:0] = 0. Разрешение 12 бит: LP_MODE[1:0] = 0 */

delay(10); /* задержка на 1/ODR */

write_reg(0x3f, 0x20); /* Работа с регистром CTRL7 (3Fh). Разрешение прерываний датчика: INTERRUPTS_ENABLE = 1. */

while (1)

{

/* … */

}

}

Стоит отметить, что при использовании функции Wake-up состояние бита FDS (регистр CTRL6 25h) роли не играет, а выбор между низкочастотным и высокочастотным фильтрами определяется битом USR_OFF_ON_WU регистра CTRL7 (3Fh) [3].

Использование LIS2DW12. Случай 2. Работа с абсолютным смещением без фильтра HP

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

На рисунках 4 и 5 показаны особенности реализации функции пробуждения Wake-up при задании абсолютного смещения. Предположим, что объект имеет некоторое начальное положение (смещение) (рисунок 4). Это положение принимается за точку отсчета. Если объект не будет перемещаться, то сигнал пробуждения формироваться не будет.

Рис. 4. Прерывание не возникает при сохранении ориентации

Рис. 4. Прерывание не возникает при сохранении ориентации

Если же ориентация объекта изменится на некоторую величину, определяемую пороговым значением, то возникает прерывание Wake-up (рисунок 5).

Рис. 5. Прерывание возникает при изменении ориентации

Рис. 5. Прерывание возникает при изменении ориентации

Для задания параметров смещения LIS2DW12 используются регистры X_OFS_USR (адрес 3Ch), Y_OFS_USR (адрес 3CDh), Z_OFS_USR (адрес 3Eh), а также биты USR_OFF_ON_WU и USR_OFF_W регистра CTRL7 (адрес 3Fh).

Бит USR_OFF_ON_WU определяет вес восьмибитных регистров (X,Y,Z)_OFS_USR [6]:

  • если USR_OFF_ON_WU = 0, то вес составит 977 мкg/LSB;
  • если USR_OFF_ON_WU = 1, то вес составит 15,6 мg/LSB.

Для большинства приложений рекомендуется выбирать вес 15,6 мg/LSB для получения максимального диапазона 256 * 15,6 мg = 4g.

Рассмотрим пример. Если вес регистров смещения составляет 15,6 мg/LSB (USR_OFF_ON_WU = 1), то при задании X_OFS_USR = 0x00, Y_OFS_USR = 0x00, Z_OFS_USR = 0x40, получаем следующие абсолютные значения: X = 0 мg, Y = 0 мg, Z ≈ 1000 мg.

Код для инициализации датчика при работе с абсолютным смещением представлен в листинге 2. Как видим, изменения коснулись только настройки регистров CTRL6, CTRL7 и регистров смещения (X,Y,Z)_OFS_USR.

Листинг 2. Инициализация LIS2DW12 при работе с абсолютным смещением [5]

void LIS2DW12_INT1_handler(void)

{

print("Обнаружено прерывание\r\n");/* … */

}

int main(void)

{

init_MCU(); /* Инициализация микроконтроллера и портов ввода-вывода */

print("Начало выполнения программы\r\n");

/* Базовая инициализация датчика */

write_reg(0x21, 0x08); /* Работа с регистром CTRL2(21h). Запрет на перезапись регистра данных в момент чтения: BDU = 1. Запрет на инкремент адреса при чтении по I2C/SPI: IF_ADD_INC = 0 */

write_reg(0x25, 0x00); /* Работа с регистром CTRL6(25h). Диапазон +/-2g: FS[1:0]= 0. Полоса пропускания ODR/2: BW_FILT[1:0] = 0. Отключение малошумящего режима LOW_NOISE = 0. При использовании функции Wake-up бит FDS роли не играет!*/

/* Настройка функции Wake-up */

write_reg(0x23, 0x20); /* Работа с регистром CTRL4_INT1_PAD_CTRL (23h). Активировать функцию Wake-up: INT1_WU = 1 */

write_reg(0x34, 0x01); /* Работа с регистром WAKE_UP_THS (34h). Задаем пороговое ускорение 1/64 от FS: WK_THS[5:0] = 1. */

write_reg(0x35, 0x00); /* Работа с регистром WAKE_UP_DUR (35h). Задаем минимальную длительность движения 16/ODR: WAKE_DUR[1:0] = 0. */

/* Задание смещение */

write_reg(0x3c, 0x00); /* Работа с регистром X_OFS_USR(3Ch). Задаем смещение 0: X_OFS_USR_[7:0] = 0 */

write_reg(0x3d, 0x00); /* Работа с регистром Y_OFS_USR(3Dh). Задаем смещение 0: Y_OFS_USR_[7:0] = 0 */

write_reg(0x3e, 0x40); /* Работа с регистром Z_OFS_USR(3Eh). Задаем смещение 1g: Z_OFS_USR_[7:0] = 0x40 */

/* Запустить датчик */ 

write_reg(0x20, 0x20); /* Работа с регистром CTRL1(20h). Установить частоту опроса 100 Гц: ODR[3:0] = 0010, режим Low-Power mode 1: MODE[1:0] = 0. Разрешение 12 бит: LP_MODE[1:0] = 0 */

delay(80); /* задержка на 1/ODR */

write_reg(0x3f, 0x2С); /* Работа с регистром CTRL7 (3Fh). Разрешение прерываний датчика: INTERRUPTS_ENABLE = 1. Использование режима абсолютного смещения: USR_OFF_ON_WU = 1. Вес регистров смещения 15,6 мg: USR_OFF_W =1.*/

while (1)

{

/* … */

}

}

Использование LIS2DW12. Случай 2. Работа с относительным смещением и фильтром HP

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

Фиксация относительного смещения происходит в момент записи бита HP_REF_MODE в регистр CTRL7 (адрес 3fh). После этого выходные данные определяются как разность между текущими значением осевых ускорений и опорными значениями, зафиксированными ранее. Если эта разность превысит величину порогового значения, заданного в WK_THS[5:0], произойдет прерывание. В остальном данный режим повторяет рассмотренный выше случай (рисунки 4 и 5).

Код для инициализации датчика при работе с относительным смещением представлен в листинге 3.

Листинг 3. Инициализация LIS2DW12 при работе с относительным смещением [5]

void LIS2DW12_INT1_handler(void)

{

print("Обнаружено прерывание\r\n");

/* … */

}

int main(void)

{

init_MCU(); /* Инициализация микроконтроллера и портов ввода-вывода */

print("Начало выполнения программы\r\n");

/* Базовая инициализация датчика */

write_reg(0x21, 0x08); /* Работа с регистром CTRL2(21h). Запрет на перезапись регистра данных в момент чтения: BDU = 1. Запрет на инкремент адреса при чтении по I2C/SPI: IF_ADD_INC = 0 */

write_reg(0x25, 0x00); /* Работа с регистром CTRL6(25h). Диапазон +/-2g: FS[1:0]= 0. Полоса пропускания ODR/2: BW_FILT[1:0] = 0. Отключение малошумящего режима LOW_NOISE = 0. При использовании функции Wake-up бит FDS роли не играет!*/

/* Настройка функции Wake-up */

write_reg(0x23, 0x20); /* Работа с регистром CTRL4_INT1_PAD_CTRL (23h). Активировать функцию Wake-up: INT1_WU = 1 */

write_reg(0x34, 0x01); /* Работа с регистром WAKE_UP_THS (34h). Задаем пороговое ускорение 1/64 от FS: WK_THS[5:0] = 1. */

write_reg(0x35, 0x00); /* Работа с регистром WAKE_UP_DUR (35h). Задаем минимальную длительность движения 16/ODR: WAKE_DUR[1:0] = 0. */

/* Запустить датчик */ 

write_reg(0x20, 0x20); /* Работа с регистром CTRL1(20h). Установить частоту опроса 100 Гц: ODR[3:0] = 0010, режим Low-Power mode 1: MODE[1:0] = 0. Разрешение 12 бит: LP_MODE[1:0] = 0 */

delay(80); /* задержка на 1/ODR */

write_reg(0x3f, 0x20); /* Работа с регистром CTRL7 (3Fh). Разрешение прерываний датчика: INTERRUPTS_ENABLE = 1. Разрешение относительного смещения с HP: USR_OFF_ON_WU = 0. */

write_reg(0x3f, 0x22); /* Зафиксировать относительное смещение. Устанавливаем бит HP_REF_MODE в регистре CTRL7(3Fh) */

while (1)

{

/* … */

}

}

Если требуется изменить значения смещений, то есть зафиксировать объект в новой ориентации, следует сбросить бит HP_REF_MODE, задать необходимую ориентацию объекта, и вновь установить бит HP_REF_MODE.

Использование LIS2DH12. Случай 1. Работа с фильтром высоких частот HP

Реализация функции Wake-up с фильтром высоких частот для LIS2DH12 практически идентична рассмотренному выше случаю с LIS2DW12. Благодаря ВЧ-фильтру HP гравитационное ускорение отфильтровывается, поэтому пробуждение могут спровоцировать только динамические ускорения с амплитудой выше заданного порогового уровня и с минимальной заданной длительностью (рисунок 3).

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

  • разрешить использование фильтра высоких частот: установить бит FDS в регистре CTRL_REG2 (адрес 21h);
  • разрешить использование фильтра высоких частот для встроенных функций OR и AND: установить бит HP_IA1 в регистре CTRL_REG2 (адрес 21h);
  • настроить вывод INT1 для формирования прерывания при пробуждении (функция Wake-up): установить бит I1_IA1 в регистре CTRL_REG3 (адрес 22h);
  • разрешить прерывания по всем осям: установить биты ZHIE, YHIE, XHIE в регистре INT1_CFG (адрес 30h);
  • установить желаемое пороговое ускорение: записать соответствующее значение в поле THS[6:0] в регистре INT1_THS (адрес 32h). При этом вес битов THS[6:0] зависит от заданного диапазона измерений: 1 LSb = 16 мg при FS = 2g, 1 LSb = 32 мg при FS = 4g, 1 LSb = 62 мg при FS = 8g, 1 LSb = 186 мg при FS = 16g;
  • установить минимальную длительность движения: записать соответствующее значение в поле D[6:0] в регистре INT1_DURATION (адрес 33h), где 1 LSB = 1 * 1/ODR, где ODR – заданная частота измерений;
  • установить частоту опроса ODR: записать соответствующее значение в поле ODR[3:0] регистра CTRL_REG1 (адрес 20h);
  • установить режим минимального потребления Low-power: установить бит LPen в регистре CTRL_REG1 (адрес 20h).

В документации также рекомендуется производить чтение регистра REFERENCE (26h) после каждого пробуждения для сброса фильтра HP и продолжения нормальной работы.

Код для инициализации LIS2DH12 при работе высокочастотным фильтром приведен в листинге 4.

Листинг 4. Инициализация LIS2DW LIS2DH12 при работе высокочастотным фильтром [5]

void LIS2DH12_INT1_handler(void)

{

print("Обнаружено прерывание\r\n");

/* … */

}

int main(void)

{

init_MCU(); /* Инициализация микроконтроллера и портов ввода-вывода */

print("Начало выполнения программы\r\n");

/* Базовая инициализация датчика */

/* Работа с регистром CTRL_REG2(21h)

Разрешить работу фильтра высоких частот: FDS = 1;

Разрешить работу фильтра высоких частот для встроенных функций OR и AND Interupt1: HP_IA1 = 1 */

write_reg(0x21, 0x09); 

write_reg(0x22, 0x40); /* Работа с регистром CTRL_REG3(22h). Настроить вывод INT1 для формирования прерывания I1_IA1 = 1 */

write_reg(0x23, 0x00); /* Работа с регистром CTRL_REG4(23h). Установить диапазон измерений +/-2g: FS[1:0] = 00. */

/* Настройка функции Wake-up */

write_reg(0x30, 0x2a); /* Работа с регистром INT1_CFG(30h). Разрешить прерывание по всем осям ZHIE, YHIE, XHIE = 1. По умолчанию используется функция ИЛИ: AOI = 0, 6D = 0*/

write_reg(0x32, 0x14); /* Работа с регистром INT1_THS(32h). Задаем пороговое ускорение с учетом выбранного диапазона. Так как FS составляет +/-2g, то для THS[6:0] 1LSB = 16 мg: 16 * 20 = 320 мg */

write_reg(0x33, 0x00); /* Работа с регистром INT1_DURATION(33h). Задаем минимальную длительность движения 1/ODR: D[6:0] = 0 */

/* Запустить датчик */ 

write_reg(0x20, 0x5f); /* Работа с регистром CTRL_REG1(20h). Установить частоту опроса 100 Гц: ODR[3:0] = 0101, режим Low-Power mode: LPen = 1. Разрешение работы всех осей Zen, Yen, Xen = 1*/

HAL_Delay(1); /* задержка 1мс */

while (1)

{

/* … */

}

}

Использование LIS2DH12. Случай 2. Работа с логическими функциями при отключенном фильтре высоких частот HP

Как было сказано ранее, акселерометры LIS2DH12 позволяют реализовывать до 64 сценариев пробуждения с учетом индивидуальных показаний каждой из осей. Для этого используются встроенные логические функции «И» и «ИЛИ». Генерация прерывания при использовании функции Wake-up определяется шестью источниками (рисунок 6) [7]:

Рис. 6. Дерево прерываний при использовании функции Wake-up в LIS2DH12

Рис. 6. Дерево прерываний при использовании функции Wake-up в LIS2DH12

  • ZHIE – прерывание при превышении порога по оси Z;
  • ZLIE – прерывание при значениях ускорения по оси Z меньше порогового значения;
  • YHIE – прерывание при превышении порога по оси Y;
  • YLIE – прерывание при значениях ускорения по оси Y меньше порогового значения;
  • XHIE – прерывание при превышении порога по оси X;
  • XLIE – прерывание при значениях ускорения по оси X меньше порогового значения.

Разрешение того или иного прерывания производится установкой одноименных битов в регистрах INT1_CFG и INT2_CFG.

В дополнение к этому возможна комбинация этих сигналов с помощью логических функций «И» и «ИЛИ». Для этого используются биты AOI и 6D регистров INT1_CFG и INT2_CFG [4, 7]:

  • если AOI = 0, 6D = 0, то реализуется функция «ИЛИ». Это значит, что прерывание будет генерироваться, если хотя бы один из источников будет активен;
  • если AOI = 1, 6D = 0, то реализуется функция «И». Это значит, что прерывание будет генерироваться, только если все выбранные прерывания будут активны.

В качестве примера рассмотрим случай, представленный на рисунке 7. В данной комбинации разрешены прерывания YHIE и XHIE, которые объединены логическим «ИЛИ». Таким образом, если хотя бы по одной из осей будет превышено пороговое значение в 312 мg, то произойдет генерация прерывания Wake-up.

Рис. 7. Пример генерации прерывания при использовании логической функции «ИЛИ»

Рис. 7. Пример генерации прерывания при использовании логической функции «ИЛИ»

Код инициализации LIS2DH12 при реализации примера, представленного на рисунке 7, приведен в листинге 5.

Листинг 5. Реализация функции пробуждения с использованием логических функций [5]

void LIS2DH12_INT1_handler(void)

{

print("Обнаружено прерывание\r\n");

/* … */

}

int main(void)

{

init_MCU(); /* Инициализация микроконтроллера и портов ввод-/вывода */

print("Начало выполнения программы\r\n");

/* Базовая инициализация датчика */

write_reg(0x22, 0x40); /* Работа с регистром CTRL_REG3(22h). Настроить вывод INT1 для формирования прерывания I1_IA1 = 1 */

write_reg(0x23, 0x00); /* Работа с регистром CTRL_REG4(23h). Установить диапазон измерений +/-2g: FS[1:0] = 00. */

/* Wakeup recognition enable */

write_reg(0x30, 0x0a); /* Работа с регистром INT1_CFG(30h). Разрешить прерывание по осям YHIE и XHIE = 1. По умолчанию используется функция «ИЛИ»: AOI = 0, 6D = 0 */

write_reg(0x32, 0x14); /* Работа с регистром INT1_THS(32h). Задаем пороговое ускорение с учетом выбранного диапазона. Так как FS составляет +/-2g, то для THS[6:0] 1LSB = 16 мg: 16 * 20 = 320 мg */

write_reg(0x33, 0x00); /* Работа с регистром INT1_DURATION(33h). Задаем минимальную длительность движения 1/ODR: D[6:0] = 0 */

/* Запустить датчик */ 

write_reg(0x20, 0x5f); /* Работа с регистром CTRL_REG1(20h). Установить частоту опроса 100 Гц: ODR[3:0] = 0101, режим Low-Power mode: LPen = 1. Разрешение работы всех осей Zen, Yen, Xen = 1*/

HAL_Delay(1); /* задержка 1мс */

while (1)

{

/* … */

}

}

Заключение

Использование акселерометров LIS2DH12 и LIS2DW12 в качестве датчиков движения имеет целый ряд преимуществ: минимальное собственное потребление, наличие аппаратной функции пробуждения Wake-up, возможность цифровой настройки параметров пробуждения (порога срабатывания, минимального времени воздействия), наличие различных режимов работы (с ВЧ-фильтром, с абсолютным или относительным смещением).

Литература

  1. Александр Калачев. Акселерометры STMicroelectronics: определяя любое движение. НЭ № 6/2014;
  2. Вячеслав Гавриков. LIS2DW12: новый акселерометр с ультранизким энергопотреблением. НЭ №3/2017;
  3. DatasheetLIS2DH12, High-performance ultra-low-power 3-axis «femto» accelerometer;
  4. DatasheetLIS2DW12, High-performance ultra-low-power 3-axis «femto» accelerometer;
  5. Vladimir JANOUSEK, Zuzana JIRANKOVA and Petr STUKJUNGER. Setting up Wake-up recognition and absolute/relative reference. 1. STMicroelectronics, 2017;
  6. LIS2DW12: always-on 3D accelerometer AN5038 Application note. LIS2DW12: always-on 3D accelerometer. Rev.1. – STMicroelectronics, 2017;
  7. Application note AN5005, LIS2DH12: MEMS digital output motion sensor ultra-low-power high performance 3-axis «nano» accelerometer. Rev.2. STMicroelectronics, 2017;
  8. st.com.

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

О компании ST Microelectronics

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