Satura rādītājs:

Kā interpretēt rotācijas virzienu no digitālā daudzfunkcionālā slēdža ar PIC: 5 soļi
Kā interpretēt rotācijas virzienu no digitālā daudzfunkcionālā slēdža ar PIC: 5 soļi

Video: Kā interpretēt rotācijas virzienu no digitālā daudzfunkcionālā slēdža ar PIC: 5 soļi

Video: Kā interpretēt rotācijas virzienu no digitālā daudzfunkcionālā slēdža ar PIC: 5 soļi
Video: Home Automation: Change direction of rotation of DC motor using 2 relays and Arduino - Robojax 2024, Jūlijs
Anonim
Kā interpretēt rotācijas virzienu no digitālā daudzfunkcionālā slēdža ar PIC
Kā interpretēt rotācijas virzienu no digitālā daudzfunkcionālā slēdža ar PIC

Šīs pamācības mērķis ir ilustrēt, kā saslēgt digitālo (kvadrātiski kodēto) rotējošo slēdzi ar mikrokontrolleri. Neuztraucieties, es paskaidrošu, ko mums nozīmē kodētā kvadratūra. Šī saskarne un pievienotā programmatūra ļaus mikrokontrolleram atpazīt rotācijas virzienu katrai kustībai no viena aizturētāja uz otru. Es nesen izmantoju šāda veida slēdzi mikrokontrollera projektā, kurā bija nepieciešams ievadīt spiediena iestatīšanas punktu, izmantojot pogu ar 16 aizturus, nevis augšup/lejup vērstas pogas. Ideja bija ļaut lietotājam "iezvanīt" vēlamo spiedienu. Tā rezultātā mums bija jāizstrādā programmatūras rutīna, lai no slēdža iegūtu informāciju par atrašanās vietu un secinātu rotācijas virzienu, lai palielinātu vai samazinātu galvenās sistēmas spiediena iestatīšanas punktu. Šajā instrukcijā es apskatīšu fizisko saskarni mikrokontrolleru, rotācijas slēdža darbības teoriju, programmatūras darbības teoriju, kā arī atskaitīšanas kārtību. Visbeidzot, es jums parādīšu savu atskaitīšanas kārtības pielietojumu. Tā kā mēs progresējam, es centīšos saglabāt lietas nedaudz vispārīgas, lai ideju varētu izmantot pēc iespējas vairākās platformās, bet es arī pastāstīšu, ko es darīju, lai jūs varētu redzēt konkrētu lietojumprogrammu.

1. darbība: detaļas

Daļas
Daļas

Lai to īstenotu, jums būs nepieciešams: rotējošs slēdzis (kodēts ar kvadratūru); uzvilkt rezistorus; piemērota mikrokontrolleru platforma. Rotācijas slēdža datu lapa prasa 8,2 kΩ pretestības rezistorus divās datu līnijās, kas nāk no slēdža. Jūs vēlaties pārbaudīt kodētāja datu lapu, kuru izvēlaties izmantot. Manu rotējošo slēdzi var pasūtīt arī ar aksiālu spiedpogas slēdzi. Tā ir noderīga funkcija, lai veiktu atlasi, kas ir sastādīta utt., Bet es šeit neapspriedīšu tās saskarni. Man ir uzskaitīta "piemērota mikrokontrolleru platforma", jo (es domāju) to var īstenot vairākās platformās. Esmu redzējis daudz cilvēku, kas Instructables izmanto citus mikrokontrollerus, tāpēc es vēlos parādīt arī vispārējo pieeju. Es uzrakstīju visu kodu programmā PIC Basic Pro lietošanai ar mikroshēmu PIC16F877A. Patiešām, galvenais, kas jums nepieciešams mikrokontrollerī, ir spēja pārtraukt darbību, ja notiek loģikas izmaiņas vienā no divām tapām. PIC16F877A to sauc par PORTB izmaiņu pārtraukšanu. Citos kontrolleros tam var būt citi nosaukumi. Šī mikrokontrollera pārtraukšanas funkcija ir daļa no tā, kas padara šo ieviešanu tik elegantu.

2. darbība. Aparatūras saskarne

Aparatūras saskarne
Aparatūras saskarne

