- Лоботрясы

Поиск
Перейти к контенту

Главное меню:

Датчики и модули

Читать в Яндекс.Подписках



    Акселерометр ADXL345. Часть 1
Просмотров: 12106
     Подошёл черёд приобщаться к очень востребованному во многих разработках датчику положения, ускорения и наклона, а попросту – акселерометру :-) С аналоговыми акселерометрами пока что решил не связываться, т.к., во-первых, природная лень всячески противится дополнительному применению внешнего АЦП с последующей и необходимой процедурой обработки полученных данных, а во-вторых, в любительских поделках вполне хватает той полосы пропускания, которую имеют доступные цифровые датчики. В качестве подопытного был выбран цифровой акселерометр ADXL345, быстро отправленный расторопными китайцами автору сего повествования. 
     Фото героя данной публикации:
     Но так как данный полезный прибор для меня немного в диковинку, я решил подотошнее покопаться в даташите, прежде чем начать на практике пытать его СИ-шным кодом. Поэтому 1-я часть статьи посвящена именно его описанию!
     ADXL345 - это небольшой и маломощный 3-х осевой акселерометр с высоким разрешением (13 бит) и с диапазоном измерения ускорения до ±16 g (надеюсь, со школы ещё помните, что такое энто «g»?), причем диапазон измерений можно выбрать из ряда: ±2 g, ±4 g, ±8 g и ±16 g. Результат измерений можно прочитать по интерфейсам SPI или I2C в виде 16-ти бит данных.

     ADXL345 относится к классу емкостных акселерометров, и, обладая узкой полосой пропускания (0,05…1600 Гц), идеален для измерения низкочастотных вибраций, статического ускорения, движения и угла отклонения (менее 1.0°).
Полоса пропускания характеризует способность датчика «замечать» изменения ускорения (движения), происходящие с высокой частотой (например, вибрация с частотой 1000 Гц). На эту характеристику влияет частота дискретизации встроенного АЦП акселерометра, которая, для возможности обнаружения кратковременного воздействия на датчик, должна быть как минимум в два раза больше охватываемой полосы пропускания. И для ADXL345 максимальная частота дискретизации составляет 3200 Гц. Хорошую и подробную информацию об основных характеристиках акселерометров можно почитать здесь.
 
     Особенности ADXL345
- Напряжение питания 2.0…3.6 В;
- Низкое энергопотребление: 25…130 мкА в режиме измерения и 0,1 мкА в режиме ожидания;
Возможность выбора разрешающей способности:
- Фиксированное разрешение в 10 бит;
- Режим полного разрешения, когда разрешающая способность увеличивается с увеличением диапазона ускорения g (максимум - до 13 бит при измерении ускорения ±16 g (с постоянной чувствительностью (шагом измерения) - 4 мg /LSB во всех диапазонах измерения g));
- Обнаружение одиночного и двойного толчков (легких ударов);
- Контроль активности/неактивности;
- Определение свободного падения;
- Интерфейсы SPI (3-х и 4-х проводной) и I2C;
- Возможность гибкого задания режимов прерывания с выбором любого (из 2-х возможных) выводов прерываний;
- Диапазон измерения, также как и полоса пропускания, выбирается подачей определённой команды;
- Широкий температурный диапазон (от -40°C до +85°C)
- Высокая ударопрочность до 10000g.

     Требуха ADXL345
     И описание его выводов 
     И страшные регистры акселерометра ADXL345!!! Подробно до каждого бита их рассматривать не буду, (вы можете ознакомиться с ними сами, начиная со страницы 24 даташита (присутствует внизу для скачивания)) так как особенности работы с ними попытаюсь реализовать в самопальной библиотеке ко 2-й части статьи :-)
     ВКЛЮЧЕНИЕ
     ADXL345 имеет два отдельных вывода питания – VS и VDDI/O. Если честно, я немного nicht verstanden, почему фирма-разработчик решила именно так, причём оба вывода могут питаться от двух отдельных источников питания, немного отличных по уровню напряжения. В готовом же модуле эти выводы соединены вместе и питаются одним напряжением – 3,3 В.
     Процедура включения датчика следующая. После подачи питания акселерометр переходит в режим ожидания (standby mode, причём рекомендуется продублировать это также и ручонками, сбросив бит измерения (бит D3) в регистре POWER_CTL) и ждёт, когда его переведут в режим измерения (measurement mode) установкой бита измерения (бит D3) в регистре POWER_CTL. Сброс бита измерения возвращает акселерометр в режим ожидания.

     ЭНЕРГОСБЕРЕЖЕНИЕ
     Режимы Питания
     ADXL345 автоматически модулирует потребление энергии пропорционально частоте дискретизации внутреннего АЦП (рисунок ниже).
     При необходимости иметь дополнительную экономию электроэнергии, в акселерометре доступен режим малого энергопотребления. В этом режиме внутренняя частота дискретизации (выборки) АЦП уменьшается, обеспечивая экономию электроэнергии в диапазоне частоты выборки от 12,5 Гц до 400 Гц за счет немного большего шума. Для входа в режим низкого энергопотребления нужно установить бит LOW_POWER (бит 4) в регистре BW_RATE.
     Использование режима малого энергопотребления для частоты дискретизации, не показанной на рисунке, не дает никакого преимущества по сравнению с обычным режимом питания. Так вот!
 
     Автоматический Режим Сна (Auto Sleep Mode)
     Дополнительную экономию энергии даёт автоматическое переключение ADXL345 в спящий режим во время простоя. Для активации данной функции нужно установить в регистры THRESH_INACT и TIME_INACT значения, определяющие режим простоя (более подробно для особо любопытных – смотреть даташит на 24-й странице :-), а затем установить бит AUTO_SLEEP (бит D4) и связующий бит (бит D5) в регистре POWER_CTL. Потребление тока (например) при выборке в 12.5 Гц и при VS 2.5 В – около 23 мкА.

     Режим Ожидания (Standby Mode) 
     В этом режиме ток потребления снижается до 0.1 мкА (измерения при этом не производятся). Для активации этого режима необходимо сбросить бит измерения (бит D3) в регистре POWER_CTL. При этом содержимое FIFO сохраняется.

     ИНТЕРФЕЙСЫ
     Для работы с датчиком доступны интерфейсы I2C и SPI, причём ADXL345, естественно, может работать только в режиме ведомого (Slave). Для включения интерфейса I2C на CS необходимо подать высокое напряжение VDD I/O (причём, в этом случае вывод CS должен быть всегда подключён к высокому потенциалу). В SPI режиме CS управляется шиной ведущего (Master).

     SPI
     Для интерфейса SPI доступна 3- или 4-проводная конфигурация. Установкой в «0» бита SPI (бит D6) в регистре DATA_FORMAT выбирается 4-х проводной SPI, если же этот бит установлен в «1» - тогда SPI 3-х проводной. Максимальная тактовая частота SPI составляет 5 МГц, к тому же режим работы SPI – 4-й (сигнал синхронизации SCLK начинается с высокого уровня а выборка данных производится по заднему (возрастающему) фронту SCLK). Более подробно про интерфейс SPI читать тута или здеся. Если используется 3-проводной SPI, рекомендуется вывод SDO подключить к плюсу питания или к земле через резистор 10 кОм.     
     Согласно протоколу SPI не забываем в начале передачи команды опускать CS в «0», а по окончании – обратно поднимать в «1»! Согласно 4-му режиму SPI, данные устанавливаются по ниспадающему фронту SCLK, а их выборка происходит по его возрастающему фронту. 
     Использование частоты дискретизации (выборки) 3200 Гц и 1600 Гц рекомендуется только с частотой работы SPI, равной или более 2 МГц. Частота в 800 Гц рекомендуется только для скорости связи равной (или большей) 400 кГц, а остальные скорости можно определить пропорционально. Например, минимальная рекомендуемая скорость связи для частоты дискретизации 200 Гц  составляет 100 кГц. Если частота дискретизации будет выше рекомендуемого максимума, то это может привести к нежелательным последствиям, связанным с ускорением передачи данных, в том числе отсутствием (пропуском) данных или дополнительным шумам.

     I2C
     Для перевода ADXL345 в режим I2C, вывод CS подключается к потенциалу VDD I/O. ADXL345 поддерживает стандартный (100 кГц) и быстрый (400 кГц) режимы передачи данных. Когда вывод ALT ADDRESS установлен в «1», 7-разрядным адресом устройства I2C является 0x1D. Вместе с идущим следом за адресом битом R/W (чтение – «1», запись – «0»), данный адрес для операции записи примет вид 0x3A, а для операции чтения - 0x3B. Альтернативный I2C адрес 0x53 получаем соединением вывода ALT ADDRESS на «землю», а с учётом следующего за адресом бита R/W, адреса для операций записи и чтения соответственно составят 0xA6 и 0xA7.
     ОБЯЗАТЕЛЬНО! При применении интерфейса I2C выводы CS и ALT ADDRESS не должны болтаться в воздухе! Они должны быть подключены или к земле, или к VDD I/O!
     Следуя ограничению по скорости связи, максимальная частота дискретизации при использовании скорости I2C в 400 кГц, составляет 800 Гц и линейно масштабируется с изменением скорости связи I2C.

     ПРЕРЫВАНИЯ
     ADXL345 имеют два программируемых выхода прерываний - INT1 и INT2, имеющих в совокупности восемь доступных функций прерываний, причём активация каждого прерывания может быть независимой. Доступные функции: DATA_READY (наличие данных), SINGLE_TAP (толчок), DOUBLE_TAP (двойной толчок), ACTIVITY (активность), INACTIVITY (отсутствие активности), FREE_FALL (свободное падение), WATERMARK, и OVERRUN (переполнение). Оба вывода являются двухтактными. По умолчанию, активным уровнем для выходов прерываний является высокий, однако активный уровень может быть легко изменён на низкий установкой в «1» бита INT_INVERT в регистре DATA_FORMAT. Все функции могут использоваться одновременно, единственное ограничение -  для работы некоторых функций, возможно, потребуется назначить разные выводы прерываний. Прерывания разрешаются путем установки соответствующего бита в регистре INT_ENABLE а назначение соответствующего вывода INT1 или INT2 происходит на основе содержимого регистра INT_MAP.
     На время чтения регистров данных вызов прерываний приостанавливается.
     Функции прерываний определяются следующим образом:
     DATA_READY
