- 英文数据手册
-
框图
-
特性
- 提供两个访问接口 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);
}
}