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

news/2024/11/27 0:49:01/

数字加速度计 (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 pinexti_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 == 1if (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 offsetadxl345_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.ppmy.cn/news/204609.html

相关文章

台式计算机i7处理器,【Intel 酷睿i7 6代台式机参数】Intel 酷睿i7 6代台式机系列CPU参数-ZOL中关村在线...

显卡其它特性eDRAM:128MB 显卡视频最大内存:64GB 图形输出:eDP/DP/HDMI/DVI 4K支持:60Hz 最大分辨率(英特尔无线显示技术):1080p 最大分辨率(HDMI 1.4):4096x230424Hz 最大分辨率(DP):4096x2304…

台式计算机i7,I7台式计算机硬件配置

多知友需要DIY台式机,更需要台式计算机硬件配置。撰编了2014年DIY台式计算机硬件配置:Intel/英特尔系列配置和AMD系列配置,供需要DIY台式计算机的朋友们参考。下面是学习啦小编收集整理的I7台式计算机硬件配置,希望对大家有帮助~~…

i7 12800hx参数 i7 12800hx功耗 酷睿i712800hx什么水平

1、该芯片拥有16核24线程,基础的频率达到了2.5ghz,加速频率为4.888ghz,数据还是不错的。 2、跑分也不错,相比较于台式机拥有更加不俗的提升,排分也更高,性能也将会更加的优秀。 3、支持全核心的超频以及30m…

酷睿i7 10510u参数 i710510u相当于台式机什么水平 i710510u玩游戏怎么样

i710510u处理器属于什么档次 i7 8565u排名为第474 i7 10510u排名为第422故i7 10510u好 i710510u怎么样这些点很重要 http://www.adiannao.cn/dy 一、INTEL处理器,I系列CPU后面带U的,低压CPU,一般用在笔记本电脑上。比一般的I系列处理器要慢很…

i7 10510U性能怎么样?相当于台式机什么水平

i7-10510U是中高端笔记本电脑处理器,通常在主流笔记本电脑中使用。 四核i7-10510U是第十代英特尔酷睿U系列的顶级型号,高于流行的中高端四核i5-10210U和中端双核英特尔酷睿i3-10110U。 i7 10510U性能怎么样这些点很重要看过你就懂了 http://www.adiannao…

大数据:spark RDD编程,构建,RDD算子,map,flatmap,reduceByKey,mapValues,groupBy,

大数据:spark RDD编程 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其s…

在任务与执行策略之间的隐性耦合

我们已经知道, Executor 框架可以将任务的提交与任务的执行策略解耦开来。就像许多对复杂过程的解耦操作那样,这种论断多少有些言过其实了。虽然Executor 框架为制定和修改执行策略都提供了相当大的灵活性,但并非所有的任务都能适用所有的执行…

2023年全球项目管理系统排行榜:推荐15家值得关注的项目管理系统

在当今世界,管理项目已经成为许多企业不可分割的一部分。因此,拥有正确的项目管理系统对于确保任何业务的成功都是至关重要的。随着技术的不断发展,好用的项目管理系统也在不断发展,以满足现代工作场所日益增长的需求。到2023年&a…