添加一個模擬低通濾波器可大大改善信號。通過低通濾波器,AVR上的代碼非常簡單。
_________
| |
| Encoder |
|_________|
| | |
| | |
100n | O | 100n
GND O-||-+ GND +-||-O GND
| |
\ /
3K3/ \ 3K3
\ /
| |
VCC O-/\/-+ +-\/\-O VCC
15K | | 15K
| |
O O
A B
啊,ASCII藝術的奇蹟:P
這裏是關於AVR該程序。連接A和B以在AVR上輸入PORTB:
#include <avr/io.h>
#define PIN_A (PINB&1)
#define PIN_B ((PINB>>1)&1)
int main(void){
uint8_t st0 = 0;
uint8_t st1 = 0;
uint8_t dir = 0;
uint8_t temp = 0;
uint8_t counter = 0;
DDRD = 0xFF;
DDRB = 0;
while(1){
if(dir == 0){
if(PIN_A & (!PIN_B)){
dir = 2;
}else if(PIN_B & (!PIN_A)){
dir = 4;
}else{
dir = 0;
}
}else if(dir == 2){
if(PIN_A & (!PIN_B)){
dir = 2;
}else if((!PIN_A) & (!PIN_B)){
counter--;
dir = 0;
}else{
dir = 0;
}
}else if(dir == 4){
if(PIN_B & (!PIN_A)){
dir = 4;
}else if((!PIN_A) & (!PIN_B)){
counter++;
dir = 0;
}else{
dir = 0;
}
}else if(PIN_B & PIN_A){
dir = 0;
}
PORTD = ~counter;
}
return 0;
}
此代碼的工作原理除非您真的快速旋轉編碼器。然後,它可能會錯過一兩步,但這並不重要,因爲使用編碼器的人不知道他們轉換了多少步。
作爲一個「業餘愛好者」的解決方案可以。然而,額外的硬件(電阻器/電容器)不容小覷。這就是爲什麼軟件反彈是一個「更好」的解決方案(恕我直言)。 – 2009-02-02 22:45:23