日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

旋转编码器消抖程序设计

發(fā)布時間:2024/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 旋转编码器消抖程序设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

話不多說,先上效果圖看下先

圖中可看到正轉(zhuǎn)和反轉(zhuǎn)之間沒有任何一個干擾信號

STM32輸入捕獲初始化配置程序
因為檢測原理和中斷輸入一樣,所以也可設(shè)為中斷輸入

#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 清除之前設(shè)置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PA0 輸入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化定時器5 TIM5 TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)定計數(shù)器自動重裝值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //預(yù)分頻器 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設(shè)置時鐘分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位//初始化TIM5輸入捕獲參數(shù)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; //先占優(yōu)先級2級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //從優(yōu)先級0級NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器 TIM_ITConfig(TIM5,TIM_IT_CC1,ENABLE);//允許CC1IE捕獲中斷 TIM_Cmd(TIM5,ENABLE ); //使能定時器5TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 設(shè)置為下降沿捕獲 }

旋轉(zhuǎn)編碼器的定時器中斷處理程序

_Bool TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài),標(biāo)志上升沿還是下降沿 _Bool bit=0; //打印輸出標(biāo)志位 _Bool dt=0; //第一次下降沿時DT相記錄標(biāo)志位 u8 state=0; //正反轉(zhuǎn)狀態(tài)位, 2、4正轉(zhuǎn), 1、3反轉(zhuǎn) u16 num=0; //計數(shù)//定時器5中斷服務(wù)程序 void TIM5_IRQHandler(void) { if(TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕獲1發(fā)生捕獲事件{ if(TIM5CH1_CAPTURE_STA==0) //如果為捕獲下降沿{dt=DT; //記錄發(fā)生下降沿后第一時間的DT相電平if(CLK==0){ //重新判斷CLK相電平是否為低delay_ms(1); //延時消抖if(CLK==0){ //再次判斷CLK相電平是否為低if(dt) //判斷發(fā)生下降沿后第一時間的DT相電平,為高電平則記錄狀態(tài)標(biāo)志為正轉(zhuǎn)state=2;else //為低電平則記錄狀態(tài)標(biāo)志為反轉(zhuǎn)state=1;TIM5CH1_CAPTURE_STA=1; //輸入捕獲狀態(tài)設(shè)為上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //設(shè)置為上升沿捕獲} } }if(TIM5CH1_CAPTURE_STA==1) //如果為捕獲上升沿{ dt=DT; //記錄發(fā)生上升沿后第一時間的DT相電平if(CLK==1){ //重新判斷CLK相電平是否為高delay_us(300); //延時消抖if(CLK==1){ //再次判斷CLK相電平是否為高if((dt==0) && (state==2)){ //判斷發(fā)生上升沿后第一時間的DT相電平,為低電平且下降沿時記錄的狀態(tài)也為正轉(zhuǎn)狀態(tài)//則記錄狀態(tài)標(biāo)志為正轉(zhuǎn) state=4;num++;bit=1; //打印狀態(tài)位置1輸出}else if((dt==1) && (state==1)){ //判斷發(fā)生上升沿后第一時間的DT相電平,為高電平且下降沿時記錄的狀態(tài)為反轉(zhuǎn)狀態(tài)//則記錄狀態(tài)標(biāo)志為反轉(zhuǎn)num--;state=3;bit=1;}TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài)設(shè)為上升沿TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //設(shè)置為上升沿捕獲 } } }} TIM_ClearITPendingBit(TIM5, TIM_IT_CC1); //清除中斷標(biāo)志位 }

_Bool是C99中支持的布爾變量類型

總結(jié)

以上是生活随笔為你收集整理的旋转编码器消抖程序设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。