STM32笔记 (十三)定时器输入捕获(利用定时器捕获高电平时间)
简介
定时器的输入捕获可以用来测量脉冲宽度与PWM的输入测量,可以通过设置检测不同的跳变边沿,来实现对高低电平的计时捕获
框图
由图可知,初始化定时器进行输入捕获有以下步骤:
- 开启时钟,配置定时器的GPIO
- 设置输入捕获滤波器,也就是设置采集几次才有效,就是滤去抖动,由 CCMRx–ICxF 设置
其中的f_DTS由CR1-CKD设置
- 设置输入捕获极性,高电平有效还是低电平有效, CCER–CCxP
- 设置输入捕获映射通道,一个通道的信号可以映射到不同的通道上(交叉映射) CCMRx–CCxS
- 设置输入分频器,每几个事件触发一次捕获,CCMRx–ICxPSC,不分频的话每一个上升沿都触发一次捕获,将计数器的值捕获到捕获寄存器CCRx中
- 开启定时器的更新中断和捕获中断(配置NVIC) SR-CCxIE SR-UIE
- 编写定时器中断服务函数
原理
配置完定时器输入捕获的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笔记 (十三)定时器输入捕获(利用定时器捕获高电平时间)相关推荐
- 判断STM32 GPIO输入口的输入状态(高电平或低电平)
判断STM32 GPIO输入口的输入状态(高电平或低电平) 以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE->IDR& GPIO_IDR_IDR2) { 函数体 ...
- 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云 邮箱: happyl ...
- 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
上一节我们讲解了键盘消息处理相关的知识.键盘加鼠标作为目前人机交互方式依旧的主流,在讲完键盘消息处理之后接着讲鼠标消息处理,自然是理所当然的. 这一节主要介绍各种鼠标消息的处理方式以及一些相关函数的运 ...
- 8、TM4单片机的滴答定时器,及利用定时器精确延时
在我们日常使用单片机的时候,延时一般采用循环的方式,但是这样的方式只能用于粗略的延时,但我们需要精准的时间控制的时候,便需要利用定时器获得精确的延时. 本次采用TM4内的滴答定时器. 文章目录 1.滴 ...
- 【STM32】【STM32CubeMX】STM32CubeMX的使用之七:定时器输入捕获实现超声波测距
文章目录 0.前言 1.硬件设计 1.1.超声波模块 1.2.STM32L151 2.CubeMX配置 3.软件设计 下载工程文件: https://gitee.com/Joseph_Coop ...
- STM32-通用定时器-输入捕获
1.概述 前面,我们介绍了STM32F1的通用定时器作为PWM输出的使用方法,这一章我们向大家介绍通用定时器作为输入捕获的使用.在本章中,我们将用TIM5的通道的通道1(PA0)来做输入捕获, 捕获 ...
- STM32F4_定时器输入捕获详解
目录 1. 输入捕获简介 2. 输入捕获框图 3. 输入捕获模式 4. 相关寄存器 4.1 TIMx_ARR.TIMx_PSC 4.2 捕获/比较寄存器1:TIMx_CCMR1 4.3 捕获/比较使能 ...
- 通用定时器——输入捕获实验
输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能. STM32 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿 ...
- STM32F103定时器输入捕获功能
STM32F103单片机的定时器不仅能输出PWM波,而且还能捕获输入的PWM波.可以通过定时器的捕获功能测量输入PWM波的周期和占空比.其中定时器的输入捕获功能如下: 在输入捕获模式下,当检测 ...
最新文章
- “移花接木”偷换广告:HTTPS劫匪木马每天打劫200万次网络访问
- python 在内网windows环境下pip三方包
- windows 下 logstash 安装启动
- 实车采集的数据重建场景_SIGGRAPH | 多机器人协同三维场景重建
- MFC使用CCommandLineInfo处理命令行
- 如何创建虚拟硬盘 + os 读取硬盘参数代码
- php用不了for循环吗,php中的这两个for循环有什么区别吗?
- 计算机学院足球队 英语怎么说,计算机学院举办2018届毕业生足球赛
- 系统架构师学习笔记-基于构件的开发
- 创建主机地址 (A) DNS 记录
- python中serial模块的使用_python中pyserial模块使用方法
- java里包含怎么算_java中怎么判断一个字符串中包含某个字符或字符串
- ansible的playbook进行yum批量安装nginx最新版本
- R语言ETL工程系列:读写(read/write)
- NAT技术与代理服务器
- 分享个B端竞品分析报告
- C#实现一个局域网文件传输工具
- E盾网络验证企业版个人版离线版对接好的自绘界面4加密防破解易语言源码加密
- 《编码:隐匿在计算机软硬件背后的语言》读书笔记整理总结
- 栈区的使用规则、压栈和出栈、栈区先进后出,后进先出
热门文章
- Java Part1 Day11继承 方法重写 super多态
- 寒假程序翻译1.27
- 戴尔inspiron5498清灰教程
- WordCount的理解与MapReduce的执行过程
- 东方证券首席架构师樊建:企业微服务架构转型实践
- 数据管理的热点话题:数据资产、数据价值、数据驱动、数据管理和数字化转型
- 一文读懂rawRGB、RGB和YUV数据格式与转换
- ASP.NET与.NET Framework和C#的关系
- cost的导函数_几种常见函数的导数
- 非期望产出的sbm模型_兼顾非期望产出的工业用地效率测度、分异与溯因 ——以东北三省为例...