【蓝桥杯——物联网设计与开发】拓展模块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校准,否则无法测量准确的值‼️

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

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

相关文章

嵌入式硬件杂谈(八)电源的“纹波”到底是什么?

纹波的引入&#xff1a;在我们嵌入式设备中&#xff0c;很多时候电路电源的纹波很敏感&#xff0c;纹波太大会导致系统不工作&#xff0c;因此设计一个纹波很小的电路就是我们的需求了。 电路的纹波是什么&#xff1f; 纹波&#xff08;Ripple&#xff09;是指电源输出中叠加在…

Linux系统之stat命令的基本使用

Linux系统之stat命令的基本使用 一、stat命令 介绍二、stat命令帮助2.1 查询帮助信息2.2 stat命令的帮助解释 三、stat命令的基本使用3.1 查询文件信息3.2 查看文件系统状态3.3 使用格式化输出3.4 以简洁形式打印信息 四、注意事项 一、stat命令 介绍 stat 命令用于显示文件或文…

uniapp开发微信小程序实现获取“我的位置”

1. 创建GetLocation项目 使用HBuilder X创建一个项目GetLocation,使用Vue3。 2. 在腾讯地图开放平台中创建应用 要获取位置,在小程序中需要使用腾讯地图或是高德地图。下面以腾讯地图为例。 (1)打开腾讯地图开放平台官方网址:腾讯位置服务 - 立足生态,连接未来 (2)注册…

基于NodeMCU的物联网空调控制系统设计

最终效果 基于NodeMCU的物联网空调控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计&#xff08;仿智能家居&#xff09;”项目中的“家电控制设计”中的“空调控制”子项目&#xff0c;最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…

easegen将教材批量生成可控ppt课件方案设计

之前客户提出过一个需求&#xff0c;就是希望可以将一本教材&#xff0c;快速的转换为教学ppt&#xff0c;虽然通过人工程序脚本的方式&#xff0c;已经实现了该功能&#xff0c;但是因为没有做到通用&#xff0c;每次都需要修改脚本&#xff0c;无法让客户自行完成所有流程&am…

从安全角度看 SEH 和 VEH

从安全角度看 SEH 和 VEH 异常处理程序是处理程序中不可预见的错误的基本方法之一 https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/exceptions/ SEH——结构化异常处理程序 就其工作方式而言&#xff0c;异常处理程序与其他处理程序相比相当基础&#xff0…

nexus docker安装

#nexus docker 安装 docker pull sonatype/nexus3 mkdir -p /data/nexus-data docker run -itd -p 8081:8081 --privilegedtrue --name nexus3 \ -v /data/nexus-data:/var/nexus-data --restartalways docker.io/sonatype/nexus3 #访问 http://192.168.31.109:8081/ 用户名&am…

Spark生态圈

Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS&#xff0c;但是中间结果可以存放在内存中&#xff1b;调度可以使用 Spark 内置的&#xff0c;也可以使用更成熟的调度系统 YARN 等。 Spark有完善的生态圈&#xff1a; Spark Core&#xff1a;实现了…

CSS---实现盒元素div内input/textarea的focus状态时给父元素加属性!

注意兼容性&#xff0c;低版本浏览器无效 要实现当 textarea 文本框获得焦点时&#xff0c;自动给其父元素添加类名或样式&#xff0c;您可以使用 CSS 的 :focus-within 伪类选择器。这个选择器会在元素本身或其任何子元素获得焦点时应用样式。 示例代码 假设您有以下 HTML 结…

2011-2020年各省城镇职工基本医疗保险年末参保人数数据

2011-2020年各省城镇职工基本医疗保险年末参保人数数据 1、时间&#xff1a;2011-2020年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;省份、时间、城镇职工基本医疗保险年末参保人数 4、范围&#xff1a;31省 5、指标解释&#xff1a;参保人数指报告期末按国家有关…

Bert中文文本分类

这是一个经典的文本分类问题&#xff0c;使用google的预训练模型BERT中文版bert-base-chinese来做中文文本分类。可以先在Huggingface上下载预训练模型备用。https://huggingface.co/google-bert/bert-base-chinese/tree/main 我使用的训练环境是 pip install torch2.0.0; pi…

【无标题】学生信息管理系统界面

网页是vue框架&#xff0c;后端直接python写的没使用框架

macos安装maven以及.bash_profile文件优化

文章目录 下载和安装maven本地仓库配置国内镜像仓库配置.bash_profile文件优化 下载和安装maven maven下载地址 存放在/Library/Java/env/maven目录 本地仓库配置 在maven-3.9.9目录下创建maven-repo目录作为本地文件仓库打开setting配置文件 在setting标签下&#xff0c;添…

用Excel表格在线发布期末考试成绩单

每到期末&#xff0c;发布学生的期末考试成绩单便是老师们的一项重要任务。以往&#xff0c;传统的纸质成绩单分发效率低还易出错&#xff0c;而借助 Excel 表格在线发布&#xff0c;则开启了全新高效模式。 老师们先是精心整理各科成绩&#xff0c;录入精准无误的分数到 Excel…

WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)

项目中要用到样条曲线&#xff0c;必须过顶点&#xff0c;圆滑后还不能太走样&#xff0c;捣鼓一番&#xff0c;发现里面颇有玄机&#xff0c;于是把我多方抄来改造的方法发出来&#xff0c;方便新手&#xff1a; 如上图&#xff0c;看代码吧&#xff1a; -------------------…

python监控数据处理应用服务Socket心跳解决方案

1. 概述 从网页、手机App上抓取数据应用服务&#xff0c;涉及到多个系统集成协同工作&#xff0c;依赖工具较多。例如&#xff0c;使用Frida进行代码注入和动态分析&#xff0c;以实现对网络通信的监控和数据捕获。在这样的集成环境中&#xff0c;手机模拟器、手机中应用、消息…

商品线上个性定制,并实时预览3D定制效果,是如何实现的?

商品线上3D个性化定制的实现涉及多个环节和技术&#xff0c;以下是详细的解释&#xff1a; 一、实现流程 产品3D建模&#xff1a; 是实现3D可视化定制的前提&#xff0c;需要对产品进行三维建模。可通过三维扫描仪或建模师进行建模&#xff0c;将产品的外观、结构、材质等细…

Python PyMupdf 去除PDF文档中Watermark标识水印

通过PDF阅读或编辑工具&#xff0c;可在PDF中加入Watermark标识的PDF水印&#xff0c;如下图&#xff1a; 该类水印特点 这类型的水印&#xff0c;会在文件的字节流中出现/Watermark、EMC等标识&#xff0c;那么&#xff0c;我们可以通过改变文件字节内容&#xff0c;清理掉…

旧衣回收小程序开发,绿色生活,便捷回收

随着绿色生活、资源回收利用理念的影响&#xff0c;人们逐渐开始关注旧衣回收&#xff0c;选择将断舍离等闲置衣物进行回收&#xff0c;在资源回收的同时也能够减少资金浪费。目前&#xff0c;旧衣回收的方式也迎来了数字化发展&#xff0c;相比传统的回收方式更加便捷&#xf…

Bluetooth Spec【0】蓝牙核心架构

蓝牙核心系统由一个主机、一个主控制器和零个或多个辅助控制器组成蓝牙BR/ EDR核心系统的最小实现包括了由蓝牙规范定义的四个最低层和相关协议&#xff0c;以及一个公共服务层协议&#xff1b;服务发现协议&#xff08;SDP&#xff09;和总体配置文件要求在通用访问配置文件&a…