欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

旋转编码器消抖程序设计

发布时间:2024/3/12 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 旋转编码器消抖程序设计 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

话不多说,先上效果图看下先

图中可看到正转和反转之间没有任何一个干扰信号

STM32输入捕获初始化配置程序
因为检测原理和中断输入一样,所以也可设为中断输入

#include "timer.h" #include "usart.h" #include "delay.h"#define CLK PAin(0) #define DT PAin(1)//定时器5通道1输入捕获配置 void TIM5_Cap_Init(u16 arr,u16 psc) { TIM_ICInitTypeDef TIM5_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIM5时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PA0 清除之前设置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PA0 输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化定时器5 TIM5 TIM_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_CC1,ENABLE);//允许CC1IE捕获中断 TIM_Cmd(TIM5,ENABLE ); //使能定时器5TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获 }

旋转编码器的定时器中断处理程序

_Bool TIM5CH1_CAPTURE_STA=0; //输入捕获状态,标志上升沿还是下降沿 _Bool bit=0; //打印输出标志位 _Bool dt=0; //第一次下降沿时DT相记录标志位 u8 state=0; //正反转状态位, 2、4正转, 1、3反转 u16 num=0; //计数//定时器5中断服务程序 void TIM5_IRQHandler(void) { if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获1发生捕获事件{ if(TIM5CH1_CAPTURE_STA==0) //如果为捕获下降沿{dt=DT; //记录发生下降沿后第一时间的DT相电平if(CLK==0){ //重新判断CLK相电平是否为低delay_ms(1); //延时消抖if(CLK==0){ //再次判断CLK相电平是否为低if(dt) //判断发生下降沿后第一时间的DT相电平,为高电平则记录状态标志为正转state=2;else //为低电平则记录状态标志为反转state=1;TIM5CH1_CAPTURE_STA=1; //输入捕获状态设为上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获} } }if(TIM5CH1_CAPTURE_STA==1) //如果为捕获上升沿{ dt=DT; //记录发生上升沿后第一时间的DT相电平if(CLK==1){ //重新判断CLK相电平是否为高delay_us(300); //延时消抖if(CLK==1){ //再次判断CLK相电平是否为高if((dt==0) && (state==2)){ //判断发生上升沿后第一时间的DT相电平,为低电平且下降沿时记录的状态也为正转状态//则记录状态标志为正转 state=4;num++;bit=1; //打印状态位置1输出}else if((dt==1) && (state==1)){ //判断发生上升沿后第一时间的DT相电平,为高电平且下降沿时记录的状态为反转状态//则记录状态标志为反转num--;state=3;bit=1;}TIM5CH1_CAPTURE_STA=0; //输入捕获状态设为上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为上升沿捕获 } } }} TIM_ClearITPendingBit(TIM5, TIM_IT_CC1); //清除中断标志位 }

_Bool是C99中支持的布尔变量类型

总结

以上是生活随笔为你收集整理的旋转编码器消抖程序设计的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。