Свързване на енкодер към микроконтролер

енкодер

Инкрементният енкодер е механично устройство (сензор), което преобразува ъгъла на въртене на вал (дръжка) в електрически сигнали. Кодерът има три изхода или пет в зависимост от наличието на вграден бутон. Тук разглеждам най-често срещаните енкодери, които са вградени в потребителското оборудване, например за регулиране на силата на звука, навигация в менюто и т.н. За разлика от променливия резистор, позицията на копчето на кодера се променя дискретно, чрез „щраквания“, докато се случват няколко комутации, чиято последователност зависи от посоката на въртене. Един пълен оборот на копчето може да има различен брой дискретни позиции (12, 20, 24), в зависимост от модела на енкодера.

Фигурата по-долу показва функционална схема, обясняваща принципа на действие на енкодера.

микроконтролери

Както можете да видите от времевите диаграми, когато завъртите една дискретна позиция (едно „щракване“), на клемите A и B се образуват отрицателни импулси (полярността на импулсите зависи от схемата на свързване), извън фаза с всеки други. Фазовото изместване зависи от посоката на въртене. Четири състояния могат да бъдат разграничени от времевата диаграма, която съставлява периода на една дискретна промяна („щракване“), продължителността на периода варира от около 2 ms до 4 ms.

Следващата фигура показва схемата на свързване на енкодера с микроконтролера:

предишното състояние

Пиновете A и B на енкодера трябва да бъдат изтеглени до захранващата линия + 5V с помощта на резистори, също така е необходимо да се инсталират кондензатори C1 и C2, които намаляват ефекта на отскока на контакта.

Състоянието на кодера може да се определи чрез прекъсвания за промяна на сигнала на щифтовете на микроконтролера или чрез периодично анкетиране на равни интервали, като се сравнява текущото състояние с предишната запаметена стойност. Първо, помислете за възможността за периодично анкетиране.

По-долу е даден кодът на програмата, в който се реализира периодичното анкетиране на състоянието на изходите на енкодера. Разпит на състоянията на щифтове A и B на кодера се извършва в рутинната програма за прекъсване, която периодично се извиква от препълването на TMR0 таймера (вж. Таймери. Организация на закъснението във времето). В моята версия таймерът прелива след около 1 ms, тоест енкодерът се анкетира всяка милисекунда.

Вътре в манипулатора на прекъсвания първо се запазва текущото състояние на щифтовете на енкодера, като за това се използва допълнителен регистър на флаговете, чието съдържание винаги се измества наляво с два бита преди да излезе от манипулатора, като по този начин се поддържа предишното състояние на щифтовете на енкодера. След запазване на текущото състояние в 0-ия и 1-ви бит на регистъра на флага, се проверява предишното състояние, тоест 2-ри и 3-ти бит се анализират. Алгоритъмът е следният: ако предишното състояние на двата щифта съответства на логически, проверяваме текущата съхранена стойност (битове 0,1 от регистъра на флага), ако стойността на битовете е 0 и 1, имаше завъртете в една посока, ако стойността е 1 и 0, имаше обрат в противоположната страна. След определяне на факта на въртене, регистърът на shet се увеличава или намалява, чието съдържание (число от 0 до 255) в основната програма се показва на седемсегментни индикатори. Прирастването се извършва до числото 255 и е ограничено при тази стойност, дори при по-нататъшно завъртане на копчето на енкодера, същото при намаляване до 0.

Ако предишното състояние на двата щифта не съвпада с 1, просто излезте от манипулатора, като също преместите съдържанието на регистъра на флаговете вляво. Това е необходимо, за да се пропуснат всички други възможни състояния на изходите на енкодера, тоест, за да се определи посоката на въртене, се използва половината от периода на една дискретна промяна (две състояния от четири възможни).

При използването на този алгоритъм бяха разкрити някои недостатъци, самият факт на завъртане на дръжката беше определен стабилно, но поради наличието на отскок на контакт в края на периода на една дискретна промяна (след „щракването“), фактът на завиването беше отново определено и то в обратна посока. Тоест, след нарастването на регистъра на shet, настъпи декремент и обратно. За да избегна това, след увеличаването/намаляването на регистъра на шет, добавих допълнително условие за многократна проверка на състоянието на щифтовете на енкодера за съответствие с високо логическо ниво. След увеличаването/намаляването на схемата, преди да излезете от манипулатора на прекъсвания, се задава знамето (0-ти бит) в допълнителния регистър flag1. При следващи записи в манипулатора, след проверка на предишното състояние и съвпадение на щифтовете на кодера с високо логическо ниво, регистърът shet1 се увеличава от зададения флаг в регистъра flag1. Ако съдържанието му не е равно на 3, манипулаторът излиза. По този начин, след факта на въртене, ще се извърши следващото определяне на състоянието на кодера, при условие че високите логически нива са фиксирани три пъти на щифтовете на кодера, след което регистърът shet1 се нулира и флагът на flag1 регистъра е изчистени.

След промяна на стойността на регистъра на shet в манипулатора на прекъсвания, допълнително се задава флагът за регистрация на ротация на енкодера flag1,1, който се анкетира в основната програма, ако флагът е зададен, подпрограмата vivod се извиква, за да покаже съдържанието на shet регистър на седемсегментни индикатори.

Сега нека разгледаме програмата за анкетиране на кодера, базирана на прекъсвания за промяна на нивото на входовете на микроконтролера: