Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Diagrami i kodifikuesve rritës. Kurs trajnimi

Në këtë projekt demo, ne do të shikojmë detyrën e çiftimit të një kontrolli të quajtur kodues me një mikrokontrollues PIC.

Për të zbatuar një projekt demo, na duhen:

  • kodues me 24 pozicione;
  • 16 LED (3 mm);
  • drejtues LED;
  • mikrokontrollues.

Një kodues është një element kontrolli modern dhe origjinal për pajisjet dixhitale dhe në pamje është i ngjashëm me një rezistencë të ndryshueshme (shih figurën më poshtë). Një emër tjetër për këtë kontroll është sensori i këndit, sensori i rrotullimit. Rrotullimi i boshtit shoqërohet me klikime, për shembull 24 klikime për rrotullim. Enkoderi ka 3 dalje - A, B, C dhe përdoret për futjen e shpejtë të të dhënave në pajisjet dixhitale. Disa modele kanë një buton të integruar që aktivizohet duke shtypur boshtin e koduesit (shtohet një dalje tjetër).

Parimi i funksionimit të koduesit

Kur ktheni një klik, për shembull, në të djathtë, kontakti A + C mbyllet fillimisht, pastaj B + C. Kur boshti kthehet në këtë klikim, kontaktet hapen në të njëjtën sekuencë. Kur boshti kthehet në drejtimin tjetër, sekuenca e mbylljes me kontaktin C ndryshon, d.m.th. kur ktheheni majtas, fillimisht mbyllet B + C, pastaj A + C.

Përdorimi i një koduesi në projektet e mikrokontrolluesve, ndoshta duke përdorur të njëjtin kodues, zbaton disa lloje të ndryshme të futjes së të dhënave, megjithatë, kjo kërkon disa reagime dhe vizualizim në mënyrë që përdoruesi të dijë se çfarë informacioni po fut dhe në cilin pozicion kodifikuesi.


Diagrami skematik: lidhja e një koduesi me një mikrokontrollues PIC (kliko për ta zmadhuar)

Kunjat e koduesit A ​​dhe B janë të lidhura me portat e mikrokontrolluesit RB4 dhe RB5, kunja e koduesit C është e lidhur me tokën. Vlen të përmendet se rezistorët tërheqës duhet të lidhen me linjat e sinjalit të kunjave A dhe B. Enkoderi nuk është i lidhur rastësisht me linjat e specifikuara I/O të mikrokontrolluesit: së pari, porta B ka rezistorë tërheqës të integruar dhe nuk kemi pse të lidhim ato të jashtme, dhe së dyti, porta B e mikrokontrolluesit ka një funksioni i dobishëm - "interrupt-on-change" - ndryshimi i nivelit të ndërprerjes, i cili do të na lejojë të monitorojmë statusin e koduesit.

16 LED konvencionale 3 mm përdoren për të vizualizuar të dhënat hyrëse dhe do të vendosen në PCB rreth koduesit të instaluar. LED-et janë të lidhura me çipin A6276.

Mikroqarku është një drejtues LED me hyrje informacioni serik 16-bit. Drejtuesi përmban një regjistër zhvendosjeje 16-bitësh CMOS, kapëse dhe drejtues të lidhur për të drejtuar LED-të dhe mund të drejtojë më shumë LED sesa lejon mikrokontrolluesi. Përveç kësaj, drejtuesi mund të kontrollohet nëpërmjet ndërfaqes SPI, e cila redukton më tej numrin e linjave I/O të përdorura dhe e bën projektin të shkallëzueshëm.

Softueri i mikrokontrolluesit për zgjidhjen e problemit tonë është relativisht i thjeshtë. Ekzistojnë 3 mënyra funksionimi (hyrja e informacionit) dhe reagimi:

  • Modaliteti i pozicionimit 360 ° - në këtë mënyrë, LED-të tregojnë "pozicionin" aktual të koduesit, përdoruesi mund ta kthejë boshtin e koduesit majtas dhe djathtas në çdo kënd;
  • Modaliteti "Vëllimi / Niveli" - në këtë modalitet LED-të tregojnë vlerën aktuale midis niveleve minimale dhe maksimale të diapazonit të hyrjes (si niveli i volumit në pajisjet audio);
  • Modaliteti i ndërrimit rrotullues me 3 pozicione - Në këtë modalitet ka vetëm tre pozicione të përzgjedhura që përdoruesi zgjedh duke e kthyer boshtin e koduesit majtas/djathtas.

Demonstrimi i projektit

Një kodues për një konvertues frekuence është i ngjashëm në pamje me një rezistencë të ndryshueshme ose një potenciometër. Të njëjtat tre kunjat, e njëjta kuti paneli. Këtu mbarojnë ngjashmëritë. Brenda ka dy çelësa, të cilët kanë një dalje të përbashkët të detyrave të kontrollit dhe dy të tyret.

Që koduesi të funksionojë, kunja e mesme duhet të lidhet me tokën, dhe dy të tjerët përmes rezistorëve në furnizimin me energji elektrike. Sinjali i kontrollit duhet të hiqet drejtpërdrejt nga terminalet e panelit të koduesit.