Бит DATA_READY устанавливается при наличии новых данных и сбрасывается при их отсутствии.

     SINGLE_TAP (Толчок)
Бит SINGLE_TAP устанавливается в случае возникновения единичного ускорения (воздействия), которое больше значения в регистре THRESH_TAP и происходит за меньшее время, чем значение в регистре DUR.
 
     DOUBLE_TAP (Двойной толчок)
Бит DOUBLE_TAP устанавливается в том случае, когда после первого воздействия, по истечении времени, указанном в регистре LATENT следует второе воздействие в течение времени, указанном в регистре WINDOW, причём это воздействие должно превышать значение в регистре THRESH_TAP и происходить за меньшее время, чем указано в регистре DUR.
     ACTIVITY (Активность)
Бит ACTIVITY установится в том случае, когда величина ускорения будет больше, чем значение, в регистре THRESH_ACT, а выбор любой оси для определения события активности (и отсутствия активности) выполняется установками регистра ACT_INACT_CTL.

     INACTIVITY (отсутствие активности)
Бит INACTIVITY устанавливается, если величина ускорения на всех участвующих осях, и определяемая за промежуток времени, который больше значения в регистре TIME_INACT меньше значения, хранящегося в регистре THRESH_INACT.
Максимальное значение TIME_INACT - 255 секунд.

     FREE_FALL (Свободное падение)
Бит FREE_FALL устанавливается в том случае, если по всем осям акселерометра (логическое И) в течение некоторого времени (превышающего указанное в регистре THRESH_FF значение) определяется ускорение, величина которого меньше значения в регистре THRESH_FF. (Этот бит будет установлен в течение времени генерации события свободного падения).

     WATERMARK (Водяной знак)
Бит WATERMARK устанавливается, когда число выборок (результатов измерений) в FIFO равно содержимому битов выборок в регистре FIFO_CTL. Бит WATERMARK сбрасывается автоматически, когда FIFO прочитывается и содержимое возвращается к значению, которое меньше содержимого битов выборок.
 
     OVERRUN (Переполнение)
