睡不着的诗人 发表于 2016-4-3 13:41:52

ADXL345 活动事件(Activity)中断设置

/*
函数描述:加速度值超过阈值,13引脚LED状态改变
板子:ArduinoUno
中断:中断0
*/

#include <Wire.h>
#define DEVICE_ID       0X53
#define OFSX            0X1E
#define OFSY            0X1F
#define OFSZ            0X20
#define DUR             0X21
#define THRESH_ACT      0X24
#define ACT_INACT_CTL   0X27
#define BW_RATE         0x2C
#define POWER_CTL       0X2D
#define INT_ENABLE      0X2E
#define INT_MAP         0X2F
#define INT_SOURCE      0X30
#define DATA_FORMAT   0x31
#define DATAX0          0X32
#define DATAX1          0X33
#define DATAY0          0X34
#define DATAY1          0X35
#define DATAZ0          0X36
#define DATAZ1          0X37
#define FIFO_CTL      0x38
#define LED   13
int reading = 0;
int val =0;
int X_out,Y_out,Z_out;
double Xg,Yg,Zg;
int state=0;
unsigned char buffer;
unsigned char data;
void setup(){
Serial.begin(9600);
pinMode(LED,OUTPUT);
digitalWrite(LED,LOW);
Wire.begin();//初始化I2C
delay(100);
Init_ADX();
INT_Config();
setOffset();
attachInterrupt(0,led_Change,CHANGE);//PIN_2
}
void loop(){
int Init=0;
digitalWrite(LED,state);
I2C_Read(DEVICE_ID,INT_SOURCE,1,data);
Init=(*data&0x10)>>4;
Serial.print("Init=");
Serial.println(Init);
Serial.println("");
}
voidI2C_Read(byte ADXAddress,byte Register, byte num, byte buffer[]){
   int i=0;
   Wire.beginTransmission(ADXAddress);
   Wire.write(Register);
   Wire.endTransmission();
   Wire.beginTransmission(ADXAddress);
   Wire.requestFrom(ADXAddress,num);
   while(Wire.available()){
   for(i;i<num+1;i++)
       buffer=Wire.read();
   }
Wire.endTransmission();
}
void I2C_Write(byte ADXAddress,byte Register,byte data){
Wire.beginTransmission(ADXAddress);
Wire.write(Register);
Wire.write(data);
Wire.endTransmission();
}
voidInit_ADX(){
I2C_Write(DEVICE_ID,POWER_CTL,0x08);//正常测量模式
I2C_Write(DEVICE_ID,BW_RATE,0x0A);// 100HZ
I2C_Write(DEVICE_ID,DATA_FORMAT,0X0B);//全分辨率,右对齐,范围16G
}
voidsetOffset() {//设定偏移量为0
I2C_Write(DEVICE_ID, OFSX, 0);
I2C_Write(DEVICE_ID, OFSY, 0);
I2C_Write(DEVICE_ID, OFSZ, 0);
}
void INT_Config(){
I2C_Write(DEVICE_ID,INT_ENABLE,0x00);// 中断清零
I2C_Write(DEVICE_ID,INT_ENABLE,0x93);//Activity中断使能
I2C_Write(DEVICE_ID,INT_MAP,0x10);//Activity中断映射到INT2
I2C_Write(DEVICE_ID,THRESH_ACT,0x10);//阈值设置
I2C_Write(DEVICE_ID,ACT_INACT_CTL,0xF0);//交流模式,X,Y,Z参与检测
}
void led_Change(){
state=!state;
}


//有错误请及时指正,谢谢(第一次发帖)
页: [1]
查看完整版本: ADXL345 活动事件(Activity)中断设置