Amatöörraadioahelad meetritel. Lihtne pöörete loendur - lihtsa keerukusega konstruktsioonid - Algajatele mõeldud vooluringid Kuidas mikrokontrollerile elektriarvestit kokku panna

Digitehnoloogia standardsetest funktsionaalsetest üksustest pole keeruline kokku panna elektroonilist stopperi loendurit, mis on sarnane koolide füüsikaklasside jaoks toodetavatega. Nendes seadmetes kasutatakse aja mõõtmiseks impulsside loendamise meetodit, mis seisneb teadaoleva kordusperioodi impulsside arvu mõõtmises. Sellised seadmed sisaldavad järgmisi põhikomponente: loendusimpulsside generaator, juhtimisahel (lihtsamal juhul mängib selle rolli nupp "Start"), binaarne kümnendloendur, dekooderid ja indikaatorid. Viimased kolm sõlme moodustavad teisenduskümnendi, modelleerides ühe kümnendkoha. Tuleb märkida, et aja mõõtmisega impulsside loendusmeetodil kaasneb paratamatu viga, mis on võrdne loendusühikuga. Selle põhjuseks on asjaolu, et seade salvestab sama arvu impulsse ja näitab seetõttu sama aega, kui loendus peatatakse vahetult pärast viimase impulsi saabumist või vahetult enne eelmise impulsi saabumist. Sel juhul võtab viga suurima väärtuse, mis on võrdne kahe kõrvuti asetseva ajaga

Riis. 172. Ümberarvestuse kümnend

impulsid. Kui vähendate impulsi kordusperioodi ja sisestate täiendavad loendurnumbrid, saate mõõtmise täpsust vajaliku arvu võrra suurendada.

Stopperi loenduri üks dekaad on näidatud joonisel 172. See koosneb kahendkümnendloendurist dekoodril ja indikaatorist neoonlambil Indikaatori toiteks on vajalik kõrgepinge, seetõttu on ohutuseeskirjade kohaselt seade peab kasutama juhendaja. Ahel kasutab dekoodrit, mis on spetsiaalselt loodud töötama kõrgepinge indikaatoriga. Lambi asemel saab kasutada teist tüüpi lampe: mõeldud toitepingele 200 V ja indikaatorvoolule Mikrolülitus koosneb loendussisendiga trigerist (sisend ja trigerijagaja 5-ga (sisend). Ühendamisel loendustrigeri (väljund 1) väljund jagaja sisendiga, kahendkümnendloendur.See reageerib positiivse impulsi langevale servale või sisendile rakendatud negatiivsele pingeastmele Legendis loendamine serva näidatakse mõnikord IC-le suunatud noolena, kui see reageerib positiivsele pingeastmele, või IC-st eemale suunatud noolena, kui see reageerib negatiivsele pingelangusele.

Loenduskümnendi töö juhtimiseks kasutatakse kolme nuppu ja lülitit. Enne kümnendi lugemise algust

nullitakse, kasutades nuppu "Määra". O”, sel juhul antakse loenduri sisenditele loogiline 1. Seejärel valib lüliti loendusimpulsside allika - see võib olla kas triger või multivibraator. Mehaaniliste sulgemiste loendamise režiimis, kui nuppu vajutatakse ja vabastatakse järjestikku, toimub kahendkümnendloendus ja indikaator süttib järjestikku, numbrid 1, 2, 3 jne kuni numbrini 9, seejärel süttib number 0 ja loendamist korratakse. Impulsside loendusrežiimis võtab loenduri sisend vastu impulsse multivibraatorilt, mis on kokku pandud vastavalt joonisel fig. 168). Aja mõõtmiseks sekundites peab impulsi sagedus olema 1 Hz. See on seatud muutuva takistiga ja mahtuvusega, mis on võrdne

Mitmebitise kahendkümnendloenduri saamiseks lülitatakse need sisse järjestikku, s.t. esimese väljund on ühendatud teise sisendiga, teise väljund on ühendatud kolmanda sisendiga jne. Mitmebitise loenduri nullseisundisse seadmiseks kombineeritakse sisendid ja ühendatakse nupp "Määra". 0".

Kui seade on mõeldud kasutamiseks näiteks füüsikatundides, siis aega tuleb mõõta üsna laias vahemikus - 0,001-100 s. Selleks peab generaatoril olema sagedus ja loendur peab koosnema viiest kümnendkohast. Sel juhul näevad digitaalse indikaatori näidud välja järgmised: 00.000; 00.001; 00.002 jne. kuni 99,999 s.

Treeningstopperi rakendusala saab oluliselt laiendada, kui sellesse lisatakse kaks lisaseadet - kontaktivaba juhtseade ja viiteseade. Esimene plokk peab tagama seadme automaatse ja inertsivaba sisse- ja väljalülitamise. Selleks saate kasutada juba tuntud fotorelee vooluringi (joonis 76), valides soovitud tundlikkuse ja sobitades toiteallikate pinge. Juhtlülitusel peab olema kaks fotosensorit – ühega lülitatakse sisse ja teisega lülitatakse välja stopperi loendur hetkedel, mil kiired ristuvad liikuva kehaga. Teades fotosensorite kaugust ja stopperi näitu, on kere kiirust lihtne arvutada. Lisaseade kasutab kahte fotovooluvõimendit. Nende väljundsignaalid juhivad loendustrigeri tööd, mille üks väljund on transistorlüliti kaudu ühendatud stopperi sisendiga.

Elektrooniliste arvestite kasutamise kohta võib tuua ka muid näiteid. Näiteks täringumängu simuleeriv masin koosneb juba käsitletud kümnendist

Ja multivibraatori impulssidega juhitav neoonlamp (vt joon. 168, 172). Mängijad vajutavad kordamööda nuppu, mis loenduse katkestab. Võidab see, kelle näitaja näitab suurimat numbrit. Loenduri seiskumise hetk, samuti hetk punktidega 1 kuni 6 peatust kuubik on määratud juhuslikel põhjustel, seetõttu on loendusdekaad koos multivibraatoriga elektrooniline juhuslike numbrite andur. Toome veel näiteid selle kasutamisest erinevates mänguolukordades.

Mängijate reaktsioonikiiruse kontrollimisel määrab takisti multivibraatori teatud töösageduse ja indikaatorite numbrite muutumise kiiruse (vt joonis 168 ja 172). Mängus osalejatel palutakse vajutada multivibraatori nuppu iga kord, kui indikaator näitab teatud, eelvalitud numbrit. Mida kõrgem on lülitussagedus, seda keerulisem on seda tingimust täita. Aeglasemad langevad esimesena välja, võitja on parima reaktsiooniga mängija. Mängu teises, keerulisemas versioonis tuleb pärast indikaatori kadumist jätkata nupu vajutamist kohtuniku määratud tempos. Selleks sulgege see mehaanilise kardinaga või lülitage see nupuga välja

Loendavat kümnendit koos multivibraatoriga on mängudes eriti mugav kasutada siis, kui selle toiteallikas on tehtud autonoomseks ehk pole võrku ühendatud. Sel juhul kasutatakse seitsmesegmendilist LED-indikaatorit, mida juhib integraallülituse dekooder. Oleme selle mikrolülituse ja indikaatoriga juba tuttavad (joonis 150, 163). Multivibraatori ja loenduri ahelad jäävad muutumatuks. 5 V allikast töötava juhusliku arvu anduri ahel on näidatud joonisel 173.

Keerulisema elektriarvesti baasil töötava seadme näiteks on viiteseade ehk taimer. Joonisel 174 on skemaatiline diagramm taimerist, mis võimaldab lülitada sisse erinevaid koormusi ajavahemikuks 0 kuni 999 s. See koosneb kolmekohalisest kümnendloendurist, mis on kokku pandud kolmest dekoodrist koosnevale mikroskeemile multivibraatori kiibil ja juhtahelast mikroskeemil, samuti mikroskeemist Impulsside loendusallikaks on sagedusele 1 Hz häälestatud multivibraator. Selle impulsid suunatakse kolmekohalise kümnendloenduri sisendisse. Iga numbri binaarkoodid suunatakse dekoodritesse. Nende väljundis ilmuvad sisenditesse jõudes järjestikku nullsignaalid.

Riis. 173. LED-indikaatoriga ümberarvutusdekaad

vastavad kahendkoodid. Vajaliku viiteaja seadistamine toimub lülititega, mis ühendavad dekoodri väljundeid mikroskeemi elementidega Elementide And sisendid ühendatakse paarikaupa elemendi saamiseks Lüliti seab sekundite ühikud, lüliti kümneid sekundeid ja lüliti sadu sekundeid. Kui näiteks lülitid on ühendatud dekoodri tihvtidega 2, 3 ja 7, siis on VÕI-EI elemendi sisendites kolm nulli ainult hetkel, mil loendur registreerib 237 impulssi või ajavahemikku. loendamise algusest on möödunud 237 sekundit. Sel juhul ilmub elemendi VÕI-EI väljundisse signaal 1. Kuni selle hetkeni oli loenduri kõikide binaarkoodide puhul loogilise elemendi väljundiks nullsignaal.

Taimeri juhtimisahel töötab järgmiselt. Esmalt vajutatakse nuppu "Stopp"; selle tulemusena seatakse mikroskeemile kokkupandud RS-päästik nulli. Otseväljundist antakse nullpinge tase 1/77 transistorile, mille emitteri ahelasse on ühendatud elektromagnetrelee mähis. Transistor ja relee on välja lülitatud. Samal ajal ilmub pöördväljundis 6 kõrge tase, mis toimib loenduri lähtestussignaalina. Kui vajutate nuppu "Start", läheb RS-päästik üksikusse olekusse ja otseväljundile ilmub 3. kõrge pingetase, mis on piisav 1/77 transistori avamiseks ja relee kasutamiseks. Selle kontaktid sulgevad koormuse toiteahela. Samaaegselt

