ADXL345 – подключение модуля акселерометра

ADXL345 подключение модуля
Акселерометр представляет собой датчик, измеряющий проекции ускорения на три пространственные оси. Учитывая величину ускорения свободного падения (g) и данные измерения по трем осям, можно определить ориентацию акселерометра в пространстве. Для этих целей его и используют, например, в мобильных телефонах для поворота изображения на экране, а также в играх. В этой статье я рассмотрю модуль с акселерометром ADXL345 позиционирующийся под платформу Arduino.

Я заказывал модуль здесь. Акселерометр ADXL345 способен измерять ускорение величиной до ±16 g, с максимальным разрешением 13 бит, частота измерения может достигать 3200 Гц. Обладает низким энергопотреблением, максимум 140 мкА, напряжение питания может находиться в пределах 2…3,6 В. Акселерометр поддерживает два распространенных интерфейса связи SPI и I2C, а также имеет два выхода прерываний и встроенный буфер для хранения данных. Схема модуля приведена ниже:
adxl345-схема модуля

Режимы питания и энергосбережения

Ток потребления акселерометра зависит от частоты измерения (дискретизации) ускорения, ниже в таблице приведены значения тока для различных частот, при напряжении питания 2,5В:

Частота измерения ускорения и обновления выходных данных, ГцПолоса пропускания, ГцБиты задания частоты (Rate), регистр BW_RATEПотребление акселерометра, мкА
320016001111140
1600800111090
8004001101140
4002001100140 (90)
2001001011140 (60)
100501010140 (50)
5025100190 (45)
2512,5100060 (40)
12,56,25011150 (34)
6,253,13011045
3,131,56010140
1,560,78010034
0,780,39001123
0,390,20001023
0,200,10000123
0,100,05000023

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

После подачи питания акселерометр находится в режиме ожидания, с минимальным потребление энергии, около 0,1 мкА, при этом ускорение не измеряется.  Для перехода в режим измерения необходимо установить бит Measure регистра POWER_CTL. Функция автоматического перехода в спящий режим при простое, позволяет дополнительно экономить энергию, более подробно о режиме будет сказано ниже.

Интерфейс передачи данных

Передача данных может осуществляться по двум протоколам, SPI и I2C. Для подключения интерфейса I2C, необходимо подтянуть линию CS к высокому логическому уровню. Для интерфейса SPI вывод CS управляется внешним контроллером. Для SPI доступны два режима: 3-х и 4-х проводная схема. В 4-х проводной схеме для передачи данных используется две линии акселерометра (кроме CS и SCLK), это SDI – вход данных, SDO – выход.

Для 3-х проводной схемы используется одна линия SDIO, при этом, внешний контроллер должен перенастраивать свой вход в соответствии с направлением передачи. В этом случае линию SDO необходимо подтянуть к высокому или низкому уровню через резистор в 10 кОм, в модуле вывод подтянут к низкому уровню. Во время передачи данных на линии CS необходимо установить низкий логический уровень, линия SCLK должна находиться в высоком логическом уровне, когда передача данных отсутствует. Ниже представлена структура первого байта для пакета SPI:

Структура первого байта для пакета SPI
D7D6D5D4D3D2D1D0
RWMBA5A4A3A2A1A0

Байты передаются старшим битом вперед. Бит RW указывает операцию: 1 – чтение, 0 – запись. Для передачи нескольких байт за сеанс связи, необходимо установить бит MB, нулевое значение соответствует передаче одного байта. Биты A5-A0 задают адрес регистра, к которому идет обращение. Окончание передачи данных выполняется установкой высокого логического уровня на линии CS.

Максимальная частота тактирования SPI интерфейса равна 5 МГц. Для частоты измерения (обновления данных) 3200 и 1600 Гц, SPI интерфейс должен функционировать на частоте не ниже 2 МГц. Для частоты измерения 800 Гц, не ниже 400 кГц и т.д. в такой же пропорции, иначе могут возникнуть пропуски новых данных измерения.

