MM32F3273G8P火龙果开发板MindSDK开发教程13 - 获取msa311加速器的运动事件

news2025/2/6 17:14:35

MM32F3273G8P火龙果开发板MindSDK开发教程13 - 获取msa311加速器的运动事件

1、功能描述

msa311在运动时候,会产生一个中断,此时我们读一下09寄存器的02位,如果为1,那么我们可以断定msa311处在运动状态,但是当msa311处于静止的时候,却没有中断产生。而adxl345在静止的时候,也会在设定时间之内,产生中断,从来更好的判断运动与静止状态。

2、设置活动检测参数

相关寄存器
在这里插入图片描述
active_th 活动检测的阈值,超过这个阈值就会产生中断。
注意这里比例因子随着range的范围变化而变化。
假如2G Range ,1g对应FF,即1/0.00391 = 0xFF。
active_dur 超过阈值持续时间,必须超过active+1ms才会产生中断。

设置寄存器代码:

static bool Msa311_SetActiveDurationParam(msa311_active_duration_t activeDuration)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

	bRet = Msa311_ReadReg(MSA311_REG_ACTIVE_DURATION,&r_data);
	if (bRet == false)
	{
		perror("Msa311_SetActiveDurationParam read error\n");
		return false;
	}
 	w_data = ((r_data & MSA311_ACTIVE_DURATION_MASK) | activeDuration);
	bRet = Msa311_WirteReg(MSA311_REG_ACTIVE_DURATION,w_data);
	if (bRet == false)
	{
		perror("Msa311_SetActiveDurationParam write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_GetActiveDurationParam(msa311_active_duration_t *activeDuration)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_ACTIVE_DURATION,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetActiveDurationParam read error\n");
		return false;
	}
    *activeDuration = (r_data & ~(MSA311_ACTIVE_DURATION_MASK));
    
    return bRet;
}


static uint8_t Msa311_ActiveThresholdConvertToRegister(float g, uint8_t *reg)
{
    msa311_range_t range;
    Msa311_GetRange(&range);
    switch (range)
    {
    case MSA311_RANGE_2_G/* constant-expression */:
        /* code */
        *reg = (int8_t)(g / 0.00391f);    
        break;
    case MSA311_RANGE_4_G/* constant-expression */:
        /* code */
        *reg = (int8_t)(g / 0.00781f);    
        break;
    case MSA311_RANGE_8_G/* constant-expression */:
        /* code */
        *reg = (int8_t)(g / 0.015625f);    
        break;
    case MSA311_RANGE_16_G/* constant-expression */:
        /* code */
        *reg = (int8_t)(g / 0.03125f);    
        break;        
    default:
        printf("Msa311_ActiveThresholdConvertToRegister error\r\n");
        break;
    }
    return 0;                                                                             
}

static uint8_t Msa311_ActiveThresholdConvertToData(uint8_t reg, float *g)
{
    msa311_range_t range;
    Msa311_GetRange(&range);
    switch (range)
    {
    case MSA311_RANGE_2_G/* constant-expression */:
        /* code */
        *g = (float)(reg) * 0.00391f;   
        break;
    case MSA311_RANGE_4_G/* constant-expression */:
        /* code */
        *g = (float)(reg) * 0.00781f;     
        break;
    case MSA311_RANGE_8_G/* constant-expression */:
        /* code */
        *g = (float)(reg) * 0.015625f;     
        break;
    case MSA311_RANGE_16_G/* constant-expression */:
        /* code */
        *g = (float)(reg) * 0.03125f;    
        break;        
    default:
        printf("Msa311_ActiveThresholdConvertToData error\r\n");
        break;
    }
    
    *g = (float)(reg) * 0.0039f;    
    return 0;
}

