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

news/2025/2/8 21:12:08 标签: 蓝桥杯, c++, 学习, 教程, 嵌入式软件

上一篇博客我们提到了定时器产生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.niftyadmin.cn/n/5845288.html

相关文章

【Linux网络编程】谈谈网络编程中的select、poll、epoll、Reactor、Proactor模型(下)

本文目录 一、IO多路复用第二版(epoll)二、epoll三大核心接口1、epoll_create()2、epoll_ctl()3、epoll_wait()4、epoll简单实例5、epoll的ET模式和LT模式6、epoll内核实现 三、异步IO四、Linux惊群效应与c10K问题五、主流网络模型介绍1、基于Thread-bas…

quartus24.1版本子模块因时钟问题无法综合通过,FPGA过OOC问题复盘

因为只负责一个子模块,所以需要单独对该子模块进行综合和过OOC,这时候已经有一些加虚拟pin文件,敲命令让子模块能过OOC的方法。但这个方法的前提是先过综合,然后再敲命令让虚拟管脚命令成功,最终可以过OOC。 今天负责…

【电商系统架构的深度剖析与技术选型】

以下是对电商系统架构的深度剖析与技术选型: 一、电商系统架构剖析 整体架构 前台系统:是用户直接交互的部分,包括用户界面、商品展示、购物车、订单结算等模块。需注重用户体验,确保页面设计美观、商品信息清晰、购物流程简便。…

荣耀内置的远程控制怎样用?荣耀如何远程控制其他品牌的手机?

荣耀手机没有内置的远程控制功能,倒是有一项内置的【远程守护】功能,可以共享定位。如果家里的老人、小孩都使用荣耀手机,那么可以共享定位,随时知道人在哪,避免走丢。 荣耀手机【远程守护】功能的使用步骤&#xff1a…

A2DP/HFP音频蓝牙模块+玩具,开启儿童成长智能时代

音频蓝牙模组在玩具中的应用非常常见,特别是在需要音频互动、音乐播放或语音功能的玩具中。 一、应用场景 1. 音乐播放玩具:玩具通过蓝牙连接主设备(如手机或平板),播放存储在主设备中的音乐或音效。 2. 语音互动玩具:玩具可以…

node.js的require()

2009年,Node.js 项目诞生,所有模块一律为 CommonJS 格式。 时至今日,Node.js 的模块仓库 npmjs.com ,已经存放了15万个模块,其中绝大部分都是 CommonJS 格式。 这种格式的核心就是 require 语句,模块通过…

FPGA实现SDI视频缩放转UltraScale GTH光口传输,基于GS2971+Aurora 8b/10b编解码架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的 SDI 编解码方案我这里已有的FPGA图像缩放方案 3、工程详细设计方案工程设计原理框图SDI 输入设备GS2971芯片BT1120转RGB…

【SQLite】设置本地时间戳默认值

使用CURRENT_TIMESTAMP创建,发现在部分运行环境时间不符,考虑用datetime(now, localtime)创建语句 CREATE TABLE logs (id INTEGER PRIMARY KEY,event TEXT,created_at TEXT DEFAULT CURRENT_TIMESTAMP -- 或 datetime(now, localtime) );在 SQLite 中&…