0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ADXL345三軸數(shù)字加速度計(jì)的驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)

CHANBAEK ? 來源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-08 15:34 ? 次閱讀

移動設(shè)備的廣泛應(yīng)用增加對移動過程中各種參數(shù)檢測需求。ADXL345三軸數(shù)字加速度計(jì)可以用來檢測加速度、進(jìn)而測量傾斜角度等。在這一篇中,我們將討論ADXL345三軸數(shù)字加速度計(jì)驅(qū)動程序的設(shè)計(jì)與實(shí)現(xiàn)。

1 、功能概述

ADXL345是一款小而薄的超低功耗3軸加速度計(jì),分辨率高(13位),測量范圍達(dá)±16 g。數(shù)字輸出數(shù)據(jù)為16位二進(jìn)制補(bǔ)碼格式,可通過SPI(3線或4線)或I2C數(shù)字接口訪問。采用SPI通訊接口時,最大SPI時鐘速度為5 MHz,時序方案按照時鐘極性(CPOL)= 1、時鐘相位(CPHA)= 1執(zhí)行。采用I2C通訊接口時,ALT ADDRESS引腳處于高電平,器件的7位I2C地址是0x1D,隨后為R / W位。這轉(zhuǎn)化為0x3A寫入,0x3B讀取。通過ALT ADDRESS引腳(引腳12)接地,可以選擇備用I2C地址0x53(隨后為R / W位)。這轉(zhuǎn)化為0xA6寫入,0xA7讀取。引腳定義及封裝如下:

Dingtalk_20221206154648.jpg

ADXL345非常適合移動設(shè)備應(yīng)用。它可以在傾斜檢測應(yīng)用中測量靜態(tài)重力加速度,還可以測量運(yùn)動或沖擊導(dǎo)致的動態(tài)加速度。其高分辨率(3.9 mg/LSB),能夠測量不到1.0°的傾斜角度變化。

該器件提供多種特殊檢測功能?;顒雍头腔顒訖z測功能通過比較任意軸上的加速度與用戶設(shè)置的閾值來檢測有無運(yùn)動發(fā)生。敲擊檢測功能可以檢測任意方向的單振和雙振動作。自由落體檢測功能可以檢測器件是否正在掉落。這些功能可以獨(dú)立映射到兩個中斷輸出引腳中的一個。正在申請專利的集成式存儲器管理系統(tǒng)采用一個32級先進(jìn)先出(FIFO)緩沖器,可用于存儲數(shù)據(jù),從而將主機(jī)處理器負(fù)荷降至最低,并降低整體系統(tǒng)功耗。

低功耗模式支持基于運(yùn)動的智能電源管理,從而以極低的功耗進(jìn)行閾值感測和運(yùn)動加速度測量。

ADXL345是一款完整的3軸加速度測量系統(tǒng),可選擇的測量范圍有±2 g,±4 g,±8 g或±16 g。既能測量運(yùn)動或沖擊導(dǎo)致的動態(tài)加速度,也能測量靜止加速度,例如重力加速度,使得器件可作為傾斜傳感器使用。

2 、驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)

我們對ADXL345驅(qū)動設(shè)計(jì)與其它設(shè)備一樣。我們先抽象對象類型并考慮對對象的初始化和操作。

2.1 、對象定義

基于對象的操作至少要包括3方面內(nèi)容:對象的定義,對象的初值以及對象的操作。接下來我們就從這里個方面入手設(shè)計(jì)并實(shí)現(xiàn)ADXL345的驅(qū)動。

2.1.1 、抽象對象類型

對于ADXL345也同時支持SPI接口通訊和I2C接口通訊。所以我們在抽象ADXL345對象類型時將接口類型作為屬性以區(qū)別不同的特性。在使用I2C時,設(shè)備有地址以區(qū)別不同的設(shè)備,所以我們將I2C設(shè)備地址也定義為屬性。而使用SPI時,沒有設(shè)備地址但有片選信號,我們將對片選的操作定義為對象的操作函數(shù)。