Для интерфейса связи I2C поддерживаются стандартная скорость передачи в 100 кГц, а также высокая 400 кГц. Линия ALT_ADDRESS отвечает за адрес акселерометра на шине I2C. При высоком логическом уровне на линии, акселерометру присваивается 7-ми битный адрес со значением 0011101, при низком уровне 1010011. Для корректного функционирования интерфейса, линии SDA и SCL необходимо подтянуть к питающему напряжению.

Из-за ограничения скорости передачи данных в 400 кГц, максимальная частота измерения ускорения не должна превышать 800 Гц.

Описание регистров ADXL345

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

АдресНазваниеТипСостояние после сбросаОписание
0 (0x00)DEVIDR11100101Номер ID
1-28 (0x01-0x1C)ReservedЗарезервировано
29 (0x1D)THRESH_TAPR/W00000000Значение уставки для толчка
30 (0x1E)OFSXR/W00000000Смещение для оси X
31 (0x1F)OFSYR/W00000000Смещение для оси Y
32 (0x20)OFSZR/W00000000Смещение для оси Z
33 (0x21)DURR/W00000000Длительность толчка
34 (0x22)LatentR/W00000000Задержка перед ожиданием второго толчка
35 (0x23)WindowR/W00000000Время для обнаружения второго толчка
36 (0x24)THRESH_ACTR/W00000000Значение уставки функции активности
37 (0x25)THRESH_INACTR/W00000000Значение уставки функции бездействия
38 (0x26)TIME_INACTR/W00000000Время бездействия
39 (0x27)ACT_INACT_CTLR/W00000000Привязка событий активности/бездействия на оси
40 (0x28)THRESH_FFR/W00000000Значение уставки свободного падения
41 (0x29)TIME_FFR/W00000000Время свободного падения
42 (0x2A)TAP_AXESR/W00000000Привязка событий толчка на оси
43 (0x2B)ACT_TAP_STATUSR00000000Регистр флагов событий толчка или активности
44 (0x2C)BW_RATER/W00001010Настройка частоты дискретизации
45 (0x2D)POWER_CTLR/W00000000Настройка режима энергосбережения
46 (0x2E)INT_ENABLER/W00000000Регистр управления прерываниями
47 (0x2F)INT_MAPR/W00000000Назначение выходных линий для прерываний
48 (0x30)INT_SOURCER00000010Регистр флагов прерываний
49 (0x31)DATA_FORMATR/W00000000Настройка формата выходных данных
50 (0x32)DATAX0R00000000Выходные данные для оси X (младший байт)
51 (0x33)DATAX1R00000000Выходные данные для оси X (старший байт)
52 (0x34)DATAY0R00000000Выходные данные для оси Y (младший байт)
53 (0x35)DATAY1R00000000Выходные данные для оси Y (старший байт)
54 (0x36)DATAZ0R00000000Выходные данные для оси Z (младший байт)
55 (0x37)DATAZ1R00000000Выходные данные для оси Z (старший байт)
56 (0x38)FIFO_CTLR/W00000000Настройка буфера FIFO
57 (0x39)FIFO_STATUSR00000000Регистр состояния буфера FIFO
Тип: R – только чтение, R/W – чтение и запись

Регистр DEVID содержит ID номер акселерометра, значение равно 0xE5.

Регистры OFSX, OFSY, OFSZ предназначены для задания смещения выходных данных по осям X, Y, Z. Содержимое каждого регистра складывается с измеренным значением ускорения по соответствующей оси. Младшему значимому биту соответствует ускорение 15,6 mg (расчетный коэффициент 15,6 mg/LSB), причем учитывается знак, для значения 0x7F получим примерно +2g, для 0x80 соответственно -2g. Подробнее про использование регистров будет сказано позже.

