STM32利用捕获功能完成脉冲宽度测量
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_ TIM5,ENABLE);//使能 TIM5 时
钟而 TIM5 的 CH1 通道对应的管脚是 PA0 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//
管脚设置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_ IPD;//设置下拉输入模式
如果使用TIM5和PA0作为捕获引脚
(4)开启捕获和定时器溢出(更新)中断 假如我们需要检测输入信号的高电平脉宽,就
需要在第一次上升沿到来时捕获一次,然后设 置为下降沿捕获,等到下降沿到来时又捕获一 次。如果输入信号的高电平脉宽比较长,那么 定时器就可能溢出,所以需要对定时器溢出进 行处理,否则计算的高电平时间将不准。所以 需要开启定时器溢出中断。
简介
输入捕获的工作原理比较简单,在输入捕 获模式下,当相应的 ICx 信号检测到跳变沿 后,将使用捕获/比较寄存器(TIMx_CCRx)来 锁存计数器的值。从而完成一次捕获。同 时还可以配置捕获时是否触发中断/DMA 等。
捕获原理
t1-t2 时间就是我们需要测量的 高电平时间,假如定时器工作 在向上计数模式,测量方法是: 首先设置定时器通道 x 为上升沿 捕获,这样在 t1 时刻,就会捕 获到当前的 CNT 值,然后立即 清零 CNT,并设置通道 x 为下降 沿捕获,这样到 t2 时刻,又会 发生捕获事件,得到此时的 CNT 值记为 CCRx2。根据定时器的计 数频率,我们就可以算出 t1-t2 的时间
如果使用TIM5和PA0作为捕获引脚
(7)使能定时器 前面几个步骤已经将定时器输入捕获配置
好,但还不能正常使用,只有开启定时器 了才能让它正常工作,开启定时器的库函 数如下:
void TIM_Cmd(TIM_TypeDef* TIMx, Fu源自文库ctionalState NewState);
使能TIM5的函数是 TIM_Cmd(TIM5,ENABLE); //开启定时器
输入捕获配置步骤
(1)使能定时器及端口时钟,并设置引脚 模式等。
因为输入捕获也是通用定时器的一个功能, 所以需要使能相应定时器时钟。由于输入 捕获通道是对应着 STM32F1 芯片的 IO 口, 所以需要使能对应的端口时钟,并将对应 IO 口设置为输入模式功能。
如果使用TIM5和PA0作为捕获引脚
GPIO_Init(GPIOA,&GPIO_InitStructure); //初 始化结构体
如果使用TIM5和PA0作为捕获引脚
(2)初始化定时器参数,包含自动重装值,分频系数,计 数方式等
要使用定时器功能,必须对定时器内相关参数初始化,其 库函数如下:
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInit TypeDef*TIM_TimeBaseInitStruct);
利用捕获功能完成脉冲宽带测量
Stm32定时器应用
简介
在定时器中我们介绍了通用定时器具有多 种功能,输入捕获就是其中一种。STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器 都具有输入捕获功能。输入捕获可以对输 入的信号的上升沿,下降沿或者双边沿进 行捕获,通常用于测量输入信号的脉宽、 测量 PWM 输入信号的频率及占空比。
如果使用TIM5和PA0作为捕获引脚
(6)编写定时器中断服务函数 最后我们还需要编写一个定时器中断服务函数,通过中断函数
处理定时器产生的相关中断。TIM5 中断函数名如下: TIM5_IRQHandler 因为定时器的中断类型有很多,所以进入中断后,我们需要在
中断服务函数开头处判断是哪种类型,根据不同中断类型完成 相应功能,比如我们需要在捕获中断内完成捕获成功记录,更 新中断内完成溢出次数的累计。中断状态标志位的函数如下: ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
极性 TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //分频系
数
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;// 直接映射到 TI1
TIM_ICInit(TIM5,&TIM_ICInitStructure);
(3)设置通用定时器的输入捕获参数,开启输入捕获功 能
初始化定时器后,需要设置对应输入捕获通道参数,比如 输入通道、滤波、分频系数、映射关系、捕获极性等。输 入捕获参数初始化函数如下:
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
如果使用TIM5和PA0作为捕获引脚
如果我们需要配置 TIM5 的通道 1 为输入捕获功能,并且为上 升沿捕获、不分频、直接映射到 TI,可以如下配置:
TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //通道 1 TIM_ICInitStructure.TIM_ICFilter=0x00; //滤波 TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕获
如果使用TIM5和PA0作为捕获引脚
假如我们要开启 TIM5 的捕获中断和定时器溢 出中断,调用函数如下:
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,E NABLE);
(5)设置定时器中断优先级,使能定时器中 断通道在上一步我们已经使能了定时器的捕获 和更新中断,只要使用到中断,就必需对 NVIC 初始化,NVIC 初始化库函数是 NVIC_Init()
钟而 TIM5 的 CH1 通道对应的管脚是 PA0 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//
管脚设置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_ IPD;//设置下拉输入模式
如果使用TIM5和PA0作为捕获引脚
(4)开启捕获和定时器溢出(更新)中断 假如我们需要检测输入信号的高电平脉宽,就
需要在第一次上升沿到来时捕获一次,然后设 置为下降沿捕获,等到下降沿到来时又捕获一 次。如果输入信号的高电平脉宽比较长,那么 定时器就可能溢出,所以需要对定时器溢出进 行处理,否则计算的高电平时间将不准。所以 需要开启定时器溢出中断。
简介
输入捕获的工作原理比较简单,在输入捕 获模式下,当相应的 ICx 信号检测到跳变沿 后,将使用捕获/比较寄存器(TIMx_CCRx)来 锁存计数器的值。从而完成一次捕获。同 时还可以配置捕获时是否触发中断/DMA 等。
捕获原理
t1-t2 时间就是我们需要测量的 高电平时间,假如定时器工作 在向上计数模式,测量方法是: 首先设置定时器通道 x 为上升沿 捕获,这样在 t1 时刻,就会捕 获到当前的 CNT 值,然后立即 清零 CNT,并设置通道 x 为下降 沿捕获,这样到 t2 时刻,又会 发生捕获事件,得到此时的 CNT 值记为 CCRx2。根据定时器的计 数频率,我们就可以算出 t1-t2 的时间
如果使用TIM5和PA0作为捕获引脚
(7)使能定时器 前面几个步骤已经将定时器输入捕获配置
好,但还不能正常使用,只有开启定时器 了才能让它正常工作,开启定时器的库函 数如下:
void TIM_Cmd(TIM_TypeDef* TIMx, Fu源自文库ctionalState NewState);
使能TIM5的函数是 TIM_Cmd(TIM5,ENABLE); //开启定时器
输入捕获配置步骤
(1)使能定时器及端口时钟,并设置引脚 模式等。
因为输入捕获也是通用定时器的一个功能, 所以需要使能相应定时器时钟。由于输入 捕获通道是对应着 STM32F1 芯片的 IO 口, 所以需要使能对应的端口时钟,并将对应 IO 口设置为输入模式功能。
如果使用TIM5和PA0作为捕获引脚
GPIO_Init(GPIOA,&GPIO_InitStructure); //初 始化结构体
如果使用TIM5和PA0作为捕获引脚
(2)初始化定时器参数,包含自动重装值,分频系数,计 数方式等
要使用定时器功能,必须对定时器内相关参数初始化,其 库函数如下:
voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInit TypeDef*TIM_TimeBaseInitStruct);
利用捕获功能完成脉冲宽带测量
Stm32定时器应用
简介
在定时器中我们介绍了通用定时器具有多 种功能,输入捕获就是其中一种。STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器 都具有输入捕获功能。输入捕获可以对输 入的信号的上升沿,下降沿或者双边沿进 行捕获,通常用于测量输入信号的脉宽、 测量 PWM 输入信号的频率及占空比。
如果使用TIM5和PA0作为捕获引脚
(6)编写定时器中断服务函数 最后我们还需要编写一个定时器中断服务函数,通过中断函数
处理定时器产生的相关中断。TIM5 中断函数名如下: TIM5_IRQHandler 因为定时器的中断类型有很多,所以进入中断后,我们需要在
中断服务函数开头处判断是哪种类型,根据不同中断类型完成 相应功能,比如我们需要在捕获中断内完成捕获成功记录,更 新中断内完成溢出次数的累计。中断状态标志位的函数如下: ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
极性 TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //分频系
数
TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;// 直接映射到 TI1
TIM_ICInit(TIM5,&TIM_ICInitStructure);
(3)设置通用定时器的输入捕获参数,开启输入捕获功 能
初始化定时器后,需要设置对应输入捕获通道参数,比如 输入通道、滤波、分频系数、映射关系、捕获极性等。输 入捕获参数初始化函数如下:
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
如果使用TIM5和PA0作为捕获引脚
如果我们需要配置 TIM5 的通道 1 为输入捕获功能,并且为上 升沿捕获、不分频、直接映射到 TI,可以如下配置:
TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //通道 1 TIM_ICInitStructure.TIM_ICFilter=0x00; //滤波 TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//捕获
如果使用TIM5和PA0作为捕获引脚
假如我们要开启 TIM5 的捕获中断和定时器溢 出中断,调用函数如下:
TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,E NABLE);
(5)设置定时器中断优先级,使能定时器中 断通道在上一步我们已经使能了定时器的捕获 和更新中断,只要使用到中断,就必需对 NVIC 初始化,NVIC 初始化库函数是 NVIC_Init()