- 英文數據手冊
-
框圖
-
特性
- 提供兩個訪問接口 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時序,時間設置是否正確
- 下載官方源碼
- 編寫程序驗證
#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);
}
}