stm32 输入捕获
2017-08-13 13:48
302 查看
根据定时器的计数频率,我们就可以算出t1-t2的时间,从而得到高电平脉宽
计算公式
N * ARR + CCRx2
首先设置定时器通道为上升沿捕获,这样在t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置定时器通道为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的CNT值,记为CCRx2
输入捕获配置步骤
1.使能定时器时钟
2.使能GPIO时钟,配置引脚模式
3.初始化定时器参数,预分频器的值、自动重装载的值等设定
4.设置通用定时器的输入捕获参数,开启输入捕获功能
5.开启捕获和定时器溢出中断
6.初始化NVIC外设,设置定时器中断优先级
7.使能定时器
8.编写定时器中断处理函数
举例
typedef struct { uint16_t TIM_Channel; //通道 uint16_t TIM_ICPolarity; //捕获极性 uint16_t TIM_ICSelection; //直接/间接映射 uint16_t TIM_ICPrescaler; //分频因子 uint16_t TIM_ICFilter; //滤波 } TIM_ICInitTypeDef; #define ICPolarity_Rising 0x40 #define ICPolarity_Falling 0x80 #define Capture1_Max 0x3f void TIM5_IRQHandler() { if(TIM_GetITStatus(TIM5, TIM_IT_Update) == SET) //产生更新中断 { if((TIM_sta & ICPolarity_Falling) == ICPolarity_Falling) //低电平捕获中 { if((TIM_sta & Capture1_Max) == Capture1_Max) //达到计数值上限 { TIM_sta = ICPolarity_Falling; } else { TIM_sta++; //更新次数 } } } if(TIM_GetITStatus(TIM5, TIM_IT_CC1) == SET) { if((TIM_sta & ICPolarity_Falling) == ICPolarity_Falling) //捕获到低电平 { TIM_sta |= ICPolarity_Rising; Capture1_val = TIM_GetCapture1(TIM5); //保存捕获值 TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising); //设置上升沿捕获 } else { TIM_sta = ICPolarity_Falling; TIM_Cmd(TIM5, DISABLE); TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Falling); //设置下降沿捕获 TIM_SetCounter(TIM5, 0); //计数器值清零 TIM_Cmd(TIM5, ENABLE); } } TIM_ClearITPendingBit(TIM5, TIM_IT_Update | TIM_IT_CC1); } void KEY_TIM5_init(u16 period, u16 prescaler) { TIM_TimeBaseInitTypeDef tim_tb = {0}; TIM_ICInitTypeDef tim_ic = { TIM_Channel_1, //通道1 TIM_ICPolarity_Rising, //上升沿 TIM_ICSelection_DirectTI, //直接映射 TIM_ICPSC_DIV1, //1分频 0 }; NVIC_InitTypeDef nvic = { TIM5_IRQn, 2, 2, ENABLE }; GPIO_InitTypeDef gpio = { GPIO_Pin_0, GPIO_Speed_50MHz, GPIO_Mode_IPD //下拉输入模式 }; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_Init(GPIOA, &gpio); tim_tb.TIM_Prescaler = prescaler; tim_tb.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 tim_tb.TIM_Period = period; tim_tb.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5, &tim_tb); //初始化定时器 TIM_ICInit(TIM5, &tim_ic); //设置通用定时器的输入捕获参数 TIM_ITConfig(TIM5, TIM_IT_Update | TIM_IT_CC1, ENABLE); //开启捕获和定时器溢出中断 NVIC_Init(&nvic); //初始化NVIC TIM_Cmd(TIM5, ENABLE); //使能定时器 } int main(void) { KEY_TIM5_init(0xffff, 72 - 1); while(1) { if((TIM_sta & ICPolarity_Rising) == ICPolarity_Rising) //捕获到低电平 { res_data = TIM_sta & Capture1_Max; res_data *= 0xffff; res_data += Capture1_val; printf("高电平持续时间 %d um.\n", res_data); TIM_sta = 0; } } }
相关文章推荐
- STM32输入捕获
- STM32学习笔记一一输入捕获
- STM32输入捕获模式
- STM32基础知识1-stm32PWM输入捕获模式详解
- STM32输入捕获简介
- STM32输入捕获简介
- STM32F0xx_TIM输入捕获(计算频率)配置详细过程
- STM32的输入捕获
- STM32 输入捕获
- STM32 HAL库 定时器输入捕获功能
- STM32输入捕获简介
- STM32输入捕获简介
- STM32 F207的PWM输入捕获频率和占空比
- STM32定时器 输入捕获实现双边沿检测
- stm32输入捕获输出比较
- STM32输入捕获简介
- stm32单个定时器多通道输入捕获
- STM32输入捕获之触摸按键开发
- STM32F0xx_TIM输入捕获(计算频率)配置详细过程
- STM32 定时器输入捕获注意点