Tani le të imagjinojmë që koduesi është ideal dhe kontaktet e tij nuk vuajnë nga kërcimi. Lidhni një oshiloskop me kunjat e koduesit dhe filloni të rrotulloni çelësin e koduesit. Impulset do të zhvendosen në lidhje me njëri-tjetrin me 90 gradë. Nëse e kthejmë çelësin e energjisë (kW) djathtas, majtas ose mbrapa, do të kemi sekuencat e panelit të kontrollit:

Nëse oshilogramet si aplikim i një sekuence detyrash me zero dhe njëshe logjike, atëherë ato do të duken kështu:

Le të marrim një kodues konvencional që ka kërcim kontakti. Zona e kërcimit:

Kërcimi ndodh kur kaloni nga logjika një në logjikën zero. Kërcimi mund të trajtohet në dy mënyra: harduer dhe softuer.

Metoda e harduerit është të lidhni një seri kondensatorësh të konvertuesit të frekuencës, nxitësit Schmitt, siç tregohet në diagramin e panelit të kontrollit:

Rekomandohet përdorimi i metodës së softuerit për trajtimin e kërcimit. Një metodë e tillë përshkruhet në bibliotekën Rothery. Kjo bibliotekë përmban disa funksione që nevojiten për të akorduar kunjat e kontrolluesit të vektorit në hyrje dhe për të lidhur rezistorët tërheqës me fuqi (kW). Në bibliotekë, duhet të specifikoni komandat dhe detyrat e duhura. Kjo komandë aktivizon rezistencën tërheqëse brenda.

Funksioni Get position seri vfd kthen vlerën e koduesit. Ky funksion nevojitet për të marrë numrin e pulseve që numëroi koduesi. Funksioni i vendosur Position vfd nevojitet për të ngarkuar vlerën nga e cila koduesi do të fillojë të numërojë.

Funksioni i rriqrës duhet të mbulohet më në detaje. Variablat sig1 dhe sig2 të këtij funksioni regjistrojnë gjendjen e pinit të vektorit me të cilin është lidhur koduesi. Pastaj këto kunja shkruhen në ndryshoren thisState vfd, e cila është gjendja aktuale e koduesit. Nëse gjendja aktuale e koduesit nuk është e barabartë me atë të mëparshme, atëherë llogariten drejtimet e reja të numërimit dhe numri i pulseve të fuqisë ruhet në variablin Position. Kur koduesi kthehet në pozicionin e tij fillestar të vektorit, ai do të zhvendoset djathtas me dy bit, dhe vlera e re e kontrollit duhet të shkruhet në ndryshoren PositionExt. Kjo variabël nevojitet për të ruajtur një sërë rezultatesh detyrash që do të përdoren në programin kryesor.

Kontrollo

Pasi kemi analizuar gjendjen e koduesit kur rrotullohet majtas dhe djathtas, ne hartojmë një tabelë:

Pozicioni i tij fillestar është 1-1. Kur kthehesha djathtas, pati një klikim, një u bë një zero logjike. Vlera e re e kësaj gjendje vfd është 01. Sipas komandës, ky rezultat përmblidhet me vlerën e ndryshores Position.

Për shkak të kërcimit që ndodhi, pozicioni u bë 11, pas rillogaritjes, numri serial u bë 7. Pas përfundimit të kërcimit, duhet të rregulloni pozicionin e ri 01 dhe një njësi i shtohet zeros së mëparshme. Kur koduesi u kthye, ndodhi një klikim dhe vlera e ndryshores Position u bë një.

Një klikim i dytë ndodh kur koduesi kthehet djathtas dhe në vend të pozicionit 01 kemi pozicionin 00. Pasi të përfundojë i gjithë bounce, edhe dalja e kontrollit ka një vlerë prej një. Në klikimin e katërt, kur pozicioni nga 10 bëhet 11, kemi vlerën 6. Pas përfundimit të muhabetit, mbetet 6.

Disa kodues kanë një aplikacion të butonit të panelit. Kur e shtypni dhe lëshoni, do të ketë gjithashtu kërcim kontaktesh, duhet të përdorni bibliotekën Bounce. Funksionet e kësaj biblioteke nevojiten për të vendosur pinin me të cilin do të lidhet butoni, detyrat e kohës së vonesës në milisekonda. Nëse shtypet butoni, atëherë funksioni i fuqisë (kW) kthen vlerën e vektorit true, nëse jo, atëherë false vfd.

Diagrami skematik i lidhjes së një koduesi me një konvertues frekuence

Në ndërtimin e veglave të makinerive, koduesit përdoren gjerësisht për konvertuesit e frekuencës së motorëve asinkron. Ata janë montuar si sensorë të reagimit të shpejtësisë. Kodues të tillë kanë një rezolucion të lartë nga 100 impulse për rrotullim në 1 milion impulse për rrotullim. Kjo markë ka një diskrete prej 500 imp. anasjelltas.

Koduesit klasifikohen në lloje detyrash nga. Ato mund të jenë absolute dhe në rritje. Enkoderi ynë kryen funksionin e zakonshëm - jep një sinjal diferencimi kur furnizimi me energji është i fikur, dhe më pas aplikohet përsëri. Gjendja e hershme nuk është ruajtur.

