添加一个模拟低通滤波器可大大改善信号。通过低通滤波器,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