升威動態(tài)
Granville dynamic
廣東升威電子制品有限公司
電 話:0769-38833333
傳 真:0769-87930111
0769-87930222
E-mail:sw@soundwell-cn.com
地 址:廣東省東莞市塘廈鎮(zhèn)鳳凰崗升威工業(yè)園
推薦產(chǎn)品
旋轉(zhuǎn)編碼開關(guān)的應用原理
旋轉(zhuǎn)編碼開關(guān)的應用非常廣泛,今天給大家介紹下如下這款3腳和5腳的EC11旋轉(zhuǎn)編碼開關(guān)。
5腳的旋轉(zhuǎn)編碼開關(guān),如下圖
具有左轉(zhuǎn),右轉(zhuǎn),按下三個功能。4、5腳是中間按下去的開關(guān)接線 1 2 3腳 一般是中間2腳接地,1、3腳上拉電阻后,當左轉(zhuǎn)、右轉(zhuǎn)旋紐時,在1、3腳就有脈沖信號輸出了。
在單片機編程時,左轉(zhuǎn)和右轉(zhuǎn)的判別是難點,用示波器觀察這種開關(guān)左轉(zhuǎn)和右轉(zhuǎn)時兩個輸出腳的信號有個相位差,見下圖:
由此可見,如果輸出1為高電平時,輸出2出現(xiàn)一個高電平,這時開關(guān)就是向順時針旋轉(zhuǎn); 當輸出1 為高電平,輸出2出現(xiàn)一個低電平,這時就一定是逆時針方向旋轉(zhuǎn).
所以,在單片機編程時只需要判斷當輸出1為高電平時,輸出2當時的狀態(tài)就可以判斷出是左旋轉(zhuǎn)或是右旋轉(zhuǎn)了。
#include "reg51.h"
#define uint unsigned int
sbit CodingsWitch_A=P1_1;
sbit CodingsWitch_B=P1_2;
uint CodingsWitchPolling()//
{
static Uchar Aold,Bold; //定義了兩個變量用來儲蓄上一次調(diào)用此方法是編碼開關(guān)兩引腳的電平
static Uchar st; //定義了一個變量用來儲蓄以前是否出現(xiàn)了兩個引腳都為高電平的狀態(tài)
uint tmp = 0;
if(CodingsWitch_A&&CodingsWitch_B)
st = 1; //
if(st) //如果st為1執(zhí)行下面的步驟
{
if(CodingsWitch_A==0&&CodingsWitch_B==0) //如果當前編碼開關(guān)的兩個引腳都為底電平執(zhí)行下面的步驟
{
if(Bold) //為高說明編碼開關(guān)在向加大的方向轉(zhuǎn)
{
st = 0;
tmp++; //
}
if(Aold) //為高說明編碼開關(guān)在向減小的方向轉(zhuǎn)
{
st = 0;
tmp--; //設返回值
}
}
}
Aold = CodingsWitch_A; //
Bold = CodingsWitch_B; //儲
return tmp; //
}
//編碼器計數(shù)程序
void encoder_cnt(void)
{
uchar temp;
temp = PIND; //取端口D管腳信號
couch_clr = (temp & 0x08); //取編碼器清零信號
if(couch_clr != false) //有編碼器清零信號
{
couch_num = 0; //水平床碼清零
}
else
{
if(encoder_cnt_en == false) //編碼器計數(shù)模塊沒有啟動
{
pr_couch_ba = temp & 0x03; //取編碼器A、B相電平信號
}
else
{
couch_ba = temp & 0x03; //取編碼器A、B相電平信號
if(pr_couch_ba == 0x00)
{
if(couch_ba == 0x01)
{
couch_num++; //水平床碼加1
}
else if(couch_ba == 0x10)
{
couch_num--; //水平床碼減1
}
}
else if(pr_couch_ba == 0x01)
{
if(couch_ba == 0x11)
{
couch_num++; //水平床碼加1
}
else if(couch_ba == 0x00)
{
couch_num--; //水平床碼減1
}
}
else if(pr_couch_ba == 0x10)
{
if(couch_ba == 0x00)
{
couch_num++; //水平床碼加1
}
else if(couch_ba == 0x11)
{
couch_num--; //水平床碼減1
}
}
else if(pr_couch_ba == 0x11)
{
if(couch_ba == 0x10)
{
couch_num++; //水平床碼加1
}
else if(couch_ba == 0x01)
{
couch_num--; //水平床碼減1
}
}
}
pr_couch_ba = couch_ba;
}
}
編碼器及其計數(shù)模塊原理
該文件只允許會員下載! 登錄 | 注冊
飄揚的旋轉(zhuǎn)編碼器的檢測程序(MCS51)
//旋轉(zhuǎn)編碼器檢測程序,A/B信號分別接在了INT0和INT1上
//程序作者:BG4UVR
//2005年1月15用KEIL編譯、硬件測試通過
//注意:編碼器的信號,程序未做消抖處理。測試中,A/B信號上各
//接了一只104的瓷片電容,工作很正常。如果不接電容,請自行編
//寫信號消抖程序。
#include <at89x51.h>
sbit led="0xB1";//有一只LED接在了RXD引腳上,用來指示正反轉(zhuǎn);
main()
{
EA=1; //總中斷允許
EX0=1; //外部中斷0允許
IT0=1; //外部中斷0為邊沿觸發(fā)方式
while(1);;
}
/*********************
編碼器中斷函數(shù)
入口:無
出口:無
*********************/
void encoder(void) interrupt 0 { //外部中斷0
if (INT1){
led=1;
}else{
led=0;
}
}
whimsy 的AVR程序
//外部中斷0,用于編碼開關(guān)解碼,解碼圖: A接中斷腳(AVR的PD2),以此為基準,B用來判斷方向(連到AVR的PA1), C接地
//A -|
// | -----|__________|----------|____________
//C -|
//
//B -|
// | ----------|__________|----------|____________
//C -|
// CW ===>>> ROTATION
//外部中斷設置(ISC01=0,ISC00=1): INT0 引腳上任意的邏輯電平變化都將引發(fā)中斷
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
//external interupt on INT0
GICR=0; //禁止外部中斷
if ((PIND & 0x04)==0) //先判斷是高電平產(chǎn)生的中斷還是低點平的中斷
if ((PINA & 0x02)==0) //再判斷B線上的電平
{
keycounter--;
keydirection="0";
}
else
{
keycounter++;
keydirection="1";
}
else
if ((PINA & 0x02)==0)
{
keycounter++;
keydirection="1";
}
else
{
keycounter--;
keydirection=0;
}
GICR=0x40;
}