/*定義ADXL345三軸數(shù)據(jù)結(jié)構(gòu)*/
typedef struct Adxl345Object {
       uint8_t devAddress;
       uint8_t devID;
       Adxl345PortTypeport;
       int16_t incidence_X;
       int16_t incidence_Y;
       int16_t incidence_Z;
      
       float incidence_Xf;
       float incidence_Yf;
       float incidence_Zf;
      
       void(*ReadBytes)(struct Adxl345Object *adxl,uint8_t regAdd,uint8_t *rData,uint16_t rSize);  //讀ADXL345寄存器操作
       void(*WriteBytes)(struct Adxl345Object *adxl,uint8_t regAdd,uint8_t *wData,uint16_t wSize);//寫ADXL345寄存器操作
       void(*ChipSelect)(Adxl345CSType en);    //使用SPI接口時,片選操作
       void(*Delayus)(volatile uint32_t nTime);     /*實(shí)現(xiàn)us延時操作*/
}Adxl345ObjectType;

2.1.2 、對象初始化函數(shù)

一個對象必須賦初值方可使用,所以我們還需要一個初始化函數(shù)來對對象初始化。初始化函數(shù)除了為對象屬性賦初始值和給操作指定函數(shù)指針外,還需要檢測參數(shù)的合法性以及對硬件設(shè)備做必要的配置?;诖宋覀冊O(shè)計(jì)ADXL345的初始化函數(shù)如下:

/*對ADXL345進(jìn)行初始化配置*/
void Adxl345Initialization(Adxl345ObjectType*adxl,uint8_t devAdd,
                           Adxl345PortTypeport,
                           Adxl345ReadBytesTyperead,
                           Adxl345WriteBytesTypewrite,
                           Adxl345ChipSelectTypecs,
                           Adxl345DelayTypedelay)
{
       uint8_t devID=0;
       uint8_t setValue=0;
      
       if((adxl==NULL)||(read==NULL)||(write=NULL)||(delay==NULL))
       {
              return;
       }
      
       if(port==SPI)
       {
              if(cs==NULL)
              {
                     return;
              }
             
              adxl->ChipSelect=cs;
              adxl->devAddress=0x00;
       }
       else
       {
              if((devAdd==0xA6)||(devAdd==0x3A))
              {
                     adxl->devAddress=devAdd;
              }
              elseif((devAdd==0x53)||(devAdd==0x1D))
              {
                     adxl->devAddress=(devAdd<<1);
              }
              else
              {
                     adxl->devAddress=0x00;
              }
              adxl->ChipSelect=NULL;
       }
      
       adxl->port=port;
       adxl->devID=0xE5;
       adxl->incidence_X=0;
       adxl->incidence_Xf=0.0;
       adxl->incidence_Y=0;
       adxl->incidence_Yf=0.0;
       adxl->incidence_Z=0;
       adxl->incidence_Zf=0.0;
      
       adxl->ReadBytes=read;
       adxl->WriteBytes=write;
       adxl->Delayus=delay;
      
       /*讀取設(shè)備ID,在每次操作前讀一次*/
       devID=Adxl345ReadRegister(adxl,REG_DEVID);
       if(adxl->devID!=devID)
       {
              return;
       }
       adxl->Delayus(300);
 
       /*配置數(shù)據(jù)格式*/
       setValue = 0x2B;
       Adxl345WriteRegister(adxl,REG_DATA_FORMAT,setValue);
       adxl->Delayus(50);
   
       /*配置數(shù)據(jù)速率及功率模式*/
       setValue = 0x0A;
       Adxl345WriteRegister(adxl,REG_BW_RATE,setValue);
       adxl->Delayus(50);
   
       /*配置電源特性*/
       setValue = 0x28;
       Adxl345WriteRegister(adxl,REG_POWER_CTL,setValue);
       adxl->Delayus(50);
   
       /*配置中斷使能*/
       setValue = 0;
       Adxl345WriteRegister(adxl,REG_INT_ENABLE,setValue);
       adxl->Delayus(50);
 
       /*配置X軸偏移*/
       Adxl345WriteRegister(adxl,REG_OFSX,setValue);
       adxl->Delayus(50);
 
       /*配置Y軸偏移*/
       Adxl345WriteRegister(adxl,REG_OFSY,setValue);
       adxl->Delayus(50);
 
       /*配置Z軸偏移*/
       Adxl345WriteRegister(adxl,REG_OFSZ,setValue);
       adxl->Delayus(500);
}