Регистр THRESH_TAP содержит значение уставки ускорения, которое используется для обнаружения кратковременного воздействия на акселерометр, то есть для фиксации толчка. Значение регистра рассчитывается исходя из расчетного коэффициента 62,5 mg/LSB (для значения 0xFF получим пороговое ускорение 16g). Значение равное 0 при разрешенном прерывании может привести к некорректному поведению.

Регистр DUR задает максимальную длительность толчка, в течение которого значение ускорения должно быть выше уставки заданной в регистре THRESH_TAP, при выполнении этих условий фиксируется событие толчка и генерируется прерывание. Если по истечении заданного времени ускорение остается уставки, событие толчка не засчитывается. Расчетный коэффициент 625 мкс/LSB, значение 0 отключает функции обнаружения толчка/двойного толчка.

Регистр Latent содержит значение временной задержки после обнаружения первого толчка и началом временного интервала для сканирования второго толчка. Временной интервал задается в регистре Window. Расчетный коэффициент 1,25 мс/LSB, значение 0 отключает функции обнаружения двойного толчка.

В регистре TAB_AXES можно задать оси X, Y, Z, по которым будут отслеживаться толчки, для этого необходимо установить биты TAP_x enable. Если бит TAP_x сброшен, то соответствующая ось не участвует в обнаружении толчков. При установке бита Suppress, событие двойного толчка не фиксируется, если во время задержки (Latent) после обнаружения первого толчка, возникает ускорение, превышающее значение уставки в регистре THRESH_TAP.

Регистр TAB_AXES
D7D6D5D4D3D2D1D0
0000SuppressTAP_X enableTAP_Y enableTAP_Z enable

Ниже представлена поясняющая картинка:
adxl345-диаграмма обнаружения толчков

Регистры THRESH_ACT и THRESH_INACT содержат значения уставок, которые используются для выявления факта изменения ускорения. Расчетный коэффициент равен 62,5 mg/LSB, значение 0 при разрешенном прерывании может привести к некорректному поведению. Если ускорение превышает значение уставки в регистре THRESH_ACT, возникает событие активности, по которому генерируется прерывание. Событие бездействия возникает, когда значение ускорение меньше уставки в регистре THRESH_INACT, в течение времени, превышающего значение в регистре TIME_INACT. Расчетный коэффициент для времени 1 сек/LSB.

С помощью регистра ACT_INACT_CTL можно задать оси X, Y, Z, для которых будет отслеживаться событие активности (биты ACT_x enable) или бездействия (биты INACT_x enable), для этого нужно установить соответствующие биты. Если все биты сброшены, функция отслеживания отключается. При отслеживании активности, сравнение ускорений по осям выполняется с помощью логической функции “И”, то есть превышение уставки по любой оси вызывает событие активности. Для бездействия используется функция “ИЛИ”, событие возникает, если ускорение по все осям меньше уставки в течение времени заданного в  регистре TIME_INACT. Кроме этого можно задать режим сравнения ускорений: если биты ACT ac/dc и INACT ac/dc сброшены, то используется абсолютное сравнение, текущее значение сравнивается с уставкой. Если я правильно понял, при установленных битах, с значением уставки сравнивается результат разницы между двумя измерениями.

Регистр ACT_INACT_CTL
D7D6D5D4D3D2D1D0
ACT ac/dcACT_X enableACT_Y enableACT_Z enableINACT ac/dcINACT_X enableINACT_Y enableINACT_Z enable

Регистр THRESH_FF содержит значение уставки, которое сравнивается с ускорением по каждой оси (лог. функция “И”), если значения ускорений по всем осям меньше уставки в течение времени заданного в регистре TIME_FF, то возникает событие свободного падения и генерируется прерывание. Расчетный коэффициент для уставеи 62,5 mg/LSB, рекомендуемые значения от 300 до 600 mg. Для временного промежутка коэффициент равен 5 мс/LSB, рекомендуемые значения от 100 до 350 мс. Значение регистров равное 0 при разрешенном прерывании может привести к некорректному поведению.

Регистр ACT_TAP_STATUS содержит флаги, которые указывают соответствующую ось, на которой в первую очередь произошло событие активности (биты ACT_x source)  или толчка (биты TAP_x source). Установленный бит указывает на факт возникновения события. Этот регистр не очищается, а перезаписывается новыми данными, регистр должен быть прочитан перед сбросом флагов прерываний. Если отслеживание по какой-либо оси было отключено, то соответствующий бит сбросится после возникновения очередного события. Бит Asleep указывает на состояние акселерометра, если значение равно 1, модуль находится в спящем режиме и наоборот.

Регистр ACT_TAP_STATUS
D7D6D5D4D3D2D1D0
0ACT_X sourceACT_Y sourceACT_Z sourceAsleepTAP_X sourceTAP_Y sourceTAP_Z source

Регистр BW_RATE отвечает за частоту выходных данных и режим пониженного потребления. Сброшенному биту LOW_POWER соответствует нормальный режим работы, если бит установлен, акселерометр переходит в режим пониженного энергопотребления. Биты Rate отвечают за частоту выходных данных, выше в статье приведена таблица настройки частоты.

Регистр BW_RATE
D7D6D5D4D3D2D1D0
000LOW_POWERRate

Регистр POWER_CTL управляет режимами энергосбережения акселерометра. Бит Link связывает функции активности и бездействия, если бит установлен, запуск функции активности задерживается до обнаружения события бездействия, и наоборот. Если бит сброшен, эти функции равноправны и выполняются независимо друг от друга.

Установка бита AUTO_SLEEP включает функцию автоматического перехода в спящий режим, сброс бита соответственно отключает ее. Функция активна, только в случае, если установлен бит Link. В этом режиме происходит автоматический переход в спящий режим, если включена функция бездействия и возникло данное событие. Если дополнительно включена функция активности, то акселерометр автоматически просыпается при возникновении данного события, и продолжает измерение в нормальном режиме. Установка бита AUTO_SLEEP при сброшенном бите Link, не влияет на работу акселерометра.

Для правильной работы функции Link, управляющему устройству необходимо отслеживать возникновение событий активности и бездействия с помощью прерываний, и своевременно сбрасывать флаги прерываний путем чтения регистра INT_SOURCE. Если, например, не сброшен флаг прерывания события активности (Activity), то акселерометр в последующем не перейдет в спящий режим, при включенной функции автоматического сна.

Сброс бита Measure переводит акселерометр в режим ожидания с минимальным потреблением энергии, ускорение при этом не измеряется. Установка бита переводит акселерометр в режим измерения.

Установка бита Sleep переводит акселерометр в спящий режим, во время которого передача данных в буфер FIFO останавливается, прерывание по обновлению данных измерения (DATA_READY) отключается.  Регистры выходных данных DATAX, DATAY, DATAZ обновляются с частотой, которая задается битами Wakeup. В спящем режиме действует только функция активности.

Биты WakeupЧастота обновления данных (измерения)
D1D0
008 Гц
014 Гц
102 Гц
111 Гц
Регистр POWER_CTL
D7D6D5D4D3D2D1D0
00LinkAUTO_SLEEPMeasureSleepWakeup

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

Регистр INT_ENABLE содержит биты разрешения различных прерываний. Возможны прерывания по следующим событиям:

  • обновление данных по измерению ускорения, бит DATA_READY;
  • толчок, то есть кратковременное изменение ускорения, бит SINGLE_TAP;
  • двойной толчок, бит DOUBLE_TAP;
  • активность, бит Activity;
  • бездействие, бит Inactivity;
  • свободное падение, бит FREE_FALL;
  • количество измерений достигло значения уставки, бит Watermark;
  • переполнение буфера FIFO либо перезапись непрочитанных данных, бит Overrun.

Установка битов разрешает соответствующие прерывания, сброс запрещает. Функции, закрепленные за битами DATA_READY, Watermark, Overrun действую постоянно, биты рекомендуется настраивать перед включением выходов прерываний.

Регистр INT_MAP содержит биты с такими же названиями, как в регистре INT_ENABLE, здесь можно назначить прерывания на один из двух выходов акселерометра. При нулевом значении бита, соответствующее прерывание назначается на вывод INT1, иначе на вывод INT2. Если на один вывод назначено несколько прерываний, любое из них вызовет изменение логического уровня на выходе (используется лог. функция “ИЛИ”).

Флаги прерываний находятся в регистре INT_SOURCE, и имеют такие же названия как биты в регистре INT_ENABLE. Установка флагов в 1 означает, что произошло соответствующее прерывание. Флаг DATA_READY устанавливается, когда получены новые данные измерения ускорения. Флаг Watermark связан с буфером FIFO, о котором будет сказано позже. В случае если буфер FIFO отключен, флаг Overrun устанавливается, когда новые данные перезаписывают еще непрочитанные в регистрах DATAX, DATAY, DATAZ. Если буфер FIFO включен, флаг Overrun указывает на его переполнение. Флаги DATA_READY, Watermark, Overrun устанавливаются независимо от того, разрешены прерывания или нет, и сбрасываются путем чтения регистров DATAX, DATAY, DATAZ. Для сброса флагов DATA_READY, Watermark может потребоваться несколько чтений, в зависимости от количества данных в буфере FIFO, остальные флаги сбрасываются путем чтения регистра INT_SOURCE.

Регистры INT_ENABLE, INT_MAP, INT_SOURCE
D7D6D5D4D3D2D1D0
DATA_READYSINGLE_TAPDOUBLE_TAPActivityInactivityFREE_FALLWatermarkOverrun

С помощью регистра DATA_FORMAT осуществляется настройка формата выходных данных для регистров DATAX, DATAY, DATAZ, а также ряда других функций. Установка бита SELF_TEST запускает самодиагностику акселерометра, при этом проверяются механические и электронные системы акселерометра. В процессе проверки значения ускорений будут меняться.

Бит SPI настраивает режим интерфейса передачи данных, значение 1 устанавливает 3-х проводной режим SPI, нулевое значение 4-х проводной режим.

Бит INT_INVERT настраивает активный логический уровень на выводах прерываний INT1, INT2. При нулевом значении бита, активный логический уровень  – высокий, для значения 1 активный уровень низкий.

С помощью бита FULL_RES настраивается величина разрешения, с которой будет измеряться ускорение. При установке бита, включается режим расширенного разрешения, которое зависит от предела установленного битами Range, результат измерения рассчитывается исходя из коэффициента 3,9 mg/LSB. Нулевое значение бита устанавливает фиксированное разрешение 10 бит, при этом результат измерения, а также расчетный коэффициент, будут зависеть от выбранного предела.

Бит Justify задает способ выравнивания результата измерения внутри регистров DATAX, DATAY, DATAZ, значение бита равное 1, устанавливает левое выравнивание, 0 – правое.

Биты RangeПредельное значение измеряемого ускорения
D1D0
00±2 g
01±4 g
10±8 g
11±16 g
Регистр DATA_FORMAT
D7D6D5D4D3D2D1D0
SELF_TESTSPIINT_INVERT0FULL_RESJustifyRange

Регистры DATAX0, DATAX1, DATAY0, DATAY1, DATAZ0, DATAZ1 хранят результат измерения ускорения. Значение ускорения для каждой оси представлено двумя байтами, DATAx1 старший, DATAx0 младший байт. Рекомендуется прочитать все 6 байт за одну операцию, чтобы исключить потерю данных, так как между раздельными операциями чтения, содержимое регистров может обновиться.

Регистр FIFO_CTL управляет режимом работы кольцевого буфера FIFO, это небольшая внутренняя память акселерометра, которая может хранить результат 32-х измерений для каждой оси. Биты FIFO_MODE устанавливают один из четырех режимов работы:

  • Bypass – буфер отключен, содержимое остается пустым;
  • FIFO – буфер заполняется до переполнения, после чего данные не сохраняются, но акселерометр продолжает работать;
  • Stream – при переполнении буфера, старые данные перезаписываются новыми, получаем кольцевой буфер.
  • Trigger – буфер сохраняет данные до возникновения события триггера, после чего переключается в режим FIFO. Я детально не разбирался с этим режимом.

Бит Trigger связывает событие триггера с выходом прерывания INT1 или INT2. Биты Samples задают количество измерений, при превышении которого устанавливается флаг прерывания Watermark в регистре INT_SOURCE, данная функция действует для режимов FIFO и Stream, для режима Trigger биты Samples имеют другое назначение. Нулевые значения битов Samples в режиме Trigger, могут привести к некорректному поведению.

Регистр FIFO_CTL
D7D6D5D4D3D2D1D0
FIFO_MODETriggerSamples

Регистр FIFO_STATUS отображает состояние буфера. Бит FIFO_TRIG указывает на возникновение события триггера, биты Entries указывают размер буфера, который занят данными, то есть количество измерений, которые хранятся в буфере на текущий момент.

Регистр FIFO_STATUS
D7D6D5D4D3D2D1D0
FIFO_TRIG0Entries

Доступ к буферу осуществляется с помощью регистров хранения результата DATAX, DATAY, DATAZ, для чтения данных из буфера, необходимо многократно прочитать регистры хранения. За одну операцию необходимо прочитать все 6 байт, так как, данные отдельного измерения (ускорение по всем осям) стираются, независимо от количества прочитанных байт.

Формат выходных данных

Результат измерения ускорения помещается в регистры выходных данных DATAX0, DATAX1, DATAY0, DATAY1, DATAZ0, DATAZ1, по два байта на каждое ускорение. Для частоты измерения 3200 и 1600 Гц формат данных меняется в зависимости от заданного разрешения и выбранного предела измерения.

При использовании частоты измерения 3200 и 1600 Гц в режиме раширенного разрешения (FULL_RES) или фиксированном разрешении 10 бит для предела ±2 g, младший значимый бит (LSB) всегда остается равным 0, независимо от способа выравнивания. Для пределов ±4 g, ±8 g, ±16 g, в 10-битном разрешении, младший значимый бит учитывается в результате измерения, то есть не всегда равен 0. Для частот измерения 800 Гц или ниже, младший значимый бит всегда учитывается, независимо от режима разрешения и выбранного предела.

В режиме расширенного разрешения, пределу ±2 g соответствует 10 бит данных, 11 бит для предела ±4 g, 12 бит для ±8 g, и 13 бит для ±16 g. В случае правого выравнивания, меняется положение старшего значимого бита (MSB), для левого выравнивания, положение младшего значимого бита. Кроме этого, при левом выравнивании, биты, лежащие правее младшего значимого (LSB), всегда равны 0. Ниже приведена поясняющая картинка:
adxl345-формат выходных значений
Результат измерения ускорения может принимать как положительные, так и отрицательные значения, в зависимости от ориентации акселерометра. В следующей таблице представлены значения выходных данных в зависимости от величины ускорения, разрешения, и предела измерения:

Разрешение, предел измеренияРасчетный коэффициентВеличина измеряемого ускоренияЗначение выходных данных
10 бит, ±2 g

Расширенное разрешение: ±2 g