Бит OVERRUN устанавливается в том случае, когда новые данные заменяют непрочитанные данные. Точная операция функции переполнения зависит от режима FIFO. В режиме bypass, бит OVERRUN устанавливается, когда новые данные заменяют непрочитанные данные в регистрах DATAX, DATAY, и DATAZ. Во всех других режимах бит OVERRUN устанавливается тогда, когда FIFO заполнен. Бит OVERRUN автоматически очищается при прочтении содержимого FIFO.

     Если можно использовать все функции одновременно, то как же можно определить, какая именно вызвала появление сигнала на выходе прерываний? Для этого (после события прерывания, естественно) нужно опросить состояние регистра INT_SOURCE (милости просим в даташит, стр 26), где установка определённого бита в «1» говорит о срабатывании прерывания именно от определённой функции.

     FIFO
     Для временного хранения результатов измерений и для минимизации загрузки процессора, память ADXL345 по каждой оси содержит 32-х уровневую FIFO (First In – First Out, или попросту – кольцевой буфер). Этот буфер имеет четыре режима: Bypass Mode, FIFO, Stream и TriggerКаждый режим выбирается настройкой битов FIFO_MODE (биты[D7 D6]) в регистре FIFO_CTL. Использовать функции FIFO я пока не планирую (поэтому описывать подробно и не буду), но представлю информацию о его режимах для общего развития :-)

     Режим Bypass
В режиме bypass буфер FIFO отключен и остается пустым.

     Режим FIFO
В режиме FIFO, данные измеряемых x-, y- и z-осей сохраняются в FIFO (буфере). Когда число выборок в FIFO равно уровню, указанному в битах выборок регистра FIFO_CTL, устанавливается бит прерывания WATERMARK
. Как только буфер будет заполнен результатами измерения с осей (32 результата измерения для x-, y- и z-осей), запись данных в него прекращается, причём акселерометр продолжает работать дальше (но уже без сохранения новых данных). Прерывание WATERMARK продолжает возникать до тех пор, пока число выборок в FIFO не станет меньше, чем значение, хранящееся в битах выборок регистра FIFO_CTL.

     Режим Stream
Единственное отличие режима Stream от режима FIFO, это то, что после переполнения буфера FIFO, он продолжает наполняться новыми значениями измерений, которые просто стирают старые.
 
     Режим Trigger
В режиме Trigger, FIFO накапливает результаты 32-х последних измерений по x-, y- и z-осям. После наступления события триггера и отправки прерывания на выходы INT1 или INT2 (определяется триггер-битом в регистре FIFO_CTL), FIFO сохраняет последние результаты измерений (количество которых определяется битами выборок в регистре FIFO_CTL) а затем работает в режиме FIFO, сохраняя результаты измерений только до переполнения буфера. Между наступлением события триггера и началом чтения данных из FIFO должна присутствовать задержка не менее 5 мкс, позволяющая FIFO отменить и сохранить необходимые результаты измерений.

     ПОЛУЧЕНИЕ РЕЗУЛЬТАТА ИЗМЕРЕНИЙ
     А вот теперь самое главное! Как же считать данные измерений с акселерометра?! Для этого нужно прочитать шесть регистров с данными измерений по осям X, Y и Z– это, соответственно, регистры DATAX0, DATAX1, DATAY0, DATAY1, DATAZ0 и DATAZ1Причем рекомендуется (что также и удобно) прочитать все шесть регистров данных подряд (благо, их адреса следуют один за другим), начав чтение с регистра DATAX0 (т.е. с адреса 0x32). А для задания диапазона измерения нужно поковыряться в регистре DATA_FORMAT.
 
     Упомяну опять – всю эту вышеприведенную информацию я привёл чисто для ознакомления (в первую очередь своего :-) с возможностями и некоторыми особенностями работы типичного цифрового акселерометра, а вот реализацию работы с ним на практике (с учётом многих опущенных нюансов) я приведу уже во второй части :-)
     Также для общего развития - интересная статья (только на аглицком) - Detecting Human Falls with a 3-Axis Digital Accelerometer (Обнаружение падения с помощью 3-х осевого акселерометра).

     Скачать:

Опубликовано 8.04.2015
© Igoryosha, 2015
 
 
Назад к содержимому | Назад к главному меню