Оптический энкодер
- Войдите на сайт для отправки комментариев
Ср, 23/03/2016 - 18:46
Добрый вечер уважаемые форумчане!
Подскажите пожалуйста как можно реализовать программу для оптического энкодера (1000) .
Ниже приведённый код счётчик работает хорошо 20000Гц считает корректно.
На 2 пин ставишь он прибавляет на 3 пин вычитает.
Как сделать чтобы была зависимость направления вращения то есть крутим по часовой он прибавляет , а против часовой вычитает и чтобы с такой же частотой работал?
#define LENC 2
#define LENC2 3
unsigned long encoder0Pos = 0;
void setup() {
pinMode(LENC, INPUT);
digitalWrite(LENC, HIGH);
attachInterrupt(0, doEncoderLW, CHANGE);
pinMode(LENC2, INPUT);
digitalWrite(LENC2, HIGH);
attachInterrupt(1, doEncoderLW2, CHANGE);
Serial.begin(112500);
}
void loop() {
Serial.println(encoder0Pos);
}
void doEncoderLW() {
if (digitalRead(LENC) == HIGH) {
encoder0Pos++;
}
}
void doEncoderLW2() {
if (digitalRead(LENC2) == HIGH) {
encoder0Pos--;
}
}
А в этом коде зависимость направления уже реализована но максимум только до 300Гц патом начинаются глюки .
#define encoder0PinA 2
#define encoder0PinB 3
byte bytes[1] ;
void setup()
{
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH);
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH);
attachInterrupt(0, doEncoderA, FALLING);
attachInterrupt(1, doEncoderB, FALLING);
Serial.begin (115200);
}
void loop()
{
}
void doEncoderA()
{
if(digitalRead(encoder0PinB)==HIGH){bytes[0]=24;}else{bytes[0]=15;}
Serial.write( bytes,1);
}
void doEncoderB()
{
if(digitalRead(encoder0PinA)==HIGH){bytes[0]=15;}else{bytes[0]=24;}
Serial.write( bytes,1);
}
потестируй эту библиотеку с параметром
http://www.pjrc.com/teensy/td_libs_Encoder.html
Спасибо
Оказалась ещё когда в Serial порт выводишь некорректно работает пока на lсd не подключил