(klõpsake skannimise vaatamiseks)

päästiku pöördväljundist eemaldatud pinge nulltase “avab” loenduri. Loendur töötab seni, kuni dekoodri väljunditesse ilmuvad valitud numbrile vastavad väljundsignaalid. Sel juhul, nagu juba mainitud, ilmub väljundisse üksainus signaal, mis juhitakse inverteri kaudu päästiku sisendisse. See on seatud nullseisundisse ja vastavalt sellele lülitatakse transistor, elektromagnetrelee ja koormus välja. Loendur on seatud nulli.

Taimer näitab praegust aega sekundites, kui LED-id on ühendatud dekoodri väljunditega. Aja loendamine muutub mugavamaks, kui loendurite binaarsed kümnendkoodid antakse dekoodritele, mis töötavad koos seitsmesegmendiliste indikaatoritega

Kui seisate silmitsi ülesandega rakendada impulssloendurit, loendada kümneid, sadu või tuhandeid, siis piisab selleks valmiskomplekti - CD4026 mikrolülituse - kasutamisest. Õnneks välistab mikroskeem praktiliselt kõik mured mikroskeemi ja täiendavate sobituselementide ühendamise pärast. Samal ajal on üks CD4026 loendur võimeline "loendama" ainult kuni 10-ni, see tähendab, et kui peame loendama kuni 100, siis kasutame 2 mikrolülitust, kui kuni 1000, siis 3 jne. Noh, ütleme paar sõna kiibi enda ja selle funktsionaalsuse kohta.

CD4026 loenduri töö kirjeldus

Esialgu tutvustame loenduri kiibil olevate tihvtide välimust ja funktsionaalset tähistust

Vaatamata sellele, et kõik on inglise keeles, on siin põhimõtteliselt kõik selge! Loenduri näidud suurenevad 1 ühiku võrra iga kord, kui "kella" kontaktile saabub positiivne impulss. Sel juhul ilmub väljunditesse a-g pinge, mis 7-segmendilisele indikaatorile rakendades kuvab impulsside arvu.

Lähtestamise kontakt lähtestab loendusnäidud, kui lühis on +.

"Keela kella" tihvt tuleb samuti maandusega ühendada.

Kontakt "Luba kuva", tegelikult peab kontakt 3 olema ühendatud positiivsega.

Kontakt “÷10” on tegelikult väljundis 5, saadab signaali loenduri ülevoolu kohta, et sellega saaks ühendada sarnase loenduri ja hakata loendama 10, 100, 1000...

Kontakt "mitte 2" võtab väärtuse LOW siis ja ainult siis, kui loenduri väärtus on 2. Muidu HIGH.

Mikrolülituse tööpinge on 3-15 V. See tähendab, et sellel on sisseehitatud stabilisaator. Räägime nüüd sellest, kuidas see mikroskeem sõlmega ühendada, see tähendab vooluringi skeemist.

CD4026 kiibil oleva impulsi loenduri ühendusskeem

Heitke pilk diagrammile. See loendab fototakisti takistuse muutuste valgusimpulsse. Fototakistina saab kasutada näiteks fototakistit 5516. Seega takistuse muutumise tõttu nihkub ka potentsiaal transistori põhjas. Selle tulemusena hakkab vool läbima kollektor-emitteri ahelat, mis tähendab, et mikroskeemi sisendisse 1 antakse impulss, mida tuleb lugeda.
Niipea, kui esimene mikroskeem loeb kümme, ilmub kontaktile 5 üks impulss, mis näitab loenduri "ülevoolu". Lõppkokkuvõttes antakse see impulss teisele mikroskeemile, mis töötab täpselt samal põhimõttel. Kuid sel juhul ei loe mikroskeem enam ühikuid, vaid kümneid. Kui lisada 3 mikrolülitust, siis on sadu jne.

0-le lähtestamiseks lisage lihtsalt pluss 15 mikrolülituse jalgadele. Mikroskeem on loodud töötama 7 segmendi indikaatoriga. Selle indikaatori ühele väljundile rakendades saame vajaliku arvu. Vaata tabelit...

Kokkuvõtteks tahaksin veel kord öelda, et sel juhul on pulsiloendur funktsionaalne ja nõuab teilt minimaalseid kulusid ja teadmisi. Oluline on ka see, et vooluringi pole vaja seadistada, vähemalt digitaalset osa. Ainus asi on see, et peate võib-olla "mängima" takistite ja fototakistiga sisendis.

Kõik teavad, miks mikrokalkulaator on olemas, kuid selgub, et lisaks matemaatilistele arvutustele on see võimeline palju enamaks. Pange tähele, et kui vajutate nuppu “1”, seejärel “+” ja seejärel “=”, siis iga nupu “=” vajutusega suureneb number ekraanil ühe võrra. Miks mitte digiloendur?

Kui nupule “=” on joodetud kaks juhet, saab neid kasutada loendussisendina, näiteks kerimismasina pöördeloendurina. Ja lõppude lõpuks võib loendur olla ka pööratav, selleks tuleb esmalt valida ekraanil mõni number, näiteks mähise keerdude arv ning seejärel vajutada nuppu “-” ja nuppu “1” . Nüüd iga kord, kui vajutate “=”, väheneb number ühe võrra.

Andurit on aga vaja. Lihtsaim variant on pilliroo lüliti (joonis 1). Ühendame pilliroo lüliti juhtmetega paralleelselt nupuga “=”, pilliroo lüliti ise seisab mähismasina statsionaarsel osal ja magneti kinnitame liikuvale, nii et mähise ühe pöörde ajal läheb magnet läbi. pilliroo lüliti lähedale, põhjustades selle sulgemise.

See on kõik. Peate mähise kerima, tegema “1+” ja seejärel iga pöördega, st iga pöördega suurenevad näidud ühe võrra. Peate mähise lahti kerima - sisestage mikrokalkulaatori ekraanile mähise pöörete arv ja tehke "-1", siis iga mähise lahtikerimise pöördega vähenevad ekraani näidud ühe võrra.

Joonis 1. Pilliroo lüliti ühendusskeem kalkulaatoriga.

Ja oletame, et peate mõõtma suurt vahemaad, näiteks tee pikkust, maatüki suurust, marsruudi pikkust. Võtame tavalise jalgratta. Täpselt nii – kahvli külge kinnitame roolülitiga mittemetallist kronsteini ja magneti kinnitame jalgratta ratta ühe kodara külge. Seejärel mõõdame ratta ümbermõõtu ja väljendame seda meetrites, näiteks ratta ümbermõõt on 1,45 meetrit, seega valime “1,45+”, misjärel iga ratta pöördega näidud suurenevad. 1,45 meetrit ja selle tulemusena kuvatakse ekraanil rattaga läbitud vahemaa meetrites.

Kui sul on vigane Hiina kvarts-äratuskell (tavaliselt pole nende mehhanism kuigi vastupidav, aga elektrooniline plaat on väga töökindel), võid sealt võtta tahvli ja joonisel 2 näidatud skeemi järgi teha sellest stopperi. see ja kalkulaator.

Äratuskellaplaadile antakse toide läbi HL1 LED-i parameetrilise stabilisaatori (LEDi alalispinge peab olema 1,4-1,7 V, näiteks punane AL307) ja takisti R2 kaudu.

Impulsid genereeritakse kellamehhanismi samm-mootori juhtimpulssidest (poolid tuleb lahti ühendada, plaati kasutatakse iseseisvalt). Need impulsid liiguvad läbi dioodide VD1 ja VD2 transistori VT1 alusele. Häireplaadi toitepinge on ainult 1,6 V, samas kui samm-mootori väljundite impulsside tasemed on veelgi madalamad.

Ahela korralikuks tööks on vaja madala päripingega dioode, näiteks VAT85 või germaaniumi.

Need impulsid jõuavad VT1 ja VT2 transistori lülitisse. Kollektorahel VT2 sisaldab väikese võimsusega relee K1 mähist, mille kontaktid on paralleelselt ühendatud mikrokalkulaatori “=” nupuga. Kui toide on +5 V, sulguvad relee K1 kontaktid sagedusega 1 Hz.

Stopperi käivitamiseks peate esmalt sooritama toimingu “1+”, seejärel lülitama lüliti S1 abil sisse impulsside kujundaja vooluringi toide. Nüüd suurenevad näidud iga sekundiga ühe võrra.

Loendamise lõpetamiseks lülitage lihtsalt impulsside kujundaja toide välja, kasutades lülitit S1.

Vähendamise loendamiseks peate esmalt sisestama mikrokalkulaatori ekraanile algse sekundite arvu, seejärel tegema toimingu “-1” ja lülitama lülitiga S1 sisse impulsside kujundaja toite. Nüüd vähenevad ekraani näidud iga sekundiga ühe võrra ja nende järgi saab hinnata, kui palju aega on jäänud teatud sündmuseni.

Joonis 2. Hiina riidepuu stopperiks muutmise skeem.

Joonis 3. IR-kiirte ristumisloenduri skeem kalkulaatori abil.

