当前位置: 首页 > news >正文

【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块

目录

一、脉冲模块

(1)资源介绍

        🔅原理图

        🔅采集原理

(2)STM32CubeMX 软件配置

(3)代码编写

(4)实验现象

二、脉冲模块接口函数封装

三、踩坑日记

(1)中断使能

(2)引脚配置

(3)ADC校准


一、脉冲模块

(1)资源介绍

        🔅原理图

        蓝桥杯物联网竞赛实训平台提供了一个拓展接口 CN2,所有拓展模块均可直接安装在 Lora 终端上使用;

图1        拓展接口

        脉冲模块电路原理图如下所示:

图2        脉冲模块电路原理图

         通过两张电路图连接可知,引脚资源配置情况为:

表1 引脚资源配置情况
PULSEMCU
PR1PB1
PULSPB0
LED1PB7
LED2PB6

        🔅采集原理

        脉冲信号由脉冲芯片产生,通过PR3滑动变阻器控制,不同阻值下的脉冲频率不同。

        通过公式可得,脉冲频率 = 脉冲周期的倒数,那么我们可以将问题转换为求取脉冲周期。

f=\frac{1}{T}

        PULS连接在PB0引脚,该引脚为定时器3的通道3,我们可以使用定时器的输入捕获模式(Input Capture direct mode)。捕获脉冲的上升沿,通过计算相邻两个上升沿之间的差值,即可得到该脉冲的周期。示意图如下所示:

图3        脉冲示意图

       ⚠️注意:由于定时器周期不为1Hz,所以这里需要用定时器时钟频率除以脉冲周期

        定时器的计数寄存器为16位,范围是0~65535,溢出后清零重新计数。在计算脉冲周期时会遇到三种情况,如图4所示:

图4        计数不同情况

        对于情况3,如果两次获取的值相等,需要考虑是否为定时器计数异常等情况,所以一般判为error

🟠️伪代码如下:

if(第一个上升沿)
{cnt1 = 获取定时器cnt值;
}
else if(第二个上升沿)
{cnt2 = 获取定时器cnt值;/* 判断情况 */if(cnt2 > cnt1)脉冲周期 = cnt2 - cnt1;else if(cnt2 < cnt1)脉冲周期 = 0xFFFF - cnt1 + 1 + cnt2;elseerror报错;uwFreq = 定时器时钟频率 / 脉冲周期;
}

        PR1为AD采集,参考之前的文章即可:

【蓝桥杯——物联网设计与开发】拓展模块2 - 电位器模块_lowpowerautowait-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63116406/article/details/139212183?spm=1001.2014.3001.5501

(2)STM32CubeMX 软件配置


🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️

【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出icon-default.png?t=O83Ahttps://blog.csdn.net/m0_63116406/article/details/135604705?spm=1001.2014.3001.5502

1️⃣点击引脚 PB0 → 选择 TIM3_CH3 ;(此时引脚呈黄色,因为TIM还未配置)

2️⃣点击 "Timers" → 点击"TIM3" → 将 "Channel3" 栏修改为 "Input Capture direct mode",即将 PB0 引脚配置为TIM3通道3的输入捕获模式;(此时引脚呈绿色,可以正常工作)

⚠️注意:下方参数表中:

  1. 计数周期为65535
  2. 通道3输入捕获极性为上升沿下降沿
图5        引脚配置


3️⃣配置PB1引脚为AD采集引脚;(具体参考AD采集一文)

4️⃣初始化 OLED;(具体参考OLED一文)

5️⃣生成代码即可;

(3)代码编写

🟢️main 函数

