Оптический энкодер
- Войдите на сайт для отправки комментариев
Ср, 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 не подключил