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

备考蓝桥杯嵌入式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.lryc.cn/news/531986.html

相关文章:

  • 智能化转型2.0:从“工具应用”到“价值重构”
  • 机器学习之数学基础:线性代数、微积分、概率论 | PyTorch 深度学习实战
  • 9.PPT:儿童孤独症介绍【22】
  • 离散浣熊优化算法(DCOA)求解大规模旅行商问题(Large-Scale Traveling Salesman Problem,LTSP),MATLAB代码
  • Java 引入和使用jcharset,支持UTF-7字符集
  • rust安装笔记
  • 扣子平台的选择器节点:让智能体开发更简单,扣子免费系列教程(17)
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_sprintf_num 函数
  • Vue的状态管理:用响应式 API 做简单状态管理、状态管理库(Pinia )
  • AI工具如何辅助写文章(科研版)
  • LEED绿色建筑认证的重要意义
  • 阿里云 ubuntu22.04 中国区节点安装 Docker
  • 【kafka的零拷贝原理】
  • Linux环境部署DeepSeek大模型
  • React中key值的正确使用指南:为什么需要它以及如何选择
  • 21.2.1 基本操作
  • 车载以太网__传输层
  • 简单本地部署deepseek(软件版)
  • AI绘画:解锁商业设计新宇宙(6/10)
  • 20250202在Ubuntu22.04下使用Guvcview录像的时候降噪
  • cors跨域是如何做的?
  • 系统通解:超多视角理解
  • 最大矩阵的和
  • 深度学习 | 表示学习 | 卷积神经网络 | Batch Normalization 在 CNN 中的示例 | 20
  • 最短木板长度
  • 团体程序设计天梯赛-练习集——L1-034 点赞
  • 利用腾讯云cloud studio云端免费部署deepseek-R1
  • LabVIEW的智能电源远程监控系统开发
  • Docker深度解析:安装各大环境
  • 牛客 - 链表相加(二)