Библиографическое описание:

Ивашинников Б. А., Коваленко М. В., Лесков О. М. Подключение акселерометра, выполненного по MEMS-технологии, к микроконтроллеру STM32F407VGT6 // Молодой ученый. — 2016. — №17. — С. 40-44.



В данной статье рассматривается подключение акселерометра к микроконтроллеру линейки STM32, а также его настройка и получение данных по шине SPI. Работа выполнена на базе отладочного комплекта STM32F4DISCOVERY.

STM32F4DISCOVERY — высокопроизводительная исследовательская плата для STM32F4 позволяет изучать возможности микроконтроллера STM32F4 и легко разрабатывать собственные приложения. В комплект поставки входит все необходимое, чтобы немедленно начинать разработки, как новичкам, так и опытным пользователям. Основанная на STM32F407VGT6, плата имеет интегрированный отладчик ST-LINK/V2, два ST MEMS, цифровой измеритель ускорения (акселерометр) и цифровой микрофон, один аудио ЦАП с интегрированным драйвером громкоговорителя, работающим в классе D, светодиоды и кнопки, а также разъем USB OTG micro-AB.

MEMS сенсоры подразделяются на два вида: сенсоры — измерительные устройства, которые преобразуют те или иные физические воздействия в электрический сигнал, и актуаторы (исполнительные устройства) — системы, которые занимаются обратной задачей, то есть преобразуют электрические сигналы в физические воздействия.

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

Наиболее распространёнными являются датчики, основанные на конденсаторном принципе. Подвижная часть системы — классический грузик на подвесах (Рисунок 1). При наличии ускорения грузик смещается относительно неподвижной части акселерометра. Обкладка конденсатора, прикрепленная к грузику, смещается относительно обкладки на неподвижной части. Емкость меняется, при неизменном заряде меняется напряжение — это изменение можно измерить и рассчитать смещение грузика. Откуда, зная его массу и параметры подвеса, легко найти и искомое ускорение.

http://www.3dnews.ru/assets/external/illustrations/2010/10/13/600098/mems-accelerometer-1.jpg

Рис. 1. Устройство конденсаторного датчика

На отладочной плате STM32F4DISCOVERY установлен трех-осевой акселерометр LIS3DSH, способный определять ускорение с точностью до 0.06 mg. Данный акселерометр подключается к микроконтроллеру(МК) по шине SPI, после настройки которой, посылая необходимые данные в регистры, производится установка таких параметров, как: пределы измерения, скорость опроса, настройка полосового фильтра для уменьшения «дребезга» показаний и т. д.

Для конфигурации необходимых режимов работы портов МК, а также настройки тактирования используется специальную утилиту STM32CubeMX, после чего создается код рабочей программы в среде Keil µVision 5.

Кроме портов SPI и светодиодно необходимо настроить вывод CS, который отвечает за подключение акселерометра.

Итоговая настройка МК в утилите STM32CubeMX показана на рисунке 2. Для общения с акселерометром настроена шина SPI1, а для индикации и проверки работоспособности программы 4 светодиода, показывающих в какую строну наклонен акселерометр.

Рис. 2. Настройка МК в программе STM32CubeMX

После чего сгенерирован код проекта для среды Keil µVision 5. Листинг кода, отвечающего за инициализации SPI1:

static void MX_SPI1_Init(void)

{

hspi1.Instance = SPI1;

hspi1.Init.Mode = SPI_MODE_MASTER;

hspi1.Init.Direction = SPI_DIRECTION_2LINES;

hspi1.Init.DataSize = SPI_DATASIZE_8BIT;

hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;

hspi1.Init.NSS = SPI_NSS_SOFT;

hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;

hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;

hspi1.Init.TIMode = SPI_TIMODE_DISABLE;

hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

hspi1.Init.CRCPolynomial = 10;

if (HAL_SPI_Init(&hspi1) != HAL_OK)

{

Error_Handler();

}

}

Для настройки режима работы акселерометра необходимо записать в данные в регистры акселерометра. Временные диаграммы протокола показаны на рисунке 3.

Рис. 3. Протокол SPI

Для обращения к акселерометру перед отправкой адреса регистра информационного пакета выставляем выход микроконтроллера CS = 0, поскольку на акселерометре данный вывод инвертирован.

Для записи информации в регистр необходимо сначала выдать на шину адрес этого регистра, при этом при чтении необходимо установить бит RW = 1, а при записи установить бит RW = 0.

