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);
				
     }

}

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIOT技术栈

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值