单片机GD32F303RCT6 (Macos环境)开发 (三十五)—— 数字加速度计 (ADXL345 ) 使能中断获取运动与静止状态

news2024/11/28 0:34:04

数字加速度计 (ADXL345)- 使能中断获取运动与静止状态

1、几个与运动、静止检测相关的寄存器

a、寄存器 0x24—THRESH_ACT(读/写)

THRESH_ACT寄存器为8位寄存器,保存检测活动的阈 值。数据格式无符号,因此,活动事件的幅度与 THRESH_ACT寄存器的值进行比较。比例因子为62.5 mg/LSB。如果使能活动中断,值为0时,可能导致工作 异常。

代码设置为:

adxl345_action_threshold_convert_to_register(2.0f,(uint8_t *)&reg);
adxl345_set_action_threshold(reg);  

b、寄存器 0x25—THRESH_INACT(读/写)

THRESH_INACT寄存器为8位寄存器,保存检测静止的 阈值。数据格式无符号,因此,静止事件的幅度与 THRESH_ INACT寄存器的值进行比较。比例因子为62.5 mg/LSB。如果使能静止中断,值为0时,可能导致工作 异常。
代码设置为:

adxl345_inaction_threshold_convert_to_register(1.0f, (uint8_t *)&reg);
/* set inaction threshold */
adxl345_set_inaction_threshold( reg); 

c、寄存器 0x26—TIME_INACT(读/写)

TIME_INACT寄存器为8位寄存器,包含未签名时间值, 表示加速度的时间量必须小于THRESH_INACT寄存器的 值,以宣布静止。比例因子为1 sec /LSB。有别于其他使 用未滤波数据(见阈值部分)的中断功能,该静止功能采 用滤波输出数据。为要触发的静止中断,必须生成至少 一个输出样本。如果TIME_INACT寄存器设置值小于输 出数据速率的时间常数,将导致功能反应迟钝。当输出 数据小于THRESH_INACT寄存器的值,值为0导致中 断。

/* set 3 s ,如果3s不动,就回产生静止中断 */
adxl345_inaction_time_convert_to_register(3, (uint8_t *)&reg); 
/* set inaction time */
adxl345_set_inaction_time(reg);                                                                                                                          

d、寄存器 0x27—ACT_INACT_CTL(读/写)

在这里插入图片描述

ACT交流/直流位与INACT交流/直流位 设置为0时,选择直流耦合操作,设置为1时,使能交流 耦合操作。在直流耦合工作模式下,将当前加速度值直 接与THRESH_ACT和THRESH_INACT进行比较,以确 定检测到的是活动还是静止。
在活动检测的交流耦合工作模式下,活动检测开始时的 加速度值为参考值。在此基础上,将新的加速度采样与 该参考值进行比较,如果差值大小超过THRESH_ACT 值,则器件会触发活动中断。
同样,在静止检测的交流耦合工作模式下,用参考值进 行比较,并在器件超过静止阈值时更新该参考值。选择 参考值之后,器件将参考值与当前加速度的差值与 THRESH_INACT进行比较。如果差值低于 THRESH_INACT的TIME_INACT的值,则认为器件处于 静止状态,并触发静止中断。

ACT_x使能位和INACT_x使能位 设置为1时,使能x、y或z轴参与检测活动或静止。设置为0 时,从参与项排除选定轴。如果所有轴都被排除,该功能 禁用。活动检测时,所有参与轴为逻辑“或”,当任意参与 轴超过阈值时,活动功能触发。静止检测时,所有参与轴 为逻辑“和”,只有当在特定时间所有参与轴低于阈值时, 静止功能触发。
代码:

/* set action x */
adxl345_set_action_inaction(ADXL345_ACTION_X, ADXL345_BOOL_TRUE);

    /* set action y */
    adxl345_set_action_inaction(ADXL345_ACTION_Y, ADXL345_BOOL_TRUE);

    /* set action z */
    adxl345_set_action_inaction(ADXL345_ACTION_Z, ADXL345_BOOL_TRUE);

    /* set inaction x */
    adxl345_set_action_inaction(ADXL345_INACTION_X, ADXL345_BOOL_TRUE);

    /* set inaction y */
    adxl345_set_action_inaction(ADXL345_INACTION_Y, ADXL345_BOOL_TRUE);
    
    /* set inaction z */
    adxl345_set_action_inaction(ADXL345_INACTION_Z, ADXL345_BOOL_TRUE);

    /* set action ac coupled */
    adxl345_set_action_coupled(ADXL345_COUPLED_AC);

    /* set inaction dc coupled */
    adxl345_set_inaction_coupled(ADXL345_COUPLED_DC);

e、中断映射跟中断使能

在这里插入图片描述

这里我们只检测运动与静止状态,所以只使能对应的寄存器即可。

代码:

    /* map int 1 */
    adxl345_set_interrupt_map(ADXL345_INTERRUPT_ACTIVITY, ADXL345_INTERRUPT_PIN1);
    /* set activity */
    adxl345_set_interrupt(ADXL345_INTERRUPT_ACTIVITY, ADXL345_BOOL_TRUE);
    delay_1ms(200);  
    /* map int 1 */
    adxl345_set_interrupt_map(ADXL345_INTERRUPT_INACTIVITY, ADXL345_INTERRUPT_PIN1);
    /* set inactivity */
    adxl345_set_interrupt(ADXL345_INTERRUPT_INACTIVITY, ADXL345_BOOL_TRUE);
    printf("Adxl345 init Success\r\n");

2、gd32 Gpio中断配置

		PB1         连接     Int1
代码:
static void init_gpio_pb1_exit_irq(void)
{
    //配置PB1外部中断
	rcu_periph_clock_enable(RCU_GPIOB);//GPIOB时钟使能
    gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_1);//PB1配置成上拉输入
	nvic_irq_enable(EXTI1_IRQn, 2U, 1U);//enable and set key EXTI interrupt to the lowest priority 
    gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_1);//connect key EXTI line to key GPIO pin
	exti_init(EXTI_1, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断
	exti_interrupt_flag_clear(EXTI_1);//清中断标志
}

中断处理函数:

void EXTI1_IRQHandler(void)
{
    exti_interrupt_flag_clear(EXTI_1);
    
#if ENABLE_KEY_INPUT_TEST == 1    
    delay_1ms(20);
    if (gpio_input_bit_get(GPIOA,GPIO_PIN_1) == RESET)
    {
        printf("User Key Press and Enter Standy Mode!\r\n");
        pmu_to_standbymode();//进入待机模式
    }
#endif  //#if ENABLE_KEY_INPUT_TEST == 1

    if (gpio_input_bit_get(GPIOB,GPIO_PIN_1) == RESET)
    {
        hander_message();
    }
}

中断产生后,我们还要去读一下寄存器0x30—INT_SOURCE(只读),来判断中断是运动产生还是静止产生的。

void hander_message(void)
{
    int value = 0;
    adxl345_read_reg(ADXL345_REG_INT_SOURCE,&value);
   
    if (value & 0x10)
    {
        printf("Adxl345 is Active\r\n");
    }
    else if (value & 0x08)
    {
        printf("Adxl345 is InActive\r\n");
    }
}

3、整个axdl345的初始化代码

/**
 * 运动静止事件的初始化
*/
void adxl345_active_init()
{
    uint8_t id = 0;
    uint8_t reg;

    adxl345_get_device_id(&id);
    if (id == 0xe5)
    {
        adxl345_set_full_resolution(ADXL345_BOOL_TRUE); 
        delay_1ms(100);  // 延时必须,不然有时候数据写不进去。
        adxl345_set_range(ADXL345_RANGE_16G);
        delay_1ms(100); 
        adxl345_set_justify(ADXL345_BOOL_FALSE); 
        delay_1ms(100);  
        adxl345_set_interrupt_active_level(ADXL345_INTERRUPT_ACTIVE_LEVEL_LOW);
        delay_1ms(100); 
 
        adxl345_set_rate(ADXL345_RATE_100);
        delay_1ms(100);

        adxl345_set_measure(ADXL345_BOOL_TRUE);
        delay_1ms(100);
        adxl345_set_auto_sleep(ADXL345_BOOL_FALSE);
        delay_1ms(100);                               // 设置自动休眠为关
        adxl345_set_sleep(ADXL345_BOOL_FALSE); 
        delay_1ms(100);        
        adxl345_set_sleep_frequency(ADXL345_SLEEP_FREQUENCY_1HZ);
        delay_1ms(100);
        adxl345_set_link_activity_inactivity(ADXL345_BOOL_FALSE); 
        delay_1ms(100);

        //set x y z offset
        adxl345_offset_convert_to_register(0.0f,&reg);
        adxl345_set_offset(reg,reg,reg);
        delay_1ms(100);
        /* set tap */
        adxl345_tap_threshold_convert_to_register(2.0f, (uint8_t *)&reg);
        adxl345_set_tap_threshold(reg);
        
        /* set duration time */
        adxl345_duration_convert_to_register(10*1000, (uint8_t *)&reg);
        adxl345_set_duration(reg);
    
        /* set latent time */
        adxl345_latent_convert_to_register(20.0f, (uint8_t *)&reg);
        adxl345_set_latent(reg);

        /* set window */
        adxl345_window_convert_to_register(80.0f, (uint8_t *)&reg);
        adxl345_set_window(reg);

        /* set tap x */
        adxl345_set_tap_axis(ADXL345_TAP_AXIS_X, ADXL345_BOOL_TRUE);
        adxl345_set_tap_axis(ADXL345_TAP_AXIS_Y, ADXL345_BOOL_TRUE);
        adxl345_set_tap_axis(ADXL345_TAP_AXIS_Z, ADXL345_BOOL_TRUE);
        
        adxl345_action_threshold_convert_to_register(2.0f,(uint8_t *)&reg);
        adxl345_set_action_threshold(reg);  

        adxl345_inaction_threshold_convert_to_register(1.0f, (uint8_t *)&reg);
        /* set inaction threshold */
        adxl345_set_inaction_threshold( reg);           

        /* set 3 s */
        adxl345_inaction_time_convert_to_register(3, (uint8_t *)&reg); 
        /* set inaction time */
        adxl345_set_inaction_time(reg);

        /* set action x */
        adxl345_set_action_inaction(ADXL345_ACTION_X, ADXL345_BOOL_TRUE);
 
        /* set action y */
        adxl345_set_action_inaction(ADXL345_ACTION_Y, ADXL345_BOOL_TRUE);

        /* set action z */
        adxl345_set_action_inaction(ADXL345_ACTION_Z, ADXL345_BOOL_TRUE);
 
        /* set inaction x */
        adxl345_set_action_inaction(ADXL345_INACTION_X, ADXL345_BOOL_TRUE);

        /* set inaction y */
        adxl345_set_action_inaction(ADXL345_INACTION_Y, ADXL345_BOOL_TRUE);
        
        /* set inaction z */
        adxl345_set_action_inaction(ADXL345_INACTION_Z, ADXL345_BOOL_TRUE);
  
        /* set action ac coupled */
        adxl345_set_action_coupled(ADXL345_COUPLED_AC);
    
        /* set inaction dc coupled */
        adxl345_set_inaction_coupled(ADXL345_COUPLED_DC);

        /* map int 1 */
        adxl345_set_interrupt_map(ADXL345_INTERRUPT_ACTIVITY, ADXL345_INTERRUPT_PIN1);
        /* set activity */
        adxl345_set_interrupt(ADXL345_INTERRUPT_ACTIVITY, ADXL345_BOOL_TRUE);
        delay_1ms(200);  
        /* map int 1 */
        adxl345_set_interrupt_map(ADXL345_INTERRUPT_INACTIVITY, ADXL345_INTERRUPT_PIN1);
        /* set inactivity */
        adxl345_set_interrupt(ADXL345_INTERRUPT_INACTIVITY, ADXL345_BOOL_TRUE);
        printf("Adxl345 init Success\r\n");
        init_gpio_pb1_exit_irq();

        while(1)
        {

        }

    }  
}

4、现象

在这里插入图片描述

5、代码:

代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/607700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始 Spring Boot 35:Lombok

从零开始 Spring Boot 35:Lombok 图源:简书 (jianshu.com) Lombok是一个java项目,旨在帮助开发者减少一些“模板代码”。其具体方式是在Java代码生成字节码(class文件)时,根据你添加的相关Lombok注解或类来…

冈萨雷斯DIP第9章知识点

文章目录 9.1 预备知识9.2 腐蚀和膨胀9.3 开运算与闭运算9.5 一些基本的形态学算法9.8 灰度级形态学 9.1 预备知识 形态学运算是用 集合 来定义的 。 在图像处理中 使用两类像素集合的形态学:目标元素 和 结构元 SE 。 通常目标定义为前景像素集合,结构…

计算机基础--->操作系统(2)【线程和进程、死锁】

文章目录 线程和进程线程和进程的区别?有了进程为什么还需要线程?为什么使用多线程?线程间的同步方式进程控制块(PCB)进程有哪几种状态?进程间的通讯方式有哪些?进程常见的调度算法有哪些&#…

冈萨雷斯DIP第2章知识点

文章目录 2.1 视觉感知要素2.2 光和电磁波谱2.3 图像感知与获取2.4 图像取样和量化2.4.1 取样和量化的基本概念2.4.2 数字图像表示2.4.4 空间分辨率和灰度分辨率2.4.5 图像内插 (image interpolation)2.5 像素间的一些基本关系 2.6 数字图像处理所用的基本数学工具介绍2.6.3 算…

基础查询 — 投影、选择

准备 数据查询操作均采用的是MySQL。示例数据库采用的是northwind 示例数据库。数据库导入手册 关于northwind 示例数据库 查询数据库中的表 show tables;查询表的表属性 desc xxx(表名);投影操作 1.语法 投影运算:选择表中的全部或者部分列。 语法 select 字段…

Jeston Orin Nano 离线烧写系统到NVME存储

大家好,我是虎哥,Jeston Orin nano 8G模块,我自己也玩了一段时间,在Orin 系列,官方提供了一种新的烧写方式,也就是离线烧写,就是你在主机,挂载存储后,直接烧写系统到这个…

Maven高级——继承与聚合——聚合实现

为什么要聚合 分模块开发之后一个项目会被拆分成多个模块。多个模块之间还会有依赖关系。 在一些大型项目中模块比较多,模块之间的依赖关系也会变得错综复杂。 并且在打包的时候还会有一个新的问题,在打包的时候我们要打包的是Springboot项目&#xf…

黑马Redis视频教程高级篇(一)

目录 分布式缓存 一、Redis持久化 1.1、RDB持久化 1.1.1、执行时机 1.1.2、RDB原理 1.1.3、小结 1.2、OF持久化 1.2.1、AOF原理 1.2.2、OF配置 1.2.3、AOF文件重写 1.3、RDB与AOF对比 二、Redis主从 2.1、搭建主从架构 2.1.1、集群结构 2.1.2、准备实例和配置 …

CBCGPRibbonBar 设置整个界面字体大小

在CMainFrame.h中添加成员变量:CFont m_fontCustom; 在onCreat()方法结束之前的任一个位置写下下测方法即可 方法1: { // Create custom font: LOGFONT lf; globalData.fontRegular.GetLogFont(&lf); lf.lfItalic TRUE; …

详解Spring Cloud版本问题

目录 1.让人头疼的多版本号体系 2.目录关系 3.为什么会有多个版本号体系 1.让人头疼的多版本号体系 由于历史原因,spring cloud分为了Alibaba和Netflix两个体系。 想要了解原因以及整个spring cloud体系的来龙去脉的同学可以去看我的另一篇文章: S…

MySQL脏读、不可重复读、幻读的区别与注意事项

目录 一、引入二、事务并发执行会遇到的问题1. 区别2. 注意 三、隔离级别四、参考资料 一、引入 MySQL的架构是 C/S 架构(即 客户端/服务器 架构),一个服务器可能有多个客户端与之相连接,每个连接称之为会话(Session&…

chatgpt赋能python:Python去掉分隔符:优化SEO效果的一种方法

Python去掉分隔符:优化SEO效果的一种方法 在现代的数字化时代,SEO已经成为了许多企业、个人和网站运营者最为关心的问题之一。SEO指的是搜索引擎优化,通过各种技术手段和优化方式,提高网站在搜索引擎结果页面上显示的排名。Pytho…

PageHelper使用

PageHelper &#xff1a; mybatis中的分页插件 文档 &#xff1a; https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md springboot使用PageHelper <dependency><groupId>com.github.pagehelper</groupId><artifactId…

利用DocsGPT快速搭建一个问答式的文档检索服务

docsGPT 示例 基于企业内部独有的知识库&#xff0c;进行智能的客服问答&#xff0c;毫无疑问是 ChatGPT 出圈以后&#xff0c;所有公司想要融入 ChatGPT 技术时的第一反应。可惜 ChatGPT 实际上是一个基于大语言模型实现的&#xff0c;包括很多其他功能的&#xff0c;完整的聊…

电力电子技术的论文

电力电子技术的论文范文一&#xff1a;Matlab电力电子技术应用 【文章摘要】信息技术的快速发展推动许多学科进一步完善&#xff0c;以电力电子技术为例&#xff0c;其本身具有较强的理论性、实践性等特征&#xff0c;涉及的波形图、电路图也较多&#xff0c;相关设计人员需掌握…

Hitcon 2016 SleepyHolder-fastbin_dup_consolidate.c

参考/题目下载&#xff1a; https://github.com/mehQQ/public_writeup/tree/master/hitcon2016/SleepyHolder https://blog.csdn.net/seaaseesa/article/details/105856878 1&#xff0c;三联 保护:基本都开了 功能&#xff1a; 0、唤醒功能&#xff1b; 1、创建-secret&#…

华为OD机试真题 Java 实现【猴子爬山】【2023 B卷 100分】,附详细解题思路

一、题目描述 一天一只顽猴想去从山脚爬到山顶&#xff0c;途中经过一个有个N个台阶的阶梯&#xff0c;但是这猴子有一个习惯&#xff1a; 每一次只能跳1步或跳3步&#xff0c;试问猴子通过这个阶梯有多少种不同的跳跃方式&#xff1f; 二、输入描述 输入只有一个整数N&…

Custom Frames插件:内置Web应用 | Obsidian实践

今天跟大家分享一个Obsidian插件&#xff1a;Custom Frames。 这个插件的美妙之处在于&#xff0c;可以将一个Obsidian外部的Web应用&#xff0c;内置到Obsidian内部来操作和使用。 这么说可能是有点儿抽象&#xff0c;就比方说吧&#xff0c;微信读书有个网页版&#xff08;后…

嵌入式开发——文件系统部署rz、sz命令

1、rz、sz命令源码下载 下载网址&#xff1a;https://ohse.de/uwe/software/lrzsz.html 2、源码编译 tar -zxvf lrzsz-0.12.20.tar.gz cd lrzsz-0.12.20 ./configure make CCaarch64-mix410-linux-gcc #指定芯片平台的交叉编译链3、源码编译遇到的问题 3.1、报错打印 (1)报错…

绝地求生可以这样制作 (Python 版)

一、概述 1.1 效果 总的来说&#xff0c;这种方式是通过图像识别来完成的&#xff0c;不侵入游戏&#xff0c;不读取内存&#xff0c;安全不被检测。 1.2 前置知识 游戏中有各种不同的枪械&#xff0c;不同的枪械后坐力不一样&#xff0c;射速也不同。相同的枪械&#xff0c;…