升威動(dòng)態(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)的應(yīng)用原理
旋轉(zhuǎn)編碼開關(guān)的應(yīng)用非常廣泛,今天給大家介紹下如下這款3腳和5腳的EC11旋轉(zhuǎn)編碼開關(guān)。
5腳的旋轉(zhuǎn)編碼開關(guān),如下圖
具有左轉(zhuǎn),右轉(zhuǎn),按下三個(gè)功能。4、5腳是中間按下去的開關(guān)接線 1 2 3腳 一般是中間2腳接地,1、3腳上拉電阻后,當(dāng)左轉(zhuǎn)、右轉(zhuǎn)旋紐時(shí),在1、3腳就有脈沖信號(hào)輸出了。
推薦型號(hào):EC11旋轉(zhuǎn)編碼開關(guān)
在單片機(jī)編程時(shí),左轉(zhuǎn)和右轉(zhuǎn)的判別是難點(diǎn),用示波器觀察這種開關(guān)左轉(zhuǎn)和右轉(zhuǎn)時(shí)兩個(gè)輸出腳的信號(hào)有個(gè)相位差,見下圖:
由此可見,如果輸出1為高電平時(shí),輸出2出現(xiàn)一個(gè)高電平,這時(shí)開關(guān)就是向順時(shí)針旋轉(zhuǎn); 當(dāng)輸出1 為高電平,輸出2出現(xiàn)一個(gè)低電平,這時(shí)就一定是逆時(shí)針方向旋轉(zhuǎn).
所以,在單片機(jī)編程時(shí)只需要判斷當(dāng)輸出1為高電平時(shí),輸出2當(dāng)時(shí)的狀態(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; //定義了兩個(gè)變量用來儲(chǔ)蓄上一次調(diào)用此方法是編碼開關(guān)兩引腳的電平
static Uchar st; //定義了一個(gè)變量用來儲(chǔ)蓄以前是否出現(xiàn)了兩個(gè)引腳都為高電平的狀態(tài)
uint tmp = 0;
if(CodingsWitch_A&&CodingsWitch_B)
st = 1; //
if(st) //如果st為1執(zhí)行下面的步驟
{
if(CodingsWitch_A==0&&CodingsWitch_B==0) //如果當(dāng)前編碼開關(guān)的兩個(gè)引腳都為底電平執(zhí)行下面的步驟
{
if(Bold) //為高說明編碼開關(guān)在向加大的方向轉(zhuǎn)
{
st = 0;
tmp++; //
}
if(Aold) //為高說明編碼開關(guān)在向減小的方向轉(zhuǎn)
{
st = 0;
tmp--; //設(shè)返回值
}
}
}
Aold = CodingsWitch_A; //
Bold = CodingsWitch_B; //儲(chǔ)
return tmp; //
}
//編碼器計(jì)數(shù)程序
void encoder_cnt(void)
{
uchar temp;
temp = PIND; //取端口D管腳信號(hào)
couch_clr = (temp & 0x08); //取編碼器清零信號(hào)
if(couch_clr != false) //有編碼器清零信號(hào)
{
couch_num = 0; //水平床碼清零
}
else
{
if(encoder_cnt_en == false) //編碼器計(jì)數(shù)模塊沒有啟動(dòng)
{
pr_couch_ba = temp & 0x03; //取編碼器A、B相電平信號(hào)
}
else
{
couch_ba = temp & 0x03; //取編碼器A、B相電平信號(hào)
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;
}
}
編碼器及其計(jì)數(shù)模塊原理
該文件只允許會(huì)員下載! 登錄 | 注冊(cè)
飄揚(yáng)的旋轉(zhuǎn)編碼器的檢測(cè)程序(MCS51)
//旋轉(zhuǎn)編碼器檢測(cè)程序,A/B信號(hào)分別接在了INT0和INT1上
//程序作者:BG4UVR
//2005年1月15用KEIL編譯、硬件測(cè)試通過
//注意:編碼器的信號(hào),程序未做消抖處理。測(cè)試中,A/B信號(hào)上各
//接了一只104的瓷片電容,工作很正常。如果不接電容,請(qǐng)自行編
//寫信號(hào)消抖程序。
#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),以此為基準(zhǔn),B用來判斷方向(連到AVR的PA1), C接地
//A -|
// | -----|__________|----------|____________
//C -|
//
//B -|
// | ----------|__________|----------|____________
//C -|
// CW ===>>> ROTATION
//外部中斷設(shè)置(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)生的中斷還是低點(diǎ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;
}
上一篇: 旋轉(zhuǎn)編碼器應(yīng)用常用術(shù)語(yǔ)匯總 下一篇: 電梯應(yīng)用中磁電編碼器的工作原理