简介

定时器的输入捕获可以用来测量脉冲宽度PWM的输入测量,可以通过设置检测不同的跳变边沿,来实现对高低电平的计时捕获

框图


由图可知,初始化定时器进行输入捕获有以下步骤:

  1. 开启时钟,配置定时器的GPIO
  2. 设置输入捕获滤波器,也就是设置采集几次才有效,就是滤去抖动,由 CCMRx–ICxF 设置

    其中的f_DTS由CR1-CKD设置
  3. 设置输入捕获极性,高电平有效还是低电平有效, CCER–CCxP
  4. 设置输入捕获映射通道,一个通道的信号可以映射到不同的通道上(交叉映射) CCMRx–CCxS
  5. 设置输入分频器,每几个事件触发一次捕获,CCMRx–ICxPSC,不分频的话每一个上升沿都触发一次捕获,将计数器的值捕获到捕获寄存器CCRx中
  6. 开启定时器的更新中断和捕获中断(配置NVIC) SR-CCxIE SR-UIE
  7. 编写定时器中断服务函数

原理

配置完定时器输入捕获的GPIO,时钟,TIM初始化结构体后,

  • 如果设置成上升沿捕获,那么单信号由下降沿跳变到上升沿时,就会触发定时器把此时计数器的值CNT锁存到输入/捕获寄存器CCRx中
  • 然后再设置下降沿捕获信号就可以把高电平持续时间内计数器CNT所累加的值锁存到输入/捕获寄存器CCRx中
  • 两次相减,就能得到高电平持续时间内计数器所增加的值
  • 结合所设置的分配系数psc以及自动重装载寄存器ARR的值,就能得到所测得的高电平时间是多少
  • 要注意在计时期间定时器是否溢出以及溢出的次数,这些都要参与运算

程序

void TIM_CapInit(u16 arr,u16 psc){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM5_ICInitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIM5时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOA, &GPIO_InitStructure); //采用的是PA0用来输入GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0设置成低电平//初始化定时器5 TIM5TIM_TimeBaseStructure.TIM_Period = arr;                     //设定计数器自动重装值TIM_TimeBaseStructure.TIM_Prescaler = psc;                  //预分频器TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);             //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//初始化TIM5输入捕获参数TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1;                //CC1S=01  选择输入端 IC1映射到TI1上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;     //上升沿捕获TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;           //配置输入分频,不分频TIM5_ICInitStructure.TIM_ICFilter = 0x00;                        //IC1F=0000 配置输入滤波器 不滤波TIM_ICInit(TIM5, &TIM5_ICInitStructure);//中断分组初始化NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;           //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //从优先级0级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //IRQ通道被使能NVIC_Init(&NVIC_InitStructure);                           //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_ITConfig(TIM5, TIM_IT_Update | TIM_IT_CC1, ENABLE); //允许更新中断 ,允许CC1IE捕获中断TIM_Cmd(TIM5, ENABLE); //使能定时器5
}u8 overload=0;  //定时器溢出计数
u8 capture_buf[2];  //定时捕获值容器
u8 capture_status=0; //定时捕获状态
u32 high_time;  //高电平时间void TIM5_IRQHandler(void)
{if ((TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) & capture_status)//在测量高电平期间产生更新中断{overload++;}if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)  //触发捕获{switch (capture_status){case 0: //第一个状态  捕获到高电平TIM_SetCounter(TIM5, 0); //将当前计数器的值CNT设置成0TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Falling);//设置成下降沿捕获capture_status = 1;//切换到下一个状态break;case 1://第二个状态  捕获到低电平capture_val = TIM_GetCapture1(TIM5); //获取当前CCR1的值 也就是高电平的时间(不包含溢出的时间)high_time = capture_val + 65536 * overload;  //计算高电平的时间 包含高电平定时器溢出的时间printf("%d us", high_time); //将结果打印出来//重新初始化 准备下一次捕获overload = 0;  capture_val = 0;high_time = 0;capture_status = 0;TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising);//设置成上升沿捕获break;}}TIM_ClearITPendingBit(TIM5, TIM_IT_CC1 | TIM_IT_Update); //清除中断标志位
}

STM32笔记 (十三)定时器输入捕获(利用定时器捕获高电平时间)相关推荐

  1. 判断STM32 GPIO输入口的输入状态(高电平或低电平)

    判断STM32 GPIO输入口的输入状态(高电平或低电平) 以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE->IDR& GPIO_IDR_IDR2) { 函数体 ...

  2. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云    邮箱: happyl ...

  3. 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理

    上一节我们讲解了键盘消息处理相关的知识.键盘加鼠标作为目前人机交互方式依旧的主流,在讲完键盘消息处理之后接着讲鼠标消息处理,自然是理所当然的. 这一节主要介绍各种鼠标消息的处理方式以及一些相关函数的运 ...

  4. 8、TM4单片机的滴答定时器,及利用定时器精确延时

    在我们日常使用单片机的时候,延时一般采用循环的方式,但是这样的方式只能用于粗略的延时,但我们需要精准的时间控制的时候,便需要利用定时器获得精确的延时. 本次采用TM4内的滴答定时器. 文章目录 1.滴 ...

  5. 【STM32】【STM32CubeMX】STM32CubeMX的使用之七:定时器输入捕获实现超声波测距

    文章目录 0.前言 1.硬件设计 1.1.超声波模块 1.2.STM32L151 2.CubeMX配置 3.软件设计   下载工程文件:   https://gitee.com/Joseph_Coop ...

  6. STM32-通用定时器-输入捕获

    1.概述 前面,我们介绍了STM32F1的通用定时器作为PWM输出的使用方法,这一章我们向大家介绍通用定时器作为输入捕获的使用.在本章中,我们将用TIM5的通道的通道1(PA0)来做输入捕获, 捕获 ...

  7. STM32F4_定时器输入捕获详解

    目录 1. 输入捕获简介 2. 输入捕获框图 3. 输入捕获模式 4. 相关寄存器 4.1 TIMx_ARR.TIMx_PSC 4.2 捕获/比较寄存器1:TIMx_CCMR1 4.3 捕获/比较使能 ...

  8. 通用定时器——输入捕获实验

    输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能. STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿 ...

  9. STM32F103定时器输入捕获功能

      STM32F103单片机的定时器不仅能输出PWM波,而且还能捕获输入的PWM波.可以通过定时器的捕获功能测量输入PWM波的周期和占空比.其中定时器的输入捕获功能如下:   在输入捕获模式下,当检测 ...

最新文章

  1. “移花接木”偷换广告:HTTPS劫匪木马每天打劫200万次网络访问
  2. python 在内网windows环境下pip三方包
  3. windows 下 logstash 安装启动
  4. 实车采集的数据重建场景_SIGGRAPH | 多机器人协同三维场景重建
  5. MFC使用CCommandLineInfo处理命令行
  6. 如何创建虚拟硬盘 + os 读取硬盘参数代码
  7. php用不了for循环吗,php中的这两个for循环有什么区别吗?
  8. 计算机学院足球队 英语怎么说,计算机学院举办2018届毕业生足球赛
  9. 系统架构师学习笔记-基于构件的开发
  10. 创建主机地址 (A) DNS 记录
  11. python中serial模块的使用_python中pyserial模块使用方法
  12. java里包含怎么算_java中怎么判断一个字符串中包含某个字符或字符串
  13. ansible的playbook进行yum批量安装nginx最新版本
  14. R语言ETL工程系列:读写(read/write)
  15. NAT技术与代理服务器
  16. 分享个B端竞品分析报告
  17. C#实现一个局域网文件传输工具
  18. E盾网络验证企业版个人版离线版对接好的自绘界面4加密防破解易语言源码加密
  19. 《编码:隐匿在计算机软硬件背后的语言》读书笔记整理总结
  20. 栈区的使用规则、压栈和出栈、栈区先进后出,后进先出

热门文章

  1. Java Part1 Day11继承 方法重写 super多态
  2. 寒假程序翻译1.27
  3. 戴尔inspiron5498清灰教程
  4. WordCount的理解与MapReduce的执行过程
  5. 东方证券首席架构师樊建:企业微服务架构转型实践
  6. 数据管理的热点话题:数据资产、数据价值、数据驱动、数据管理和数字化转型
  7. 一文读懂rawRGB、RGB和YUV数据格式与转换
  8. ASP.NET与.NET Framework和C#的关系
  9. cost的导函数_几种常见函数的导数
  10. 非期望产出的sbm模型_兼顾非期望产出的工业用地效率测度、分异与溯因 ——以东北三省为例...