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

蓝桥杯嵌入式第五课--输入捕获

前言

输入捕获的考题十分明确,就是测量输入脉冲波形的占空比和频率,对我们的板子而言,就是检测板载的两个信号发生器产生的信号:

具体来说就是使用PA15PB4来做输入捕获。

输入捕获原理简介

输入捕获能够对输入信号的上升沿和下降沿进行捕获,并且记录下捕获时定时器的数值以及触发中断。

借用一张图来阐明这个动作:

  1. 边沿触发,产生捕获中断

  1. 中断中读取当前的计数值CCR,并且将计数值清零

  1. 退出中断

因此通过计数值可以计算出高电平持续时间,这里面有一个溢出的问题,对于我们的信号发生器来说,其信号的频率比较高,计数器不会发生溢出,因此不需要考虑。

根据功能分为两类:

  1. 普通输入捕获(只能测频率)

  1. PWM输入模式(可以测频率和占空比)

普通输入捕获

一、CubeMX配置

以及

之后要记得打开中断:

二、Keil软件编写

  1. 开启捕获

HAL_TIM_IC_Start(&htim3,TIM_CHANNEL_1);

第一个参数是定时器句柄,在tim.c中定义,第二个参数是通道:

  1. 编写回调函数

    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3)  //判断是哪个定时器触发{if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)  //判断是哪个通道触发{Counter=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)+1;//获取计数值+1Freq=1000000/Counter;//计算频率}}
}

进入回调函数后,先判断定时器类型,再判断是哪个通道,完成之后再获取计数值,并且完成频率计算。

PWM输入捕获(双通道模式)

一、CubeMX配置

类似普通单通道输入捕获,这里就是将通道2的输入通道设置为简介模式,并且在下面的配置中,将其捕获的极性设置为下降沿:

双通道的原理借用下图展示:

我们只需要看一个周期,其它周期都一样,这样一来,通道一捕获的值为整个周期的持续时间,通道二捕获的值即为高电平的持续时间,这也为咱们的程序设计提供了依据。

二、Keil软件编写

  1. 开启捕获

HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);//开启CH1输入捕获中断        
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);//开启CH2输入捕获中断
  1. 编写中断回调函数

//输入捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3){if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){T_Count = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_1)+1;//得到周期值Freq = 1000000 / T_Count;Duty = (float)D_Count/T_Count * 100;}else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2){D_Count = HAL_TIM_ReadCapturedValue (htim,TIM_CHANNEL_2)+1;//得到占空比}                    }    
}

由于我们使用双通道模式,因此无论是启动操作还是回调函数,都必须要写两个通道,这样代码思路就十分明确,便于我们记忆。

总结

想要在比赛中正确地完成输入的捕获,我们需要掌握两点内容:

  1. CubeMX配置,只能通过不断练习来记忆

  1. Keil代码编写,主要记忆思路(启动捕获,中断回调函数编写)

对于程序的思路:

  • 首先启动捕获中断(HAL_TIM_IC_Start();)注意双通道要写两个

  • 其次回调函数编写(void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim))注意双通道时,一个通道测周期,一个通道测高电平持续时间。

http://www.lryc.cn/news/40645.html

相关文章:

  • Spring事务和事务传播机制
  • 基于OpenCV+CUDA实时视频抠绿、背景合成以及抠绿算法小结
  • MySQL 中的 UNION 语句
  • 高完整性系统工程(三): Logic Intro Formal Specification
  • 【linux】多线程概念详述
  • 【Java】P8 面向对象(3)方法 基本知识
  • js中null和undefined的区别
  • 【Linux】linux中的c++怎么调试?gdb的介绍和使用。
  • 提升Python代码性能的六个技巧
  • VI的常用命令
  • 【数据结构】万字深入浅出讲解单链表(附原码 | 超详解)
  • 无线WiFi安全渗透与攻防(五)之aircrack-ng破解WEP加密
  • MySQL中事务的相关问题
  • 推荐算法再次踩坑记录
  • STM32 (十五)MPU6050
  • 使用yarn,依赖报各种错误怎么办
  • 面试官:rem和vw有什么区别
  • 【GPT-4】GPT-4 相关内容总结
  • 5.springcloud微服务架构搭建 之 《springboot集成Hystrix》
  • 【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
  • 香港服务器遭受DDoS攻击后如何恢复运行?
  • 【Hive】配置
  • IP-GUARD如何强制管控电脑设置开机密码要符合密码复杂度?
  • 剑指 Offer II 031. 最近最少使用缓存
  • 44岁了,我从没想过在CSDN创作2年,会有这么大收获
  • 相位相参信号源的设计--示波器上的信号不稳定,来回跑?
  • Spring Boot 整合 RabbitMQ 多种消息模式
  • node多版本控制
  • Redis set集合
  • 漫画:什么是希尔排序算法?