Kui kasutate valgusvihu ristumiskohas töötavat infrapuna-fotosensorit, saate kohandada mikrokalkulaatori loendama mõnda objekti, näiteks mööda konveierilindi liikuvaid kaste, või paigaldades anduri vahekäiku, loendama ruumi sisenevaid inimesi. .

IR peegeldusanduri skemaatiline diagramm mikrokalkulaatoriga töötamiseks on näidatud joonisel 3.

IR signaali generaator on valmistatud A1 kiibil tüüp “555” (integreeritud taimer) Tegemist on 38 kHz sagedusega impulssgeneraatoriga, mille väljundis lülitub sisse infrapuna LED. Generatsioonisagedus sõltub C1-R1 vooluringist, seadistamisel valides takisti R1, peate määrama mikrolülituse väljundi (kontakt 3) sageduse 38 kHz lähedale. HL1 LED asetatakse läbipääsu ühele küljele, asetades sellele läbipaistmatu toru, mis peab olema täpselt suunatud fotodetektorile.

Fotodetektor on valmistatud HF1 kiibil - see on standardne TSOP4838 tüüpi integreeritud fotodetektor telerite ja muude kodumasinate kaugjuhtimissüsteemide jaoks. Kui HL1 kiir tabab seda fotodetektorit, on selle väljund null. Tala puudumisel - üks.

Seega pole HL1 ja HF1 vahel midagi - relee K1 kontaktid on avatud ja mis tahes objekti läbimise hetkel on relee kontaktid suletud. Kui teete mikrokalkulaatoril toimingu "1+", siis iga objekti läbimisel HL1 ja HF1 vahel suurenevad mikrokalkulaatori näidud ühe võrra ja nende põhjal saate otsustada, mitu kasti saadeti või kui palju inimesi sisenes. .

Kryukov M.B. RK-2016-01.

See seade on ette nähtud mehaanilise seadme võlli pöörete arvu loendamiseks. Lisaks lihtsale loendamisele, mille LED-ekraan näitab kümnendarvudes, annab loendur teavet binaarses kümnebitises koodis pöörete arvu kohta, mida saab kasutada automaatse seadme kujundamisel. Loendur koosneb optilisest kiirusandurist, mis kujutab endast pidevalt helendavast IR LED-ist ja fotodioodist koosnevat optronit, mille vahel on läbipaistmatust materjalist ketas, milles on välja lõigatud sektor. Ketas on kinnitatud mehaanilise seadme võllile, mille pöörete arv tuleb lugeda. Ja kahe loenduri kombinatsioon - kolmekohaline kümnendloendur, mille väljund on seitsme segmendi LED-indikaatoritele, ja kümnekohaline kahendloendur. Loendurid töötavad sünkroonselt, kuid üksteisest sõltumatult. HL1 LED kiirgab pidevat valgusvoogu, mis siseneb fotodioodi läbi mõõteketta pilu. Kui ketas pöörleb, tekivad impulsid ja kuna kettal on ainult üks pesa, siis on nende impulsside arv võrdne ketta pöörete arvuga. Schmitti päästik D1.1 ja D1.2 muundab pingeimpulsid R2-l, mis on põhjustatud fotodioodi läbiva fotovoolu muutusest, loogilise taseme impulssideks, mis sobivad tajumiseks K176 ja K561 seeria loenduritega. Impulsside arvu (ketta pöörete arvu) loendavad samaaegselt kaks loendurit - kolme kümnendiku kümnendloendur kiipidel D2-D4 ja binaarloendur D5-l. Teave pöörete arvu kohta kuvatakse digitaalsel ekraanil, mis koosneb kolmest seitsmesegmendilisest LED-indikaatorist H1-H3 ja kümnebitise kahendkoodi kujul, mis eemaldatakse loenduri D5 väljunditest. Kõigi loendurite nullimine toite sisselülitamise hetkel toimub samaaegselt, mida hõlbustab elemendi D1.3 olemasolu. Kui vajate nullnuppu, saab selle ühendada paralleelselt kondensaatoriga C1. Kui teil on vaja lähtestussignaali saada välisseadmest või loogikast, peate asendama K561LE5 mikroskeemi K561LA7-ga ja eraldama selle tihvti 13 kontaktidest 12 ja C1. Nüüd saab nullimise teha, rakendades loogilise nulli välisest loogilisest sõlmest D1.3 viigule 13. Ahel võib kasutada muid seitsmesegmendilisi LED-indikaatoreid, mis on sarnased ALS324-ga. Kui indikaatoritel on ühine katood, peate kontaktidele 6 D2-D4 rakendama nulli, mitte ühte. K561 mikroskeeme saab asendada K176, K1561 seeria analoogidega või imporditud analoogidega. LED - mis tahes IR LED (seadme kaugjuhtimispuldist). Fotodiood - mis tahes neist, mida kasutatakse USCT tüüpi telerite kaugjuhtimissüsteemides. Seadistamine seisneb fotodioodi tundlikkuse seadistamises, valides väärtuse R2.

Raadiokonstruktor nr 2 2003 lk 24

Tihti tuleb mikrokontrolleriga töötamisel lugeda “antropomorfset” aega – mitu murdosa sekundist peaks LED helendama, maksimaalne topeltklõpsu periood jne. Üldiselt arvesta mitte ainult nano- ja mikrosekundeid, aga ka kümneid millisekundeid või isegi sekundeid , minuteid ja isegi tunde (päevade kohta kardan öelda...).
Samal ajal on mikrokontrollerites sageli vaja tegeleda samaaegselt mikrosekunditega - impulsiperioodid, põrkevastane ootamine jne.
On ka seadmeid, mis töötavad pidevalt mitu tundi ja isegi päevi - lennuseadmed, autovarustus, puuraukuseadmed (mõnikord räägime pidevast tööst mitu päeva). Sellistel juhtudel on taimerite ja 8-bitiste muutujate ületäitumine vastuvõetamatu.
Tahaks selle kõik ühendada üheks elegantseks ja universaalseks lahenduseks – omada mikrosekundi täpsusega ajamõõtmise vahendit, mis ei voola üle mitme päeva.
Miks mitte? Kannatasin mõnda aega ja leidsin lahenduse 8-bitiste AVR mikrokontrollerite jaoks. Selleks kasutasin 8-bitist taimerloendurit ja 4-baidist muutujat. Ma ei tööta praegu PIC-ide ja AT89-ga ning ma ei tunne teisi manustatud platvorme. Kui aga lugejad aitavad, teen seda ka nende heaks.
Eelised – kood on väga korratav (teen sellega juba viiendat seadet); töö lihtsus (katkestusi ei kasutata töö tellija osa puhul); koodi kliendiosa on tinglikult platvormist sõltumatu; katkestuses - üks summeerimisoperatsioon (kuid 4-baidise väärtuse jaoks); puudub väline seade - reaalajas taimer.
Leidsin ainult ühe puuduse - üks selline kasulik ja alati vajalik taimer on hõivatud...
Artikkel pakub huvi eelkõige algajatele - ma ei avastanud siin Ameerikat.

teooria

Niisiis, minu käsutuses on seade, mis põhineb Atmega16A-l ja millel on 12 MHz kvarts. Võtame selle taimer-loenduriks 0. See on kaheksabitine taimer – sellest meile piisab. Miks? Me arvestame:
  1. võtame kvartsist 12 MHz ja jagamisteguri 8-ga - saame sageduseks 1500 KHz;
  2. Võtame CTC režiimi (reset on kokkusattumus) ja seame katkestuse kattuma 150-ga - saame katkestuse sageduseks 10 KHz;
  3. just sellel katkestusel suurendame muutujat (kasv saadakse iga 0,1 millisekundi järel);
  4. kui see on märgita 32-bitine väärtus, täitub see ligikaudu pärast seda
    • 429496729,6 millisekundit;
    • 42949,7 sekundit;
    • 7158,3 minutit;
    • 119,3 tundi;
    • 4,97 päeva.
Ehk siis see lahendus loob (peaaegu) 5 päevaks taimeri 0,1 millisekundi täpsusega (peame aga arvestama, et päris kvartsil on viga – sellest lähemalt hiljem). Ja kui analüüsida ka taimeri 0 väärtust ennast - seda suurendatakse iga 2/3 mikrosekundi järel -, saate loenduri 0,67 mikrosekundi täpsusega.
Piisav? Minu silmade taga. Kasutades 0,1 millisekundi loendurit, ma oma projektides:
  • Loen LED-ide vahelise helendamise ja pauside kestuse;
  • Arvestan ajalõpudega töötamisel UART-iga, USB-ga;
  • Seadistan katseseadmetes kõikvõimalikke olukordi - keerulisi ruumilis-ajalisi kombinatsioone;
  • Hoian ADC ja muude andurite küsitlemisel kindlaksmääratud ajavahemikke;
  • Ma ütlen arvutile oma (seadme) tööaja ja edastan teavet etteantud ajavahemike järel;
  • Arvestades loendurit kuni mikrosekunditeni, teostan klahvide vajutamisel põrkevastast juhtimist, analüüsides impulsse pikkades ridades.
Ja kõik see mahub lihtsalt ÜHTE ATmega16 JUHTIMISEKS! Pealegi pole see Assembler, vaid platvormideülene C! Ja ei mingit välist reaalajas loendurit!
Pole paha, eks?

AVR-i seadistamine

Kuidas seda kõike AVR-is teha?
Kõigepealt loome välise muutuja, mida ma nimetan "DeciMilliSecond":
// in main.h typedef märgita pikk dword; // märgita 32-bitine täisarv väline volatile dword dmsec; // 0,1 msek // in main.c volatile dword dmsec;
Nagu @no-smoking õigesti märkis, peab see muutuja olema muutlik, et kompilaator ei prooviks seda optimeerida.
Initsialiseerin selle muutuja funktsioonis:
dmsec = 0;
Järgmisena seadsin taimeri 0 töörežiimi:
// . taimer 0 – 0,1 msek Timer0_Mode (TIMER_Mode_CTC | TIMER0_Clk_8); Timer0_Cntr(149); Timer_Int(Taimer0_Cmp);
Samal ajal deklareerin mõnes MCU_init.h-s kõik vajaliku:
// failis mcu_init.h #include // . TIMSK #define Timer0_Cmp (1<< 1) // совпадение таймера 0 // . TCCRn #define WGM1 (1 << 3) #define CS1 (1 << 1) // . источник сигнала для таймера 0 #define TIMER0_Clk_8 CS1 // предделитель 8 // . режим работы таймера #define TIMER_Mode_CTC WGM1 // CTC (сброс при совпадении) // . настройка таймера #define Timer_Int(Mode) TIMSK = (Mode) #define Timer0_Mode(Mode) TCCR0 = (Mode) #define Timer0_Cntr(Cntr) OCR0 = (Cntr)
Kui võimalik, siis luban katkestused:
#asm("SEI")
Jääb üle katkestuse kirjeldamine. See on lihtsam kui kõik varem:
#kaasa katkestus Timer0_Compare (kehtetu) ( ++dmsec; )
See on kõik, taimer on kirjeldatud, konfigureeritud ja töötab!

PIC-i seadistus

Siin on see, mida kallid PIC-fännid mulle ütlesid:

Tipphetkedel saab seda lihtsalt korrata Timer2 mooduli abil. Sellel on juhuslikult sarnane katkestusfunktsioon.

PR2 = 75 – väärtus, mille juures taimer lähtestab ja genereerib katkestuse
T2CON.T2CKPS = 2 – eelskaalaja 1:16
T2CON.T2OUTPS = 0 – ilma järelskaalajata
T2CON.TMR2ON = sees – taimer on lubatud

IPR1.TMR2IP = 1 -- kõrge prioriteediga katkestus
PIR1.TMR2IF = väljas -- katkestuse lipu lähtestamine
PIE1.TMR2IE = sees – lubage katkestus, kui TMR2 ja PR2 langevad kokku
INTCON.GIE = ​​sees -- katkestuse töötlemise lubamine

Nagu näete, on siinne eelskaalaja 2 korda suurem, seega on PR2 2 korda väiksem.
Need sätted genereerivad katkestusi sagedusega 10 kHz süsteemi sagedusel 48 MHz (taimer on seatud väärtusele Fosc/4) – USB täiskiiruse standardsagedus.

Kasutamine

Selle taimeri kliendi kood on platvormideülene (välja arvatud juurdepääs AVR-is taimeri 0 väärtusele).
Siin on väljavõte USB-jagamiskoodist:
#include "main.h" // siin on muutuja dmsec, next_USB_timeout #include "FT245R.h" // siin on USB-mooduliga töötamise funktsioonid #include "..\Protocol.h" // siin on mikrokontroller -arvutivahetusprotokoll // * * // ** USB-pakettide analüüsimine // ** void AnalyzeUSB (void) ( #define RECEIVE_BYTE(B) while (!FT245R_IsToRead)\ ( if (dmsec > end_analyze) return; )\ B = FT245_ReadByte (); #define RECEIVE_WORD(W) // sarnane 2 baidile #define RECEIVE_DWORD(W) // sarnane 4 baidile dword end_analyze, d; NewAnalyze: if (!FT245R_IsToRead) // no paketid pole end_dmsanaecze return? + max_USB_timeout; // praeguse analüüsi ajalõpp next_USB_timeout = dmsec + MaxSilence_PC_DEV; // üldise vahetuse ajalõpp RECEIVE_BYTE (b) // paketi päise lüliti (b) ( juhtum SetFullState: RECEIVE_DWORD (d); // sõna lugemine on =_ 1; // töötle ChangeIndicator () ; break; ) // lülita (pakk) goto NewAnalyze; #undef RECEIVE_BYTE // tühista #define #undef RECEIVE_WORD #undef RECEIVE_DWORD )
Makrofunktsioonid RECEIVE_BYTE, RECEIVE_WORD, RECEIVE_DWORD rakendavad lugemisprotseduure, võttes arvesse antud vahetusfaasi ajalõpu. Selle tulemusena, kui midagi ripub teisel pool, ei lähe mikrokontroller talveunne. Pange tähele – WatchDog ei ole vajalik! Ja seda kõike tänu muutujale/konstantsele max_USB_timeout, mis seab ajalõpu 0,1 millisekundilise täpsusega.
"Vaikuse eetris" analüüs, kasutades muutujat next_USB_timeout, viiakse läbi samal viisil. See võimaldab mikrokontrolleril 1) teada saada, et arvuti on kuhugi kadunud, 2) sellest kuidagi märku anda (minu puhul süttib “error” LED). MaxSilence_PC_DEV konstant/muutuja võimaldab teil muuta "vaikuse" mõistet kõige laiemas vahemikus – millisekundi murdosast mitme päevani.
Kõik muud punktid rakendatakse sarnaselt.
Kui peate kasutama mikrosekundite loendurit, kuvatakse seal võrdlusfunktsioon:
#define GetUSec(A,B) ( #asm ("CLI"); A = dmsec; B = TCNT0; #asm ("SEI"); ) // ** // ** Ajavahe sündmuste vahel täpsusega 2/ 3usec // ** dwordi erinevus (dword prev_dmsec, bait prev_usec) ( dword cur_dmsec; bait cur_usec; ​​dword dif; // . märkige praegune aeg GetUSec (cur_dmsec, cur_usec); // arvutage erinevus dif = cur_dmsec - prev_dmsec ; dif<<= 8; if (cur_usec < prev_usec) dif += 255 + (dword) cur_usec - prev_usec; else dif += cur_usec - prev_usec; return dif; }
Funktsioon edastatakse eelmisest ajahetkest - dmsec ja taimeri eelmine väärtus 0.
Esiteks kasutame GetUSeci makrot katkestuste peatamiseks, et dmsec-i väärtus ja loendur ei oleks kopeerimise ajal rikutud. Ja kopeerige praegune kellaaeg.
Järgmisena teisendame ajavahe 2/3 mikrosekundi vormingusse, võttes arvesse ületäitumist.
Noh, lähme seekord tagasi.
Ja siis kasutame seda regulaarselt põrkevastaste ja muude meetmete kontrollimiseks. Lihtsalt ärge unustage hetke ajahetke märkimisel ka katkestusi peatada – või veel parem, kasutage GetUSeci makrot.

