Напишите ответ

Введите сообщение и нажмите Отправить
Параметры

Назад

Обзор темы (новое вверху)

Watchdog
2020-03-06 09:30:37

Более того, направление вращения невозможно определить даже при пропуске половины импульса одной фазы (от фронта одной фазы до фронта другой), поскольку состояний у двух двоичных фаз всего 4. Вот такой код получается.

Watchdog
2020-03-06 08:12:33
Guest1 пишет:

...раз тема начата обсуждаем код
Гуглим в других местах smile

Что тут обсуждать? При пропуске регистрации одного импульса энкодера, утерянными оказываются два состояния фазы. При этом уже невозможно определить в какую сторону было вращение. А за программу которую не тестировали я промолчу. Пишите псевдокодом, в таком случае. Гуглите, господа, гуглите.

Код
2020-03-06 06:06:17
Xy пишет:

Я так понимаю форум технический , а не выяснение личностей ...

Религиозный!

Guest1 пишет:

Согласен, пусть выкладывает код ...

Пусть; "А может вам и ключи от квартиры, где деньги лежат"? Обычно, говорят пожалуйста.

Guest1
2020-03-06 00:42:52

Согласен, пусть выкладывает код , а не предложения гуглить , все мы гуглим ......раз тема начата обсуждаем код
Гуглим в других местах smile

Xy
2020-03-06 00:26:01

Ничего не понял , по моему было предложено хорошее техническое решение, а тут какое то согласие требуется
Я так понимаю форум технический , а не выяснение личностей, если так опровергайте грамотно , или бегите в другую ветку

Watchdog
2020-03-05 12:47:00
YK пишет:

Принципиально не согласен. ...

Я спорить, с вами, не буду. Лучше достигните согласия со своей программой.

YK
2020-03-05 12:13:34
Watchdog пишет:
YK пишет:

... можно анализировать в loop

Можно если loop выполняется не дольше длительности импульсов энкодера. Эта штука называется квадратурный энкодер. Погуглите - полезно.

Принципиально не согласен.
Если правильно организовать loop c очисткой history из моего примера, то сам history ,будет выполнять роль очереди. и пусть
loop крутиться сколько надо

Watchdog
2020-03-05 12:00:59
YK пишет:

... можно анализировать в loop

Можно если loop выполняется не дольше длительности импульсов энкодера. Эта штука называется квадратурный энкодер. Погуглите - полезно.

YK
2020-03-05 10:37:23

Я так понимаю что правильное определение вращения это последовательность замыкания и РАЗМЫКАНИЯ контактов
Почему бы не сделать что то  так (пример для первого кода от 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

vvr
2020-03-05 01:48:59

нет. это просто спам....

Жорж
2020-03-04 23:53:46

Latifun, це стьоб такий ?)

Latifun
2020-02-18 20:13:10

Я недавно приобрел энкодер  h.264/avc hd arcotel enc-h410 https://klaster.ua/shop/televidenie/akt … rudovanie/ и он не разочаровал, крайне порадовал удобный интерфейс и благодаря этому настройка была не сложной даже для такого чайника как я) К тому же сжатие современное 1920×1080p за адекватную стоимость, потому если ищете оптимальное соотношение цена/качество, то это как раз об этом энкодере. Так же к плюсам можно отнести, что напряжение требует маленькое, около 220 В, с моей старой проводкой только такой и нужен. Потому если ищете экономически выгодный энкодер и при этом эффективный, то могу посоветовать именно этот.

goodspeedmen
2017-07-12 13:35:24

11-07-2017-19-13-06.jpg

Колдовал я колдовал и наколдовал вот такое самое интересное что в Proteus работает в реальности считает только в минус, но судя по снятой диаграмме должно работать mad и в чем причина не понятно...


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);

 }

12-07-2017-13-29-24.jpg

goodspeedmen
2017-07-10 14:27:16

Я переписал ваш код более понятными мне названиями, инкремент происходит в начале шага и в конце, если крутить медленно то это можно увидеть. Какой код вы хотите увидеть? Я написал ту часть которая относится к энкодеру (инкремент, декремент точно такой же), зачем вам мои светодиоды и прочие? sad

renoshnik
2017-07-10 07:33:35
Green пишет:
renoshnik пишет:

У меня тоже энкодеры работают нормально, даже с "двойной точностью" (см. видео)...

"Сам себя не похвалишь..." Тоже верно. Как и конденсаторы.

А, что делать если это так и есть ...

Подвал раздела