备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波,现在,我们尝试的想要捕获我们的PWM波,测量它的频率,我们应该怎么做呢?答案还是回到我们的定时器上。

我们知道,定时器是一个高级的秒表(参考笔者的比喻:备考蓝桥杯嵌入式3:产生PWM波-CSDN博客),它可以根据我们的设置向主处理器发送中断,所以,我们的一个测量办法就是,捕获其中的上升沿(或者是下降沿,两次上升沿的间隔就是我们的方波周期),如何知道上升沿或者是下降沿到来呢?答案是使用中断,我们将上升沿捕获进来,度量其中的CNT变化了多少,这个时候,我们就获得了相对于自身的频率,我们的PWM方波的频率是自身工作的频率的倍数。

我们让自身的CNT为0,再下一次捕获的时候得到CNT减去0就是CNT个度量的单位时间,其中,单位的度量时间笔者上一篇博客已经给出,这里不再给定,最终的结果就是

f = \frac{1}{T} = \frac{1}{t_0 \cdot capture_{CNT}}=\frac{f_{sys}}{(prescalar + 1) \cdot capture_{CNT}}

这里笔者建议进行预分频,因为我们需要保证我们的计次不会击穿我们的接受CNT的值的变量范围,否则就会出错。

代码实战

笔者以PA7作为捕获,来接受上一博客中笔者设置的PA1引脚产生的PWM波形。办法是配置PA7为输入捕获模式,且设置分频为80。

其他的部分可以不设置。我们采取的是上升沿的捕获!记得使能一下定时器的中断!我们生成MDK5工程,下一步就是我们来看看,如何完成软件的部分。

显然,我们的时钟输入捕获需要按照使能中断的方式进行开启:

HAL_TIM_IC_Start_IT(&htim17, TIM_CHANNEL_1);

重要的是,我们需要捕获我们的上升沿,其回调函数是:

uint32_t frequency, capture_value;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM17){capture_value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);TIM17->CNT = 0;frequency = HAL_RCC_GetSysClockFreq()/((htim->Init.Prescaler + 1) * capture_value);}
}

我们按照管理获取我们的捕获值,当然,如果要追求迅速,可以直接将htim->Instance->CCR1抓出来赋值,来进行加速。笔者的建议是不要这样,除非有明显的效率提升,否则可读性不好。

我们在主循环中,调用一个时时刻刻进行刷新的display函数

char value[20];
void display_current_captured_freq(void)
{snprintf(value, 20, "frequency:%d", frequency);lcd_middledisplay(Line0, value);
}

关于LCD的使用和笔者进行的小幅度的修改,参考笔者的博客:备考蓝桥杯嵌入式2:使用LCD完成显示-CSDN博客

现在我们将PA7和PA1使用杜邦线或者是导线连接。再将我们的代码上传上去。笔者采用的是1000HZ的PWM方波,这里的显示稍有误差:

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

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

相关文章

ArrayList 扩容机制的源码剖析

在 Java 编程中,ArrayList是一个常用的集合类,它实现了List接口,底层基于数组实现。与普通定长数组不同,ArrayList能够根据元素的添加情况动态调整数组的大小,这就是其扩容机制。下面我们将深入剖析ArrayList扩容机制的…

Java 面试之结束问答

技术优化 线程池优化 设置最大线程数设置最小核心线程数设置额外线程存活时间选择线程池队列选择合适的线程池选择合适的饱和策略 锁优化 尽量不要锁住方法缩小同步代码块,只锁数据锁中尽量不要再包含锁将锁私有化,在内部管理锁进行适当的锁分解 HT…

【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE

在自然语言处理(NLP)领域,Transformer 模型已经成为主流。然而,Transformer 本身并不具备处理序列顺序的能力。为了让模型理解文本中词语的相对位置,我们需要引入位置编码(Positional Encoding)…

【科研】 -- 医学图像处理方向,常用期刊链接

文章目录 文章目录 医学图像处理方向,期刊链接医学图像处理方向,会议 医学图像处理方向,期刊链接 Sicence https://www.science.org/ Nature https://www.nature.com/ Nature Communications https://www.nature.com/ncomms/ Nature Met…

The specified Gradle distribution ‘gradle-bin.zip‘ does not exist.

The specified Gradle distribution ‘https://services.gradle.org/distributions/gradle-bin.zip’ does not exist. distributionUrl不存在,关联不上,下载不了,那就匹配一个能下载的 distributionUrlhttps://services.gradle.org/distrib…

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表?3代码实现:从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

Cesium点集中获取点的id,使用viewer.value.entities.getById报错的解决方法

错误代码: viewer.value.entities.getById(pickedObject.id) 报错: 可以正常获取movement.position但是一直出现如下报错,无法获得航点的id,通过断点定位为 viewer.value.entities.getById(pickedObject.id)导致的报错 解决方…

java 进阶教程_Java进阶教程 第2版

第2版前言 第1版前言 语言基础篇 第1章 Java语言概述 1.1 Java语言简介 1.1.1 Java语言的发展历程 1.1.2 Java的版本历史 1.1.3 Java语言与C/C 1.1.4 Java的特点 1.2 JDK和Java开发环境及工作原理 1.2.1 JDK 1.2.2 Java开发环境 1.2.3 Java工作原理 1.…

ARM Linux Qt使用JSON-RPC实现前后台分离

文章目录 1、前言2、解决方案2.1、JSON-RPC2.2、Qt中应用JSON-RPC的框架图2.3、优点2.4、JSON-RPC 1.0 协议规范 3、程序示例3.1、Linux C(只例举RPC Server相关程序)3.2、Qt程序(只例举RPC Client相关程序) 4、编译程序4.1、交叉…

PyQt6/PySide6 的 QMainWindow 类

QMainWindow 是 PyQt6 或 PySide6 库中一个非常重要的类,它提供了一个主窗口应用程序的框架,该框架可以包含菜单栏、工具栏、状态栏以及中心部件等。QMainWindow 为 GUI 应用程序提供了基本的结构和布局管理功能,非常适合用来创建复杂的用户界…

9. k8s二进制集群之kube-controller-manager部署

同样在部署主机上创建证书请求文件(为之后的证书生成做准备)根据上面的证书文件创建证书(结果会在当前目录下产生kube-controller-manager证书)创建kube-controller-manager服务配置文件创建kube-controller-manager服务启动文件同步kube-controller-manager证书到对应mast…

教程 | i.MX RT1180 ECAT_digital_io DEMO 搭建(一)

本文介绍 i.MX RT1180 EtherCAT digital io DEMO 搭建,Master 使用 TwinCAT ,由于步骤较多,分为上下两篇,本文为第一篇,主要介绍使用 TwinCAT 控制前的一些准备。 原厂 SDK 提供了 evkmimxrt1180_ecat_examples_digit…

ubuntu22.40安装及配置静态ip解决重启后配置失效

遇到这种错误,断网安装即可! 在Ubuntu中配置静态IP地址的步骤如下。根据你使用的Ubuntu版本(如 Netplan 或传统的 ifupdown),配置方法有所不同。以下是基于 Netplan 的配置方法(适用于Ubuntu 17.10及更高版…

服务端渲染技术

一.JSP 1.jsp介绍,全称是java Server Pages ,java服务器页面,就是服务端渲染技术,html只能为用户提供静态数据,而JSP技术允许在页面中嵌套 java代码,jsp技术基于Servlet,Servlet很难对数据进行排版,而jsp就可以,可以理解为jsp就是对Servlet的包装. 2.jsp程序本质是java程序,无…

[23] cuda应用之 nppi 实现图像缩放

[23] cuda应用之 nppi 实现图像缩放 NPP(NVIDIA Performance Primitives)是一个由 NVIDIA 提供的库,专门用于加速图像和信号处理任务。NPP 提供了许多高效的图像处理函数,包括图像缩放。使用 NPP 实现图像缩放可以充分利用 GPU 的…

【产品经理学习案例——AI翻译棒出海业务】

前言: 本文主要讲述了硬件产品在出海过程中,翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家,需要优化翻译质量和算法,关注市场需求和文化差异,以便更好地满足当地用户的需求。同…

CH340G上传程序到ESP8266-01(S)模块

文章目录 概要ESP8266模块外形尺寸模块原理图模块引脚功能 CH340G模块外形及其引脚模块引脚功能USB TO TTL引脚 程序上传接线Arduino IDE 安装ESP8266开发板Arduino IDE 开发板上传失败上传成功 正常工作 概要 使用USB TO TTL(CH340G)将Arduino将程序上传…

1.4 Go 数组

一、数组 1、简介 数组是切片的基础 数组是一个固定长度、由相同类型元素组成的集合。在 Go 语言中,数组的长度是类型的一部分,因此 [5]int 和 [10]int 是两种不同的类型。数组的大小在声明时确定,且不可更改。 简单来说,数组…

AI推理性能之王-Groq公司开发的LPU芯片

Groq公司开发的LPU(Language Processing Unit,语言处理单元)芯片是一种专为加速大规模语言模型(LLM)和其他自然语言处理任务而设计的新型AI处理器。以下是对其技术特点、性能优势及市场影响的深度介绍: 技…

C#中的委托(Delegate)

什么是委托? 首先,我们要知道C#是一种强类型的编程语言,强类型的编程语言的特性,是所有的东西都是特定的类型 委托是一种存储函数的引用类型,就像我们定义的一个 string str 一样,这个 str 变量就是 string 类型. 因为C#中没有函数类型,但是可以定义一个委托类型,把这个函数…