INHOUDSOPGAWE:

Hoe om die draairigting van 'n digitale draaiskakelaar met 'n PIC te interpreteer: 5 stappe
Hoe om die draairigting van 'n digitale draaiskakelaar met 'n PIC te interpreteer: 5 stappe

Video: Hoe om die draairigting van 'n digitale draaiskakelaar met 'n PIC te interpreteer: 5 stappe

Video: Hoe om die draairigting van 'n digitale draaiskakelaar met 'n PIC te interpreteer: 5 stappe
Video: Anand Vaidya: Consciousness, Truth, Belief, Time 2024, Julie
Anonim
Hoe om die draairigting van 'n digitale draaiskakelaar met 'n PIC te interpreteer
Hoe om die draairigting van 'n digitale draaiskakelaar met 'n PIC te interpreteer

Die doel van hierdie Instructable is om te illustreer hoe om 'n digitale (kwadratuur gekodeerde) draaiskakelaar met 'n mikrobeheerder te koppel. Moenie bekommerd wees nie; ek sal verduidelik wat kwadratuur -gekodeerde vir ons beteken. Hierdie koppelvlak en die meegaande sagteware sal die mikrobeheerder in staat stel om die draairigting vir elke beweging van een sper na die ander te herken. in plaas van op/af knoppies. Die idee was om die gebruiker in staat te stel om die gewenste druk in te skakel. As gevolg hiervan moes ons 'n sagteware -roetine ontwikkel om die posisiesinligting van die skakelaar af te haal en die rotasierigting af te lei om die drukinstelpunt vir die hoofstelsel te verhoog of te verlaag. In hierdie instruksies behandel ek die fisiese koppelvlak aan die mikrobeheerder, die teorie van werking vir die draaischakelaar, die teorie van werking vir die sagteware sowel as die aftrekkingsroetine. Uiteindelik sal ek u my toepassing van die aftrekkingsroetine wys. Soos ons vorder, sal ek probeer om dinge ietwat generies te hou sodat die idee op soveel platforms moontlik toegepas kan word, maar ek sal ook deel wat ek gedoen het sodat u 'n spesifieke toepassing kan sien.

Stap 1: Onderdele

Dele
Dele

Om dit te kan implementeer, benodig u: 'n Draaiskakelaar (kwadratuur gekodeer) Trek weerstande Geskikte mikrobeheerderplatform Vir my projek het ek 'n Grayhill 61C22-01-04-02 optiese encoder gebruik. Die gegewensblad vir die draaiskakelaar vereis 8,2k ohm optrekweerstands op die twee data lyne wat van die skakelaar af kom. U wil die gegewensblad nagaan vir die encoder wat u kies om te gebruik. Die draaiskakelaar wat ek gebruik het, kan ook bestel word met 'n aksiale drukknopskakelaar. Dit is 'n nuttige funksie vir die maak van keuses wat ingeskakel is, ens., Maar ek sal nie die koppelvlak hier bespreek nie. Ek het 'n 'geskikte mikrobeheerderplatform' gelys, want (ek dink) dit kan op meer as een platform geïmplementeer word. Ek het baie mense gesien wat ander mikrobeheerders gebruik vir Instructables, so ek wil ook die algemene benadering toon. Ek het al die kode in PIC Basic Pro geskryf vir gebruik met 'n Microchip PIC16F877A. Die belangrikste ding wat u op die mikrobeheerder nodig het, is die vermoë om te onderbreek as daar 'n logiese verandering op een van die twee penne is. Op die PIC16F877A word dit die PORTB -veranderingsonderbreking genoem. Daar kan ander name daarvoor op ander beheerders wees. Hierdie onderbrekingsfunksie van die mikrobeheerder is deel van wat hierdie implementering so elegant maak.

Stap 2: Hardeware -koppelvlak

Hardeware -koppelvlak
Hardeware -koppelvlak

'N' Eenvoudige 'oplossing sou wees om 'n' enkelpaal-16-gooi'-skakelaar met 16 verbindings met die mikrobeheerder te hê. Elke skakelaaruitset word dan aan 'n pen op die mikrobeheerder vasgemaak sodat elke draaiposisie deur die mikrobeheerder nagegaan kan word. Dit is 'n oormatige gebruik van I/O -penne. Dinge word nog erger as ons meer as 16 posisies (aanhoudings) vir ons op die skakelaar wil hê. Elke ekstra posisie op die skakelaar sal 'n ekstra inset na die mikrobeheerder vereis. Dit word vinnig 'n baie ondoeltreffende gebruik van insette op 'n mikrobeheerder. Voer die skoonheid van die draaiskakelaar in. Die draaiskakelaar het slegs twee uitsette na die mikrobeheerder wat as A en B op die gegewensblad gelys word. Daar is slegs vier moontlike logiese vlakke wat hierdie lyne kan neem: AB = 00, 01, 10 en 11. Dit verminder die aantal invoerlyne wat u moet gebruik om die skakelaar aan die mikrobeheerder te koppel. Ons het dus die aantal invoerlyne tot net twee verminder. Nou wat? Dit lyk asof ons regtig 16 verskillende state benodig, maar hierdie nuwe skakelaar het slegs vier. Het ons onsself in die voet geskiet? Nope. Lees verder. Ons sal 'n bietjie van die teorie agter die draai -skakelaar -operasie bespreek om dit te verduidelik.

Stap 3: Hardeware -teorie van werking

Hardeware teorie van werking
Hardeware teorie van werking
Hardeware teorie van werking
Hardeware teorie van werking
Hardeware teorie van werking
Hardeware teorie van werking

Rotasie-rigtingswaarneming is moontlik met behulp van die bogenoemde 'enkelpaal-16-gooi'-skakelaar, maar dit gebruik baie insette op die mikrobeheerder. Deur die draaiskakelaar te gebruik, verminder die aantal insette na die mikrobeheerder, maar nou moet ons die seine van die skakelaar interpreteer en dit na 'n rotasierigting vertaal. Ek het vroeër genoem dat die skakelaar kwadratuur gekodeer is. Dit is ook een van die belangrikste eleganse in hierdie oplossing. Dit beteken dat daar 'n 2-bis kode is wat die skakelaar gee wat ooreenstem met die posisie van die skakelaar. U dink moontlik: "As daar 'n tweesnit -invoer na die mikrobeheerder is, hoe verteenwoordig ons al 16 posisies?" Dit is 'n goeie vraag. Ons verteenwoordig hulle nie almal nie. Ons moet net die relatiewe posisies van die knop ken, sodat ons die draairigting kan bepaal. Die absolute posisie van die knop is irrelevant. Vir rotasie met die kloksgewys herhaal die kode wat die skakelaar gee elke vier keer en word grys gekodeer. Grys gekodeer beteken dat daar slegs 'n bietjie verandering is vir elke posverandering. In plaas daarvan dat die AB -inset tel vir kloksgewyse rotasie in binêre soos volg: 00, 01, 10, 11, verander dit so: 00, 10, 11, 01. Let op dat daar vir laasgenoemde patroon slegs een inset verander tussen stelle. Die antikloksgewys waardes vir die AB -invoer na die mikrobeheerder sal soos volg lyk: 00, 01, 11, 10. Dit is eenvoudig die omgekeerde van die kloksgewys patroon met AB = 00 wat eers gelys is. Kyk na die diagramme vir 'n meer visuele verduideliking.

Stap 4: Sagteware -teorie van werking

Sagteware teorie van werking
Sagteware teorie van werking