"Vienkāršs" risinājums būtu slēdzis "viens pols-16" ar 16 savienojumiem ar mikrokontrolleri. Pēc tam katra slēdža izeja būtu saistīta ar mikrokontrollera tapu, lai mikrokontrolleris varētu pārbaudīt katru ciparnīcas pozīciju. Tā ir pārmērīga I/O tapu izmantošana. Situācija pasliktinās vēl vairāk, ja vēlamies, lai uz slēdža mums būtu pieejamas vairāk nekā 16 pozīcijas (aizturēšanas vietas). Katrai slēdža papildu pozīcijai būtu nepieciešama papildu ievade mikrokontrollerī. Tas ātri kļūst par ļoti neefektīvu mikrokontrollera ievades izmantošanu. Ievadiet rotējošā slēdža skaistumu. Rotācijas slēdzim ir tikai divas izejas uz mikrokontrolleri, kas datu lapā uzskaitīti kā A un B. Šīs līnijas var izmantot tikai četrus iespējamos loģikas līmeņus: AB = 00, 01, 10 un 11. Tas ievērojami samazina ievades līniju skaitu, kas jāizmanto, savienojot slēdzi ar mikrokontrolleri. Tātad, mēs esam samazinājuši ievades rindu skaitu līdz divām. Ko tagad? Šķiet, ka mums patiešām ir vajadzīgi 16 dažādi stāvokļi, taču šim jaunajam slēdzim ir tikai četri. Vai mēs esam iešāvuši sev kājā? Nē. Turpini lasīt. Mēs izskaidrosim mazliet teorijas, kas balstās uz rotējošā slēdža darbības.

3. darbība. Aparatūras darbības teorija

Aparatūras darbības teorija
Aparatūras darbības teorija
Aparatūras darbības teorija
Aparatūras darbības teorija
Aparatūras darbības teorija
Aparatūras darbības teorija

Rotācijas virziena noteikšana ir iespējama, izmantojot iepriekš minēto "viena pola 16" slēdzi, taču tas izmanto daudz mikrokontrollera ievades. Izmantojot rotējošo slēdzi, tiek samazināts mikrokontrollera ieeju skaits, bet tagad mums ir jāinterpretē signāli, kas nāk no slēdža, un tie jāpārvērš rotācijas virzienā. Iepriekš minēju, ka slēdzis bija kodēts kvadrātiski. Šī ir arī viena no šī risinājuma galvenajām elegancēm. Tas nozīmē, ka slēdzim ir 2 bitu kods, kas atbilst slēdža pozīcijai. Jūs varētu domāt: "Ja mikrokontrolleram ir divu bitu ievade, kā mēs attēlojam visas 16 pozīcijas?" Tas ir labs jautājums. Mēs viņus visus nepārstāvam. Mums vienkārši jāzina pogas relatīvās pozīcijas, lai mēs varētu noteikt rotācijas virzienu. Pogas absolūtajai pozīcijai nav nozīmes. Pagriežot pulksteņrādītāja virzienā, slēdža kods atkārtojas ik pēc četriem aizturiem un ir pelēks. Pelēks kodēts nozīmē, ka katrai pozīcijas maiņai ir tikai viena bitu maiņa. Tā vietā, lai AB ievade tiktu skaitīta pulksteņrādītāja kustības virzienā binārā formātā šādi: 00, 01, 10, 11, tā mainās šādi: 00, 10, 11, 01. Ņemiet vērā, ka pēdējam modelim ir tikai viena ievade, kas mainās starp komplekti. Mikrokontrollera AB ievades pretēji pulksteņrādītāja virzienam vērtības izskatīsies šādi: 00, 01, 11, 10. Tas ir vienkārši pretēji pulksteņrādītāja kustības virzienam, vispirms norādot AB = 00. Lai iegūtu vizuālāku skaidrojumu, apskatiet diagrammas.

4. solis: programmatūras darbības teorija

Programmatūras darbības teorija
Programmatūras darbības teorija

Rutīna, kas nosaka rotācijas virzienu, tiek pārtraukta. Atlasītajam mikrokontrolleram jāspēj pārtraukt darbību jebkurā laikā, kad tiek mainītas abas (vismaz) divas tapas, kad pārtraukums ir iespējots. PIC16F877A to sauc par PORTB izmaiņu pārtraukšanu. Ikreiz, kad slēdzis tiek pagriezts, mikrokontrolleris tiks pārtraukts un programmas izpilde tiks nosūtīta uz pakalpojumu pārtraukšanas kārtību (ISR). ISR ātri noskaidros, kādā virzienā slēdzis tika pagriezts, atbilstoši iestatīs karodziņu un ātri atgriezīsies galvenajā programmā. Mums tas jānotiek ātri, ja lietotājs ļoti ātri pagriež slēdzi. Mēs zinām, ka pelēkais kodētais AB modelis atkārtojas ik pēc četrām pozīcijām, tādēļ, ja mēs veicam ikdienas darbu pārejām starp šīm četrām pozīcijām, tas darbosies arī visos pārējos. Ievērojiet, ka vienā četru pozīciju ciklā ir četras malas. Augšējā mala un krītošā mala A ieejai, kā arī B ieejai. Mikroprocesors tiks pārtraukts katru reizi, kad būs kāda mala, kas nozīmē, ka mikrokontrolleris tiks pārtraukts jebkurā laikā, pagriežot pogu. Tā rezultātā ISR ir jāizdomā, kādā virzienā poga tika pagriezta. Lai palīdzētu mums saprast, kā to izdarīt, mēs pievēršamies viļņu formai griešanai pulksteņrādītāja virzienā. Ņemiet vērā, ka jebkurā laikā, kad A ir mala, tā jaunā vērtība vienmēr atšķiras no vērtības B. Kad poga pārvietojas no 1. pozīcijas uz 2. pozīciju, A pāriet no loģikas-0 uz loģiku-1. B šai pārejai joprojām ir 0 un neatbilst jaunajai vērtībai A. Kad poga pārvietojas no pozīcijas 3 uz 4, A ir krītoša mala, bet B paliek pie loģikas-1. Vēlreiz ievērojiet, ka B un jaunā A vērtība ir atšķirīga. Pašlaik mēs redzam, ka jebkurā laikā, kad A izraisa pārtraukumu pulksteņrādītāja kustības virzienā, tā jaunā vērtība atšķiras no B. Pārbaudīsim B, lai redzētu, kas notiek. B ir augoša mala, kad slēdzis pāriet no 2. pozīcijas uz 3. Šeit jaunā B vērtība ir tāda pati kā A. Skatoties uz pēdējo atlikušo malu pulksteņrādītāja kustības virzienā, B ir krītoša mala, kas pārvietojas no 4. pozīcijas uz 5. pozīciju. (5. pozīcija ir tāda pati kā 1. pozīcija.) B jaunā vērtība arī šeit ir tāda pati kā A! Tagad mēs varam izdarīt dažus atskaitījumus! Ja A izraisa pārtraukumu un jaunā A vērtība atšķiras no B vērtības, rotācija notika pulksteņrādītāja virzienā. Turklāt, ja B izraisa pārtraukumu un jaunā B vērtība ir tāda pati kā A, tad rotācija notika pulksteņrādītāja virzienā. Ātri izskatīsim rotācijas pretēji pulksteņrādītāja virzienam gadījumu. Tāpat kā pagriešana pulksteņrādītāja virzienā, arī pretēji pulksteņrādītāja kustības virzienam vienā ciklā būs četri pārtraukumi: divi ieejai A un divi ieejai B. Ievadam A ir augoša mala, kad poga pārvietojas no 4. pozīcijas uz 3., un krītošā mala pārvietojas no 2. pozīcijas uz 1 Kad poga pārvietojas no 4. pozīcijas uz 3., jaunā vērtība A ir tāda pati kā vērtība B. Ņemiet vērā, ka tad, kad A pārvietojas no 2. pozīcijas uz 1., tā jaunā vērtība ir tāda pati kā B vērtība. Tagad mēs redzam, ka tad, kad A izraisa pārtraukumu un tā jaunā vērtība atbilst B vērtībai, rotācija notika pretēji pulksteņrādītāja virzienam. Ātri mēs apskatīsim ievadi B, lai pārbaudītu visu. B izraisa pārtraukumu, kad poga pārvietojas no 5. pozīcijas (kas ir tāda pati kā 1.) uz 4. un kad poga pārvietojas no 3. pozīcijas uz 2. Abos šajos gadījumos jaunā B vērtība neatbilst esošajai vērtībai no A, kas ir pretējs gadījumiem, kad B izraisa pārtraukumu pulksteņrādītāja kustības virzienā. Šī ir laba ziņa. Viss tiek pārbaudīts tā, kā vajadzētu. Rezumējot, ja A izraisa pārtraukumu un tā jaunā vērtība nesakrīt ar B vērtību vai ja B izraisa pārtraukumu, un jaunā B vērtība atbilst A vērtībai, mēs zinām, ka bija rotācija pulksteņrādītāja virzienā. Pārējos gadījumos programmatūrā varam pārbaudīt rotāciju pretēji pulksteņrādītāja virzienam vai pieņemt, ka tāpēc, ka tā nebija rotācija pulksteņrādītāja virzienā, tā bija pretēji pulksteņrādītāja virzienam. Mana rutīna vienkārši izdarīja pieņēmumu.

5. solis: programmatūra

Programmatūra
Programmatūra
Programmatūra
Programmatūra

Es neizmantoju iebūvētos pārtraukumus programmā PIC Basic Pro. Es izmantoju pāris failus, kurus es iekļāvu savā kodā no Darela Teilora, lai veicinātu rutīnu. Šeit ir milzīgs Darela nopelns! Faili ir bezmaksas. Vienkārši apmeklējiet viņa vietni, lai iegūtu vairāk informācijas, citas lietojumprogrammas un lejupielādētu failus. Jūs varat izlaist šo daļu, ja neizmantojat PIC ar Darela Teilora pārtraukumiem. Vienkārši iestatiet pārtraukumus pēc nepieciešamības jūsu izmantotajā platformā. Lai iestatītu Darela Teilora (DT) pārtraukumus, ir jādara divas lietas: 1.) Iekļaujiet savā failā DT_INTS-14.bas un ReEnterPBP.bas failus. code.2.) Kopējiet un ielīmējiet to savā kodā. ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, jā endm INT_CREATEENDASI Ievietojiet cilnes un atstarpes, piemēram, grafiku Instructable beigās, lai jūs varētu vieglāk redzēt lietas savā kodā. Jums tas būs nedaudz jāpārveido, lai tas atbilstu jūsu vajadzībām. Sadaļā Iezīme aizstājiet ISR ar tās ISR apakšprogrammas nosaukumu. Neaizmirstiet pasvītrojumu! Jums tas ir vajadzīgs! Lai pārtraukumi darbotos, ir jāveic vēl divas darbības: 1.) Uzrakstiet ISR. Jūs to rakstīsit tāpat kā rakstījāt PBP apakšprogrammu, izņemot to, ka apakšprogrammas beigās būs jāievieto @ INT_RETURN, nevis RETURN. Tas atzīs pārtraukumu un atgriezīs programmas izpildi vietā, kur tā tika pārtraukta galvenajā cilpā. ISR iekšpusē jums ir jānoņem pārtraukuma karodziņš, lai jūsu programma netiktu iekļauta rekursīvā pārtraukumā. Vienkārši izlasot PORTB, viss, kas jādara, lai notīrītu PIC16F877A pārtraukuma karodziņu. Katram mikrokontrolleram ir atšķirīgs veids, kā notīrīt pārtraukuma karodziņus. 2.) Kad sasniedzat koda punktu, kurā vēlaties iespējot pārtraukumu, izmantojiet šo koda rindiņu:@ INT_ENABLE RBC_INT Ja vēlaties atspējot pārtraukumu, vienkārši izmantojiet:@ INT_DISABLE RBC_INTTur ir daudz lietas, kas iepakotas tikko aptvertajā, tāpēc ātri apkopošu. Līdz šim jūsu programmai vajadzētu izskatīties apmēram šādi:; Jebkura nepieciešamā iestatīšana vai kodsINCLUDE "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, jā endm INT_CREATEENDASM; Jebkura cita nepieciešamā iestatīšana vai kods@ INT_ENABLE RBC_INT; Kods, kuram jāzina pogas rotācijas virziens@ INT_DISABLE RBC_INT; Cits kodsEND; ProgrammyISR beigas:; ISR kods šeit@ INT_RETURN (pārtraukšanas apstrādātāja iestatīšanas tabula) Es domāju, ka šeit var atkal pievienoties ikviens, kurš neizmanto PIC vai DT pārtraukumus. Tagad mums faktiski jāraksta ISR, lai mikrokontrolleris zinātu, uz kuru pusi poga griežas. Atcerieties no programmatūras teorijas sadaļas, ka mēs varam secināt rotācijas virzienu, ja mēs zinām ievadi, kas izraisīja pārtraukumu, tā jauno vērtību un citas ievades vērtību. Šeit ir pseidokods: izlasiet PORTB skrāpējumu mainīgajā, lai notīrītu pārtraukuma karogu Pārbaudiet, vai pārtraukumu izraisīja A. Ja tā ir taisnība, salīdziniet A un B. Pārbaudiet, vai atšķiras, ja atšķiras, tas bija rotācija pulksteņrādītāja virzienā, citādi - EndifCheck, vai pretēji pulksteņrādītāja virzienam, vai pārtraukumu izraisīja B. Ja ir taisnība, salīdziniet A un B Pārbaudiet, vai atšķiras, ja tas ir vienāds, vai tā bija griešanās pulksteņrādītāja virzienā, citādi - pretēji pulksteņrādītāja virzienam EndifReturn from interruptKā mēs zinām, vai pārtraukums izraisīja izmaiņas A vai B? Izmainītās ievades un citas (nemainītās) ievades jaunās vērtības atklāšana ir vienkārša, jo mēs varam tās izlasīt ISR iekšpusē. Mums jāzina, kāds bija katra stāvoklis, pirms izpilde tika nosūtīta ISR. Tas notiek galvenajā rutīnā. Galvenā rutīna sēž un gaida, kad ISR iestatīs baitu mainīgo, ko saucām par CWflag, uz 1 vai notīrītu līdz 0. Pēc katras apstiprinātās pogas maiņas vai ja poga netiek veikta, mainīgais tiek iestatīts uz 5, lai norādītu dīkstāves stāvokli. Ja karodziņš tiek iestatīts vai notīrīts, galvenais režīms nekavējoties palielina vai samazina iestatītās vērtības spiedienu atbilstoši rotācijai un pēc tam CWflag mainīgo atgriež uz 5, jo poga atkal ir tukšgaitā. Tā kā galvenā rutīna ir CWflag pārbaude, tā arī dokumentē A un B rotācijas slēdža vērtību stāvokli. Tas ir patiešām vienkārši un izskatās šādi: oldA = AoldB = BTiešām šeit nav nekā superīga. Vienkārši iekļaujiet šīs divas rindiņas cilpas sākumā, kas pārbauda CWflag rotāciju. Mēs vienkārši atjauninām ieejas loģiskās vērtības no rotējošās pogas, kas atrodas palielināšanas/samazināšanas cilpas iekšpusē galvenajā rutīnā, lai mēs varētu redzēt, kāda ievade izraisīja pārtraukumu, kad tiek izpildīts ISR. Šeit ir ISR kods. A! = B THEN GOTO CW 'Pretējā gadījumā rotācija notika pretēji pulksteņrādītāja virzienam. CITA GOTO CCW ENDIF ENDIF' bija rotācija pulksteņrādītāja virzienā IF A == B THEN GOTO CW 'Pretējā gadījumā rotācija bija pretēji pulksteņrādītāja virzienam. ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNI ISR kodu esam iekļāvuši failā AB_ISR.bas, jo koda cilnes netiek parādītas tā, kā vajadzētu. Tagad, tā kā ISR ir vecās ievades A un B vērtības, tā var noteikt, kura ievade izraisīja pārtraukumu, salīdzināt to ar citu (nemainītu) ievadi un noteikt virzienu rotācijas. Viss, kas jādara, ir pārbaudīt CWflag, lai redzētu, kurā virzienā poga ir pagriezusies (ja tā ir), un palielināt vai samazināt skaitītāju, iestatījuma punktu vai visu, kas jums patīk vai nepieciešams. Es ceru, ka tas palīdz un nav bijis pārāk mulsinoši. Šis interfeisa veids ir īpaši noderīgs, ja jūsu sistēma jau izmanto pārtraukumus, jo tas ir tikai vēl viens pārtraukums, ko pievienot. Izbaudi!

Ieteicams: