旋转编码器ec11
定時器編碼器功能需要用到通道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é)
- 上一篇: 地下水情监测仪应用库区安全行业
- 下一篇: 中国工业管道过滤器市场深度研究分析报告