3,9 mg/LSB+1 g256 (0x100)
-1 g768 (0x300)
10 бит, ±4 g7,8 mg/LSB+1 g128 (0x80)
-1 g896 (0x380)
10 бит, ±8 g15,6 mg/LSB+1 g64 (0x40)
-1 g960 (0x3C0)
10 бит, ±16 g31,2 mg/LSB+1 g32 (0x20)
-1 g992 (0x3E0)
Расширенное разрешение: ±4 g (11 бит)3,9 mg/LSB+1 g256 (0x100)
-1 g1792 (0x700)
Расширенное разрешение: ±8 g (12 бит)3,9 mg/LSB+1 g256 (0x100)
-1 g3840 (0xF00)
Расширенное разрешение: ±16 g (13 бит)3,9 mg/LSB+1 g256 (0x100)
-1 g7936 (0x1F00)

Значения выходных данных могут варьироваться, и не совпадать для разных осей, при одинаковой величине ускорения. В этом случае для компенсации могут использоваться регистры смещения OFSX, OFSY, OFSZ для каждой оси. Например, необходимо уменьшить значение выходных данных по оси Z на 80 mg, так как расчетный коэффициент регистра смещения составляет 15,6 mg/LSB, величина смещения составит 80/15,6=5. Смещение прибавляется к регистру выходных данных, поэтому для его уменьшения используем отрицательно число -5. В регистр смещения записываем число 251 (0xFB).

Подключение ADXL345 к микроконтроллеру

Я подключил акселерометр к микроконтроллеру PIC16F628A, для вывода данных измерения использовал графический дисплей Nokia 5110, схема подключения ADXL345 приведена ниже:
adxl345-схема подключения к МК
Светодиод HL1 служит индикатором, и мигает в процессе передачи данных.

Часть кода программы представлена ниже (полный код доступен для скачивания в конце статьи):

Я использовал 3-х проводной SPI интерфейс для связи с акселерометром. Для передачи и приема данных используются две подпрограммы send_spi и priem_spi. Перед вызовом подпрограмм, в регистр adr_byte записывается адрес регистра акселерометра, к которому идет обращение, в случае передачи/приема нескольких байт, этот адрес будет начальным. В регистр kol_byte необходимо записать количество байт данных для передачи/приема. Данные для передачи, необходимо размещать последовательно, начиная с регистра data_x0, при получении данных, они также помещаются в данные регистры, начиная data_x0.

После настройки регистров микроконтроллера, выполняется вызов подпрограммы инициализации акселерометра aks_init. Здесь настраиваются следующие режимы: 3-х проводной SPI, высокий активный уровень выхода прерываний, фиксированное разрешение 10 бит, предел ±2 g, правое выравнивание, частота измерения 12,5 Гц, нормальный режим работы, разрешение прерываний по обновлению данных (DATA_READY). Спящий режим, а также автоматический переход в сон отключен, установка режима измерения.

Кроме этого, в моем случае дополнительно задается смещение выходных данных. Дело в том, что имеющийся у меня экземпляр акселерометра выдавал ненулевые значения для величины ускорения 0 g, по оси X: -105, Y: -48, Z: 420. Для примера рассчитаю смещение для оси Z, здесь  необходимо уменьшить значение на 420, расчетный коэффициент выходных данных 3,9 mg/LSB, для регистра смещения коэффициент равен 15,6 mg/LSB. Значение смещения составит (420*3,9)/15,6=105, в регистр OFSZ записываем отрицательное число 150 (0x96), для остальных осей расчет аналогичен.

После инициализации идет опрос линии прерывания, при появлении которого считывается 6 байт данных из регистров DATAX, DATAY, DATAZ, если значение отрицательное, выполняется инвертирование и прибавление единицы, для получения положительного значения. Кроме этого незначащие биты обнуляются согласно разрешению 10 бит, далее выполняется двоично-десятичное преобразование, и наконец, вывод символа оси, знака, и собственно результата измерения ускорения. Далее цикл начинается заново, с опроса линии прерывания.

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

adxl345-макет

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

Прошивка МК и исходник для акселерометра

У этой записи один комментарий

  1. Нужна помощь. Можете понятно обЪяснить (желательно с кодом для Arduino) как поменять частоту датчика.

Имя (обязательно)Email (обязательно)Веб-сайт

Добавить комментарий