tulemused

See taimer osutus minu jaoks äärmiselt mugavaks lahenduseks. Ma arvan, et see on kasulik ka teile. Ja ma kasutasin seda oma järgmistes projektides:
  • Elektrikilbi piirdeaedade olukorrad. See on kopsakas poolemeetrine laud, millel on kolm kontrollerit - ATmega128 on keskne ja ATmega64 on kaks abi (paremal ja vasakul). Kolme kontrolleri ja nende komponentide vahel puudub galvaaniline ühendus – toide põhineb ionistoritel, side läbi optronide. Keskkontroller laeb mõne ionistori rühmi ja annab sel ajal toite mõlemale poolele teistelt ionistoritelt. Siin tuli koostada mitmeastmeline algoritm selle kõige ümberlülitamiseks, et minimeerida omavahelist ühendust. Eelkõige räägime 8 relee koordineeritud tööst - taimerid töötavad siin 3,3 ms (relee reaktsiooniaeg garanteeritud). No tegelikult juhivad mõlemad pooled 10 releed ja umbes poolsada multiplekserit. Kõik need seadmed töötavad selgelt määratletud ajakarakteristikutega (täpsusega 1 ms, maksimaalne kestus on 6 sekundit). Noh, ja lõpuks, banaalne ajalõpp USB, UART jaoks.
  • Sügavusandur. Siin lahendan veel üht probleemi (projekt pooleli). Seal on kaks juhti (palju meetrit pikk), mis määratlevad olukorra "nihutage 1 cm võrra üles" ja "nihutage 1 cm võrra alla". Suuna määramiseks on palju võimalusi. Igal juhul on need teatud impulsside kombinatsioonid. Selle taimeriga määran põrke ja stabiilse impulsi kestuse. Arvutist määratakse maksimaalne lubatud põrkeaeg (siin piisab 10 mikrosekundist), põrkevastane ooteaeg ja minimaalne/maksimaalne impulsi kestus. Noh, seal on silumisrežiim - andurist saab loogikaanalüsaator. See võimaldab teil siluda liini tööd ja kohandada koefitsiente. Noh, jälle aeg, LED-id.
  • Analoogsignaali andur. Banaalne 8-kanaliline ADC. Siin kasutan vajalike pauside säilitamiseks taimerit.
Kallid habra kasutajad teistelt platvormidelt võivad mulle öelda vastava taimeri lähtestamiskoodi ja sellele juurdepääsu reeglid - lisan selle siia. Teiste platvormide jaoks võib osutuda vajalikuks valida erinevad kellaajad. Kuid igal juhul peaks see olema taimeri enda jaoks mõne mikrosekundi ühiku piires ja loenduri muutuja puhul 100 mikrosekundi kordne. Sest nagu selgub, mõnikord ühest millisekundist ei piisa.
Jaga