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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

旋转编码器ec11

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







定時器編碼器功能需要用到通道1(TI1)和通道2(TI2),小編使用的是自己畫的板子原理圖在上一期已附上,故得先對GPIO配置如下。
圖片
配置完GPIO后就可以配置定時器、中斷優(yōu)先級和定時器中斷服務(wù)函數(shù)了。
圖片
圖片
圖片
到此定時器編碼器功能就全部配置完畢了,下面就可以使用TIM_GetCounter(TIM2)直接讀取旋鈕值了;需要注意的是讀出來的值需要除以4,因為轉(zhuǎn)動一小格編碼旋鈕會產(chǎn)生如下波形(正轉(zhuǎn)),
圖片
從官方參考手冊下表很容易看出確實是一個脈沖記四個數(shù)。
圖片
好的,到現(xiàn)在我們就掌握了兩種方法來獲取編碼旋鈕的值了,小編沒有使用定時器獲取編碼旋鈕的值,是因為想要榨干編碼旋鈕的話后面還需要用到一個定時器,如果采用定時器去獲取編碼旋鈕的話,對STM32的資源消耗太大,對小編后期的開發(fā)影響較大。當(dāng)然如果大家做項目時對定時器消耗較小話,也可以采用這種方法。
(注:接下來的內(nèi)容與上一期緊密連接,沒有看上一期的朋友可以先看上一期)

二、快慢旋的判斷

需要判斷快慢旋的話,肯定就與時間緊密掛鉤了,這里就需要用到定時器了。整體思路就是旋轉(zhuǎn)編碼旋鈕鍵值在改變的同時給一個flage++,然后配置一個定時器中斷去判斷flage的大小,來判斷快慢旋,直接上代碼吧。

先配置一下定時器,這里定時時長會影響都后面對快慢旋判斷的閾值。
圖片
圖片
下面就是判斷處理了。每次旋轉(zhuǎn)編碼器鍵值得改變都是一個結(jié)構(gòu)體變量increment,同時不管正反旋都會給一個flage++。定時器中斷函數(shù)對flage判斷如果大于3則increment為10,反之則為1,同時給flage清零。至此我們的編碼旋鈕就可以判斷正反轉(zhuǎn)了。
圖片
圖片
三、PUSH BUTTON 按下時編碼旋鈕值

有前面的基礎(chǔ)這個相對就簡單起來的,直接上代碼講解吧。進入A中斷后首先是延時1MS再判斷A相是否為低電平(這里是消抖,上一期忘了和大家講hihi),消完抖后就是判斷PUSH BUTTON(KEYC)是否按下了。若為按下則改變Down_number否則改變number。
圖片

四、單、雙和長擊的判斷

單、雙和長擊的判斷就需要有一定的邏輯能力了,直接上代碼吧。
void EXTIC_IRQHandler(void)
{
if(EXTI_GetITStatus(EXYIC_Line) != RESET)
{
delay_ms(1);
if(KEYC0)
{
Encoder_Init.Encoder_Keep=0;
Encoder_Init.Encoder_Double=0;
Encoder_Init.Encoder_KEY=0;
Encoder_Init.Double_flage=300;
while(KEYC0&&Encoder_Init.Double_flage>0)
{
delay_ms(1);
Encoder_Init.Double_flage–;
}
if(Encoder_Init.Double_flage0)
{
Encoder_Init.Encoder_Keep=1;
}else
{
Encoder_Init.Double_flage=150;
while(KEYC1&&Encoder_Init.Double_flage>0)
{
delay_ms(1);
Encoder_Init.Double_flage–;
}
if(Encoder_Init.Double_flage>0)
{
Encoder_Init.Encoder_Double=1;
}else
{
Encoder_Init.Encoder_KEY=1;
}
}

}
}
EXTI_ClearITPendingBit(EXYIC_Line);
}

PUSH BUTTON配置的是下降沿觸發(fā)的外部中斷,進入中斷首先延時消抖,然后就是進入鍵值處理函數(shù)了,首先是給上一次的鍵值清零。然后給Double_flage賦值300然后判斷是否進入第一個while,按鍵一直按下且Double_flage大于零進入,while里面給Double_flage–,只有按鍵一直按著Double_flage才會為0,若按下就松手則直接跳過while。接下來判斷Double_flage,若為零表示300MS按鍵一直被按下,則Encoder_Keep賦值1 。否則進入判斷單雙擊,首先給Double_flage賦值150然后判斷是否進入下一個while,按鍵松開且Double_flage大于零進入,while里面給Double_flage–,其實也就是在你按鍵松開后在150ms內(nèi),按鍵是否被在此按下,按下則終止while。最后就是判斷Double_flage,若減為0就是松手后沒有檢測到在此按下,則Encoder_KEY賦值為1,反之Encoder_Double賦值為1 。





總結(jié)

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

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