Ви не увійшли.
Более того, направление вращения невозможно определить даже при пропуске половины импульса одной фазы (от фронта одной фазы до фронта другой), поскольку состояний у двух двоичных фаз всего 4. Вот такой код получается.
...раз тема начата обсуждаем код
Гуглим в других местах
Что тут обсуждать? При пропуске регистрации одного импульса энкодера, утерянными оказываются два состояния фазы. При этом уже невозможно определить в какую сторону было вращение. А за программу которую не тестировали я промолчу. Пишите псевдокодом, в таком случае. Гуглите, господа, гуглите.
Я так понимаю форум технический , а не выяснение личностей ...
Религиозный!
Согласен, пусть выкладывает код ...
Пусть; "А может вам и ключи от квартиры, где деньги лежат"? Обычно, говорят пожалуйста.
Согласен, пусть выкладывает код , а не предложения гуглить , все мы гуглим ......раз тема начата обсуждаем код
Гуглим в других местах
Ничего не понял , по моему было предложено хорошее техническое решение, а тут какое то согласие требуется
Я так понимаю форум технический , а не выяснение личностей, если так опровергайте грамотно , или бегите в другую ветку
Принципиально не согласен. ...
Я спорить, с вами, не буду. Лучше достигните согласия со своей программой.
YK пише:... можно анализировать в loop
Можно если loop выполняется не дольше длительности импульсов энкодера. Эта штука называется квадратурный энкодер. Погуглите - полезно.
Принципиально не согласен.
Если правильно организовать loop c очисткой history из моего примера, то сам history ,будет выполнять роль очереди. и пусть
loop крутиться сколько надо
... можно анализировать в loop
Можно если loop выполняется не дольше длительности импульсов энкодера. Эта штука называется квадратурный энкодер. Погуглите - полезно.
Я так понимаю что правильное определение вращения это последовательность замыкания и РАЗМЫКАНИЯ контактов
Почему бы не сделать что то так (пример для первого кода от renoshnik)
unsigned long history=0;
void KY040() {
e_B = PIND&(1<<3); e_A = PIND&(1<<2);
history=(history <<1) | e_A ;
history=(history <<1) | e_B ;
// теперь можно смотреть последовательности замыканий размыканий
//например для вращения по часовой маска =B0101, т.е.
if(history & (B0101)){ Serial.println(" counter-clockwise ");};
if(history & (B1010)){ Serial.println(" clockwise ");};
//ну и можно "усилить" несколькими щелчками , типа B01010101 - явно крутим против часовой
}
P.S. я код не тестировал, возможно в битах ошибся, просто идея.
Ну и конечно не писать длинных обработчиков в прерываниях, тот же Serial.print уже может быть проблемой, например историю можно анализировать в loop
нет. это просто спам....
Latifun, це стьоб такий ?)
Я недавно приобрел энкодер h.264/avc hd arcotel enc-h410 https://klaster.ua/shop/televidenie/akt … rudovanie/ и он не разочаровал, крайне порадовал удобный интерфейс и благодаря этому настройка была не сложной даже для такого чайника как я) К тому же сжатие современное 1920×1080p за адекватную стоимость, потому если ищете оптимальное соотношение цена/качество, то это как раз об этом энкодере. Так же к плюсам можно отнести, что напряжение требует маленькое, около 220 В, с моей старой проводкой только такой и нужен. Потому если ищете экономически выгодный энкодер и при этом эффективный, то могу посоветовать именно этот.
Колдовал я колдовал и наколдовал вот такое самое интересное что в Proteus работает в реальности считает только в минус, но судя по снятой диаграмме должно работать и в чем причина не понятно...
int counter = 0;
void setup()
{
Serial.begin(57600);
Serial.println("Encoder - Interrupt");
DDRD = B00000000; //
PORTD = B11111111; //
DDRB = B111111; //
PORTB = B000000; //
//INT0 PD2. Mode: Falling Edge. INT1 PD2. Mode: off
EICRA=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (1<<INT0);
EIFR=(0<<INTF1) | (1<<INTF0);
PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
}
void loop()
{
if((digitalRead(2) == 1) && (digitalRead(3) == 1)){EIMSK |= (1<<INT0);}
}
ISR(INT0_vect) //INT0 PD2. Mode: Falling Edge. \
{
if((digitalRead(2) == 0) && (digitalRead(3) == 0)) {counter++; Serial.println(counter);}
if((digitalRead(2) == 0) && (digitalRead(3) == 1)) {counter--; Serial.println(counter);}
EIMSK &=~ (0<<INT0);
}
Я переписал ваш код более понятными мне названиями, инкремент происходит в начале шага и в конце, если крутить медленно то это можно увидеть. Какой код вы хотите увидеть? Я написал ту часть которая относится к энкодеру (инкремент, декремент точно такой же), зачем вам мои светодиоды и прочие?
renoshnik пише:У меня тоже энкодеры работают нормально, даже с "двойной точностью" (см. видео)...
"Сам себя не похвалишь..." Тоже верно. Как и конденсаторы.
А, что делать если это так и есть ...