Koduesit absolut kanë një memorie të brendshme që kujton pozicionet e fundit. Pse keni nevojë për memorie dhe pse t'i ruani këto të dhëna? Në kushtet e fabrikës së industrisë së veglave të makinerive, përpara se të lëvizni një pajisje të caktuar, fillimisht tregohet pika zero. Ky proces quhet përmbledhje, d.m.th., shkon në zero.

Përdorimi i një sensori absolut të pamjes bën të mundur shmangien e kësaj procedure për herë të dytë, për të zvogëluar kohën, me kusht që sistemi të ketë kufizime për lëvizjet.

Merrni parasysh koduesit sinus dhe kosinus. Ato ofrojnë një sinjal daljeje kosinusi ose sinusi. Më tej, me ndihmën e një pajisjeje interpolatori të energjisë, prej tyre formohen impulse. Sinjalet e këtij lloji mund të ndryshohen përmasat. Enkoderi mundësohet nga një tension prej 5 volt.

Sinjali "A" është një sinjal impuls i tipit të drejtpërdrejtë. Numri i pulseve nga ky sinjal vjen në çdo rrotullim. Është e barabartë me 500 (rezolucion i sensorit).

Sinjali "B" është gjithashtu një sinjal i drejtpërdrejtë i pulsit. Prej tij, në çdo rrotullim, numri i pulseve merret sipas diskretitetit të sensorit, i cili zhvendoset nga kanali "A" me 90 gradë (500).

Sinjali "R" është sinjali i shenjës zero. Një puls merret nga një rrotullim i sensorit.

Në koduesit industrialë, një sinjal diferencimi përdoret për të punuar me një konvertues frekuence (konvertuesi i frekuencës). Emri i tij është kompleks, por në realitet gjithçka është e thjeshtë. Të gjitha kanalet kopjohen veçmas nga përmbysja e tyre. Kjo është e nevojshme për transmetimin e një sinjali në distanca të gjata. Kanali i daljes së koduesit është i lidhur me një marrës me qëllim të veçantë të bërë në amplifikatorë operacionalë. Impulsi përfundimisht përcaktohet nga kombinimi i dy sinjaleve.

Lidhje

Lidhja është e thjeshtë. Ne lidhim një tension prej 5 volt në daljet e koduesit. Ne kemi një plan urbanistik: tela kafe - 0 V, tela e bardhë - +5 V, rozë, jeshile dhe e kuqe - A, B, R.

Programi i lidhjes së koduesit bazohet në ndërprerjet në kanalet A dhe B. Ndërprerjet aktivizohen në skajin në rritje. Rezulton një situatë kur koduesi ngadalësohet në momentin e kryqëzimit të rasterit dhe sinjali i daljes së kanalit mbetet gjithmonë pozitiv. Impulset numërohen vazhdimisht nga numëruesi.

Në rastin tonë, ne nuk do të përdorim ndërprerje, sepse po punojmë me 4 sensorë, ata funksionojnë njëkohësisht. Nëse përdorni një skemë ndërprerjeje, ka të ngjarë të lindë një situatë e humbjes së pulseve. Ne e kemi zgjidhur këtë problem duke krijuar një ikonë të pranisë së lëvizjes. Dhe ne konsideruam funksionimin e koduesve industrialë.

Funksionimi i numëruesit të pulsit bazuar në modulin e koduesit

Numëruesi funksionon së bashku me një modul tregues me shtatë shifra, i cili do të shfaqë numrin e pulseve të plagosura nga koduesi. Kur aktivizohet, vlera e numëruesit është zero.

Rrotulloni çelësin e koduesit në drejtim të akrepave të orës. Vlera e numëruesit rritet me një sa herë që klikohet koduesi. Numri më i madh që mund të përfundoni është 999999999. Ky numër duhet të plotësojë të gjitha shifrat e treguesit tonë me shtatë segmente. Nëse e rrotulloni më tej dorezën, numëruesi do të rivendoset në zero dhe do të fillojë të numërojë përsëri nga zero.

Për shembull, le të mbyllim 120 impulse. Tani ne e kthejmë atë duke e rrotulluar dorezën në drejtim të kundërt të akrepave të orës. Boshti qendror i koduesit funksionon si një buton. Pastron pjesët e lira të treguesit nga zero. Butoni ka një kërcim të lehtë të kontakteve, kështu që fikja dhe ndezja nuk ndodh menjëherë. Me anë të softuerit, fryrja eliminohet. Kjo është baza për të punuar me modulin e koduesit.

Unë kam dashur prej kohësh të përshtat kontrollin e volumit të bërë nga kodues... Ju do të duhet ta lidhni këtë rregullator me USB në mënyrë që gjithçka të "rritur" (dhe nuk ka asnjë mënyrë tjetër për të lidhur një pajisje të jashtme me laptopin). Kthejeni koduesin në të majtë - vëllimi duhet të ulet, në të djathtë - duhet të rritet. Shtypni butonin e koduesit - hapni ndonjë program të dobishëm ose kaloni te kontrolli i tonit.

Për ata që nuk e dinë se çfarë është një kodues, ky është një lloj çelësi, si një çelës vëllimi i bazuar në një rezistencë konvencionale, vetëm se ky çelës nuk ka pozicione kufitare - rrotullohet sa më shumë që të mundet në çdo drejtim. Enkoderi rrotullohet me klikime të buta të këndshme dhe duket si një rezistencë e zakonshme e ndryshueshme.

