Do-it-yourself pulse counter circuits. Simpleng revolution counter - Mga disenyo ng simpleng kumplikado - Mga circuit para sa mga nagsisimula

💖 Gusto mo ba? Ibahagi ang link sa iyong mga kaibigan

Mula sa mga karaniwang functional unit ng digital na teknolohiya, hindi mahirap mag-assemble ng electronic stopwatch counter, katulad ng ginawa para sa mga silid-aralan ng physics ng paaralan. Ginagamit ng mga device na ito ang paraan ng pagbibilang ng pulso ng pagsukat ng oras, na binubuo sa pagsukat ng bilang ng mga pulso na alam ang panahon ng pag-uulit. Ang mga naturang device ay naglalaman ng mga sumusunod na pangunahing bahagi: isang counting pulse generator, isang control circuit (sa pinakasimpleng kaso, ang papel nito ay nilalaro ng "Start" na buton), isang binary decimal counter, mga decoder at mga tagapagpahiwatig. Ang huling tatlong node ay bumubuo ng isang dekada ng conversion, na nagmomodelo ng isang decimal na lugar. Dapat pansinin na ang pagsukat ng oras gamit ang paraan ng pagbibilang ng pulso ay sinamahan ng isang hindi maiiwasang error na katumbas ng isang yunit ng pagbibilang. Ito ay dahil sa ang katunayan na ang aparato ay magtatala ng parehong bilang ng mga pulso at, samakatuwid, ay nagpapakita ng parehong oras kung ang pagbibilang ay tumigil kaagad pagkatapos ng pagdating ng huling pulso o bago ang pagdating ng nakaraang pulso. Sa kasong ito, ang error ay kukuha ng pinakamalaking halaga, katumbas ng oras sa pagitan ng dalawang magkatabi

kanin. 172. Recalculation dekada

mga impulses. Kung babawasan mo ang panahon ng pag-uulit ng pulso at maglalagay ng mga karagdagang counter digit, maaari mong taasan ang katumpakan ng pagsukat sa kinakailangang numero.

Isang dekada ng stopwatch counter ay ipinapakita sa Figure 172. Ito ay binubuo ng isang binary-decimal counter sa decoder at isang indicator sa neon lamp Upang paganahin ang indicator, kailangan mo mataas na boltahe, samakatuwid, ayon sa mga regulasyon sa kaligtasan, ang aparato ay dapat gamitin ng isang superbisor. Gumagamit ang circuit ng isang decoder na partikular na idinisenyo upang gumana sa isang high-voltage indicator. Sa halip na isang lampara, maaari mong gamitin ang mga lamp ng iba pang mga uri: dinisenyo para sa isang boltahe ng supply ng 200 V at isang kasalukuyang indikasyon Ang microcircuit ay binubuo ng isang trigger na may input ng pagbibilang (input at isang trigger divider ng 5 (input). Kapag kumokonekta. ang output ng counting trigger (output 1) sa input ng divider, isang binary-decimal counter Ito ay tumutugon sa bumabagsak na gilid ng isang positibong pulso o sa isang negatibong boltahe na hakbang na inilapat sa input Sa alamat, ang pagbibilang Ang gilid ay minsan ay ipinapakita bilang isang arrow na nakadirekta patungo sa IC kung ito ay tumutugon sa isang positibong hakbang ng boltahe, o isang arrow na nakadirekta palayo sa IC na ito ay tumutugon sa isang negatibong pagbaba ng boltahe.

Upang kontrolin ang pagpapatakbo ng dekada ng pagbibilang, tatlong mga pindutan at isang switch ang ginagamit. Bago magsimula ang pagbibilang ng dekada

ay nakatakda sa zero gamit ang "Itakda" na buton. O", sa kasong ito, isang lohikal na 1 ang ibinibigay sa mga counter input. Pagkatapos ay pipiliin ng switch ang pinagmulan ng pagbibilang ng mga pulso - maaari itong maging trigger o multivibrator. Sa mode na "mechanical closure counting", kapag pinindot ang button at inilabas nang sunud-sunod, magaganap ang binary-decimal counting at sunud-sunod na iilaw ang indicator sa mga numero 1, 2, 3, atbp. hanggang sa numero 9, pagkatapos ay umiilaw ang numero 0 at ang pagbibilang ay paulit-ulit. Sa mode ng pagbibilang ng pulso, ang input ng counter ay tumatanggap ng mga pulso mula sa isang multivibrator na binuo ayon sa kilalang circuit sa Fig. 168). Upang sukatin ang oras sa mga segundo, ang dalas ng pulso ay dapat na 1 Hz. Ito ay naka-install variable na risistor at katumbas ng kapasidad

Upang makakuha ng isang multi-bit binary-decimal counter, sila ay inililipat sa sunud-sunod, i.e. ang output ng una ay konektado sa input ng pangalawa, ang output ng pangalawa ay konektado sa input ng pangatlo, atbp. Upang itakda ang multi-digit na counter sa zero na estado, ang mga input ay pinagsama at konektado sa Button na "Itakda". 0".

Kung, halimbawa, ang aparato ay inilaan upang magamit sa mga aralin sa pisika, kung gayon ang oras ay dapat masukat sa isang medyo malawak na saklaw - mula 0.001 hanggang 100 s. Upang gawin ito, ang generator ay dapat na may dalas at ang counter ay dapat na binubuo ng limang decimal na lugar. Sa kasong ito, ang mga digital indicator reading ay magiging ganito: 00.000; 00.001; 00.002, atbp. hanggang 99.999 s.

Ang saklaw ng aplikasyon ng counter-stopwatch ng pagsasanay ay maaaring makabuluhang mapalawak kung magpakilala ka ng dalawa karagdagang mga aparato- contactless control unit at time delay unit. Ang unang block ay dapat magbigay ng awtomatiko at inertia-free switching on at off ng device. Upang gawin ito, maaari mong gamitin ang kilalang photo relay circuit (Larawan 76), pagpili ng nais na sensitivity at tumutugma sa boltahe ng mga power supply. Ang control circuit ay dapat na may dalawang photosensor - ang isa ay ginagamit upang i-on at ang isa ay upang patayin ang stopwatch counter sa mga sandali kapag ang mga sinag ay nagsalubong sa isang gumagalaw na katawan. Alam ang distansya sa pagitan ng mga sensor ng larawan at mga pagbabasa ng stopwatch, madaling kalkulahin ang bilis ng katawan. Gumagamit ang add-on unit ng dalawang photocurrent amplifier. Kinokontrol ng kanilang mga output signal ang pagpapatakbo ng counting trigger, ang isa sa mga output ay konektado sa stopwatch input sa pamamagitan ng transistor switch.

Ang iba pang mga halimbawa ng paggamit ng mga elektronikong metro ay maaari ding ibigay. Halimbawa, ang isang makina na ginagaya ang laro ng dice ay binubuo ng tinalakay nang dekada ng

At isang neon lamp na kinokontrol ng multivibrator pulses (tingnan ang Fig. 168, 172). Ang mga manlalaro ay humalili sa pagpindot sa pindutan na nakakaabala sa bilang. Ang isa na ang tagapagpahiwatig ay nagpapakita ng pinakamataas na bilang ang panalo. Ang sandaling huminto ang counter, pati na rin ang sandali ng kubo na may mga puntos mula 1 hanggang 6 na paghinto, ay tinutukoy ng mga random na dahilan, samakatuwid ang pagbibilang ng dekada kasama ang multivibrator ay isang electronic random number sensor. Magbigay tayo ng higit pang mga halimbawa ng paggamit nito sa iba't ibang sitwasyon sa paglalaro.

Kapag sinusuri ang bilis ng reaksyon ng mga manlalaro, ang isang risistor ay nagtatakda ng isang tiyak na dalas ng operasyon ng multivibrator at ang bilis kung saan nagbabago ang mga numero ng tagapagpahiwatig (tingnan ang Fig. 168 at 172). Ang mga kalahok sa laro ay hinihiling na pindutin ang pindutan ng multivibrator sa bawat oras na ang tagapagpahiwatig ay nagpapakita ng isang tiyak, paunang napiling numero. Kung mas mataas ang dalas ng paglipat, mas mahirap matupad ang kundisyong ito. Ang mga pinakamabagal ay inalis muna sa laro; ang nagwagi ay ang manlalaro na may pinakamahusay na reaksyon. Sa isa pa, mas mahirap na bersyon ng laro, kailangan mong ipagpatuloy ang pagpindot sa pindutan sa bilis na itinakda ng hukom pagkatapos mawala ang indicator. Upang gawin ito, isara ito gamit ang isang mekanikal na kurtina o i-off ito gamit ang isang pindutan

Ang isang nagbibilang na dekada kasama ang isang multivibrator ay lalong maginhawang gamitin sa mga laro kung ang power supply nito ay ginawang autonomous, iyon ay, hindi konektado sa network. Sa kasong ito, ginagamit ang isang pitong-segment na tagapagpahiwatig ng LED na kinokontrol ng isang integrated circuit decoder. Pamilyar na tayo sa microcircuit at indicator na ito (Fig. 150, 163). Ang multivibrator at counter circuit ay nananatiling hindi nagbabago. Ang circuit ng isang random na sensor ng numero na tumatakbo mula sa isang 5 V na pinagmulan ay ipinapakita sa Figure 173.

Ang isang halimbawa ng isang mas kumplikadong device na gumagana sa batayan ng isang electric meter ay isang time delay unit, o timer. Ang Figure 174 ay nagpapakita ng isang schematic diagram ng isang timer na nagbibigay-daan sa iyo upang i-on ang iba't ibang mga load para sa isang oras mula 0 hanggang 999 s. Binubuo ito ng isang tatlong-digit na decimal counter na binuo sa isang microcircuit ng tatlong decoder sa isang multivibrator chip at isang control circuit sa isang microcircuit, pati na rin ang isang microcircuit Ang pinagmulan ng pagbibilang ng mga pulso ay isang multivibrator na nakatutok sa dalas ng 1 Hz. Ang mga pulso nito ay pinapakain sa input ng isang tatlong-digit na decimal counter. Ang mga binary code mula sa bawat digit ay ibinibigay sa mga decoder Sa kanilang mga output, ang mga zero na signal ay lilitaw nang sunud-sunod sa pagdating nila sa mga input

kanin. 173. Recalculation dekada na may LED indicator

kaukulang binary code. Ang pagtatakda ng kinakailangang pagkaantala ng oras ay isinasagawa sa pamamagitan ng mga switch na nagkokonekta sa mga output ng decoder na may mga elemento ng microcircuit Ang mga input ng mga elemento At ay konektado sa mga pares upang makakuha ng isang elemento Ang switch ay nagtatakda ng mga yunit ng segundo, ang switch ng sampu-sampung segundo at ang switch daan-daang segundo. Kung, halimbawa, ang mga switch ay konektado sa mga pin 2, 3 at 7 ng decoder, pagkatapos ay magkakaroon ng tatlong 0 sa mga input ng elemento ng OR-NOT lamang sa sandaling ang counter ay nagtatala ng 237 pulse o isang tagal ng panahon katumbas ng 237 segundo ang lumipas mula nang magsimula ang pagbibilang. Sa kasong ito, lalabas ang 1 signal sa output ng OR-NOT na elemento Hanggang sa sandaling ito, para sa lahat ng binary code ng counter, ang output ng logical na elemento ay zero signal.

Ang timer control circuit ay gumagana tulad ng sumusunod. Ang "Stop" na pindutan ay unang pinindot bilang isang resulta, ang RS trigger na binuo sa microcircuit ay nakatakda sa zero na estado. Mula sa direktang output, ang antas ng zero boltahe ay ibinibigay sa isang 1/77 transistor, sa emitter circuit kung saan nakakonekta ang electromagnetic relay winding. Naka-off ang transistor at relay. Kasabay nito, sa kabaligtaran na output 6 ay lilitaw mataas na antas, na nagsisilbing reset signal para sa counter. Kapag pinindot mo ang "Start" na buton, ang RS trigger ay mapupunta sa iisang estado, at 3 ang lalabas sa direktang output. mataas na antas ng boltahe, sapat upang buksan ang 1/77 transistor at patakbuhin ang relay. Isinasara ng mga contact nito ang load power supply circuit. Kasabay nito

(i-click upang tingnan ang pag-scan)

ang antas ng zero boltahe na inalis mula sa kabaligtaran na output ng trigger ay "magbubukas" sa counter. Gumagana ang counter hanggang sa lumabas ang mga output signal na tumutugma sa na-dial na numero sa mga output ng decoder. Sa kasong ito, tulad ng nabanggit na, lumilitaw ang isang solong signal sa output, na pinapakain sa pamamagitan ng inverter sa input ng trigger. Ito ay nakatakda sa zero na estado at, nang naaayon, ang transistor, electromagnetic relay at load ay naka-off. Ang counter ay nakatakda sa zero.

Ipapakita ng timer ang kasalukuyang oras sa mga segundo kung ang mga LED ay konektado sa mga output ng decoder. Magiging mas maginhawa ang pagbibilang ng oras kung ang mga binary decimal code ng mga counter ay ibinibigay sa mga decoder na gumagana kasabay ng pitong-segment na indicator

-20 dB ang sumulat:
Bakit hindi lapitan ang bagay na may kaunting pagdanak ng dugo? Kung mayroong isang bagay tulad ng nabanggit sa itaas na IZhTS5-4/8, na may hiwalay na mga output ng segment?

Sa imbakan ng hindi nagamit na K176IE4 mula sa panahon ng Sobyet, marami ang natitira (isang counter/divider ng 10 na may pitong-segment na decoder at isang transfer output, na ginamit upang bumuo ng mga yunit ng minuto at oras sa isang elektronikong relo, isang hindi kumpletong analogue - CD4026 - ano ang incompleteness, hindi pa tinitingnan...) sa classic switching on para sa LCD control. 4 na mga PC - 2 bawat channel, + 2 mga PC. 176(561)LE5 o LA7 - isa para sa mga single pulse shaper (contact bounce suppressors), ang pangalawa - para sa pagbuo ng meander para "iluminado" ang LCD indicator?

Siyempre, mas maganda ang solusyon sa MP, pero sa basura, mas mura, at malulutas lang sa tuhod... Sa MP programming, halimbawa, nahihirapan ako (maliban na lang kung may mag-abot sa akin ng ready-made dump. ) - mas madali para sa akin ang hardware.


Well, willing akong tumaya dito. Gawin natin ang matematika. Para sa mga nagsisimula, ang gastos:
1. PIC12LF629 (SOIC-8) - 40 kuskusin. (~$1.15)
2. Display mula sa Motorola S200/S205/T190/T191 - mga 90 rubles (~$2.57) Bilang karagdagan, ang resolution ay 98x64 - gumuhit at isulat kung ano ang gusto mo.
3. Bulk (SMD shortcut, mga pindutan, SMD capacitors, atbp.) Sa isang sulyap - tungkol sa 50 rubles. (~$1.42)

Kabuuan: ~180rub (~$5)

Ang kaso, ang baterya (pipiliin ko ang Lo-Pol na baterya mula sa parehong C200 motor scooter - compact, capacious, mura (medyo)) - hindi namin ito binibilang, dahil pareho ang kailangan sa parehong mga pagpipilian.

Ngayon ang iyong pagpipilian:

1. LCI5-4/8 - humigit-kumulang 50 rubles (~$1.42)
2. K176IE4 (CD4026) - 15 rubles (~0.42$)x4=60 rubles (~1.68$)
3. K176LA7 - 5 rubles (~0.14$)x4=20 rubles (~0.56$)
4. Bulk (SMD shortcut, mga pindutan, SMD capacitors, atbp.) Sa isang sulyap - tungkol sa 50 rubles. (~$1.42)

Kabuuan: ~180rub (~$5)

Ano ang pakinabang?

Ngayon, tantyahin natin ang mga katangian ng pagganap at paggana:

Ang bersyon na may MK ay magkakaroon ng pagkonsumo maximum 20mA, habang sa iyong bersyon, sa tingin ko 1.5...2 beses pa. Bilang karagdagan, sa iyong bersyon ay mayroong (kamag-anak) kumplikado ng isang naka-print na circuit board sa 7 mga kaso + isang multi-legged ILC5-4/8 (marahil double-sided), ang kawalan ng kakayahan upang i-upgrade ang device (magdagdag o magbago ng functionality) nang hindi nakapasok sa circuit (sa antas lamang ng software), ang kawalan ng kakayahang ayusin ang memorya para sa mga sukat (pagbibilang), power supply ng hindi bababa sa 5V (na may mas kaunting hindi mo i-ugoy ang LCI), timbang at mga sukat. Marami pang argumento na maaaring ibigay. Ngayon ang pagpipilian sa MK. Nagsulat na ako tungkol sa kasalukuyang pagkonsumo - 20mA max. + ang posibilidad ng sleep mode (consumption - 1...5 mA (pangunahin ang LCD)), ang pagiging kumplikado ng board para sa isang 8-leg microcircuit at isang 5-pin connector para sa isang Motorola LCD ay katawa-tawa kahit na sabihin. Kakayahang umangkop (maaari kang gumawa ng isang bagay tulad nito sa pamamagitan ng program, nang hindi binabago ang circuit o board - ito ay magpapatayo sa iyong buhok), ang nilalaman ng impormasyon ng 98x64 graphic na display ay hindi maihahambing sa 4.5 na digit ng isang 7-segment na LCI . power supply - 3...3.5V (maaari ka ring gumamit ng CR2032 tablet, ngunit mas mahusay pa rin ang Li-Pol mula sa isang mabyl). Ang kakayahang ayusin ang multi-cell memory para sa mga resulta ng pagsukat (bilang) ng device - muli, sa antas ng software lamang nang hindi nakakasagabal sa circuit at board. At sa wakas - ang mga sukat at timbang ay hindi maihahambing sa iyong pagpipilian. Ang argumentong "I don't know how to program" ay hindi tatanggapin - kung sino ang gusto ay makakahanap ng paraan. Hanggang kahapon, hindi ko alam kung paano magtrabaho kasama ang display mula sa mobile phone ng Motorola S205. Ngayon kaya ko na. Lumipas ang isang araw. Dahil KAILANGAN ko ito. Sa huli, tama ka - maaari kang magtanong sa isang tao.)) Ganito iyon. At ito ay hindi isang bagay ng kagandahan, ngunit ang katotohanan na ang discrete logic ay walang pag-asa na lipas na sa moral at teknikal bilang pangunahing elemento ng disenyo ng circuit. Ano ang kailangan ng dose-dosenang mga kaso na may ligaw na kabuuang pagkonsumo, kumplikado ng PP at malalaking sukat ay maaari na ngayong tipunin na may 28-40 talampakang MK nang madali at natural - maniwala ka sa akin. Ngayon ay may higit pang impormasyon sa MK kaysa sa discrete logic - at ito ay lubos na nauunawaan.

Ang counter sa microcontroller ay medyo simple upang ulitin at binuo sa sikat na PIC16F628A microcontroller na may isang indication output sa 4 na pitong-segment na LED indicator. Ang counter ay may dalawang control input: "+1" at "-1", pati na rin ang "I-reset" na button. Ang kontrol ng bagong counter circuit ay ipinapatupad sa paraang kahit gaano katagal o maikli ang input button ay pinindot, magpapatuloy lamang ang pagbibilang kapag ito ay inilabas at pinindot muli. Pinakamataas na dami nakatanggap ng mga pulso at, nang naaayon, ang mga pagbabasa ng ALS ay 9999. Kapag kinokontrol sa input na "-1", ang pagbibilang ay isinasagawa sa reverse order sa halagang 0000. Ang mga counter reading ay nai-save sa memorya ng controller kahit na ang kapangyarihan ay nakabukas. off, na magse-save ng data sa kaganapan ng mga random na pagkagambala sa supply boltahe.

Schematic diagram ng isang reverse counter sa PIC16F628A microcontroller:

Ang pag-reset ng mga counter reading at sa parehong oras ang estado ng memorya sa 0 ay isinasagawa sa pamamagitan ng pindutang "I-reset". Dapat alalahanin na kapag una mong binuksan ang reverse counter sa microcontroller, maaaring lumitaw ang hindi mahuhulaan na impormasyon sa indicator ng ALS. Ngunit sa unang pagkakataon na pinindot mo ang alinman sa mga pindutan, ang impormasyon ay na-normalize. Saan at paano magagamit ang circuit na ito ay depende sa mga partikular na pangangailangan, halimbawa, na naka-install sa isang tindahan o opisina upang mabilang ang mga tao o bilang isang indicator para sa isang winding machine. Sa pangkalahatan, sa palagay ko ang counter na ito sa isang microcontroller ay magiging kapaki-pakinabang sa isang tao.

Kung ang isang tao ay walang kinakailangang tagapagpahiwatig ng ALS sa kamay, ngunit mayroon pang isa (o kahit na 4 na magkahiwalay na magkatulad na tagapagpahiwatig), handa akong tumulong na i-redraw ang signet at gawing muli ang firmware. Sa archive sa forum mayroong isang circuit diagram, board at firmware para sa mga tagapagpahiwatig na may isang karaniwang anode at isang karaniwang katod. PCB ipinapakita sa figure sa ibaba:

meron din bagong bersyon firmware para sa isang counter sa isang PIC16F628A microcontroller. sa parehong oras, ang circuit at board ng metro ay nanatiling pareho, ngunit ang layunin ng mga pindutan ay nagbago: pindutan 1 - pulse input (halimbawa, mula sa isang reed switch), ang pindutan 2 ay lumiliko sa pagbibilang para sa pagbabawas ng mga pulso ng input, habang ang pinakakaliwang punto sa indicator ay umiilaw, button 3 - pagdaragdag ng mga pulso - Ang pinakakanang punto ay umiilaw. Pindutan 4 - i-reset. Sa bersyong ito, ang counter circuit sa isang microcontroller ay madaling mailapat sa isang winding machine. Bago paikot-ikot o i-unwinding ang mga pagliko, kailangan mo munang pindutin ang "+" o "-" na buton. Ang metro ay pinapagana mula sa isang pinagkukunan na may boltahe na 5V at isang kasalukuyang 50mA. Kung kinakailangan, maaari itong paandarin ng mga baterya. Ang kaso ay depende sa iyong panlasa at kakayahan. Scheme na ibinigay ng Samopalkin

Mga de-koryenteng impulse counter

Ang counter ay isang digital device na nagbibilang ng bilang ng mga electrical impulses. Ang counter conversion factor ay katumbas ng pinakamababang bilang ng mga pulso na natanggap sa counter input, pagkatapos nito ang mga estado sa counter output ay magsisimulang ulitin. Ang isang counter ay tinatawag na summing kung pagkatapos ng bawat susunod na pulso ang digital code sa counter output ay tataas ng isa. Sa isang subtractive counter, pagkatapos ng bawat pulso sa counter input, ang digital code sa output ay nababawasan ng isa. Ang mga counter kung saan posibleng lumipat mula sa summation mode patungo sa subtraction mode ay tinatawag na reversible.

Maaaring i-pre-install ang mga counter. Sa naturang mga counter, ang impormasyon mula sa mga preset na input ay inililipat sa mga counter output sa pamamagitan ng isang signal sa isang espesyal na preset input. Ayon sa kanilang istraktura, ang mga counter ay nahahati sa serial, parallel at parallel-serial. Ang isang serial binary counter ay nabuo sa pamamagitan ng isang chain ng pagbibilang ng mga flip-flop na konektado sa serye. Sa isang parallel counter, ang pagbibilang ng mga pulso ay inilapat nang sabay-sabay sa mga input lahat ng digit ng counter. Ang mga parallel counter ay mas mabilis kaysa sa mga serial counter. Ang mga parallel-serial counter ay may mataas na bilis at mataas na halaga

pagbabago ng conversion factor. Available ang mga electric pulse counter sa parehong TTL at CMOS series. Bilang halimbawa ng TTL counter, isaalang-alang ang K155IE5 microcircuit. Functional na diagram ang counter K155IE5 ay ipinapakita sa Figure 1.51,a, at ang simbolo nito ay naka-on mga diagram ng circuit

sa Larawan 1.51, b. Ang K155IE5 counter ay talagang mayroong dalawang counter: na may conversion factor na dalawa (input C0 at output Q 0) at may conversion factor na walo (input C1 at output Q 1, Q 2, Q 3). Ang isang counter na may conversion factor na labing-anim ay madaling makuha sa pamamagitan ng pagkonekta ng output Q0 sa input C1, at ang mga pulse ay inilalapat sa input C0. Ang timing diagram ng pagpapatakbo ng naturang counter ay ipinapakita sa Figure 1.52. Ipinapakita ng Figure 1.53 ang mga diagram ng koneksyon na nagbabago sa conversion factor ng K155IE5 meter. Ang mga counter output Q 0, Q 1, Q 2, Q 3 ay mayroon Q 1, Q 2 na may mga input para sa pagtatakda ng counter sa zero, nakakakuha kami ng counter na may conversion factor na anim (Fig. 1.53a). Ipinapakita ng Figure 1.53, b ang diagram ng koneksyon para sa pagkuha ng conversion factor na sampu, at Figure 1.53, c - labindalawa. Gayunpaman, sa mga circuit na ipinapakita sa Mga Figure 1.53, a - c, walang posibilidad na itakda ang mga counter sa zero na estado.

Ipinapakita ng mga figure 1.54, a, b, ayon sa pagkakabanggit, ang mga counter na may conversion factor na anim at pito, kung saan ang isang input ay ibinigay para sa pagtatakda ng counter sa zero na estado. Pagsusuri pagpapatakbo ng circuit, na ipinapakita sa Mga Figure 1.53 - 1.54, ay nagpapakita na upang makakuha ng ibinigay na conversion factor, ang mga counter output na ang mga weighting coefficient sa kabuuan ay nagbibigay ng kinakailangang conversion factor ay konektado sa mga input ng logic element na AT.

Ipinapakita ng talahanayan 1.3 ang mga estado sa mga output ng counter na may conversion factor na sampu pagkatapos ng pagdating ng bawat susunod na pulso, at ang counter ay dating nakatakda sa zero.

Tingnan natin ang ilan sa mga counter ng serye ng CMOS. Ipinapakita ng Figure 1.55 ang simbolo para sa K561IE8 microcircuit - isang decimal counter na may decoder. Ang microcircuit ay may input para sa pagtatakda sa zero state R, isang input para sa pagbibigay ng pagbibilang ng mga pulso ng positibong polarity CP at isang input para sa pagbibigay ng pagbibilang ng mga pulso ng negatibong polarity CN.

Lumilipat ang counter batay sa pagbaba ng mga pulso ng positibong polarity sa input ng CP, habang dapat mayroong isang lohikal sa input ng CN. Ang counter ay lilipat batay sa pagbaba ng mga pulso ng negatibong polarity sa CN input kung ang CP input ay logical zero. Ang isa sa sampung counter output ay palaging may lohikal na isa. Ang counter ay nakatakda sa zero kapag ang isang lohikal na isa ay inilapat sa input R. Kapag ang counter ay nakatakda sa zero, ang output na "0" ay itatakda sa isang lohikal, at lahat ng iba pang mga output ay itatakda sa mga lohikal na zero. Ang K561IE8 chips ay maaaring pagsamahin sa mga multi-bit na counter na may serial carry, na nagkokonekta sa carry output ng nakaraang chip sa CN input ng susunod. Ang Figure 1.56 ay nagpapakita ng isang diagram ng isang multi-bit counter batay sa K561IE10 microcircuits.

Gumagawa ang industriya ng mga counter para sa mga elektronikong relo. Tingnan natin ang ilan sa kanila. Ipinapakita ng Figure 1.57 ang simbolo para sa K176IE3 microcircuit, at ang Figure 1.58 ay nagpapakita ng K176IE4 microcircuit.

Sa mga figure na ito, ang mga output ng microcircuits ay ipinapakita para sa standard indicator segment designation na ipinapakita sa Figure 1.59. Ang mga microcircuits na ito ay naiiba sa bawat isa sa pamamagitan ng conversion factor.

Ang conversion factor ng K176IE3 chip ay anim, at ang conversion factor ng K176IE4 chip ay sampu. Ang pagtatakda ng mga counter na pinag-uusapan sa zero ay isinasagawa sa pamamagitan ng paglalapat ng isang lohikal na signal sa input R. Ang pagpapalit ng mga counter trigger ay nangyayari sa pagbaba ng mga positibong pulso sa input C. Ang microcircuits ay may carry output p (pin 2), kung saan ang input ng susunod na counter ay karaniwang konektado. Ang pagbaba ng boltahe sa output na ito ay nabuo sa sandaling ang counter transition mula sa estado 9 hanggang sa estado 0. Ang mga microcircuits ay naiiba sa mga signal sa pin 3. Para sa K176IE3 microcircuit, isang lohikal na lilitaw sa pin 3 kapag ang counter ay nakatakda sa estado 2, at para sa K176IE4 microcircuit - sa estado 4. Ito ay kinakailangan upang i-reset ang orasan sa 24 na oras.

Kapag ang isang lohikal na zero signal ay inilapat sa S input, ang mga lohikal sa counter output ay nasa mga segment na iyon na nagpapakita ng bilang ng mga pulse na natanggap sa counter input. Kapag ang isang lohikal na yunit ay inilapat sa S input, ang polarity ng mga output signal ay nagbabago. Ang kakayahang ilipat ang polarity ng mga signal ng output ay ginagawang medyo madali upang baguhin ang diagram ng koneksyon ng mga digital na tagapagpahiwatig. Ang Figure 1.60 ay nagpapakita ng isang diagram ng pagkonekta ng isang luminescent indicator sa mga output ng K176IE4 microcircuit. Magiging katulad ang pagkonekta sa indicator sa mga output ng K176IE3 microcircuit. Mga diagram ng koneksyon

Mga tagapagpahiwatig ng LED

Kadalasan, kapag nagpapatakbo ng isang microcontroller device, kailangang magbilang ng "anthropomorphic" na oras - kung gaano karaming mga fraction ng isang segundo ang LED ay dapat kuminang, ang maximum na panahon ng double-click na oras, atbp. Sa pangkalahatan, bilangin hindi lamang nano- at microsecond, ngunit sampu-sampung millisecond, o kahit na mga segundo, minuto at kahit na oras (natatakot akong sabihin ang tungkol sa mga araw...).
Kasabay nito, sa mga microcontroller ay madalas na kinakailangan upang sabay na makitungo sa mga microsecond - mga panahon ng pulso, paghihintay ng anti-bounce, atbp.
Mayroon ding mga device na patuloy na gumagana sa loob ng maraming oras at kahit na araw - kagamitan sa aviation, kagamitan sa sasakyan, mga downhole device (kung minsan ay pinag-uusapan natin ang tungkol sa tuluy-tuloy na operasyon sa loob ng ilang araw). Sa mga kasong ito, hindi katanggap-tanggap ang overflow ng mga timer at 8-bit na variable.
Gusto kong pagsamahin ang lahat ng ito sa isang eleganteng at unibersal na solusyon - upang magkaroon ng paraan ng pagsukat ng oras na may katumpakan ng microsecond na hindi umaapaw sa loob ng ilang araw.
Bakit hindi? Nagdusa ako nang ilang oras at nakaisip ng solusyon para sa 8-bit na AVR microcontroller. Upang gawin ito, gumamit ako ng 8-bit na timer-counter at isang 4-byte na variable. Kasalukuyang hindi ako nagtatrabaho sa mga PIC at AT89, at hindi ako pamilyar sa iba pang naka-embed na platform. Gayunpaman, kung tumulong ang mga mambabasa, gagawin ko rin ito para sa kanila.
Mga kalamangan - ang code ay lubos na nauulit (ginagawa ko na ang ika-5 na aparato kasama nito); kadalian ng operasyon (ang mga pagkagambala ay hindi ginagamit para sa bahagi ng trabaho ng kliyente); ang bahagi ng kliyente ng code ay may kondisyon na platform-independent; sa interrupt - isang summation operation (ngunit, gayunpaman, para sa isang 4-byte na halaga); Hindi panlabas na aparato- real time timer.
Nakakita lang ako ng isang disbentaha - ang isang kapaki-pakinabang at palaging kinakailangan na timer ay abala...
Ang artikulo ay magiging interesado lalo na sa mga nagsisimula - hindi ko natuklasan ang America dito.

Teorya

Kaya, mayroon akong magagamit na device batay sa Atmega16A na may 12MHz quartz. Kunin natin ang timer-counter nito na 0. Ito ay isang eight-bit timer - sapat na iyon para sa amin. Bakit? Binibilang namin:
  1. kumukuha kami ng 12 MHz mula sa kuwarts at kunin ang division factor ng 8 - nakakakuha kami ng dalas ng 1500 KHz;
  2. Kinukuha namin ang CTC mode (i-reset sa pagkakataon) at itinakda ang interrupt na tumutugma sa 150 - nakuha namin ang dalas ng interrupt na 10 KHz;
  3. sa mismong interrupt na ito, dinadagdagan namin ang variable (isang pagtaas ay nakukuha tuwing 0.1 milliseconds);
  4. kung ito ay isang unsigned na 32-bit na halaga, ito ay aapaw pagkatapos ng humigit-kumulang
    • 429496729.6 millisecond;
    • 42949.7 segundo;
    • 7158.3 minuto;
    • 119.3 oras;
    • 4.97 araw.
Sa madaling salita, ang ganitong solusyon ay lumilikha ng isang timer na may katumpakan na 0.1 millisecond para sa (halos) 5 araw (gayunpaman, dapat nating isaalang-alang na ang tunay na kuwarts ay may error - higit pa sa susunod). At kung susuriin mo rin ang halaga ng timer 0 mismo - ito ay dinadagdagan bawat 2/3 microseconds - pagkatapos ay makakakuha ka ng counter na may katumpakan na 0.67 microseconds.
sapat na? Sa likod ng aking mga mata. Gamit ang isang 0.1 millisecond counter, sa aking mga proyekto:
  • Binibilang ko ang tagal ng glow at pag-pause sa pagitan ng mga LED;
  • Isinasaalang-alang ko ang mga timeout kapag nagtatrabaho sa UART, USB;
  • Itinakda ko ang lahat ng uri ng mga sitwasyon sa mga kagamitan sa pagsubok - kumplikadong mga kumbinasyon ng spatio-temporal;
  • Pinapanatili ko ang mga tinukoy na agwat ng oras kapag binobotohan ang ADC at iba pang mga sensor;
  • Sinasabi ko sa computer ang oras ng operasyon ko (ang device) at nagpapadala ng impormasyon sa isang partikular na agwat ng oras;
  • Isinasaalang-alang ang counter pababa sa microsecond, nagsasagawa ako ng anti-bounce control kapag pinindot ang mga key, sinusuri ang mga pulso sa mahabang linya.
At lahat ng ito ay madaling umaangkop sa ISANG ATmega16 CONTROLLER! Bukod dito, hindi ito Assembler, ngunit cross-platform C! At walang panlabas na real-time na counter!
Hindi masama, tama?

Pag-set up para sa AVR

Paano gawin ang lahat ng ito sa AVR?
Una sa lahat, lumikha kami ng isang panlabas na variable, na tinatawag kong "DeciMilliSecond":
// sa main.h typedef unsigned long dword; // unsigned 32-bit integer extern volatile dword dmsec; // 0.1msec // sa main.c volatile dword dmsec;
Tulad ng nabanggit nang tama ng @no-smoking, dapat na pabagu-bago ang variable na ito upang hindi subukan ng compiler na i-optimize ito.
Sinisimulan ko ang variable na ito sa isang function:
dmsec = 0;
Susunod, itinakda ko ang operating mode ng timer 0:
// . timer 0 – 0.1msec Timer0_Mode (TIMER_Mode_CTC | TIMER0_Clk_8);
Timer0_Cntr(149);
Timer_Int(Timer0_Cmp); Kasabay nito, sa ilang MCU_init.h ipinapahayag ko ang lahat ng kailangan:<< 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)
// sa mcu_init.h #include
// . TIMSK #define Timer0_Cmp (1
Kaya, kung posible, pinapagana ko ang mga pagkaantala:
#asm("SEI") Ito ay nananatiling ilarawan ang pagkagambala. Ito ay mas madali kaysa sa lahat ng nakaraan:
#isama

matakpan ang Timer0_Compare (walang bisa) ( ++dmsec; )

Iyon lang, ang timer ay inilarawan, na-configure at tumatakbo!

Setting para sa PIC

Narito ang sinabi sa akin ng mahal na mga tagahanga ng PIC:
Sa mga taluktok ito ay madaling ulitin gamit ang Timer2 module. Ito ay may katulad na interrupt function sa pamamagitan ng pagkakataon.
PR2 = 75 - ang halaga kung saan magre-reset ang timer at makabuo ng isang interrupt
T2CON.T2CKPS = 2 - prescaler 1:16

T2CON.T2OUTPS = 0 - walang postscaler
T2CON.TMR2ON = naka-on - naka-enable ang timer
PIE1.TMR2IE = on -- paganahin ang interrupt kapag ang TMR2 at PR2 ay magkasabay
INTCON.GIE = ​​​​on -- paganahin ang interrupt processing

Tulad ng nakikita mo, ang prescaler dito ay 2 beses na mas malaki, samakatuwid ang PR2 ay 2 beses na mas maliit.
Ang mga setting na ito ay bubuo ng mga interrupt na may dalas na 10 kHz sa dalas ng system na 48 MHz (nakatakda ang timer sa Fosc/4) - ang karaniwang dalas para sa Buong Bilis ng USB.

Paggamit

