STM32读写ADXL345 中断功能

首先感谢网上朋友们的分享,我也贴出自己的源码,开源互助!

1、配置:PC8和PC9外部中断,上升沿触发;

#define BW_RATE             0x2C      //数据速率和功率模式控制
#define POWER_CTL            0x2D        //省电功能控制
#define DATA_FORMAT        0x31        //数据格式控制
#define INT_ENABLE        0x2E    //中断使能控制
#define FIFO_CTL            0x38    //FIFO控制
#define THRESH_ACT        0x24        //活动阈值
#define THRESH_INACT    0x25        //静止阈值
#define TIME_INACT        0x26        //静止时间
#define ACT_INACT_CTL    0x27        //轴使能控制活动和静止检测
#define INT_MAP                0x2F        //中断引脚映射控制
#define OFSX                    0x1E        //X轴偏移
#define OFSY                    0x1F        //Y轴偏移
#define OFSZ                    0x20        //Z轴偏移

   

        //中断配置
    ADXL345_WriteByte(INT_ENABLE    ,    0x00);         delay345_ms(200);            //关闭中断
    ADXL345_WriteByte(DATA_FORMAT , 0x0B);        delay345_ms(200);            //测量范围:中断上升沿,正负±16 g , 右对齐 ,全分辨率模式13位分辨率  
    ADXL345_WriteByte(BW_RATE            , 0x1A);        delay345_ms(200);         //正常功率:低功耗操作,100Hz输出  ,频率 1hz
    ADXL345_WriteByte(POWER_CTL        , 0x18);      delay345_ms(200);            //测量模式 ,自动睡眠    
    
    ADXL345_WriteByte(OFSX                , 0x00);        delay345_ms(200);            //X轴偏移
    ADXL345_WriteByte(OFSY                , 0x00);        delay345_ms(200);            //Y轴偏移
    ADXL345_WriteByte(OFSZ                , 0x00);        delay345_ms(200);            //Z轴偏移
    
    ADXL345_WriteByte(THRESH_ACT,0x20);              delay345_ms(200);            //活动阈值,激活睡眠activity阈值,大于时触发中断,2 - 2g         (不能设置为零)
    ADXL345_WriteByte(THRESH_INACT,0x0F);          delay345_ms(200);            //静止阈值,睡眠开始阈值,最小值,09 - 0.9g                                    (不能设置为零)
    ADXL345_WriteByte(TIME_INACT,0x0F);              delay345_ms(200);            //静止时间,小于THRESH_INACT值宣布静止,进入睡眠,02 - 2秒    (不能设置为零)
    ADXL345_WriteByte(ACT_INACT_CTL,0xFF);      delay345_ms(200);            //直流交流触发配置,XYZ使能触发配置,此处选XYZ交流
    ADXL345_WriteByte(INT_MAP,0x00);                  delay345_ms(200);            //中断引脚映射控制,打开活动中断引脚到 INT1 引脚上
//    ADXL345_WriteByte(INT_MAP,0x10);                  delay345_ms(200);            //中断引脚映射控制,打开活动中断引脚到 INT2 引脚上
    
    ADXL345_WriteByte(INT_ENABLE,0x10);             delay345_ms(200);            //开活动 中断    

//**************中断回调函数读取数据********

    uint8_t re_value =0;
    uint8_t re_value =0;
    
    if(HAL_GPIO_ReadPin(ADXL345_INT1_GPIO_Port, ADXL345_INT1_Pin) == GPIO_PIN_SET)
    {        
        re_value = ADXL345_ReadByte(0x30);    //最好在 读取数据函数后,在读一次0x30,否则ADXL345不会产生中断
        printf("\n ADXL345 1: %x \n",re_value);
    }

三、经过测试ADXL345读取时间过快会出现错误,不过增加读取时间可以避免此问题,应该是配置问题,如有解决的大神希望留言,谢谢!

四、普通连续读取模式:

//普通配置
ADXL345_WriteByte(DATA_FORMAT , 0x2B);        delay345_ms(200);            //测量范围:正负±16 g , 右对齐 ,全分辨率模式13位分辨率  
ADXL345_WriteByte(BW_RATE            , 0x0A);        delay345_ms(200);         //正常功率 50Hz输出  带宽25Hz    
ADXL345_WriteByte(POWER_CTL        , 0x08);      delay345_ms(200);            //测量模式 ,不会自动睡眠    
ADXL345_WriteByte(INT_ENABLE    ,    0x00);         delay345_ms(200);            //关闭中断

ADXL345_WriteByte(OFSX                , 0x00);        delay345_ms(200);            //X轴偏移
ADXL345_WriteByte(OFSY                , 0x00);        delay345_ms(200);            //Y轴偏移
ADXL345_WriteByte(OFSZ                , 0x00);        delay345_ms(200);            //Z轴偏移

发布了30 篇原创文章 · 获赞 12 · 访问量 6131

猜你喜欢

转载自blog.csdn.net/qq_39758638/article/details/103615118