static bool Msa311_SetActiveThresholdParam(uint8_t threshold)
{
    uint8_t r_data;
	uint8_t w_data;
	bool bRet = 0;

 	w_data = threshold;
	bRet = Msa311_WirteReg(MSA311_REG_ACTIVE_THRESHOLD,w_data);
	if (bRet == false)
	{
		perror("Msa311_SetActiveThresholdParam write error\n");
		return false;
	}

    return bRet;
}

static bool Msa311_GetActiveThresholdParam(uint8_t *threshold)
{    
    uint8_t r_data;
	bool bRet = 0;

    bRet = Msa311_ReadReg(MSA311_REG_ACTIVE_THRESHOLD,&r_data);
	if (bRet == false)
	{
		perror("Msa311_GetActiveThresholdParam read error\n");
		return false;
	}
    *threshold = r_data;
    
    return bRet;
}

3、映射与使能中断

在这里插入图片描述
使能bit2,将中断映射到int管脚
在这里插入图片描述
使能bit0,bit1,bit2,将输出x y z产生的活动中断。
相关代码:

// 映射活动中断
    Msa311_SetInterruptMap0(MSA311_INTERRUPT_ACTIVE,MSA311_BOOL_TRUE);
    Msa311_GetInterruptMap0(MSA311_INTERRUPT_ACTIVE,&enable);
    printf("Msa311_GetInterruptMap0 MSA311_INTERRUPT_ACTIVE %s\r\n",enable==MSA311_BOOL_TRUE ? "enable" : "disable");

    Msa311_SetInterrupt0Enable(MSA311_INTERRUPT_ACTIVE_EN_X,MSA311_BOOL_TRUE);
    Msa311_GetInterrupt0Enable(MSA311_INTERRUPT_ACTIVE_EN_X,&enable);
    printf("Msa311_GetInterrupt0Enable MSA311_INTERRUPT_ACTIVE_EN_X %s\r\n",enable==MSA311_BOOL_TRUE ? "enable" : "disable");

    Msa311_SetInterrupt0Enable(MSA311_INTERRUPT_ACTIVE_EN_Y,MSA311_BOOL_TRUE);
    Msa311_GetInterrupt0Enable(MSA311_INTERRUPT_ACTIVE_EN_Y,&enable);
    printf("Msa311_GetInterrupt0Enable MSA311_INTERRUPT_ACTIVE_EN_Y %s\r\n",enable==MSA311_BOOL_TRUE ? "enable" : "disable");

    Msa311_SetInterrupt0Enable(MSA311_INTERRUPT_ACTIVE_EN_Z,MSA311_BOOL_TRUE);
    Msa311_GetInterrupt0Enable(MSA311_INTERRUPT_ACTIVE_EN_Z,&enable);
    printf("Msa311_GetInterrupt0Enable MSA311_INTERRUPT_ACTIVE_EN_Z %s\r\n",enable==MSA311_BOOL_TRUE ? "enable" : "disable");

4、中断处理

在这里插入图片描述
中断处理函数中读取bit2是否为1,为1,则活动,为0,则不活动。

void handle_int_message(void)
{
    uint8_t state;
    bool bRet;
    bRet = Msa311_ReadReg(MSA311_REG_MOTIONINT,&state);
	if (bRet == false)
	{
		perror("Msa311_GetInterrupt1Enable read error\n");
		return;
    }

    if (state & (1 << MSA311_S_TAP_INT_STATE))
    {
        printf("this is s_tap \r\n");
    }
    else if (state & (1 << MSA311_D_TAP_INT_STATE))
    {
        printf("this is d_tap \r\n");
    }
    else if (state & (1<< MSA311_ACTIVE_INT_STATE))
    {
        printf("this is active\r\n");
    }
}

5、现象

摇晃msa311,可见如下打印:
在这里插入图片描述

6、代码

代码下载

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

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

相关文章

Guideline 1.2 - Safety - User Generated Content

最近被拒很多次这个理由&#xff1a; 有这样&#xff1a;&#xff08;第一种&#xff1a;&#xff09; Guideline 1.2 - Safety - User Generated Content Your app enables users to post content anonymously but does not have the proper precautions in place. Next Ste…

澳大利亚纽扣电池以及含纽扣电池产品测试标准要求

由于在澳大利亚&#xff0c;已有儿童因为误食纽扣电池而导致死亡&#xff0c;且每月至少有一名儿童因吞咽或插入纽扣/硬币电池而严重受伤&#xff0c;导致其中一些儿童永久性损伤&#xff0c;而全世界数以百万计的消费品中都含有纽扣电池&#xff0c;所以澳大利亚出台含纽扣电池…

如何挑选适合自己的项目管理工具?这些选择技巧可以帮到你

选择一款符合您需求的项目管理软件对任何企业的成功都至关重要。由于可用的项目管理工具数量之多&#xff0c;选择一个最适合团队工作流程的工具可能会让人应接不暇。以下是一些选择正确项目管理软件的技巧&#xff1a; 1.确定业务需求 首先&#xff0c;确定您的业务需求至关重…

笔记本电脑开不了机怎么办?3招快速解决!

我是个笔记本电脑的重度用户&#xff0c;几乎每天都需要用到笔记本电脑&#xff0c;但昨天当我想开机时&#xff0c;我的笔记本电脑一点反应都没有&#xff0c;这我应该怎么办呢&#xff1f; 我们在日常生活中&#xff0c;对笔记本电脑的使用越来越多&#xff0c;它给我们带来了…

基于RBAC实现权限系统

RBAC 一&#xff1a;故事背景二&#xff1a;什么是RBAC&#xff08;Role-Based Access Control&#xff09;2.1 概念2.2 关键构成2.3 RBAC 三个著名原则2.3.1 最小权限2.3.2 责任分类2.3.3 数据抽象 2.4 RBAC 的 5种类型2.5 图体现 三&#xff1a;RBAC的优缺点四&#xff1a;通…

useref和useImperativeHandle

1.函数组件中&#xff0c;还可以基于useRef Hook函数&#xff0c;创建一个ref对象 useRef 是 React 提供的一个 Hook 函数&#xff0c;它可以用来在函数式组件内部保存和访问任何可变值&#xff0c;类似于在类组件中使用 this.setState 来保存数据。不同之处在于&#xff0c;u…

Maven创建Web项目

创建 Web 应用 通过使用 Maven 的 maven-archetype-webapp 模板可以创建一个简单的 Web 应用。 例如&#xff0c;在命令行窗口执行以下命令&#xff0c;Maven 会为我们创建一个 JavaWeb 应用。 mvn archetype:generate -DgroupIdnet.biancheng.www -DartifactIdmavenWeb -Darc…

Unity与原生交互之Unity篇——AndroidStudio导出aar/jar包供Unity使用实现交互全流程(4)

序言:此篇介绍使用AndroidStudio导出aar/jar导入unity过程中的注意点 1.处理aar包 *****重要 重要 重要***** 目的是为了剔除之前导入android工程的unity API,这些api unity已经有了 过程建议拷贝一份aar进行处理 方式一: 处理aar包 1)解压aar 2)…

百度沈抖:大模型 产业智能化时代的新引擎

6月9日&#xff0c;2023 NAVIGATE领航者峰会在杭州举办&#xff0c;聚焦数字经济新政策、新技术、新业态带来的蓬勃机遇&#xff0c;探讨ICT行业在AIGC时代将要面临的全新挑战与应对策略。百度集团执行副总裁、百度智能云事业群总裁沈抖出席大会并作题为《大模型 产业智能化时代…

华为OD机试之用户调度问题(Java源码)

用户调度问题 题目描述 在通信系统中&#xff0c;一个常见的问题是对用户进行不同策略的调度&#xff0c;会得到不同的系统消耗和性能。假设当前有n个待串行调度用户&#xff0c;每个用户可以使用A/B/C三种不同的调度策略&#xff0c;不同的策略会消耗不同的系统资源。请你根据…

AI + 非遗文化主题师资培训落地,飞桨持续赋能AI人才培养

随着数字浪潮袭来&#xff0c;人工智能的发展声势浩大&#xff0c;高校人工智能专业建设以及 AI 的人才培养已经提上日程。如何夯实产教融合&#xff0c;加快人工智能研究创新&#xff0c;培养具备 AI 系统能力的拔尖人才&#xff0c;是推进产业智能化升级的迫切课题。6月2日-4…

2023年国内五大 IoT 物联网平台费用对比

五大物联网平台费用对比 随着物联网发展进入成熟期&#xff0c;越来越多企业选择云厂商提供的物联网PaaS服务&#xff0c;以降低运营成本&#xff0c;缩短业务上线周期&#xff0c;释放运维的人力&#xff0c;按需付费动态扩容。笔者基于各云厂商2023年4月的官网报价&#xff0…

【笑小枫系列】Java加密那点事,本文给你讲的明明白白

本文简介 相信大家在日常工作中都遇到过加密的场景吧&#xff0c;像登录密码加密保存、无token接口验签、数据加密传输等等。 本文将详细的介绍一下加密的方式&#xff0c;并分析使用场景&#xff0c;并会以详细的代码完整的介绍如何使用加密&#xff0c;让小伙伴们遇到加密时…

docker-consul服务发现部署

什么是consul consul是google开源的一个使用go语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法&#xff0c;用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案&…

Redis 分布式集群操作

文章目录 连接集群写入数据单个key写入批量key操作 集群查询查询 key 的 slot查询 slot 中 key 的数量查询 slot 中的 key 故障转移Master宕机Master 和 Slave 都宕机 集群扩容1.启动两个节点2.添加 master3.分配slot4.添加 slave 集群缩容1.删除 slave 节点2.移出 master 的 s…

【K8SRockyLinux】基于开源操作系统搭建K8S高可用集群(详细版)

文章目录 一、实验节点规划表&#x1f447;二、实验版本说明&#x1f4c3;三、实验拓扑&#x1f4ca;四、实验详细操作步骤&#x1f579;️1. 安装Rocky Linux开源企业操作系统2. 所有主机系统初始化3. 所有master节点部署keepalived4. 所有master节点部署haproxy5. 所有节点配…

睿智医药×企通启动采购与供应链管理项目,加速医药领域数智采购

随着世界经济发展、人口总量增长、人口老龄化程度提高以及人们保健意识增强&#xff0c;新型国家城市化建设的推进和各国医疗保障体制的不断完善&#xff0c;全球医药市场呈持续增长趋势。在政策、资本、技术等因素催化下&#xff0c;我国生物医药行业研发创新实力稳步增强&…

Three.js教程:渲染器

推荐&#xff1a;将 NSDT场景编辑器加入你的3D工具链。 其他系列工具&#xff1a; NSDT简石数字孪生 渲染器 生活中如果有了景物和相机&#xff0c;那么如果想获得一张照片&#xff0c;就需要你拿着相机&#xff0c;按一下&#xff0c;咔&#xff0c;完成拍照。对于threejs而言…

《西部学刊》期刊简介及投稿邮箱

《西部学刊》是经国家新闻出版总署批准&#xff0c;由陕西新华出版传媒集团主管、主办的面向国内外公开发行的综合性哲学社会科学学术期刊。2014年&#xff0c;被国家新闻出版广电总局认定为第一批学术期刊。 《 西部学刊》以全球视野&#xff0c;关注中国西部&#xff0c;聚焦…

webpack生成模式配置

一、生产模式和开发模式介绍 生成模式&#xff08;production mode&#xff09;是指在开发完成后将代码部署到生产环境中运行的模式&#xff0c;通常需要进行代码压缩、优化、合并&#xff0c;以减少文件大小和请求次数&#xff0c;提高页面加载速度和运行效率。 开发模式&am…