dimir 2 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Хочу я создать программу для енкодера Хотя в stm32 есть аппаратный.Но меня интересует программный енкодер.Кто может подсказать как проще? Или как практичнее? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба опрос или прерывания. Зависит от решаемой задачи и чем еще должен заниматься процессор. Примерно так: dt = INCINPUT; switch(EncState) { case 0: { if(dt == 1) {StepD++; break;} if((dt == 2) && (StepD > 0)) StepD--; break; } case 1: { if(dt == 3) {StepD++; break;} if((dt == 0) && (StepD > 0)) StepD--; break; } case 2: { if(dt == 0) {StepD++; break;} if((dt == 3) && (StepD > 0)) StepD--; break; } case 3: { if(dt == 2) {StepD++; break;} if((dt == 1) && (StepD > 0)) StepD--; break; } } EncState = dt; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Вы мне дали пример опроса?.А прервания по пинам для ручного енкодера наверное не подходят. Мне не совсем понятны эти переменные.Я подобный пример в нете видел. В 05.04.2023 в 19:48, mitya1698 сказал: EncState И я так понял инкримет при управлении и вывода на дисплей к этой переменной.Или не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Для этого надо посмотреть, какие сигналы формирует квадратурный энкодер: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба В 05.04.2023 в 20:08, EdgeAligned сказал: Для этого надо посмотреть, какие сигналы формирует квадратурный энкодер: Вы мне показываете функционал квадратурного энкодера? но там нет элнмента а как он именуется? .Не 2И -НЕ.Что это? Но при покое у нас все логические 1 на канале А и канале В Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба В случае СТМ, у него на каждой ноге может быть по прерыванию, проще на два завести, без XOR В 05.04.2023 в 19:58, dimir сказал: А прервания по пинам для ручного енкодера наверное не подходят. Почему же не подходят, подходят, только скорее всего дребезг будет мучать, и в случае прерываний с ним не удобно бороться, поэтому опрос по таймеру с процедурой антидребезга. В 05.04.2023 в 19:58, dimir сказал: И я так понял инкримет при управлении и вывода на дисплей к этой переменной.Или не так? кто на ком стоял? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба В 05.04.2023 в 20:24, mitya1698 сказал: кто на ком стоял? Я так понял вы проффсионал.И с чувством юмора.Я с такого региона где юмор вторая жизнь.Я имею ввидуДля чего служит энкодер?.Он заменяет две кнопки инкримент и дикримент.Но для этого нужно переменную .Вот это она? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба я не знаю для чего у вас нужен энкодер, в коде StepD будет уменьшаться или увеличиваться при вращении энкодера. ту функцию можно вызывать по прерываниям или по опросу. в начале в переменную dt должны попасть два младших бита - значения входных линий. EncState переменная - хранящая предыдущее положение энкодера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Спасибо за разьяснение.И ещё для лучшего понимания алгоритма прошу вас разъяснить.Если мы вращаем по часовой стрелке и против часовой .То инкремент происходит по спаду или по фронту одного из каналов? Вот это хотел бы уяснить себе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба EncState = ((EncState << 2) | (dt & 0b11)) & 0b1111; switch(EncState) { case 0b0001: case 0b0111: case 0b1000: case 0b1110: StepD++; break; // Вверх case 0b0010: case 0b0100: case 0b1011: case 0b1101: StepD--; break; // Вниз case 0b0000: case 0b0101: case 0b1010: case 0b1111: break; // Стоим default: Error++; break; // Ошибка - пропущен импульс } Нет. Есть 4 прошлых возможных состояния энкодера и 4 новых. Из четырех новых два правильных и два ошибочных. Из правильных одно вверх второе вниз. А ошибочные означают, что один фронт мы пропустили не обработав. Обрабатываться процедурой должно каждое изменение входных сигналов. Код выше мне нравится больше, и возможно он более понятен. Здесь в переменной EncState старшие два бита - прошлое значение, младшие - новое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба В 05.04.2023 в 22:24, mitya1698 сказал: EncState = ((EncState << 2) | (dt & 0b11)) & 0b1111; switch(EncState) { case 0b0001: case 0b0111: case 0b1000: case 0b1110: StepD++; break; // Вверх case 0b0010: case 0b0100: case 0b1011: case 0b1101: StepD--; break; // Вниз case 0b0000: case 0b0101: case 0b1010: case 0b1111: break; // Стоим default: Error++; break; // Ошибка - пропущен импульс } Нет. Есть 4 прошлых возможных состояния энкодера и 4 новых. Из четырех новых два правильных и два ошибочных. Из правильных одно вверх второе вниз. А ошибочные означают, что один фронт мы пропустили не обработав. Обрабатываться процедурой должно каждое изменение входных сигналов. Код выше мне нравится больше, и возможно он более понятен. Здесь в переменной EncState старшие два бита - прошлое значение, младшие - новое. Получается по спаду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба ЛЮБОЕ изменение, тоесть каждый фронт и передний и задний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Не понял.Канал А если крутим по часовой стрелке то по любому изменению? Не по переднему фронту(спаду)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба для максимальной точности надо считать все фронты, ели считать только восходящие, получим половинную точность, если только восходящие на одном канале, то четвертную, но это не имеет большого смысла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 5 апреля, 2023 Опубликовано 5 апреля, 2023 · Жалоба Если у вас с энкодера приходят чистые сигналы (без дребезга), и если энкодер с стопом (т.е. у него есть устойчивые положения) и если на 1 шаг энкодера он проходит все 4 состояния, то подсчёт можно сильно упростить. На фронт (или спад - по вкусу) сигнала на одной фазе проверяем сигнал на другой. Если там 1 - инкрементриуем счётчик, иначе декрементируем (или наоборот - по вкусу). Несмотря на много 'если' вверху многие энкодеры как раз такие (за исключением 'чистых сигналов' - но дребезг можно подавить отдельно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться