【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块
目录
一、脉冲模块
(1)资源介绍
🔅原理图
🔅采集原理
(2)STM32CubeMX 软件配置
(3)代码编写
(4)实验现象
二、脉冲模块接口函数封装
三、踩坑日记
(1)中断使能
(2)引脚配置
(3)ADC校准
一、脉冲模块
(1)资源介绍
🔅原理图
蓝桥杯物联网竞赛实训平台提供了一个拓展接口 CN2,所有拓展模块均可直接安装在 Lora 终端上使用;

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

通过两张电路图连接可知,引脚资源配置情况为:
PULSE | MCU |
---|---|
PR1 | PB1 |
PULS | PB0 |
LED1 | PB7 |
LED2 | PB6 |
🔅采集原理
脉冲信号由脉冲芯片产生,通过PR3滑动变阻器控制,不同阻值下的脉冲频率不同。
通过公式可得,脉冲频率 = 脉冲周期的倒数,那么我们可以将问题转换为求取脉冲周期。
PULS连接在PB0引脚,该引脚为定时器3的通道3,我们可以使用定时器的输入捕获模式(Input Capture direct mode)。捕获脉冲的上升沿,通过计算相邻两个上升沿之间的差值,即可得到该脉冲的周期。示意图如下所示:

⚠️注意:由于定时器周期不为1Hz,所以这里需要用定时器时钟频率除以脉冲周期;
定时器的计数寄存器为16位,范围是0~65535,溢出后清零重新计数。在计算脉冲周期时会遇到三种情况,如图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博客https://blog.csdn.net/m0_63116406/article/details/139212183?spm=1001.2014.3001.5501
(2)STM32CubeMX 软件配置
🔅“工程建立、时钟树配置、Debug 串行线配置、代码生成配置” 在下文中有讲解,这里不再赘述❗️
【蓝桥杯——物联网设计与开发】基础模块1- GPIO输出https://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的输入捕获模式;(此时引脚呈绿色,可以正常工作)
⚠️注意:下方参数表中:
- 计数周期为65535;
- 通道3输入捕获极性为上升沿或下降沿;

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 - 脉冲模块
目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…...

.NET平台用C#通过字节流动态操作Excel文件
在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据。这种方法允许开发者直接在内存中创建、修改和保存Excel文档,无需依赖直接的文件储存、读取操作,从而提高了程序的性能和安全性。使用流技术处理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本身并没有引入大量新的注解,但它基于Spring框架,并整合了多种技术和库,使得开发者可以更方便地使用Spring框架的功能。在Spring Boot项目中,常用的注解主要来自于Spring框架本身。 Sprin…...
Apache Commons ThreadUtils 的使用与优化
Apache Commons ThreadUtils 的使用与优化 1. 问题背景 在 Java 系统中,跨系统接口调用通常需要高并发支持,尤其是线程池的合理配置至关重要。如果线程池使用不当,可能导致性能下降,线程等待或过载。 当前问题 使用了 Apache …...

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

下午四点半
客户的员工竟然背着公司开发报表系统,是在密谋什么大事吗? 之前去线下给客户的员工培训,当时我就对这个小姑娘印象很深刻,因为她后面加了我们的技术人员,问了很多问题,不同于从来没有用过低代码平台的人&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文件,写入以下代码: let log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.i…...

利用 deepin-IDE 的 AI 能力,我实现了文件加密扩展
经过多轮迭代,deepin 文件管理器(dde-file-manager)的扩展功能已经趋于稳定,看到越来越丰富的文管新功能,作为一名技术爱好者,也想自己动手写个插件扩展一下文管的功能。 我选择的开发工具是 deepin-IDE&a…...

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

hiprint结合vue2项目实现静默打印详细使用步骤
代码地址是:vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址:electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm(socket.…...

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

【计算机-显示屏灰阶测试】
硬计算机-显示屏灰阶测试 ■ 对比度■ 清晰度■ 灰度色阶(色带)■ 对比率■■ ■ 对比度 在一个性能良好的显示器上,您可观察到每种颜色的标尺都可分为从 1 至 32、大致上等宽但不同亮度的色带。即使是在刻度1处的色带也应该隐约可见。 一个…...
CSS系列(40)-- Container Queries详解
前端技术探索系列:CSS Container Queries详解 📦 致读者:探索组件响应式的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Container Queries,这个强大的组件级响应式特性。 基础概念 🚀 容…...

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

各种数据库类型介绍
在软件开发和数据处理领域,数据库扮演着至关重要的角色。它们用于存储、检索和管理大量数据,是信息系统不可或缺的基础。以下是几种常用的数据库类型及其简要介绍: 1.关系型数据库(Relational Databases) 关系型数据库…...
了解智能运维
智能运维 (一)运维工作的转变 随着技术发展,运维工作从基础的搬机器、插网线、装系统等体力活儿,逐渐转变为更侧重服务器管理、代码管理、日志分析、监控告警、流量管理及故障排查等的脑力劳动。如今,运维人员拿到的…...
js实现仿windows文件名称排序
引言: 在JavaScript中,数组排序是一个常见的操作,但默认的Array.sort()方法只能进行简单的字符串比较。在处理复杂数据时,我们需要自定义排序函数来满足特定的需求。本文将通过一个具体的代码示例,解释如何实现一个仿w…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...