就常用的EC11旋轉(zhuǎn)編碼器為例來分析
一開始我只是在示波器和數(shù)控電源上見到過旋轉(zhuǎn)編碼器,那時候我聽人說這叫數(shù)字電位器,就覺得很神奇,是什么結(jié)構(gòu)竟然可以讓一個“電位器”無限的轉(zhuǎn)下去。后來才知道汽車的車機(jī)上用的也是旋轉(zhuǎn)編碼器。
一、旋轉(zhuǎn)編碼器作為人機(jī)交互的輸入設(shè)備,最常用的是EC11(類似的還有EC12、EC16等)
具體電路分析如下
EC11測試電路原理圖.無外部上拉電阻.幾乎所有單片機(jī)IO口都可以設(shè)置為輸入上拉模式,也可以省略EC11的外部上拉電阻,但是我沒有這樣做。
在研究EC11的時序之前首先要了解一點(diǎn),EC11按旋轉(zhuǎn)的輸出動作可以分為兩種。一種是轉(zhuǎn)兩格,A、B對C端輸出一個完整脈沖(轉(zhuǎn)一格就只是由低電平->高電平或由高電平->低電平);另一種就是轉(zhuǎn)一格,A、B對C端輸出一個完整脈沖。
二、具體原理分析一下,如何讓輸出脈沖的
兩定位一脈沖的EC11稍微復(fù)雜一些,轉(zhuǎn)動一格只會輸出半個脈沖。靜止時,AB觸點(diǎn)開關(guān)可以是斷開的也可以是閉合的。
若初始狀態(tài)時AB都是高電平,轉(zhuǎn)動一格就輸出從高電平到低電平的下降沿,隨后一直輸出低電平。對應(yīng)于EC11內(nèi)部AB兩個觸電開關(guān)的動作為斷開-->閉合。若初始狀態(tài)時AB都是低電平,轉(zhuǎn)動一格就輸出從低電平到高電平的上升沿,隨后一直輸出低電平。對應(yīng)于EC11內(nèi)部AB兩個觸點(diǎn)開關(guān)的動作為閉合-->斷開。由于兩脈沖一定位的EC11會有兩種初始狀態(tài),寫驅(qū)動程序就需要考慮多一些情況。再者,這類EC11在轉(zhuǎn)動到內(nèi)部AB觸點(diǎn)一直閉合的時候,就相當(dāng)于把上拉電阻的另一端接地,無形中加大了系統(tǒng)的功耗(若外接10K上拉電阻到5V電源就是500uA的電流),這對于低功耗應(yīng)用來說是非常不利的。因此對于無特殊要求的人機(jī)輸入應(yīng)用來說,我都推薦使用一定位一脈沖的EC11。
當(dāng)然了,有一些質(zhì)量比較差的EC11會有一些額外的問題要考慮,例如開關(guān)的抖動問題,例如轉(zhuǎn)動定位不清晰,靜止時AB兩個觸點(diǎn)都要閉合或者都要斷開才對,但是定位點(diǎn)不清晰,轉(zhuǎn)動的角度不到位導(dǎo)致一個觸點(diǎn)已經(jīng)閉合(斷開)了,另一個觸點(diǎn)卻還保持在斷開(閉合)。
這樣就輸出了高低電平的脈沖了
三、stc15單片機(jī)程序分析
//----------------IO口定義----------------//
#define EC11_A_Now P36 //EC11的A引腳,視為時鐘線
#define EC11_B_Now P35 //EC11的B引腳,視為信號線
#define EC11_Key P37 //EC11的按鍵
文件內(nèi)需要的靜態(tài)局部變量
//----------------局部文件內(nèi)變量列表----------------//
static char EC11_A_Last = 0; //EC11的A引腳上一次的狀態(tài)
static char EC11_B_Last = 0; //EC11的B引腳上一次的狀態(tài)
static char EC11_Type = 1; //定義變量暫存EC11的類型---->>>>---- 0:一定位對應(yīng)一脈沖; 1:兩定位對應(yīng)一脈沖
//所謂一定位對應(yīng)一脈沖,是指EC11旋轉(zhuǎn)編碼器每轉(zhuǎn)動一格,A和B都會輸出一個完整的方波。
//而 兩定位對應(yīng)一脈沖,是指EC11旋轉(zhuǎn)編碼器每轉(zhuǎn)動兩格,A和B才會輸出一個完整的方波,只轉(zhuǎn)動一格只輸出A和B
編碼器掃描程序
按鍵檢測部分
我們自己用EC11,大多數(shù)時候都是選擇帶按鍵的,這就可以把按鍵檢測加入到EC11的動作掃描程序中,實(shí)現(xiàn)單獨(dú)的檢測按鍵以及按下按鍵時轉(zhuǎn)動轉(zhuǎn)軸。
掃描到EC11的動作后,可以在此函數(shù)內(nèi)做出對應(yīng)的動作處理。函數(shù)內(nèi)包含了按鍵的單擊,雙擊,長按和長按松手檢測。
大家可以參考下程序