Die roetine wat die rotasie rigting aflei, word onderbreek. Die mikrobeheerder wat u kies, moet altyd kan onderbreek as daar 'n verandering aan een van (ten minste) twee penne is wanneer die onderbreking geaktiveer is. Dit word die PORTB -veranderingsonderbreking op die PIC16F877A genoem. Elke keer as die skakelaar gedraai word, word die mikrobeheerder onderbreek en die uitvoering van die program word na die Interrupt Service Routine (ISR) gestuur. Die ISR sal vinnig agterkom hoe die skakelaar gedraai is, 'n vlag op die regte manier stel en vinnig terugkeer na die hoofprogram. Dit is nodig dat dit vinnig gebeur as die gebruiker die skakelaar baie vinnig draai. Ons weet dat die grys gekodeerde AB -patroon elke vier posisies herhaal, so as ons die roetine laat werk vir oorgange tussen die vier posisies, sal dit vir al die ander werk. Let op dat daar in een vierposisiesiklus vier rande is. 'N Stygende rand en 'n dalende rand vir die A -invoer sowel as die B -invoer. Die mikroverwerker word onderbreek elke keer as daar 'n rand is, wat beteken dat die mikrobeheerder onderbreek sal word wanneer die knop gedraai word. As gevolg hiervan moet die ISR uitvind watter rigting die knop gedraai is. Om ons te help uitvind hoe ons dit moet doen, draai ons na die golfvorm vir rotasie met die kloksgewys. Let op dat wanneer A 'n rand het, sy nuwe waarde altyd anders is as die van B. As die knop van posisie 1 na 2 gaan, gaan A oor van logika-0 na logika-1. B is steeds 0 vir hierdie oorgang en stem nie ooreen met die nuwe waarde van A. As die knop van posisie 3 na 4 gaan, het A 'n dalende rand terwyl B by logika-1 bly. Let weer op dat B en die nuwe waarde van A anders is. Op die oomblik kan ons sien dat A elke keer dat A die onderbreking veroorsaak tydens rotasie met die kloksgewys, die nuwe waarde daarvan verskil van die van B. Kom ons kyk na B om te sien wat gebeur. B het 'n stygende rand wanneer die skakelaar van posisie 2 na 3. oorgaan. Hier is die nuwe waarde van B dieselfde as A. As ons na die laaste oorblywende rand kyk vir kloksgewys draai, het B 'n dalende rand wat van posisie 4 na 5 beweeg. (Posisie 5 is dieselfde as posisie 1.) Die nuwe waarde van B is ook hier dieselfde as A! Ons kan nou 'n paar afleidings maak! As A die onderbreking veroorsaak en die nuwe waarde van A verskil van dié van B, was die rotasie kloksgewys. Verder, as B die onderbreking veroorsaak en die nuwe waarde van B dieselfde is as A, dan was die rotasie met die kloksgewys. Kom ons kyk vinnig na die geval van rotasie teen die kloksgewys. Net soos met die kloksgewys draai, veroorsaak rotasie teen die kloksgewys vier onderbrekings in een siklus: twee vir invoer A en twee vir invoer B… As die knop van posisie 4 na 3 beweeg, is die nuwe waarde van A dieselfde as die waarde van B. Let op dat wanneer A van posisie 2 na 1 beweeg, die nuwe waarde daarvan ook dieselfde is as die van B. Nou kan ons sien dat wanneer A die onderbreking veroorsaak en die nuwe waarde daarvan ooreenstem met dié van B, die rotasie linksom was. Ons kyk vinnig na invoer B om alles te verifieer. B sal 'n onderbreking veroorsaak wanneer die knop van posisie 5 (wat dieselfde is as 1) na 4 beweeg en wanneer die knop van posisie 3 na 2. beweeg. In albei hierdie gevalle stem die nuwe waarde van B nie ooreen met die bestaande waarde nie van A wat die teenoorgestelde is van die gevalle wanneer B die onderbreking vir kloksgewys draai veroorsaak. Dit is goeie nuus. Alles kyk uit soos dit moet. Om op te som, as A die onderbreking veroorsaak en die nuwe waarde daarvan nie ooreenstem met die waarde van B nie, of as B die onderbreking veroorsaak en die nuwe waarde van B ooreenstem met die waarde van A, weet ons dat daar kloksgewys gedraai is. Ons kan die ander gevalle vir rotasie teen die kloksgewys in sagteware kontroleer, of ons kan aanneem dat dit nie met die kloksgewys gedraai is nie. My roetine het eenvoudig die aanname gemaak.

Stap 5: sagteware

Sagteware
Sagteware
Sagteware
Sagteware

Ek het nie die ingeboude onderbrekings in PIC Basic Pro gebruik nie. Ek het 'n paar lêers wat ek in my kode van Darrel Taylor ingesluit het, gebruik om die roetine te bestuur. Dit is waar 'n groot eer aan Darrel behoort! Die lêers is gratis. Besoek sy webwerf vir meer inligting, ander toepassings en om die lêers af te laai. U kan hierdie deel oorslaan as u nie 'n PIC gebruik met onderbrekings van Darrel Taylor nie. Stel net die onderbrekings in soos nodig op die platform wat u gebruik. Om die Darrel Taylor (DT) onderbrekings op te stel, is daar twee dinge om te doen: 1.) Sluit die DT_INTS-14.bas- en ReEnterPBP.bas-lêers in in u kode.2.) Kopieer en plak dit in u kode. ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, ja endm INT_CREATEENDASM Plaas oortjies en spasies soos die grafiek aan die einde van die Instructable, sodat u dinge 'n bietjie makliker in u kode kan sien. U moet dit effens aanpas om aan u behoeftes te voldoen. Onder Label, vervang ISR met die naam van die subroutine wat u ISR is. Moenie die onderstreepteken vergeet nie! Jy het dit nodig! Om die onderbrekings te laat werk, is daar nog twee dinge om te doen: 1.) Skryf die ISR. U skryf dit net soos u 'n PBP -subroutine sou skryf, behalwe dat u @ INT_RETURN aan die einde van die subroutine moet plaas in plaas van RETURN. Dit sal die onderbreking erken en die uitvoering van die program terugbring na waar dit in die hooflus opgehou het. Binne die ISR moet u die onderbreking vlag skoonmaak sodat u program nie in 'n rekursiewe onderbreking beland nie. Om PORTB te lees, is al wat u moet doen om die vlag op die PIC16F877A skoon te maak. Elke verskillende mikrobeheerder het 'n ander manier om onderbrekingsvlae te vee. Kontroleer die gegewensblad vir u mikrobeheerder.) van die goed wat ingepak is in wat ek nou net gedek het, sodat ek dit vinnig kan opsom. Tot dusver behoort u program so te lyk:; Enige benodigde opstel of kode INCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, ja endm INT_CREATEENDASM; Enige ander nodige opstelling of kode@ INT_ENABLE RBC_INT; Kode wat moet weet in watter rigting die knop draai@ INT_DISABLE RBC_INT; Ander kodeEND; Einde van programmyISR:; ISR -kode hier@ INT_RETURN (Interrupt Handler Set Table) Ek dink dit is waar almal wat nie 'n PIC- of DT -onderbreking gebruik nie, weer kan aansluit. Nou moet ons die ISR skryf sodat die mikrobeheerder weet hoe die knop draai. Onthou uit die sagtewareteorie -afdeling dat ons die draairigting kan aflei as ons die insette wat die onderbreking veroorsaak het, die nuwe waarde en die waarde van die ander insette ken. Hier is die pseudokode: Lees PORTB in 'n krasveranderlike om die onderbrekingsvlag skoon te maak Kontroleer of A die onderbreking veroorsaak het. As dit waar is, vergelyk A en B. Kontroleer of dit anders is, as dit anders is. Dit was met die kloksgewys omdraai, anders was dit EndifCheck of B die onderbreking veroorsaak het. As dit waar is, vergelyk A en B Kontroleer of dit anders is, as dit dieselfde was. Dit was met die kloksgewys omdraai, anders, dit was teen die rigting van EndifReturn van interrupt Hoe weet ons of 'n verandering op A of B die onderbreking veroorsaak het? Dit is maklik om die nuwe waarde van die veranderde insette en die ander (onveranderde) invoer te ontdek, want ons kan dit binne die ISR lees. Ons moet weet wat die toestand van elkeen was voordat die teregstelling na die ISR gestuur word. Dit gebeur in die hoofroetine. Die hoofroetine sit en wag dat 'n byte -veranderlike wat ons CWflag genoem het, op 1 gestel word of deur die ISR tot 0 skoongemaak word. Na elke erkende verandering van die knop of as daar geen knopaktiwiteit is nie, word die veranderlike op 5 gestel om 'n ledige toestand aan te dui. As die vlag reggemaak word of dit skoongemaak word, verhoog of verlaag die hoofroetine onmiddellik die ingestelde druk op die regte manier op grond van die rotasie en stel dan die CWflag -veranderlike terug op 5 omdat die knop nou weer ledig is. Aangesien die hoofroetine die CWflag nagaan, dokumenteer dit ook die toestand van die A- en B -draaiskakelaarwaardes. Dit is regtig eenvoudig en lyk so: oldA = AoldB = B Hier is regtig niks super fancy nie. Sluit net die twee reëls aan die begin van die lus in wat die CWflag op rotasie kontroleer. Ons werk net die logiese waardes van die insette vanaf die draaiknop binne die inkrement/afneemlus in die hoofroetine op, sodat ons kan sien watter insette die onderbreking veroorsaak het toe die ISR uitgevoer word. Hier is die ISR -kode: ABreise: scratch = PORTB 'Lees PORTB om die onderbrekingvlag te verwyder' As A die onderbreking veroorsaak, kyk B na rotasie as IFA! = A DAN 'As A en B verskil, was dit draai met die kloksgewys IF A! = B DAN GOTO CW 'Andersins was dit rotasie teen die kloksgewys ELSE GOTO CCW ENDIF ENDIF' As B die onderbreking veroorsaak, kyk A vir rotasie rigting AS oudB! = B DAN 'As A en B dieselfde is, is dit was rotasie met die kloksgewys AS A == B DAN GOTO CW 'Andersins was dit linksom anders ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNI Ek het die ISR -kode in 'n AB_ISR.bas -lêer opgeneem omdat die tabs in die kode verskyn nie soos dit moet nie. Omdat die ISR die ou waardes vir insette A en B het, kan dit bepaal watter insette die onderbreking veroorsaak het, dit vergelyk met die ander (onveranderde) invoer en die rigting bepaal van rotasie. Al wat die belangrikste roetine hoef te doen, is om na die CWflag te kyk in watter rigting die knop gedraai het (indien wel) en om 'n teller, stelpunt of wat u ook al nodig het, te verhoog of te verlaag. Ek hoop dit help en was ook nie verwarrend. Hierdie tipe koppelvlak is veral handig as u stelsel reeds onderbrekings gebruik, aangesien dit slegs nog 'n onderbreking is om by te voeg. Geniet dit!

Aanbeveel: