Мазмуну:

PIC менен санариптик Ротари которгучтан айлануу багытын кантип чечмелөө керек: 5 кадам
PIC менен санариптик Ротари которгучтан айлануу багытын кантип чечмелөө керек: 5 кадам

Video: PIC менен санариптик Ротари которгучтан айлануу багытын кантип чечмелөө керек: 5 кадам

Video: PIC менен санариптик Ротари которгучтан айлануу багытын кантип чечмелөө керек: 5 кадам
Video: ЭКИ КӨЗ КАМЕРА ЖАҢЫЛГАНДАН КИЙИН ТАҢ КАЛДЫ!!! 2024, Июль
Anonim
PIC менен санариптик айлануучу которуштуруудан айлануу багытын кантип чечмелөө керек
PIC менен санариптик айлануучу которуштуруудан айлануу багытын кантип чечмелөө керек

Бул Нускаманын максаты - микроконтроллер менен санариптик (төрт бурчтуу коддуу) айлануучу коммутатордун интерфейсин кантип көрсөтүү керек. Кабатыр болбоңуз, мен квадратура коду биз үчүн эмнени билдирерин түшүндүрөм. Бул интерфейс жана аны коштогон программалык камсыздоо микроконтроллерге ар бир кыймылдын айлануу багытын таанууга мүмкүндүк берет. Жакында микроконтроллердин долбоорунда которуунун бул түрүн колдондум. өйдө/ылдый баскычтардын ордуна кармоо. Идея колдонуучуга керектүү кысымды "терүүгө" уруксат берүү болчу. Натыйжада, биз негизги системанын басымын белгилөө чекитин жогорулатуу же азайтуу үчүн которуштуруучу позиция тууралуу маалыматты алуу жана айлануу багытын аныктоо үчүн программалык программаны иштеп чыгышыбыз керек болчу. микроконтроллерге, айлануучу которгучтун иштөө теориясы, программалык камсыздоонун иштөө теориясы, ошондой эле чегерүү тартиби. Акыр -аягы, мен сизге чегерүү тартибин колдонууну көрсөтөм. Биз алга жылган сайын, мен идеяны мүмкүн болушунча көп платформаларда колдонулушу үчүн бир аз жалпы нерселерди сактоого аракет кылам, бирок мен конкреттүү тиркемени көрүү үчүн кылган иштерим менен бөлүшөм.

1 -кадам: Бөлүктөр

Бөлүктөр
Бөлүктөр

Муну ишке ашыруу үчүн сизге керек болот: Ротари которгуч (квадратура менен коддолгон) Резисторлорду тартып алыңыз Тиешелүү микроконтроллер платформасы Менин долбоорум үчүн Grayhill 61C22-01-04-02 оптикалык коддогучун колдондум. Ротари которгучтун маалымат баракчасы которгучтан келген эки маалымат линиясында 8.2k Ом резисторлорду тартууну талап кылат. Сиз колдонгон коддогучтун маалымат барагын текшергиңиз келет. Мен колдонгон ротариатты октук баскыч баскычы менен да заказ кылса болот. Бул терилген тандоолорду жасоо үчүн пайдалуу өзгөчөлүк, ж. Менде "ылайыктуу микроконтроллер платформасы" бар, анткени (менимче) бул бир нече платформада ишке ашырылышы мүмкүн. Мен көптөгөн адамдарды Instructables үчүн башка микроконтроллерлерди колдонуп жүргөнүн көрдүм, ошондуктан мен жалпы мамилени көрсөткүм келет. Мен бардык коддорду Microchip PIC16F877A менен колдонуу үчүн PIC Basic Proдо жаздым. Чынында, микроконтроллерде сизге керектүү болгон нерсе - бул эки казыктын биринде логикалык өзгөрүү болгондо үзүлүү жөндөмү. PIC16F877Aда, бул PORTB өзгөртүү үзгүлтүгү деп аталат. Башка контроллерлерде анын башка аттары болушу мүмкүн. Бул микроконтроллердин үзгүлтүккө учуроо өзгөчөлүгү - бул ишке ашырууну ушунчалык көрктүү кылган нерсенин бир бөлүгү.

2 -кадам: Аппараттык интерфейс

Аппараттык интерфейс
Аппараттык интерфейс

"Жөнөкөй" чечим-бул микроконтроллерге 16 туташуусу бар "жалгыз уюл-16 ыргытуу" алмаштыргычы болмок. Ар бир которгучтун чыгышы микроконтроллердеги пинге байланат, андыктан терүүнүн ар бир абалын микроконтроллер текшере алат. Бул I/O казыктарын ашыкча колдонуу. Эгерде биз которгучта 16дан ашык позицияны (кармоону) кааласак, иштер андан да жаман болот. Коммутатордун ар бир кошумча позициясы микроконтроллерге кошумча киргизүүнү талап кылат. Бул тез эле микроконтроллердеги кирүүлөрдү өтө натыйжасыз колдонууга айланат. Ротари которгучтун кооздугун киргизиңиз. Ротари которгучтун маалымат баракчасында А жана В деп аталган микроконтроллерге эки гана жолу бар. Бул линияларды алышы мүмкүн болгон төрт гана логикалык деңгээл бар: AB = 00, 01, 10 жана 11. Бул микроконтроллерге туташтырууда колдонуу керек болгон киргизүү линияларынын санын абдан азайтат. Ошентип, биз киргизүү линияларынын санын экиге чейин кыскарттык. Эми эмне? Бизге чындап эле 16 башка штат керек окшойт, бирок бул жаңы которгучта төртөө гана бар. Биз өзүбүздү бутка атып салдыкпы? Жок. Окууну улантыңыз. Биз түшүндүрүү үчүн айлануучу которгучтун иштөө теориясынын бир азын камтыйбыз.

3 -кадам: Аппараттын иштөө теориясы

Аппараттык иштөө теориясы
Аппараттык иштөө теориясы
Аппараттык иштөө теориясы
Аппараттык иштөө теориясы
Аппараттык иштөө теориясы
Аппараттык иштөө теориясы

Айлануу багытын сезүү жогоруда айтылган "бир полюс-16 ыргытуу" которгучунун жардамы менен мүмкүн болот, бирок ал микроконтроллерге көптөгөн кириштерди колдонот. Ротари которгучту колдонуу микроконтроллерге кирүүлөрдүн санын азайтат, бирок азыр биз которгучтан келген сигналдарды чечмелеп, аларды айлануу багытына которушубуз керек. Мен жогоруда которгучтун квадратура коддолгонун айттым. Бул ошондой эле бул чечимдин негизги элеганттарынын бири. Бул которгучтун позициясына дал келген 2-бит коду бар экенин билдирет. Сиз ойлонуп жаткандырсыз: "Эгерде микроконтроллерге эки бит киргизүү болсо, анда биз бардык 16 позицияны кантип көрсөтөбүз?" Бул жакшы суроо. Биз алардын баарынын өкүлү эмеспиз. Биз жөн гана айлануу багытын аныктай алгыбыз үчүн, баскычтын салыштырмалуу позицияларын билишибиз керек. Баскычтын абсолюттук орду мааниге ээ эмес. Сааттын жебеси боюнча, которгуч берген код ар бир төрт жолу кайталанат жана боз түстө коддолгон. Боз коддолгон, ар бир позиция өзгөрүүсү үчүн бир аз гана өзгөрүү бар экенин билдирет. AB киргизүүсүнүн ордуна экиликте сааттын жебеси боюнча айланууну эсептөө: 00, 01, 10, 11, ал мындай өзгөрөт: 00, 10, 11, 01. Байкаңыз, акыркы үлгү үчүн бир гана киргизүү ортосунда өзгөрөт топтомдор. Микроконтроллерге AB киргизүү үчүн сааттын жебесине каршы маанилер төмөнкүдөй көрүнөт: 00, 01, 11, 10. Бул жөн гана AB = 00 менен сааттын жебесинин үлгүсүнүн тескери жагы..

4 -кадам: Программалык камсыздоонун иштөө теориясы

Программалык камсыздоонун иштөө теориясы
Программалык камсыздоонун иштөө теориясы

Айлануу багытын аныктоочу күнүмдүк үзгүлтүккө учурайт. Сиз тандаган микроконтроллер үзгүлтүк иштетилгенде (жок дегенде) эки пиндин биринде өзгөрүү болгондо, үзгүлтүккө учурата алышы керек. Бул PIC16F877Aдагы PORTB өзгөртүү үзгүлтүгү деп аталат. Качан болбосун которгуч айландырылса, микроконтроллер үзгүлтүккө учурайт жана программанын аткарылышы үзгүлтүккө учуратуу кызматына (ISR) жөнөтүлөт. ISR тез эле которгучтун кайсы жакка бурулганын аныктап, желекти туура коюп, тез арада негизги программага кайтат. Колдонуучу которуштурууну өтө тез бурган учурда, бул тез арада ишке ашышы керек. Биз билебиз, боз коддуу AB үлгүсү ар бир төрт позицияда кайталанат, эгерде биз ошол төрт позициянын ортосундагы өткөөлдөр үчүн күнүмдүк жумуш кылсак, анда ал башкалар үчүн иштейт. Байкасаңыз, бир төрт позиция циклинде төрт чети бар. А киришине, ошондой эле В киришине көтөрүлүүчү жана түшүүчү чек. Микропроцессор ар бир жээк болгондо үзгүлтүккө учурайт, башкача айтканда, тетик бурулганда микроконтроллер үзгүлтүккө учурайт. Натыйжада, ISR баскыч кайсы тарапка бурулганын аныкташы керек. Муну кантип жасоо керек экенин түшүнүүгө жардам берүү үчүн, сааттын жебеси боюнча толкун формасына кайрылабыз. Белгилей кетчү нерсе, качан А чети бар, анын жаңы мааниси ар дайым В-дан айырмаланат. Баскыч 1ден 2ге өткөндө, A логикадан 0гө өтөт. В бул өтүү үчүн дагы эле 0 жана Анын жаңы маанисине дал келбейт. Түймө 3төн 4кө чыкканда, А логика-1де калып, А жыгылып калат. Дагы бир жолу көңүл буруңуз, В менен Анын жаңы мааниси башка. Азыр биз көрө алабыз, качан гана А сааттын жебеси боюнча үзгүлтүккө учуратса, анын жаңы мааниси Вдан айырмаланат, эмне болгонун көрүү үчүн В текшерип көрөлү. В 2 которгучтан 3кө которулганда В көтөрүлүүчү чекке ээ. Бул жерде, Внын жаңы мааниси А менен бирдей, сааттын жебеси боюнча акыркы калган четин карасак, В түшүүчү жээги 4төн 5ке жылат. (5 -позиция 1 -позиция менен бирдей.) Bнын жаңы мааниси бул жерде да А менен бирдей! Биз азыр кээ бир чегерүүлөрдү жасай алабыз! Эгерде А үзгүлтүккө учураса жана А -нын жаңы мааниси В -дан айырмаланса, айлануу саат жебеси боюнча болгон. Мындан тышкары, эгерде B үзгүлтүктү жаратса жана Внын жаңы мааниси А менен бирдей болсо, анда айлануу саат жебеси боюнча болгон. Сааттын жебеси сыяктуу эле, сааттын жебесине каршы айлануу бир циклде төрт жолу үзгүлтүккө учуратат: экөө А киришинде жана экөө В киришинде. Киргизүү А туткасы 4төн 3кө жылганда жана түшүүчү чети 2ден 1ге жылганда. Түймө 4төн 3кө жылганда, Анын жаңы мааниси Внын мааниси менен бирдей. А 2 позициядан 1ге өткөндө анын жаңы мааниси В менен бирдей экенин байкаңыз. Эми, биз А үзгүлтүккө учураганда жана анын жаңы мааниси В маанисине дал келгенде, айлануу сааттын жебесине каршы болгонун көрө алабыз. Бардыгын текшерүү үчүн В кирүүсүн тез арада карап чыгабыз. В туткасы 5 позициядан (бул 1ге окшош) 4кө жылганда жана баскыч 3төн 2ге которулганда үзгүлтүккө учуратат. Бул эки учурда тең Внин жаңы мааниси учурдагы мааниге дал келбейт А - бул сааттын жебеси боюнча В үзгүлтүккө учураткан учурлардын тескериси. Бул жакшы кабар. Кыскача айтканда, эгер А үзгүлтүккө учураса жана анын жаңы мааниси В маанисине дал келбесе же В үзгүлтүктү жаратса жана Внин жаңы мааниси А маанисине дал келсе, биз саат жебеси боюнча айлануу болгонун билебиз. Биз башка учурларды программалык камсыздоонун саат жебесине каршы айлануусун текшере алабыз же сааттын жебеси боюнча эмес, анткени ал сааттын жебесине каршы болгон деп божомолдой алабыз. Менин күнүмдүк жоромолум жөн эле болду.

5 -кадам: Программалык камсыздоо

Программалык камсыздоо
Программалык камсыздоо
Программалык камсыздоо
Программалык камсыздоо

Мен PIC Basic Proдо курулган үзгүлтүктөрдү колдонгон жокмун. Мен тартипти башкаруу үчүн Даррель Тейлордон кодума киргизген бир нече файлды колдондум. Бул жерде Даррелге чоң кредит таандык! Файлдар бекер. Көбүрөөк маалымат, башка тиркемелер жана файлдарды жүктөө үчүн анын вебсайтына баш багыңыз. Сиз Даррел Тейлордун үзгүлтүктөрү менен PIC колдонбосоңуз, бул бөлүктү өткөрүп жибере аласыз. Даррель Тейлордун (DT) үзгүлтүктөрүн алуу үчүн эки нерсени жасоо керек: 1.) DT_INTS-14.bas жана ReEnterPBP.bas файлдарын өзүңүзгө кошуңуз. code.2.) Муну көчүрүп кодуңузга салыңыз. ASMINT_LIST макро; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, ооба endm INT_CREATEENDASMI Нускаманын аягындагы графика сыяктуу өтмөктөрдү жана боштуктарды киргизиңиз, ошондо сиз кодуңуздан бир аз жеңилирээк көрө аласыз. Сиз аны муктаждыктарыңызга ылайыкташтырып бир аз өзгөртүшүңүз керек. Этикетка астында ISRди ISR болгон чакан программанын аты менен алмаштырыңыз. Астын сызууну унутпаңыз! Сизге керек! Үзгүлтүктөрдү иштетүү үчүн дагы эки нерсени жасоо керек: 1.) ISR жазыңыз. Сиз муну PBP кичи программасын жазам деп жаткандай жазасыз, бирок RETURN ордуна подрограмманын аягына @ INT_RETURN киргизишиңиз керек болот. Бул программанын үзгүлтүккө учурашын жана программанын аткарылышын негизги циклде калган жерине кайтарат. ISRдин ичинде сиз программаңызды рекурсивдүү үзгүлтүккө учуратпоо үчүн үзгүлтүк желегин тазалашыңыз керек. Жөн гана PORTB окуу - бул PIC16F877Aдагы үзүлүү желегин тазалоо үчүн жасалышы керек болгон нерсе. Ар бир микроконтроллердин үзүлүү желектерин тазалоонун башка жолу бар. Микроконтроллериңиздин маалымат баракчасын текшериңиз.2.) Сиз кодуңузда үзгүлтүккө учуратууну каалаган чекитке жеткенде, бул кодду колдонуңуз:@ INT_ENABLE RBC_INT Үзгүлтүктү өчүргүңүз келгенде:@ INT_DISABLE RBC_INTБир нерсе көп. Мен камтылган нерселерге толтурулган, ошондуктан мен кыскача жыйынтыктайм. Азырынча сиздин программаңыз мындай көрүнүшү керек:; Каалаган орнотуу же код "INT_CLUDE" DT_INTS-14.bas "INCLUDE" ReEnterPBP.bas "ASMINT_LIST макро; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, ооба endm INT_CREATEENDASM; Башка зарыл болгон орнотуу же код@ INT_ENABLE RBC_INT; Баскычтын кайсыл тарапка бурулуп жатканын билиши керек болгон код@ INT_DISABLE RBC_INT; Башка кодEND; ProgrammyISR аягы:; ISR коду бул жерде@ INT_RETURN (Үзгүлтүк иштетүүчү иштетүү столун) Менин оюмча, бул жерде PIC же DT үзгүлтүктөрүн колдонбогон адам кайра кошула алат. Эми биз ISRны жазышыбыз керек, андыктан микроконтроллер баскычтын кайсы тарапка бурулуп жатканын билет. Программалык камсыздоо теориясы бөлүмүнөн, эгер биз үзгүлтүктү жараткан киргизүүнү, анын жаңы маанисин жана башка киргизүүнүн маанисин билсек, айлануу багытын аныктай алабыз деп эстеп көрүңүз. Бул жерде псевдокод: PORTBны үзүлүү желегин тазалоо үчүн чийилген өзгөрмөгө окуңуз А үзгүлтүккө себеп болгонун текшериңиз. Эгерде чын болсо, анда А менен Бди салыштырып көрүңүз, эгер башкача болсо, сааттын жебеси боюнча бурулду, эгер саат үзгүлтүккө учуратса, анда EndifCheck. Эгерде чын болсо, анда А менен Вду салыштырып көрүңүз, эгер башка болсо, анда сааттын жебеси боюнча айлануу болгон, анда сааттын жебесине каршы болгон. Өзгөртүлгөн киргизүүнүн жаңы баасын табуу жана башка (өзгөрүүсүз) киргизүү оңой, анткени биз аларды ISR ичинде окуй алабыз. Аткаруу ISRге жөнөтүлгөнгө чейин, биз алардын ар биринин абалын билишибиз керек. Бул негизги тартипте болот. Негизги күнүмдүк отурат жана биз CWflag деп атаган байт өзгөрмөсүн 1ге же ISR тарабынан 0го чейин тазалануусун күтөт. Баскычтын ар бир моюнга алынган өзгөрүүсүнөн кийин же эч кандай аракет болбосо, өзгөрмө бош абалды көрсөтүү үчүн 5ке коюлат. Эгерде желек орнотулса же тазаланса, негизги күнүмдүк айлануу процессинин негизинде басымдын басымын дароо көбөйтөт же төмөндөтөт, андан кийин CWflag өзгөрмөсүн кайра 5ке коёт, анткени туткасы азыр кайра бош турат. Негизги күнүмдүк CWflag текшерилип жаткандыктан, ал ошондой эле А жана В айлануучу которгучтун маанилерин документтештирет. Бул чынында эле жөнөкөй жана окшош: oldA = AoldB = B Бул жерде чынында эч кандай кооз нерсе жок. Жөн эле CWflagтин айлануусун текшерүүчү циклдин башына ошол эки сапты кошуңуз. Биз жөн гана ISR аткарылганда үзгүлтүккө эмне себеп болгонун көрө алышыбыз үчүн, өсүү/азайтуу циклинин ичиндеги айлануучу туткадан киргизүүлөрдүн логикалык баалуулуктарын жаңылап жатабыз. Бул жерде ISR коду: ABchange: scratch = PORTB 'PORTBти окуу үзгүлтүк желегин тазалоо үчүн' Эгерде A үзгүлтүккө учуратса, анда B айлануу багытын текшериңиз, эгер oldA! A! = B THOT GOTO CW 'Болбосо, бул сааттын жебесине каршы айлануу болчу ELSE GOTO CCW ENDIF ENDIF' Эгерде B үзгүлтүккө учураса, анда Aнын айлануу багытын текшериңиз, эгер OldB! = B THEN 'Эгерде A жана B бирдей болсо, анда ал Эгерде сааттын жебеси боюнча айлануу болгон болсо, анда A == B, анда GOTO CW 'Болбосо, сааттын жебесине каршы айлануу болгон ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNISR кодун AB_ISR.bas файлына кошконум үчүн коддогу өтмөктөр керек болгон жолду көрсөтпөйт. Эми, анткени ISR A жана B кириштери үчүн эски баалуулуктарга ээ болгондуктан, ал үзгүлтүккө учураган кайсы киргизүүнү аныктай алат, аны башка (өзгөрүүсүз) киргизүүгө салыштырып жана багытын аныктайт. айлануу. Негизги күнүмдүк кылышы керек болгон нерсе CWflagты текшерип, баскыч кайсы жакка бурулганын көрүү үчүн (эгер бар болсо) жана эсептегичти көбөйтүү же азайтуу, чекиттин пунктун же сизге жаккан же керектүү нерселердин бардыгын көрсөтөт. чаташтыруучу Интерфейстин бул түрү өзгөчө пайдалуу, эгер сиздин системаңыз үзгүлтүктөрдү колдонуп жатса, бул дагы бир үзгүлтүккө кошулат. Ырахат!

Сунушталууда: