Перейти к содержанию
    

stm32 программный енкодер.

Хочу я создать программу  для енкодера Хотя  в stm32 есть аппаратный.Но меня интересует программный   енкодер.Кто может подсказать как проще? Или как практичнее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

опрос или прерывания. 

Зависит от решаемой задачи и чем еще должен заниматься процессор.

Примерно так:

         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;

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы мне дали пример опроса?.А прервания по пинам для ручного енкодера наверное не подходят.

Мне не совсем понятны эти переменные.Я подобный пример в нете видел.

В 05.04.2023 в 19:48, mitya1698 сказал:
EncState

И я так  понял инкримет  при управлении и вывода на дисплей к этой переменной.Или не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для этого надо посмотреть, какие сигналы формирует квадратурный энкодер:

a2a87f6ec61f39dac526b71761670ba7.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 05.04.2023 в 20:08, EdgeAligned сказал:

Для этого надо посмотреть, какие сигналы формирует квадратурный энкодер:

a2a87f6ec61f39dac526b71761670ba7.png

Вы мне показываете функционал квадратурного  энкодера? но там нет элнмента  а как он именуется? .Не 2И -НЕ.Что это?

Но при покое у нас все логические 1 на канале А и канале В

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В случае СТМ, у него на каждой ноге может быть по прерыванию, проще на два завести, без XOR

В 05.04.2023 в 19:58, dimir сказал:

А прервания по пинам для ручного енкодера наверное не подходят.

Почему же не подходят, подходят, только скорее всего дребезг будет мучать, и в случае прерываний с ним не удобно бороться, поэтому опрос по таймеру с процедурой антидребезга.

В 05.04.2023 в 19:58, dimir сказал:

И я так  понял инкримет  при управлении и вывода на дисплей к этой переменной.Или не так?

кто на ком стоял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 05.04.2023 в 20:24, mitya1698 сказал:

кто на ком стоял?

Я так понял вы проффсионал.И с чувством юмора.Я с такого региона где юмор вторая жизнь.Я имею ввидуДля чего служит энкодер?.Он заменяет две кнопки инкримент и дикримент.Но для этого нужно переменную .Вот это она?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я не знаю для чего у вас нужен энкодер, в коде StepD будет уменьшаться или увеличиваться при вращении энкодера.

ту функцию можно вызывать по прерываниям или по опросу. в начале в переменную dt должны попасть два младших бита - значения входных линий.

EncState переменная - хранящая предыдущее положение энкодера. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за разьяснение.И ещё для лучшего понимания алгоритма прошу вас разъяснить.Если мы вращаем по часовой стрелке и против часовой .То инкремент происходит по спаду или по фронту одного из каналов? Вот это хотел бы уяснить себе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

         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 старшие два бита - прошлое значение, младшие - новое. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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 старшие два бита - прошлое значение, младшие - новое. 

Получается по спаду.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понял.Канал А если крутим по часовой  стрелке то по любому изменению? Не по переднему фронту(спаду)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для максимальной точности надо считать все фронты, ели считать только восходящие, получим половинную точность, если только восходящие на одном канале, то четвертную, но это не имеет большого смысла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если у вас с энкодера приходят чистые сигналы (без дребезга), и если энкодер с стопом (т.е. у него есть устойчивые положения) и если на 1 шаг энкодера он проходит все 4 состояния, то подсчёт можно сильно упростить.

На фронт (или спад - по вкусу) сигнала на одной фазе проверяем сигнал на другой. Если там 1 - инкрементриуем счётчик, иначе декрементируем (или наоборот - по вкусу).

Несмотря на много 'если' вверху многие энкодеры как раз такие (за исключением 'чистых сигналов' - но дребезг можно подавить отдельно)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...