Pajisjet e tilla nuk janë të rralla në radiot moderne të makinave dhe në çdo pajisje shtëpiake, ndërfaqja e përdoruesit e të cilave përpunohet nga një mikrokontrollues (dhe kjo është pothuajse çdo pajisje shtëpiake) dhe ku nevojitet rregullim ose akordim i qetë. Një kontakt i tretë shpesh ndërtohet në kodues, i cili funksionon si një buton në dorezë - kur e shtyjmë dorezën e koduesit poshtë (përgjatë boshtit), ky buton aktivizohet. Ai pasuron shumë mundësitë e ndërfaqes me përdoruesin - në një kodues është e mundur të ndërtohet i gjithë sistemi i kontrollit të një pajisjeje elektronike (por i shton programuesit hemorroide, por këto janë gjëra të vogla). Unë sapo kisha një kodues të tillë.

Parimi i funksionimit të koduesit është mjaft i thjeshtë - ai ka vetëm dy kontakte (butoni në dorezë nuk llogaritet), të cilat fillojnë të mbyllen sapo përdoruesi fillon të kthejë dorezën e koduesit. Kontaktet janë të lidhura me dy këmbët e mikrokontrolluesit (duke punuar si hyrje dixhitale), dhe kur rrotullohet pulla e koduesit, në këto këmbë shfaqen pulse, sipas fazës dhe numrit të të cilave mikrokontrolluesi përcakton drejtimin e rrotullimit dhe këndin e rrotullimi i çelësit të koduesit.

Për të funksionuar kontrollin e volumit, duhet të zgjidhni të paktën tre probleme inxhinierike:

Hapi 1... Krijon një pajisje USB me shpejtësi të ulët nga një tabelë e bukës.
Hapi 2... Lidhni një kodues me këtë pajisje USB, bëni që mikrokontrolluesi të funksionojë dhe transmetoni informacionin në lidhje me rrotullimin e koduesit në kompjuter.
Hapi 3... Kuptoni se si mund të kontrolloni programatikisht kontrollin e volumit. Me siguri ekziston një lloj API multimediale që ju lejon ta bëni këtë. Programi minimal - duhet të shkruani një program që do të marrë sinjale nga një pajisje USB dhe do të kontrollojë volumin. Do të ishte mirë, sigurisht, të shkruash një shofer, por është e frikshme ta ndërmarrësh këtë. Më mirë ta lëmë për më vonë.

Pra, unë do të përshkruaj procesin e krijimit të një rregullatori në hapa. I heq detajet, përndryshe do të jetë shumë e mërzitshme. Për të gjithë të interesuarit, shikoni burimet dhe dokumentacionin në lidhje.

[Hapi 1: Krijoni një pajisje USB me shpejtësi të ulët në një Breadboard]

Ky hap kaloi pa filluar as - disi shumë i thjeshtë dhe banal. Shkarkova marrëzi një projekt shembull nga lidhja. Korrigjuar skedarin usbconfig.h - për shfaqje me emrin pajisja ime DEMO ENKODER, për më shumë imagjinatë nuk mjaftonte. Kontrollova në Makefile llojin e procesorit (ATmega16), frekuencën e kristalit (16 MHz) - që të përputhet me paraqitjen time AVR-USB-MEGA16. E përpilova projektin në AVRStudio, ndeza tabelën e bukës, e lidha me kompjuterin - gjithçka filloi me gjysmë rrotullimi, pajisja ime USB funksionoi siç duhet si një port virtual COM - gjithçka është saktësisht siç është shkruar në artikull.

[Hapi 2. Lidhni koduesin me pajisjen USB]

Ky hap shkaktoi frikën time më të madhe se gjithçka do të funksiononte ashtu siç duhej. Nuk kisha dyshim se do të lidhja koduesin dhe do të isha në gjendje ta lexoja. Kishte dyshime se mund ta lexoja me efikasitet kur përpunimi i protokollit USB po funksionon gjithashtu në sfond - në fund të fundit, kjo nuk është një detyrë e lehtë për mikrokontrolluesin (siç doli më vonë, më kot u shqetësova).

Si zakonisht, fillova të gërmoj në internet në kërkim të rutinave të gatshme për leximin e koduesit. Shumë shpejt gjeta atë që më duhej - veçanërisht për AVR, kod shumë të thjeshtë C, skedarë encoder.c dhe encoder.h. Thuaj çfarë të pëlqen, por burimi i hapur është i mirë.

Bashkangjitur dy LED tregues - E GJELBËR dhe TË VERDHË - për të treguar drejtimin e rrotullimit të koduesit. Për lehtësi, e lidha koduesin direkt me lidhësin ISP, duke përfituar nga fakti se sinjalet MOSI, MISO dhe SCK janë vetëm këmbët PB5, PB6 dhe PB7 të mikrokontrolluesit ATmega16 (kam lidhur fazat A dhe B atje, si dhe butoni i koduesit).

Përkufizimet e korrigjuara të këmbëve, kodi i inicializimit të shtuar. Projektit i është bashkangjitur moduli encoder.c. Shtohet kontrolli i LED-ve jeshile dhe të verdha në rrjetin kryesor të qarkut kur infa vjen nga koduesi. LED i kuq është i bashkangjitur në butonin e koduesit - kur e shtypni, LED i kuq ndizet, kur e lëshoni, fiket. Përpiluar, ndezur - funksionon. E kthej dorezën majtas dhe me kalimin e kohës me klikimet e koduesit pulson drita e gjelbër LED. E kthej çelësin në të djathtë - LED-ja e verdhë pulson. Pavarësisht se koduesi lexohet me metodën e sondazhit, falë kodit efektiv për leximin e koduesit, NUK ka ankesa edhe kur punoni me bibliotekën V-USB në të njëjtën kohë (respekt, Pashgan!). Dalja e shtuar e informacionit nga koduesi në portën virtuale COM (kthejeni koduesin majtas dhe nxirrni shenjat minus "-" në tastierë, kthehu djathtas Unë nxjerr shenjat plus "+" në tastierë). Me kohëmatës, çdo 10 ms shfaq gjendjen e butonit të koduesit dhe e tregoj atë me një LED të kuq (butoni shtypet - transmetoj karakterin "1", lëshuar - "0"). Gjithçka po funksionon. Mërzia.

Si përfundim, hodha modulet cmd.c, crc16.c, eepromutil.c, strval.c. Madhësia e kodit ra në 3 kilobajt - shkëlqyeshëm, tani do të futet në memorien ATtiny45 (mund të përdorni prototipin AVR-USB-TINY45 në të ardhmen, është më i vogël dhe më i lirë).

[Hapi 3. Kuptoni se si mund të kontrolloni programatikisht kontrollin e volumit]

Si zakonisht, e kërkova në google pyetjen. Kam shoshitur një tufë mbeturinash dhe më në fund nxora perlën -. Më tej një çështje teknologjie. Unë nxjerr stilistin tim të preferuar të fëmijëve - Visual Studio. Pa menduar për asgjë, magjistari gjeneron një aplikacion të bazuar në dialog. E lëshoj rrëshqitësin e kontrollit të volumit në panel, lidh një variabël me të, shtoj një mbajtës për pozicionin e rrëshqitësit. Në fillim të aplikacionit, e vendosa motorin në një minimum prej 0 dhe një maksimum prej 65535 (për të korresponduar me kufijtë e vlerës së volumit të manipuluar nga bibliotekat e kontrollit të mikserit). Kam lexuar sipas funksionit mixerGetControlDetails vlerën aktuale të volumit dhe vendoseni rrëshqitësin në pozicionin e duhur. Në mbajtësin e pozicionit të motorit, e kundërta është e vërtetë - lexova pozicionin e motorit dhe funksionin mixerSetControlDetails vendosni volumin e dëshiruar. Unë bëj kontrollin e volumit pikërisht siç është shkruar në artikull. E kontrollova - funksionon.

Tani ka mbetur pak për të bërë - për të lexuar atë që vjen nga porta virtuale COM (ne kemi një pajisje USB të sapopjekur me një kodues në të). Nëse erdhi një shenjë minus (-), atëherë lëvizni rrëshqitësin majtas (ulni volumin), shenjën plus (+), më pas zhvendoseni rrëshqitësin në të djathtë (rritni volumin). Nëse vijnë karakteret 0 dhe 1, atëherë ne përkatësisht kontrollojmë gjendjen e kutisë së kontrollit (vetëm për të treguar nëse butoni i koduesit është i shtypur apo jo). Ju mund të punoni me portin COM si me një skedar të rregullt (shih). Ne inicializojmë lidhjen me portin COM duke hapur një skedar (duke thirrur :: KrijoFile) në modalitetin e bllokimit. Ne fillojmë një fije të veçantë, shtojmë skedarin e lexuar në ciklin e pafund (me një thirrje bllokuese :: ReadFile) një karakter në një kohë, dhe ne e analizojmë këtë karakter. Sipas cilit simbol erdhi, kthejeni rrëshqitësin në drejtimin e dëshiruar (vëllimi do të kontrollohet nga mbajtësi i rrëshqitësit) ose përditësoni gjendjen e kutisë së kontrollit. E kontrollova - funksionon.

Kjo është e gjitha, në fakt. Atëherë mund të përfshiheni në përmirësime të pafundme (dhe, ndoshta, të padobishme). Bëni një kërkim automatik për portën e kërkuar virtuale COM (tani, për thjeshtësi, emri i portës COM kalon përmes vijës së komandës). Rindërtoni një pajisje USB me CDC- klasa në HID- mund të thjeshtojë kodin e pajisjes USB, dhe gjithashtu ta bëjë më të lehtë gjetjen dhe hapjen programatike të pajisjes në kompjuter me anë të VID dhe HID. Ose shkruani një shërbim në vend të një programi (në mënyrë që të mos keni nevojë të ekzekutoni një program të veçantë). Ose edhe një shofer. Është shumë interesante, por nuk e di se si (ndoshta dikush nga Khabravchan do të mësojë mençurinë? ..). Vidhni disa veprime në butonin e koduesit. Dhe kështu me radhë ad infinitum.

Shpresoj se dikush do ta gjejë kërkimin tim të dobishëm në zhvillimet e veta. Nëse kam humbur diçka, do të jem i lumtur të dëgjoj komentet në komente.

[UPD120803]

Një person me shkrim e këndim u mblodh në mikrokontrolluesin AVR

Koder inkremental duket si potenciometër, por ndryshe nga një potenciometër, ai nuk ka pozicione fundore, ai mund të rrotullohet në të dy drejtimet për një numër të pakufizuar rrotullimesh. Duhet të theksohet gjithashtu se koduesi në rritje nuk rrotullohet aq mirë sa potenciometri, por me hapa. Mund të shihet në radion e makinës, oshiloskop, një qendër muzikore, një lavatriçe dhe pajisje të tjera, ku rregullimi i një parametri kryhet brenda kufijve të gjerë. Sigurisht, parametrat mund të ndryshohen edhe duke përdorur butonat, për shembull, për ta bërë muzikën me 20 vlera më të larta, kur kontrolloni butonin, duhet ta shtypni atë 20 herë, dhe kur kontrolloni koduesin, kthejeni atë në një kënd të caktuar, në varësi të algoritmit të përpunimit.

Koder inkremental përfaqëson dy kontakte, radha e mbylljes së të cilave varet nga drejtimi i rrotullimit.


Në fakt një kodues inkremental konverton rrotullimin e boshtit në impulse elektrike që përmban informacion për drejtimin e rrotullimit.

Le të ndërtojmë qarkun e provës të treguar në figurën e mësipërme dhe të lidhemi me kunjat A dhe B oshiloskop, rezistenca tërheqëse - 4.7K.
Le ta kthejmë koduesin në drejtim të akrepave të orës.


Tani në të kundërt të akrepave të orës.


Oshilogramet tregojnë se, në varësi të drejtimit të rrotullimit, ndryshon rendi i mbylljes së kontaktit. Por pjesa e përparme nuk del gjithmonë aq e bukur.


Meqenëse kontaktet janë mekanike, ato janë të prirura të kërcejnë, domethënë kur mbyllen për shkak të elasticitetit të materialeve, ndodhin qarqe të shkurtra dhe hapje të shumta të pakontrolluara, të cilat mund të shihen në oshilogramin e mësipërm.

Ka dy mënyra për t'u marrë me kërcimin, së pari konsiston në shtimin e kondensatorëve dhe rezistorëve siç tregohet në foton më poshtë.


Meqenëse kërcimi është një fenomen afatshkurtër, ai shuhet lehtësisht nga një kondensator.


Oshilogrami tregon se pas instalimit të kondensatorëve, pjesët e përparme u bënë më pak të pjerrëta dhe kërcimi u zhduk.

Mënyra e dytë- softuer dhe gjithçka varet nga zbatimi i sondazhit të daljeve të koduesit. Nëse statusi i koduesit i monitoruar nga ndërprerje të jashtme, atëherë pasi të aktivizohet ndërprerja, është e nevojshme të bëhet një vonesë prej 20-30 milisekonda, gjatë së cilës MC nuk do t'i përgjigjet një ndryshimi në gjendjen e daljes, domethënë nuk do të ndjejë kërcim. Nëse sondazhi i kunjave të koduesit zbatohet në një kohëmatës, atëherë intervali midis sondazheve duhet të jetë më i gjatë se kohëzgjatja e fryrjes, e njëjta 20-30 milisekonda.

le të shqyrtojmë metodat e përpunimit të të dhënave që vijnë nga koduesi.
Metoda e parë është që ne lidhim një nga këmbët e koduesit me daljen e ndërprerjeve të jashtme dhe e vendosim atë për një ndërprerje në skajin që bie. Në ndërprerje kontrollojmë gjendjen e këmbës tjetër dhe nëse është zero, atëherë rrotullimi ndodh në një drejtim, përndryshe në tjetrin. Më poshtë është kodi që zbaton këtë metodë për AVR.
#përfshi ISR (INT2_vect) (nëse (PINB & 0X02) (PORTB | = (1<<0); } else { PORTB &= ~(1<<0); } //антидребезг _delay_ms(20); //сбрасываем флаг прерывания вызванный дребезгом GIFR = (1<Kur koduesi kthehet në njërën anë, LED ndizet, kur koduesi kthehet në anën tjetër, fiket.

Metoda e dytë është duke krahasuar gjendjen aktuale dhe atë të mëparshme... Le të shprehim nivelet logjike të një treni pulsi si zero dhe njëshe.


Pastaj marrim një numër të kufizuar të gjendjeve të koduesit. Shifra e parë është niveli logjik i pinit të parë të koduesit, i dyti është niveli logjik i pinit të dytë.

Supozoni se gjendja e fundit në të cilën ishte vendosur koduesi është e barabartë me tre, nëse gjendja tjetër është e barabartë me një, atëherë ai rrotullohet në një drejtim, nëse dy, atëherë në tjetrin. Rezulton se mund të rregulloni kalimin nga një gjendje në tjetrën dhe të përcaktoni drejtimin e rrotullimit, por zbatimi më i thjeshtë është kur kaloni nga 11 në 01 dhe 10. Më poshtë është kodi që zbaton algoritmin e përshkruar për AVR,
#përcaktoni F_CPU 8000000UL #përfshini #përfshi uint8_t gjendja e fundit = 0; ISR (TIMER0_COMP_vect) (// të dy kunjat e koduesit janë të lidhur me kunjat 2 dhe 3 të portit B // lexoni gjendjen e tyre uint8_t aktuale_state = (PINB & 0x06) >> 1; // merrni parasysh kalimin vetëm nëse gjendja e mëparshme është 11 // dhe nëse nuk është e barabartë me të renë nëse ((gjendja_e fundit == 3) && (gjendja_e fundit! = gjendja_aktuale)) (// nëse gjendja e re është 01 - ndizni LED nëse (gjendja_aktuale == 1) (PORTB | = 0x01;) // nëse gjendja e re është 10 - fik LED nëse (gjendja_aktuale == 2) (PORTB & = ~ 0x01;)) // kur del nga ndërprerja, gjendja aktuale bëhet gjendja e fundit e mëparshme = aktuale_state;) int main (void) (// dy hyrje për lidhjen e koduesit DDRB & = ~ 0x06; // tërhiqni hyrjet në furnizimin me energji PORTB | = 0x06; // dalje për lidhjen e DDRB LED | = 0x01 ; // vendosni kohëmatësin që të rivendoset rastësisht TCCR0 = (1<Kjo eshte e gjitha.
Blerë kodues

Një kodues është një gjë që duket si një rezistencë e ndryshueshme, por, ndryshe nga kjo e fundit, nuk ka kufizues dhe mund të rrotullohet pafundësisht në çdo drejtim. Me ndihmën e koduesit është shumë i përshtatshëm për të organizuar të gjitha llojet e menyve në ekran, në përgjithësi, një kodues "push-button" (dmth, nëse mund të funksionojë edhe si buton) është ideal për organizimin ciklik njëdimensional menutë.

Ekzistojnë dy lloje të koduesve: absolut - duke dhënë menjëherë kodin e këndit të rrotullimit dhe inkremental - duke dhënë impulse gjatë rrotullimit. Për këtë të fundit, mikrokontrolluesi duhet të angazhohet në numërimin e pulseve dhe shndërrimin e tyre në një kënd rrotullimi.

Nga pikëpamja e projektimit, koduesit janë mekanikë dhe optikë, në të parën, pulset gjatë rrotullimit krijohen në një palë kontaktesh kur ato mbyllen nga një kontakt rrëshqitës i boshtit, së dyti, fotodiodat luajnë rolin e kontakteve, dhe një LED që ndriçon përmes një disku me lojëra elektronike (përshëndetje miut me top) luan rolin e një kontaktuesi. ...

Megjithëse ka shumë informacione për koduesit e programimit në rrjet, si dhe bibliotekat e gatshme për këtë, ato janë të gjitha të panevojshme të rënda (IMHO) - sondazhet e shtetit, si rregull, zbatohen në formën e një shteti. makinë në formën e një blloku ndërprerës me if të mbivendosur, i cili duket disi i komplikuar (sidomos kur shkruhet në asembler). Megjithatë, zbatimi mund të jetë më i thjeshtë.

Më të njohurit në ekonominë kombëtare janë koduesit mekanikë të lirë në rritje, dhe ne do t'i shqyrtojmë ato. Procesi i rrotullimit të boshtit të koduesit tregohet skematikisht në figurë (rrotullimi lart - në drejtim të akrepave të orës, poshtë - kundër akrepave të orës):


Këtu A dhe B janë vetë kontaktet, nivelet në të cilat mikrokontrolluesi duhet të përpunojë. Lëvizja e kontaktit i mbyll ato në tokë nëse nuk bien në vrimat e saj. Vini re këtu se vetëm katër vrima janë paraqitur në figurë për thjeshtësi. Në fakt, ka shumë më tepër nga këto vrima (përsëri, mbani mend miun e topit dhe si duket rrota e tij optike e helikopterit). Kunjat A dhe B tërhiqen nga rezistorët në tensionin e furnizimit. Si rezultat, kur rrotullohen, fitohen diagramet e paraqitura në figurën e mësipërme.

Supozoni se fillimisht të dy kontaktet bien në vrimë, atëherë do të ketë një nivel të lartë tensioni mbi to (ato gjithashtu tërhiqen deri në furnizimin me energji elektrike). Më tej, kur kthehet në drejtim të akrepave të orës, kontakti A do të jetë i pari që do të mbyllet me tokën, pastaj kontakti B do të bashkohet gjithashtu me të. Më tej, duke arritur vrimën tjetër në disk, kontakti A do të hapet dhe do të marrë një nivel të lartë, pas së cilës kontakti B do të kapja e këtyre zhvendosjeve, kontaktet kthehen në gjendjen e tyre origjinale dhe me rrotullim të mëtejshëm ky diagram do të përsëritet në mënyrë ciklike.

Kështu, rezulton se gjendja aktuale e koduesit përshkruhet nga një vlerë dy-bit. Por vetë gjendja aktuale mbart pak informacion të dobishëm dhe për analizën e rrotullimit duhet të merret parasysh në lidhje me vlerën e gjendjes së mëparshme. Dhe kjo palë tashmë përcakton në mënyrë unike drejtimin e rrotullimit të dorezës. Për lehtësi, le të marrim një numër katër-bitësh, dy bajtë më të rëndësishëm të të cilëve përmbajnë gjendjet e mëparshme të kontakteve A dhe B, dhe dy ato më pak të rëndësishme - ato aktuale.

Dhe kur rrotullohet në të kundërt të akrepave të orës

Binar dhjetore
1110 14
0001 1
0010 2
0111 7

