ADXL372應用筆記

  1. 英文數據手冊
  • 框圖
    在這裏插入圖片描述

  • 特性

    • 提供兩個訪問接口 SPI和IIC
    • 三種操作模式:
模 式 功能
Measurement Mode 默認工作模式,連續測量,寬帶寬感應
Instant On Mode 以極低的功耗實現瞬時衝擊檢測,在這個模式下,加速度計以極小的電流消耗持續檢測環境,一旦有超過閾值的事件被檢測到,立即切換到測量模式來記錄這個事件。默認閾值是10-15g,可以通過寄存器提高到30-40g。爲了節省功耗,在切換到正常模式之前,不輸出新的加速度數值,但所有寄存器能夠進行正常讀寫
Wake-Up Mode 喚醒模式用於有限帶寬低g活動檢測,喚醒模式非常適合簡單檢測是否存在或在極低的功耗下沒有運動。喚醒模式對於實現低g動作開關切換非常有用,允許關閉系統的其餘部分,直到檢測到持續活動
standby mode 可以通過將設備置於待機模式來暫停測量。
  • BANDWIDTH:
    是指低通濾波器的帶寬,濾波器帶寬可由用戶選擇,默認帶寬爲200 Hz。最大帶寬限制爲ODR的一半,以確保不違反奈奎斯特標準。

  • Low-Pass Antialiasing Filter:
    四級低通濾波器可以減少測量誤差

  • ODR
    在這裏插入圖片描述

  • 串行通信訪問接口
    在這裏插入圖片描述

  • 寄存器

  • bw ODR的一半

  • spi時序,時間設置是否正確

  1. 下載官方源碼
  2. 編寫程序驗證
#include "stm32f10x.h"
#include <stdlib.h>
#include "adxl372.h"
#include <math.h>
#include "string.h"
#include "./flash/bsp_spi_flash.h"


/**************************賂眉賂脛*************************/
float a_2,b_2,c_2;
float a2,b2,c2;
u8 ADXL372_read_byte(u16 add_1)
{
	  u8 Temp = 0;
		SPI_FLASH_CS_LOW();
	  Delay(1);
		SPI_FLASH_SendByte((add_1 << 1)|0x01);

		Temp = SPI_FLASH_SendByte(Dummy_Byte);
		Delay(1);
		SPI_FLASH_CS_HIGH();
		Delay(10);
		return Temp;
}

void ADXL372_write_byte(u16 add, u16 val)
{
	
		SPI_FLASH_CS_LOW();
		SPI_FLASH_SendByte(add << 1);
		SPI_FLASH_SendByte(val);
		SPI_FLASH_CS_HIGH();
}


u8 ADXL372_read_mulbytes(u16 add_1,u8 *revdata)
{
	  u8 Temp = 0,i;
		SPI_FLASH_CS_LOW();
	  Delay(1);
		SPI_FLASH_SendByte((add_1 << 1)|0x01);

	  for(i = 0; i<6;i++)
		{
			*revdata++ = SPI_FLASH_SendByte(Dummy_Byte);
			Delay(5);
		}
	
	
		Delay(1);
		SPI_FLASH_CS_HIGH();
		Delay(10);
		return Temp;
}


void ADXL372_RD_MULBYTES_XYZ(void)
{
	

    u8 BUF[6];
    short tx2,ty2,tz2;
    ADXL372_read_mulbytes(XL372_XDATA_H,BUF);
	
    tx2 = (BUF[0] << 8 | BUF[1] ) ;
    ty2 = (BUF[2] << 8 | BUF[3] ) ;
    tz2 = (BUF[4] << 8 | BUF[5] ) ;

    tx2 = tx2>>4;
    ty2 = ty2>>4;
    tz2 = tz2>>4;

//    tx2 = ((BUF[1] << 4 | BUF[0]>>4 )) ;
//    ty2 = ((BUF[3] << 4 | BUF[2]>>4 )) ;
//    tz2 = ((BUF[5] << 4 | BUF[4]>>4 )) ;

    a2 = (float)tx2 * 97.65625;
    b2 = (float)ty2 * 97.65625;
    c2 = (float)tz2 * 97.65625;

    a2/= 1000;
    b2/= 1000;
    c2/= 1000;
}



void ADXL372_RD_XYZ(void)
{
	

    u8 BUF[6];
    short tx2,ty2,tz2;
    BUF[0] = ADXL372_read_byte(XL372_XDATA_L);
	  
    BUF[1] = ADXL372_read_byte(XL372_XDATA_H);

    BUF[2] = ADXL372_read_byte(XL372_YDATA_L);
    BUF[3] = ADXL372_read_byte(XL372_YDATA_H);
    BUF[4] = ADXL372_read_byte(XL372_ZDATA_L);
    BUF[5] = ADXL372_read_byte(XL372_ZDATA_H);
	
    tx2 = (BUF[1] << 8 | BUF[0] ) ;
    ty2 = (BUF[3] << 8 | BUF[2] ) ;
    tz2 = (BUF[5] << 8 | BUF[4] ) ;

    tx2 = tx2>>4;
    ty2 = ty2>>4;
    tz2 = tz2>>4;

//    tx2 = ((BUF[1] << 4 | BUF[0]>>4 )) ;
//    ty2 = ((BUF[3] << 4 | BUF[2]>>4 )) ;
//    tz2 = ((BUF[5] << 4 | BUF[4]>>4 )) ;

    a2 = (float)tx2 * 97.65625;
    b2 = (float)ty2 * 97.65625;
    c2 = (float)tz2 * 97.65625;

    a2/= 1000;
    b2/= 1000;
    c2/= 1000;
}

extern float a_2,b_2,c_2;
#define ADXL345_AVER_TIME 10
void ADXL372_Read_Average(void)
{
    u8 h;
    a_2 = 0;
    b_2 = 0;
    c_2 = 0;
    for(h=0;h<ADXL372_AVER_TIME;h++)//連續讀取times次
        {
            ADXL372_RD_XYZ();
            a_2+= a2;
            b_2+= b2;
            c_2+= c2;
        }
    a_2 /=ADXL345_AVER_TIME;
    b_2 /=ADXL345_AVER_TIME;
    c_2 /=ADXL345_AVER_TIME;
}


void ADXL372_Init(void)
{
    u8 ret=0;
	  int n=5,m1=0,m2,m3,m4;
	
    while(ret!=0XFA)
		{
			ret = ADXL372_read_byte(XL372_PARTID);
			printf("id --------- %x\r\n",ret);
		}

    
     while(n--)
     {
       // m = 0;
        ADXL372_write_byte(XL372_MEASURE,   0X8B);
        ADXL372_write_byte(XL372_TIMING,    0x60);
        ADXL372_write_byte(XL372_POWER_CTL, 0x0F);
        ADXL372_write_byte(XL372_FIFO_CTL,  0x00);
			 
				
        if(n == 0)break;


        ADXL372_write_byte(0x40,  0x01);


        do {
            ret = ADXL372_read_byte(0x40);
        }
        while((ret&(3<<1)) != 0x06);


        m1 = ADXL372_read_byte(XL372_MEASURE);
        m2 = ADXL372_read_byte(XL372_TIMING);
        m3 = ADXL372_read_byte(XL372_POWER_CTL);
        m4 = ADXL372_read_byte(XL372_FIFO_CTL);
				printf("%x %x %x %x\r\n",m1,m2,m3,m4);
				
     }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章