- Лоботрясы

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

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

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

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



    Акселерометр ADXL345. Часть 2
Просмотров: 5324
     Продолжаем мучить наш акселерометр ADXL345!
     Найдя небольшой отрезок свободного времени среди кучи навалившихся дел, болячек и прочих приятных форс-мажорных факторов, на основании тщательно проштудированного даташита и парочки хороших иностранных ресурсов в сети интернет, я написал V.1.0 своей самопальной библиотеки (CodeVisionAVR рулит!). Правда, всех функций акселерометра я пока не предусмотрел (в некоторых не видел надобности, а некоторые буду дополнять/обновлять постепенно), но основные режимы работы, позволяющие вдоволь поиграться и придумать достойное применение датчику, предусмотрел.
     Как я указывал в 1-й части описания про ADXL345, акселерометр имеет возможность выбора как фиксированной 10-ти битной разрешающей способности для одного из диапазонов: ±2 g, ±4 g, ±8 g и ±16 g, так и режим полного разрешения, когда разрешающая способность увеличивается с увеличением диапазона ускорения g (10 бит для ±2 g, 11 бит для ±4 g, 12 бит для ±8 g ну и 13 бит для ±16 g).
     В режиме полного разрешения, стандартному ускорению свободного падения (да, это наше «g», или, из школьного курса физики - 9,8 м/с2) в режиме равновесия соответствует значение 256, выданное датчиком в определённом положении для определённой оси. Да вот вам и картинка из даташита, показывающая пример «ответа» датчика на положение в пространстве в режиме равновесия. 
     Тот же самый ответ для 1g можно получить и для фиксированного 10-ти битного разрешения для диапазона ±2 g, вот только не факт, что в показанных на картинках положениях акселерометра вы получите ваши 256 (0xFF), т.к. этот ответ, согласно заверениям разработчика, может варьироваться в диапазоне от 230 до 282 (а у меня по оси Z так вообще 295 показал – все врут :-( Чувствительность измерения при этих двух настройках разрешения составляет 3,9 mg/LSB (т.е, mg/младший разряд).
     А если вы решите выбрать один из диапазонов ±4 g, ±8 g или ±16 g (с 10-ти разрядным разрешением), то значению 1g на указанных на картинке положениях будут соответствовать значения 128, 64 и 32 соответственно (опять же – это средние значения :-) Но не переживайте – акселерометр имеет регистры калибровки, которые, правда, я добавлю в следующей версии библиотеки :-)
     Из всего вышесказанного вы наверное догадаетесь, в каком положении находился в данный момент мой датчик ADXL345:
     Библиотеку я оформил одним файлом – ADXL345lib.c, и пока решил остановиться только на интерфейсе I2C, причём программную реализацию его работы взял стандартную, от CodeVisionAVR.
     Поэтому, в самом начале, помимо установки адреса микросхемы (я выбрал режим подключения вывода ALT_ADDRESS на «землю»), вас ожидает ассемблерная вставка с выбором порта ввода-вывода (его адреса) и назначением выводов на SDA и SCL.
 
#define ADXL345_BUS_ADDRESS    0xA6 //Альтернативный адрес - 0x3A
 
// I2C Bus functions
#asm
   .equ __i2c_port=0x1B; PORTA
   .equ __sda_bit=6
   .equ __scl_bit=7
#endasm
#include <i2c.h> // Стандартная библиотека CVAVR
 
А вот пока и небольшой перечень функций, который успел состряпать, и планирую дополнить в будущем:
//**************************************************************
//                                           ФУНКЦИИ
//************************************************************** 
// Инициализация акселерометра
void ADXL345_Init (void);
 
//Установка разрешающей способности, где resol - выбор разрешающей способности:
// RESOLUTION_FULL – полное разрешение, RESOLUTION_2 – ±2 g, RESOLUTION_4 – ±4 g, RESOLUTION_8 – ±8 g и RESOLUTION_16 – ±16 g
void Set_Resolution (Set_Resol   resol);
 
//Режим Ожидания. ENABLE - разрешить, DISABLE - запретить
void Standby_Mode (Set_Func   val);
 
//Выбор функции прерывания   
// func - вид функции прерывания: OVERRUN, WATERMARK, FREE_FALL, INACTIVITY, ACTIVITY, DOUBLE_TAP, SINGLE_TAP и DATA_READY
// val - разрешение/запрещение прерывания: ENABLE или DISABLE
// pin - назначение вывода прерывания: INT_1 или INT_2
void Set_Interrupt (INT_Func func, Set_Func val, Set_Map pin);
 
// Определение источника прерывания
// func - вид функции прерывания (смотри функцию выше). Функция возвращает "1", если прерывание произошло от опрашиваемого источника, иначе - "0"
char Get_Source_Interrupt (INT_Func func);
 
// Получение данных измерений (среднее арифметическое из num_sample значений). Главная функция для чтения данных :-)
void Get_Data (char num_sample);
 
И пока частично реализовал настройки для работы функций прерываний (знаю, знаю, добавлю и остальные, исправлюсь :-) Для понимания, зачем всё это нужно, пока отсылаю к даташиту в 1-й части статьи.
 
// Установка порога Толчка 
void Set_Tap_Threshold (unsigned char data);
 
// Установка лимита времени для Толчка (DUR) 
void Set_Tap_Duration (unsigned char data);
 
// Установка задержки для Толчка (Latent) 
void Set_Tap_Latency (unsigned char data);
 
// Установка временного окна для Второго Толчка (Window)
void Set_Tap_Window (unsigned char data);
 
// Установка порога Активности
void Set_Activity_Threshold (unsigned char data);
 
// Установка порога Неактивности  
void Set_Inactivity_Threshold (unsigned char data);
 
// Установка времени Неактивности
void Set_Time_Inactivity (unsigned char data);
 
     Библиотеку ещё буду вылизывать и дополнять, поэтому, если вы нашли какой-нибудь недочёт – пинайте!

     Скачать:

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