Tani algoritmi për përcaktimin e drejtimit të rrotullimit të koduesit duket shumë i thjeshtë: marrim vlerën dhe krahasojmë nëse ai bie në një nga grupet (2, 4, 11, 13) dhe (1, 7, 8, 14). Nëse po, atëherë kemi një kthesë në drejtimin përkatës. Përndryshe, boshti ose nuk u rrotullua fare, ose u rrotullua aq shpejt sa rrëshqiti nëpër disa gjendje (nëse kjo ndodh shpesh, atëherë duhet të mendoni për rritjen e shkallës së votimit të shtetit), ose ka pasur një "kërcim" të kontakteve. Pa u thelluar në arsyen, të gjitha vlerat e tjera mund të injorohen me siguri.

Si shembull, merrni parasysh funksionimin e një koduesi në lidhje me një mikrokontrollues AVR:


Këtu, për lidhje, përdoren dy kunjat e poshtme të portës PB të mikrokontrolluesit ATMega8. Një palë rezistencash i tërheqin këto linja në tensionin e furnizimit (meqenëse rezistorët e brendshëm të atmega këtu mund të mos jenë të mjaftueshëm për funksionim të qëndrueshëm), janë instaluar një palë kondensatorë për të shtypur zhurmën e impulsit.

Për një skemë të tillë lidhjeje, mund të skiconi zbatimin e mëposhtëm në gjuhën C:

EncoderGetVal statik uint8_t () (kthimi PINB & 3;) statik uint8_t encoderGetCode () (static uint8_t e mëparshme; uint8_t val = encoderGetVal (); kodi uint8_t = (prev<< 2) | val; prev = val; return code; } static void encoderInit() { DDRB &= ~0b11; PORTB |= 0b11; encoderGetCode(); } void onEncoderEvent(bool direction); void encoderCheck() { uint8_t code = encoderGetCode(); if (code == 1 || code == 7 || code == 8 || code == 14) { onEncoderEvent(true); } else if (code == 2 || code == 4 || code == 11 || code == 13) { onEncoderEvent(false); } }

Kodi është jashtëzakonisht i thjeshtë - disa nëse dhe pa makineri shtetërore. Funksioni encoderInit () thirret në fillim për të inicializuar portin dhe për të kujtuar vlerën fillestare. Funksioni encoderCheck () thirret në ciklin e ngjarjeve (brenda kryesore () ose me kohëmatës). Trajtuesi onEncoderEvent (bool) do të thirret sa herë që koduesi rrotullohet dhe do të marrë flamurin e drejtimit të rrotullimit.

Por ka një pikë të rëndësishme: koduesi është një gjë e ndjeshme dhe nëse përpiqeni të përpunoni, për shembull, ngjarjet e navigimit të menysë në këtë mënyrë, atëherë edhe një rrotullim i vogël i pullës së koduesit do të thërrasë në mënyrë të përsëritur mbajtësin onEncoderEvent (), si si rezultat i së cilës kursori i menysë në vend që të kalojë në elementin tjetër / të mëparshëm do të fluturojë menjëherë në fund / fillim të listës. Mund të rregulloni ndjeshmërinë e koduesit duke ndryshuar frekuencën e thirrjes së encoderCheck () (zakonisht frekuenca optimale është ~ 10 Hz). Në këtë rast, metoda encoderGetCode () duhet të thirret sa më shpesh që të jetë e mundur në mënyrë që të ketë gjithmonë vlerën aktuale të gjendjes së fundit të kontakteve (me një frekuencë prej diku ~ 100 Hz).

Në assembler, ky kod mund të duket si ky:

EQU encoder_port PORTB .EQU encoder_pin PINB .EQU encoder_ddr DDRB .DSEG .ORG SRAM_START sEncoderPrev: .BYTE 1 ... .CSEG .ORG $ 0000 ... Encoder_init: cbi encoder,1 encoder_s andi r0, 3 st sEncoderPrev, r0 ... Encoder_check lds ZL, sEncoderPrev lsl ZL lsl ZL in r0, encoder_pin andi r0, 3 sts sEncoderPrev, r0 ose ZL, r0; 1 7 8 14 -> në drejtim të akrepave të orës cpi ZL, 1 breq Enkoder_në drejtim të akrepave të orës cpi ZL, 7 breq Enkoder_në drejtim të akrepave të orës cpi ZL, 8 breq Enkoder_në drejtim të akrepave të orës cpi ZL, 14 breq Enkoder_në drejtim të akrepave të orës cpi ZL; 2 4 11 13 -> cpi në drejtim të kundërt të akrepave të orës ZL, 2 breq Encoder_kundër akrepave të orës cpi ZL, 4 breq Encoder_kundër drejtimit të akrepave të orës cpi ZL, 11 breq Encoder_kundër akrepave të orës cpi ZL, 13 breq Encoder_kundërmprehtë cpi ZL, 13 breq Encoder_countermpclockwise_djone Encoder_countercodercoder_done: ; këtu është kodi për mbajtësin e rrotullimit në drejtim të akrepave të orës; Encoder_kundër akrepave të orës:; ; këtu është kodi i mbajtësit të rrotullimit në drejtim të kundërt të akrepave të orës; Interval_enc_mbaruar.

Artikujt kryesorë të lidhur