/* USER CODE BEGIN PV */
uint8_t puc_oled[17];    // oled显示缓存区
uint16_t pui_adc;        // adc采集值uint8_t uc_ic_state;     // 输入捕获状态,区分第一次和第二次上升沿
uint32_t uwValue1;       // 第一次上升沿的计数值
uint32_t uwValue2;       // 第二次上升沿的计数值
uint32_t uwDiff;         // 脉冲周期
uint32_t uwFreq;         // 脉冲频率
/* USER CODE END PV *//* USER CODE BEGIN 0 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)                    // 判断是否为通道3中断{if(uc_ic_state == 0)    // 第一次上升沿{uwValue1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);    // 获取计数值uc_ic_state = 1;    // 修改状态变量}else if(uc_ic_state == 1)    // 第二次上升沿{uwValue2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);    // 获取计数值/* 判断情况 */if(uwValue2 > uwValue1)    uwDiff = uwValue2 - uwValue1;else if(uwValue2 < uwValue1)uwDiff = 0xFFFF - uwValue1 + 1 + uwValue2;elseError_Handler();uwFreq = HAL_RCC_GetPCLK1Freq() / uwDiff;    // 计算脉冲频率uc_ic_state = 0;    // 修改状态变量}}
}
/* USER CODE END 0 */
/*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_ADC_Init();MX_TIM3_Init();MX_I2C3_Init();/* USER CODE BEGIN 2 */OLED_Init();HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);    // 开启定时器捕获中断/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* ADC采集 */HAL_ADC_Start(&hadc);if(HAL_ADC_PollForConversion(&hadc, 10) == HAL_OK)pui_adc = HAL_ADC_GetValue(&hadc);/* OLED显示 */sprintf((char*)puc_oled, "TIM:%u     ", uwFreq);OLED_ShowString(0, puc_oled);sprintf((char*)puc_oled, "ADC:%.2f   ", pui_adc * 3.3 / 4095);OLED_ShowString(2, puc_oled);HAL_Delay(200);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

(4)实验现象

  •         旋转PR1按钮,能够实时采集AD值;
  •         旋转PR3按钮,能够实时采集频率值;

二、脉冲模块接口函数封装

🟡️定时器输入捕获中断函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)                    // 判断是否为通道3中断{if(uc_ic_state == 0)    // 第一次上升沿{uwValue1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);    // 获取计数值uc_ic_state = 1;    // 修改状态变量}else if(uc_ic_state == 1)    // 第二次上升沿{uwValue2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_3);    // 获取计数值/* 判断情况 */if(uwValue2 > uwValue1)    uwDiff = uwValue2 - uwValue1;else if(uwValue2 < uwValue1)uwDiff = 0xFFFF - uwValue1 + 1 + uwValue2;elseError_Handler();uwFreq = HAL_RCC_GetPCLK1Freq() / uwDiff;    // 计算脉冲频率uc_ic_state = 0;    // 修改状态变量}}
}

三、踩坑日记

(1)中断使能

        🔅中断使能应该使用函数HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_3);否则中断无法进入;

(2)引脚配置

        🔅引脚模式配置为带上拉电阻(目前没发现不配置有什么问题);

        🔅速度配置为Very High

(3)ADC校准

        🔅ADC模块注意:初始化函数里面需要进行ADC校准,否则无法测量准确的值‼️

相关文章:

【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块

目录 一、脉冲模块 &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;采集原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…...

.NET平台用C#通过字节流动态操作Excel文件

在.NET开发中&#xff0c;通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存Excel文档&#xff0c;无需依赖直接的文件储存、读取操作&#xff0c;从而提高了程序的性能和安全性。使用流技术处理Excel不仅简化了…...

SpringMVC详解

文章目录 1 什么是MVC 1.1 MVC设计思想1.2 Spring MVC 2 SpringMVC快速入门3 SpringMVC处理请求 3.1 请求分类及处理方式 3.1.1 静态请求3.1.2 动态请求 3.2 处理静态请求 3.2.1 处理html文件请求3.2.2 处理图片等请求 3.3 处理动态请求 3.3.1 注解说明3.3.2 示例 3.4 常见问题…...

springboot、spring、springmvc有哪些注解

Spring Boot 常用注解 虽然Spring Boot本身并没有引入大量新的注解&#xff0c;但它基于Spring框架&#xff0c;并整合了多种技术和库&#xff0c;使得开发者可以更方便地使用Spring框架的功能。在Spring Boot项目中&#xff0c;常用的注解主要来自于Spring框架本身。 ‌Sprin…...

Apache Commons ThreadUtils 的使用与优化

Apache Commons ThreadUtils 的使用与优化 1. 问题背景 在 Java 系统中&#xff0c;跨系统接口调用通常需要高并发支持&#xff0c;尤其是线程池的合理配置至关重要。如果线程池使用不当&#xff0c;可能导致性能下降&#xff0c;线程等待或过载。 当前问题 使用了 Apache …...

重温设计模式--5、职责链模式

文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求的发送者和多个接收者解耦&#xff0c;让多个对象都有机会处理请求&am…...

下午四点半

客户的员工竟然背着公司开发报表系统&#xff0c;是在密谋什么大事吗&#xff1f; 之前去线下给客户的员工培训&#xff0c;当时我就对这个小姑娘印象很深刻&#xff0c;因为她后面加了我们的技术人员&#xff0c;问了很多问题&#xff0c;不同于从来没有用过低代码平台的人&a…...

嵌入式单片机中Flash存储器控制与实现

第一:嵌入式单片机内部Flash概述 1.存储器的概念 存储器指的是若干个存储单元的集合,每个存储单元都可以存储若干个二进制数,为了方便的操作存储单元,就为每个存储单元都分配了地址,就可以通过寻址来访问存储单元。由于计算机的处理的数据量较大,并且运算速度都很快,就…...

loki failed to flush

loki 报错 levelerror ts2024-12-27T08:13:10.450140686Z callerflush.go:143 org_idfake msg"failed to flush" err"failed to flush chunks: store put chunk: open /data/loki/chunks/ZmFrZS85ODBmM2U3NzliODg2MjY1OjE5M2VhNDVkYTc4OjE5M2VhNDVlNDdkOjVmMjA…...

微信小程序打印生产环境日志

微信小程序打印生产环境日志 新建一个log.js文件&#xff0c;写入以下代码&#xff1a; let log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.i…...

利用 deepin-IDE 的 AI 能力,我实现了文件加密扩展

经过多轮迭代&#xff0c;deepin 文件管理器&#xff08;dde-file-manager&#xff09;的扩展功能已经趋于稳定&#xff0c;看到越来越丰富的文管新功能&#xff0c;作为一名技术爱好者&#xff0c;也想自己动手写个插件扩展一下文管的功能。 我选择的开发工具是 deepin-IDE&a…...

JPA 基本查询(五)

JPA 查询Exists示例 JPA教程 - JPA 查询Exists示例 如果子查询返回任何行&#xff0c;则EXISTS条件返回true。 以下代码显示如何在JPQL中使用带有子查询的EXISTS运算符。 List l em.createQuery("SELECT e FROM Professor e WHERE EXISTS " "(SELECT p FROM …...

hiprint结合vue2项目实现静默打印详细使用步骤

代码地址是&#xff1a;vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址&#xff1a;electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm&#xff08;socket.…...

项目报 OutOfMemoryError 、GC overhead limit exceeded 问题排查以及解决思路实战

项目报 OutOfMemoryError、GC overhead limit exceeded 问题排查以及解决思路实战 前言&#xff1a; 问题现象描述&#xff1a; 1&#xff0c;生产环境有个定时任务&#xff0c;没有初始化告警数据【告警数据量为1000多个】 2&#xff0c;其他定时任务执行正常 3&#xff0c;查…...

【计算机-显示屏灰阶测试】

硬计算机-显示屏灰阶测试 ■ 对比度■ 清晰度■ 灰度色阶&#xff08;色带&#xff09;■ 对比率■■ ■ 对比度 在一个性能良好的显示器上&#xff0c;您可观察到每种颜色的标尺都可分为从 1 至 32、大致上等宽但不同亮度的色带。即使是在刻度1处的色带也应该隐约可见。 一个…...

CSS系列(40)-- Container Queries详解

前端技术探索系列&#xff1a;CSS Container Queries详解 &#x1f4e6; 致读者&#xff1a;探索组件响应式的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Container Queries&#xff0c;这个强大的组件级响应式特性。 基础概念 &#x1f680; 容…...

工作生活做事慢效率低原因及解决方案

时间和效率管理具体版&#xff08;初阶&#xff09;&#xff08;一&#xff09; 工作&生活做事慢效率低原因及解决方案 一、效率慢的原因&#xff08;动物解析法&#xff08;编者自创&#xff09;&#xff09; 打败你的可能是生活的小事 1.无头苍蝇无流程 做事之前没有想…...

各种数据库类型介绍

在软件开发和数据处理领域&#xff0c;数据库扮演着至关重要的角色。它们用于存储、检索和管理大量数据&#xff0c;是信息系统不可或缺的基础。以下是几种常用的数据库类型及其简要介绍&#xff1a; 1.关系型数据库&#xff08;Relational Databases&#xff09; 关系型数据库…...

了解智能运维

智能运维 &#xff08;一&#xff09;运维工作的转变 随着技术发展&#xff0c;运维工作从基础的搬机器、插网线、装系统等体力活儿&#xff0c;逐渐转变为更侧重服务器管理、代码管理、日志分析、监控告警、流量管理及故障排查等的脑力劳动。如今&#xff0c;运维人员拿到的…...

js实现仿windows文件名称排序

引言&#xff1a; 在JavaScript中&#xff0c;数组排序是一个常见的操作&#xff0c;但默认的Array.sort()方法只能进行简单的字符串比较。在处理复杂数据时&#xff0c;我们需要自定义排序函数来满足特定的需求。本文将通过一个具体的代码示例&#xff0c;解释如何实现一个仿w…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...