Ang code para sa kliyente ng timer na ito ay cross-platform (maliban sa pag-access sa halaga ng timer 0 sa AVR).
Narito ang isang snippet ng USB sharing code:
#include "main.h" // narito ang dmsec variable, next_USB_timeout #include "FT245R.h" // narito ang mga function para sa pagtatrabaho sa USB module #include "..\Protocol.h" // narito ang microcontroller -computer exchange protocol // * * // ** Pag-aralan ang mga USB packet // ** void AnalyzeUSB (void) ( #define RECEIVE_BYTE(B) habang (!FT245R_IsToRead)\ ( if (dmsec > end_analyze) return; )\ B = FT245_ReadByte (); #define RECEIVE_WORD(W) // katulad para sa 2 bytes #define RECEIVE_DWORD(W) // katulad para sa 4 bytes dword end_analyze, d; max_USB_timeout; para sa kasalukuyang pagsusuri next_USB_timeout = dmsec + MaxSilence_PC_DEV; // timeout para sa pangkalahatang exchange RECEIVE_BYTE (b) // packet header switch (b) ( case SetFullState: RECEIVE_DWORD (d); // basahin ang salitang is_initialized = 1; proseso ChangeIndicator () ; break ;
Ang mga macro function na RECEIVE_BYTE, RECEIVE_WORD, RECEIVE_DWORD ay nagpapatupad ng mga pamamaraan sa pagbabasa na isinasaalang-alang ang timeout para sa isang partikular na yugto ng palitan. Bilang resulta, kung may nakabitin sa kabilang panig, ang microcontroller ay hindi mapupunta sa hibernation. Pakitandaan - Hindi kailangan ang WatchDog! At lahat salamat sa variable/constant max_USB_timeout, na nagtatakda ng timeout na may katumpakan na 0.1 millisecond.
Ang pagsusuri ng "katahimikan sa hangin" gamit ang next_USB_timeout na variable ay ipinapatupad sa parehong paraan. Ito ay nagpapahintulot sa microcontroller 1) na malaman na ang computer ay nawala sa isang lugar, 2) upang i-signal ito kahit papaano (sa aking kaso, ang "error" na LED ay umiilaw). Ang MaxSilence_PC_DEV constant/variable ay nagbibigay-daan sa iyong pag-iba-ibahin ang konsepto ng "katahimikan" sa pinakamalawak na saklaw - mula sa isang fraction ng isang millisecond hanggang sa ilang araw.
Ang lahat ng iba pang mga punto ay ipinatupad nang katulad.
Kung kailangan mong gumamit ng microsecond counter, may lalabas na function ng paghahambing doon:
#define GetUSec(A,B) ( #asm ("CLI"); A = dmsec; B = TCNT0; #asm ("SEI"); ) // ** // ** Ang pagkakaiba ng oras sa pagitan ng mga kaganapan na tumpak hanggang 2/ 3usec // ** dword Difference (dword prev_dmsec, byte prev_usec) ( dword cur_dmsec; byte cur_usec; ​​​​dword dif; // . tandaan ang kasalukuyang oras GetUSec (cur_dmsec, cur_usec); // kalkulahin ang pagkakaiba dif = cur_dmsec - prev_dmsec ;<<= 8; if (cur_usec < prev_usec) dif += 255 + (dword) cur_usec - prev_usec; else dif += cur_usec - prev_usec; return dif; }
Ang function ay naipasa sa nakaraang punto sa oras - ang dating halaga ng dmsec at timer 0.
Una, ginagamit namin ang GetUSec macro upang ihinto ang mga interrupts upang ang halaga ng dmsec at ang counter ay hindi masira sa oras ng pagkopya. At kopyahin ang kasalukuyang oras.
Susunod, iko-convert namin ang pagkakaiba ng oras sa isang 2/3 microsecond na format, na isinasaalang-alang ang overflow.
Well, balik tayo this time.
At pagkatapos ay ginagamit namin ito nang regular kung para kontrolin ang anti-bounce at iba pang mga hakbang. Basta huwag kalimutang i-pause din ang mga interrupt kapag minarkahan ang kasalukuyang sandali sa oras - o mas mabuti pa, gamitin ang GetUSec macro.

Mga resulta

Ang timer na ito ay naging isang napaka-maginhawang solusyon para sa akin. Sa tingin ko ito ay magiging kapaki-pakinabang din sa iyo. At ginamit ko ito sa aking mga sumusunod na proyekto:
  • Mga sitwasyon ng switchboard fencing. Ito ay isang mabigat na kalahating metrong board na may tatlong controllers - ang ATmega128 bilang gitna at ang ATmega64 bilang dalawang auxiliary (kanan at kaliwang gilid). Walang galvanic na koneksyon sa pagitan ng tatlong controllers at ang kanilang mga bahagi - power supply batay sa ionistors, komunikasyon sa pamamagitan ng optocoupler. Sinisingil ng sentral na controller ang mga grupo ng ilang ionistor at sa oras na ito pinapagana ang magkabilang panig mula sa iba pang mga ionistor. Dito kailangan naming lumikha ng isang multi-stage algorithm para sa paglipat ng lahat ng ito upang mabawasan ang pagkakabit. Sa partikular, pinag-uusapan natin ang coordinated na gawain ng 8 relay - gumagana ang mga timer dito para sa 3.3 ms (garantisadong oras ng pagtugon ng relay). Sa totoo lang, kontrolado ng magkabilang panig ang 10 relay at humigit-kumulang kalahating daang multiplexer. Gumagana ang lahat ng kagamitang ito nang may malinaw na tinukoy na mga katangian ng oras (na may katumpakan na 1 ms, ang maximum na tagal ay 6 na segundo). Well, at, sa huli, ang banal na timeout para sa USB, UART.
  • Depth sensor. Narito ako ay nilulutas ang isa pang problema (isang proyekto na isinasagawa). Mayroong dalawang konduktor (maraming metro ang haba) na tumutukoy sa sitwasyong "shift up ng 1 cm" at "shift down ng 1 cm". Maraming paraan para magtakda ng direksyon. Sa anumang kaso, ito ay ilang mga kumbinasyon ng mga impulses. Gamit ang timer na ito tinutukoy ko ang bounce at ang tagal ng isang matatag na pulso. Ang maximum na pinapayagang bounce time (10 microseconds ay sapat na dito), ang anti-bounce na paghihintay, at ang minimum/maximum na tagal ng pulso ay itinakda mula sa computer. Well, mayroong isang debug mode - ang sensor ay nagiging logic analyzer. Pinapayagan ka nitong i-debug ang pagpapatakbo ng linya at ayusin ang mga coefficient. Well, timeout na naman, mga LED.
  • Analog signal sensor. Isang karaniwang 8-channel ADC. Dito ay gumagamit ako ng timer upang kunin ang mga kinakailangang paghinto.
Maaaring sabihin sa akin ng mahal na mga user ng habra mula sa iba pang mga platform ang initialization code para sa kaukulang timer, pati na rin ang mga panuntunan para sa pag-access dito - idaragdag ko ito dito. Maaaring kailanganin na pumili ng iba't ibang oras para sa iba pang mga platform. Ngunit sa anumang kaso, ito ay dapat na isang bagay sa loob ng ilang mga yunit ng microseconds para sa timer mismo at isang bagay na isang multiple ng 100 microseconds para sa counter variable. Dahil, kung minsan, hindi sapat ang isang millisecond.
Sabihin sa mga kaibigan