После этого по SPI за 7 тактов передается адрес внутреннего регистра акселерометра, после чего в зависимости от режима чтение/запись в течении 8 тактов выдается новое значение регистра, либо посылается пустой байт, после которого необходимо считать текущее значение опрашиваемого регистра. По окончанию цикла чтения/записи выставляем CS = 1.

За настройку скорости работы акселерометра и включение/выключение осей отвечает регистр CTRL_REG4, с адресом 0x20. Биты данного регистра приведены на рисунке 4.

Рис. 4. Регистр CTRL_REG4

Старшие 4 бита отвечают за настройку скорости опроса внутренних схем датчика. Бит BDU выключает или отключает обновление младшего регистра данных, при условии, что старший бит данных оси акселерометра был считан. Три младших бита включают или выключают оси X,Y и Z.

Для нашего случая установим скорость опроса датчика = 50Hz, BDU = 0 и включим оси X и Y. В этом случае нам требуется записать в регистр бит 0x53.

Листинг функции, отвечающей за инициализацию акселерометра:

void Acc_Init(void)

{

uint8_t Reg_ctrl_4 = 0x20;

uint8_t acc_set = 0x53;

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);

HAL_SPI_Transmit(&hspi1, &Reg_ctrl_4, 1, 100);

HAL_SPI_Transmit(&hspi1, &acc_set, 1, 100);

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);

}

После инициализации акселерометра можно приступить к считыванию данных.

Акселерометр выдает 16-битные значения, считывание которых происходит путем обращения к двум 8-битным регистрам: старшему и младшему. При этом максимальное значение равняется 0хFFFF, что соответствует максимальному ускорению, совпадающему с положительным направлением оси. По умолчанию акселерометр настроен на пределы измерения -+2g. Это означает, что значению 0xFFFF соответствует ускорение 2g, а 0x0000 соответствует -2g. Данную особенность необходимо учесть при обработке данных, а именно, в зависимости от полученного значения либо «опустить», либо «поднять» значение на 0x8000, при этом установив флаг, означающий положительное значение или отрицательное в 1 или 0 соответственно.

Для чтения информации считываем значения старшего и младшего регистров, после чего производим сдвиг старшего на 8 бит влево и присваиваем младшим битам значения младшего регистра.

Адреса регистров данных для осей X и Y приведены на рисунке 5.

Рис. 5. Адреса регистров данных

Для чтения значений данных регистров устанавливаем бит RW = 1. Стоит отметить, что при работе с библиотекой HAL нет необходимости посылать пустой бит для считывания данных, поскольку функция считывания делает это самостоятельно.

Листинг функций получения и обработки значений регистров для оси X приведены ниже.

void X_read(void)

{

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);

HAL_SPI_Transmit(&hspi1, &X_read_H, 1, 100);

HAL_SPI_Receive(&hspi1, &OUT_X_H, 1, 100);

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);

HAL_SPI_Transmit(&hspi1, &X_read_L, 1, 100);

HAL_SPI_Receive(&hspi1, &OUT_X_L, 1, 100);

HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);

X_16bit = ((OUT_X_H<<8)|(OUT_X_L));

}

void X_Proc(void)

{

if (X_16bit >= 0x8000){

X_norm = X_16bit - 0x8000;

zeroX = 1;

}else{

X_norm = 0x8000 - X_16bit;

zeroX = 0;

}

}

После выполнения данной функции глобальным переменным X_norm и zeroX присваиваются значения текущего ускорения и направления, по которому оно действует. Для оси Y функции выглядят аналогично.

После этого в зависимости от полученных данных зажигаем необходимые светодиоды.

if(X_norm <= 0x6000)

{

if(zeroX == 1)

{

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);

}

else{

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);

}

}

На этом написание управляющей программы завершено. После компилирования и загрузки программы во flesh-память убеждаемся в правильности написания программы.

Литература:

1. Лабораторный практикум для изучения микроконтроллеров архитектуры ARM Cortex-M4 на базе отладочного модуля STM32F4 Discovery / Бугаев В. И., Мусиенко М. П., Крайнык Я. М. — Москва-Николаев: МФТИ-ЧГУ, 2013. — 71 с.

2. Мартин Т. // Применение микроконтроллеров AVR: схемы алгоритмы программы, 2-е изд. испр. / Мартин Т. — Москва: Издательский дом «Додэка-XXI» 2006. — 288с.: ил.

3. STMicroelectronics. MEMS digital output motion sensor: ultra-low-power high-performance three-axis «nano» accelerometer / DocID022405 Rev 2 2015.

4. STMicroelectronics. RN0094 Release note. STM32CubeMX release 4.16.0 / DocID025911 Rev 23 2016.

Обсуждение

Социальные комментарии Cackle