2.2 、對象操作

我們定義一個對象的目的是操作這個對象,這也是驅(qū)動程序的主要內(nèi)容。接下來我們就來實(shí)現(xiàn)對ADXL345對象的操作函數(shù)。

2.2.1 、寫數(shù)據(jù)操作

對ADXL345對象的寫操作因?yàn)槭褂玫慕涌诓煌鋽?shù)據(jù)幀格式也會有不同。使用SPI接口時,其數(shù)據(jù)幀格式如下:

Dingtalk_20221206154648.jpg

而使用I2C接口時,可以同時寫多個寄存器,其數(shù)據(jù)幀格式如下:

Dingtalk_20221206154648.jpg

根據(jù)上述的數(shù)據(jù)幀格式和時序圖我們可以編寫寫ADXL345的寄存器函數(shù):

/* 寫ADXL345的寄存器 */
static voidAdxl345WriteRegister(Adxl345ObjectType *adxl,uint8_t regAdd,uint8_t wData)
{     
       if(adxl->port==SPI)
       {
              adxl->ChipSelect(ADXL345CS_Enable);
              adxl->Delayus(50);
              adxl->WriteBytes(adxl,regAdd,&wData,1);
              adxl->Delayus(50);
              adxl->ChipSelect(ADXL345CS_Disable);
       }
       else
       {
              adxl->WriteBytes(adxl,regAdd,&wData,1);
       }
}

2.2.2 、讀數(shù)據(jù)操作

對ADXL345對象的讀操作也同樣在使用不同的接口時擁有不同的數(shù)據(jù)幀結(jié)構(gòu)。使用SPI接口時,其數(shù)據(jù)幀格式如下:

Dingtalk_20221206154648.jpg

而在使用I2C接口時,可以實(shí)現(xiàn)一個或多個寄存器的讀操作,其數(shù)據(jù)幀格式如下:

Dingtalk_20221206154648.jpg

根據(jù)以上的數(shù)據(jù)幀格式和時序圖我們可以開發(fā)讀取ADXL345的寄存器操作函數(shù):

/* 讀取ADXL345的寄存器 */
static uint8_tAdxl345ReadRegister(Adxl345ObjectType *adxl,uint8_t regAdd)
{
       uint8_t regValue=0;
      
       if(adxl->port==SPI)
       {
              adxl->ChipSelect(ADXL345CS_Enable);
              adxl->Delayus(50);
              adxl->ReadBytes(adxl,regAdd,®Value,1);
              adxl->Delayus(50);
              adxl->ChipSelect(ADXL345CS_Disable);
       }
       else
       {
              adxl->ReadBytes(adxl,regAdd,®Value,1);
       }
      
       returnregValue;
}

2.2.3 、測量數(shù)據(jù)輸出

我們操作ADXL345對象的目的當(dāng)然是獲取我們想要的數(shù)據(jù)。最基本的,我們開發(fā)從ADXL345獲取3個坐標(biāo)數(shù)據(jù)。

/*讀取數(shù)據(jù)值,分辨率(3.9 mg/LSB)*/
voidGetValueFromAdxl345(Adxl345ObjectType *adxl)
{
 uint8_t devID = 0;
 uint8_t dataTemp[6];
 
 /*讀取設(shè)備ID,在每次操作前讀一次*/
 devID=Adxl345ReadRegister(adxl,REG_DEVID);
 if(adxl->devID!=devID)
 {
    return;
 }
 adxl->Delayus(200);
 
 /*讀取三軸數(shù)據(jù)值*/
 Adxl345ReadMultiReg(adxl,REG_DATAX0,dataTemp,6);
 
 /*數(shù)據(jù)解析*/
 adxl->incidence_X = (int16_t)(dataTemp[0] + ((uint16_t)dataTemp[1]<< 8));
 adxl->incidence_Y = (int16_t)(dataTemp[2] + ((uint16_t)dataTemp[3]<< 8));
 adxl->incidence_Z = (int16_t)(dataTemp[4] + ((uint16_t)dataTemp[5]<< 8));
      
 adxl->incidence_Xf = (float)(adxl->incidence_X * 0.0039);
 adxl->incidence_Yf = (float)(adxl->incidence_Y * 0.0039);
 adxl->incidence_Zf = (float)(adxl->incidence_Z * 0.0039);
}

3 、驅(qū)動的使用

完成了驅(qū)動的設(shè)計(jì)開發(fā),我們還要使用驅(qū)動實(shí)現(xiàn)ADXL345的應(yīng)用。與其它外設(shè)一樣,我們也按照實(shí)際項(xiàng)目的使用流程來驗(yàn)證之。

3.1 、聲明并初始化對象

首先我們使用前面定義的Adxl345ObjectType類型聲明一個ADXL345對象變量。如:Adxl345ObjectType adxl345;

聲明對象變量后還需要調(diào)用Adxl345Initialization初始化函數(shù)對ADXL345對象變量進(jìn)行初始化。當(dāng)然在調(diào)用初始化函數(shù)前需要考慮傳入的參數(shù)。特別是幾個函數(shù)指針需要實(shí)現(xiàn)響應(yīng)的函數(shù)。需要實(shí)現(xiàn)的函數(shù)類型如下:

typedef void(*Adxl345ReadBytesType)(struct Adxl345Object *adxl,uint8_t regAdd,uint8_t *rData,uint16_t rSize); //讀ADXL345寄存器操作

typedef void(*Adxl345WriteBytesType)(struct Adxl345Object *adxl,uint8_t regAdd,uint8_t *wData,uint16_t wSize);//寫ADXL345寄存器操作

typedef void(*Adxl345ChipSelectType)(Adxl345CSType en); //使用SPI接口時,片選操作

typedef void(*Adxl345DelayType)(volatile uint32_t nTime); / 實(shí)現(xiàn)us延時操作 /

定義這幾個函數(shù)后,就可以將器函數(shù)指針作為實(shí)參傳遞給初始化函數(shù)。調(diào)用如下:

Adxl345Initialization(&adxl345,devAdd,port,read,write,cs,delay);

其中adxl345為需要初始化的ADXL345對象。devAdd為使用I2C通訊時的設(shè)備地址,使用SPI時無用。port為通訊端口的類型,SPI或者I2C。read讀操作函數(shù)指針,是對硬件層的封裝。write為寫操作函數(shù)指針,是對硬件層的封裝。cs為使用SPI接口時,片選操作函數(shù)指針。delay為延時函數(shù)的指針。

3.2 、基于對象進(jìn)行操作

對象初始化完成后就可進(jìn)行相應(yīng)的操作。ADXL345的操作比較簡單就是調(diào)用GetValueFromAdxl345函數(shù)獲取我們需要的數(shù)據(jù)。具體的調(diào)用樣式如下:

GetValueFromAdxl345(&adxl345);

這個使用比較簡單,因?yàn)槲覀冊诔跏蓟瘯r將數(shù)據(jù)格式、數(shù)據(jù)速率及功率模式、電源特性、中斷使能、各軸的數(shù)據(jù)偏移量等都按我們的需要在初始化時作了配置。如果需要不同配置則需要做相應(yīng)的修改。

4 、應(yīng)用總結(jié)

在我們的應(yīng)用中,我們將其設(shè)置為全分辨率,±16g的測量范圍,讀取數(shù)據(jù)與預(yù)期一致。

使用I2C接口時,設(shè)備地址使用7位輸入或8位輸入都沒問題,地址一共有4種可能。其他的都為非法地址,在地址輸入不符合要求時,會被默認(rèn)初始化為廣播地址。

在使用SPI接口時,如果是通過軟件操作片選信號則需要實(shí)現(xiàn)操作函數(shù)并將函數(shù)指針傳遞給初始化函數(shù)。如果硬件上采取永久選中的形式則可將NULL作為參數(shù)傳入。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 加速度計(jì)
    +關(guān)注

    關(guān)注

    6

    文章

    702

    瀏覽量

    45897
  • 驅(qū)動設(shè)計(jì)

    關(guān)注

    1

    文章

    111

    瀏覽量

    15285
  • ADXL345
    +關(guān)注

    關(guān)注

    14

    文章

    71

    瀏覽量

    33910
收藏 人收藏

    評論

    相關(guān)推薦

    Accessory Shield學(xué)習(xí)6:加速度計(jì)ADXL345

    本章我們講一個具有運(yùn)動風(fēng)的技能——加速度計(jì),這貨能干啥?典型的就是測量加速度值、獲取當(dāng)前的空間姿態(tài)......原理大放送:主角ADXL345
    發(fā)表于 03-28 14:52

    ADXL354/355與ADXL345都是加速度計(jì),請問都可以測傾角嗎?

    我想請問一下ADXL354/355與ADXL345都是加速度計(jì),345可以測兩個傾角,想請問
    發(fā)表于 08-02 06:22

    ADXL345:3,±2g數(shù)字加速度計(jì)

    ADXL345是一款小而薄的超低功耗3加速度計(jì),分辨率高(13位),測量范圍達(dá)&#177; 16g。數(shù)字輸出數(shù)據(jù)為16位二進(jìn)制補(bǔ)碼格式,可通過SPI(3線或4線)或I2C
    發(fā)表于 11-27 16:58 ?210次下載
    <b class='flag-5'>ADXL345</b>:3<b class='flag-5'>軸</b>,±2g<b class='flag-5'>數(shù)字</b><b class='flag-5'>加速度計(jì)</b>

    ADXL345快速入門指南

    ADXL345加速度計(jì)。檢測如圖1所示。當(dāng)ADXL345沿檢測
    發(fā)表于 11-25 00:40 ?521次下載
    <b class='flag-5'>ADXL345</b>快速入門指南

    基于3加速度計(jì)ADXL345的跌倒檢測應(yīng)用

    基于3加速度計(jì)ADXL345的跌倒檢測應(yīng)用 ADXL345是ADI公司的
    發(fā)表于 11-28 15:20 ?359次下載
    基于3<b class='flag-5'>軸</b><b class='flag-5'>加速度計(jì)</b><b class='flag-5'>ADXL345</b>的跌倒檢測應(yīng)用

    利用精密模擬微控制器ADuC7024和數(shù)字加速度計(jì)ADXL345檢測低g加速度

    ADXL345是一款小巧纖薄的低功耗加速度計(jì),可以對高達(dá)16 g的加速度進(jìn)行高分辨率(13位)測量。
    發(fā)表于 02-01 15:52 ?127次下載
    利用精密模擬微控制器ADuC7024和<b class='flag-5'>數(shù)字</b><b class='flag-5'>加速度計(jì)</b><b class='flag-5'>ADXL345</b>檢測低g<b class='flag-5'>加速度</b>

    ADI公司MEMS加速度計(jì)ADXL345簡介與例程

    ADI公司MEMS加速度計(jì)ADXL345簡介與例程
    發(fā)表于 12-29 10:36 ?0次下載

    ADXL345 MEMS加速度計(jì)開發(fā)板的設(shè)置和使用方法

    ADXL345 MEMS加速度計(jì)開發(fā)板。由ADI公司的Nitzan Gadish說明如何設(shè)置和使用ADXL345開發(fā)板。該板能夠捕捉3在時間上的數(shù)據(jù),并以excel表格和圖形的方式顯
    的頭像 發(fā)表于 07-16 06:06 ?5008次閱讀

    GY-291 ADXL345數(shù)字重力加速度傾斜度模塊的資料合集免費(fèi)下載

    程序,ADXL345 AVR單片機(jī)通信程序),ADXL345數(shù)字加速度計(jì)中英文數(shù)據(jù)手冊,ADXL345數(shù)
    發(fā)表于 04-23 08:00 ?34次下載
    GY-291 <b class='flag-5'>ADXL345</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>三</b><b class='flag-5'>軸</b>重力<b class='flag-5'>加速度</b>傾斜度模塊的資料合集免費(fèi)下載

    ADXL345超低功耗3數(shù)字加速度計(jì)的中文數(shù)據(jù)手冊免費(fèi)下載

    ADXL345是一款小而薄的超低功耗3加速度計(jì),分辨率高(13位),測量范圍達(dá)± 16g。數(shù)字輸出數(shù)據(jù)為16位二進(jìn)制補(bǔ)碼格式,可通過SPI(3線或4線)或I2 C
    發(fā)表于 04-22 08:00 ?13次下載
    <b class='flag-5'>ADXL345</b>超低功耗3<b class='flag-5'>軸</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>加速度計(jì)</b>的中文數(shù)據(jù)手冊免費(fèi)下載

    ADXL345數(shù)字加速度計(jì)的數(shù)據(jù)手冊免費(fèi)下載

    ADXL345是一款小而薄的超低功耗3加速度計(jì),分辨率高(13位),測量范圍達(dá)± 16g。數(shù)字輸出數(shù)據(jù)為16位二進(jìn)制補(bǔ)碼格式,可通過SPI(3線或4線)或I2 C
    發(fā)表于 05-18 08:00 ?23次下載
    <b class='flag-5'>ADXL345</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>加速度計(jì)</b>的數(shù)據(jù)手冊免費(fèi)下載

    ADXL362輸入數(shù)字加速度計(jì)Linux驅(qū)動程序

    ADXL362輸入數(shù)字加速度計(jì)Linux驅(qū)動程序
    發(fā)表于 04-21 09:59 ?12次下載
    <b class='flag-5'>ADXL</b>362輸入<b class='flag-5'>三</b><b class='flag-5'>軸</b><b class='flag-5'>數(shù)字</b><b class='flag-5'>加速度計(jì)</b>Linux<b class='flag-5'>驅(qū)動</b>程序

    ADXL345加速度計(jì)與Arduino UNO連接的方法

    在這里,我們討論的是ADXL345 加速度計(jì),它用于測量 x、y 和 z 加速度速度變化。這些小型傳感器用于汽車和自行車以檢測事故以展
    的頭像 發(fā)表于 08-18 17:15 ?4928次閱讀
    將<b class='flag-5'>ADXL345</b><b class='flag-5'>加速度計(jì)</b>與Arduino UNO連接的方法

    ADXL345加速度計(jì)屏幕方向開源

    電子發(fā)燒友網(wǎng)站提供《ADXL345加速度計(jì)屏幕方向開源.zip》資料免費(fèi)下載
    發(fā)表于 11-01 11:38 ?0次下載
    <b class='flag-5'>ADXL345</b><b class='flag-5'>加速度計(jì)</b>屏幕方向開源

    ADXL345超低功耗3加速度計(jì)應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《ADXL345超低功耗3加速度計(jì)應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 10-20 16:57 ?3次下載
    <b class='flag-5'>ADXL345</b>超低功耗3<b class='flag-5'>軸</b><b class='flag-5'>加速度計(jì)</b>應(yīng)用