原创 使用Arduino 來偵測Rotary Encoder

2019-1-7 18:53 3469 17 2 分类: MCU/ 嵌入式

# Arduino

# Rotary Encoder

# Interrutp

# Ext interrupt

# Arduino for Encoder

# Arduino for Rotary

# 兩個剪貼搞定 Rotary Encoder

使用Arduino來偵測Rotary Encoder 在網路的範例很多,但是他們似乎是不太適合我用,他們的方法,當我轉動Encoder會加二,或者會誤動作,讓人誤以爲Encoder不良,或者是漏格現象

針對這個問題我寫了一個即簡單有好用的程式碼在此公開給大家參考,如需要再改建,或者有錯誤,請讓我知道。

這是我們可以買得到的Rotary Encoder 


這個是Rotary Encoder的波形解析圖我的程式是來自於這張圖,在網路衆多圖片中我覺得這一張圖片畫的最好。


Encoder 和Arduino的接法【只是建議】,實際上的應用還是要以你的需要而定。

在硬體方面我的PinA是接在Arduino的外部中斷腳,PinB可以接在一般的Digital pin即可。

在Arduino的 Setup{


pinMode(outputB,INPUT); //設定19爲input

digitalWrite(outputB,HIGH); // 內部pull high 電阻開啓

attachInterrupt(digitalPinToInterrupt(outputA),ENCODER_SUB,FALLING);  

}

 宣告外部中斷。

外部中短的語法www.arduino.cc網站中建議使用

attachInterrupt(digitalPinToInterrupt(outputA),ENCODER_SUB,FALLING);

digitalPinToInterrupt(outputA)這個寫法在我這次的MEGA2560才有辦法啓動外部中斷

這一點要特別注意。


中斷的副程式內容如下:


void ENCODER_SUB(void)

{


if ((f_cw_start ==0)||(f_ccw_start==0))

{

if(digitalRead(outputB)==1)

{

f_cw_start = 1;

attachInterrupt(digitalPinToInterrupt(outputA), ENCODER_SUB,RISING);

} else{

attachInterrupt(digitalPinToInterrupt(outputA), ENCODER_SUB,RISING);

f_ccw_start = 1;

}

}


if ((f_cw_start ==1)||(f_ccw_start==1))

{

if(digitalRead(outputB)==0)

{

attachInterrupt(digitalPinToInterrupt(outputA), ENCODER_SUB,FALLING);

encoder_counter++;

f_cw_start = 0;

}else{

attachInterrupt(digitalPinToInterrupt(outputA), ENCODER_SUB,FALLING);

encoder_counter--;

f_ccw_start = 0;

}


}


}

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条