Circuite radio amatori pe contoare. Un numărător de rotații simplu - Designuri de complexitate simplă - Circuite pentru începători Cum să asamblați un contor de electricitate pe un microcontroler

Din unități funcționale standard ale tehnologiei digitale, nu este dificil să asamblați un numărător de cronometru electronic, asemănător celor produse pentru sălile de fizică școlare. Aceste aparate folosesc metoda de măsurare a timpului prin numărare a impulsurilor, care constă în măsurarea numărului de impulsuri a căror perioadă de repetare este cunoscută. Astfel de dispozitive conțin următoarele componente principale: un generator de impulsuri de numărare, un circuit de control (în cel mai simplu caz, rolul său este jucat de butonul „Start”), un contor zecimal binar, decodoare și indicatori. Ultimele trei noduri formează un deceniu de conversie, modelând o zecimală. Trebuie remarcat faptul că măsurarea timpului folosind metoda de numărare a impulsurilor este însoțită de o eroare inevitabilă egală cu o unitate de numărare. Acest lucru se datorează faptului că dispozitivul va înregistra același număr de impulsuri și, prin urmare, va afișa același timp dacă numărarea este oprită imediat după sosirea ultimului impuls sau chiar înainte de sosirea impulsului anterior. În acest caz, eroarea va lua cea mai mare valoare, egală cu timpul dintre două adiacente

Orez. 172. Deceniu de recalculare

impulsuri. Dacă reduceți perioada de repetare a pulsului și introduceți cifre suplimentare de contor, puteți crește precizia măsurării cu numărul necesar.

Un deceniu al unui contor de cronometru este prezentat în Figura 172. Acesta constă dintr-un contor binar-zecimal pe un decodor și un indicator pe o lampă cu neon.Pentru alimentarea indicatorului este necesară tensiune înaltă, prin urmare, conform reglementărilor de siguranță, dispozitivul trebuie folosit de un supervizor. Circuitul folosește un decodor special conceput pentru a funcționa cu un indicator de înaltă tensiune. În locul unei lămpi, puteți utiliza lămpi de alte tipuri: concepute pentru o tensiune de alimentare de 200 V și un curent de indicare. Microcircuitul constă dintr-un declanșator cu o intrare de numărare (intrare și un divizor de declanșare cu 5 (intrare). La conectare ieșirea unui declanșator de numărare (ieșire 1) cu intrarea divizorului, un numărător binar-zecimal.Răspunde la frontul de scădere a unui impuls pozitiv sau la un pas de tensiune negativ aplicat la intrare.În legendă, numărarea marginea este uneori arătată ca o săgeată îndreptată către circuitul integrat dacă răspunde la un pas de tensiune pozitiv sau o săgeată îndreptată departe de circuitul integrat dacă reacţionează la o cădere de tensiune negativă.

Pentru a controla funcționarea deceniului de numărare, sunt utilizate trei butoane și un comutator. Înainte să înceapă numărătoarea deceniului

este setat la zero folosind butonul „Setare”. O”, în acest caz, la intrările de contor este furnizat un 1 logic. Apoi comutatorul selectează sursa impulsurilor de numărare - poate fi fie un declanșator, fie un multivibrator. În modul „numărarea închiderilor mecanice”, atunci când butonul este apăsat și eliberat secvențial, are loc contorizarea binar-zecimală și indicatorul se aprinde secvențial, numerele 1, 2, 3 etc. până la numărul 9, apoi numărul 0 se aprinde și se repetă numărătoarea. În modul de numărare a impulsurilor, intrarea contorului primește impulsuri de la un multivibrator asamblat conform circuitului deja cunoscut din Fig. 168). Pentru a măsura timpul în secunde, frecvența pulsului trebuie să fie de 1 Hz. Este stabilit de un rezistor variabil și o capacitate egală cu

Pentru a obține un contor binar-zecimal pe mai mulți biți, acestea sunt pornite secvenţial, de exemplu. ieșirea primului este conectată la intrarea celui de-al doilea, ieșirea celui de-al doilea este conectată la intrarea celui de-al treilea etc. Pentru a seta contorul multi-biți la starea zero, intrările sunt combinate și conectate la Butonul „Setare”. 0".

Dacă, de exemplu, dispozitivul este destinat a fi utilizat în lecțiile de fizică, atunci timpul trebuie măsurat într-un interval destul de larg - de la 0,001 la 100 s. Pentru a face acest lucru, generatorul trebuie să aibă o frecvență, iar contorul trebuie să fie format din cinci zecimale. În acest caz, citirile indicatorului digital vor arăta astfel: 00.000; 00.001; 00.002 etc. până la 99.999 s.

Domeniul de aplicare al unui cronometru de antrenament poate fi extins semnificativ dacă în el sunt introduse două dispozitive suplimentare - o unitate de control fără contact și o unitate de întârziere. Primul bloc trebuie să asigure pornirea și oprirea automată și fără inerție a dispozitivului. Pentru a face acest lucru, puteți utiliza circuitul fotoreleu deja cunoscut (Fig. 76), selectând sensibilitatea dorită și potrivind tensiunea surselor de alimentare. Circuitul de control trebuie să aibă doi fotosenzori – unul este folosit pentru a porni și celălalt pentru a opri contorul cronometrului în momentele în care razele se intersectează cu un corp în mișcare. Cunoscând distanța dintre senzorii foto și citirile cronometrului, este ușor de calculat viteza corpului. Unitatea suplimentară folosește două amplificatoare fotocurent. Semnalele lor de ieșire controlează funcționarea unui declanșator de numărare, una dintre ale cărui ieșiri este conectată la intrarea cronometrului printr-un comutator cu tranzistor.

Pot fi date și alte exemple de utilizare a contoarelor electronice. De exemplu, o mașină care simulează un joc de zaruri constă din deceniul deja discutat

Și o lampă de neon controlată de impulsuri multivibratoare (vezi Fig. 168, 172). Jucătorii apasă pe rând pe butonul care întrerupe numărătoarea. Câștigă cel al cărui indicator arată cel mai mare număr. Momentul în care se oprește contorul, precum și momentul în care cubul cu puncte de la 1 la 6 opriri, este determinat de motive aleatorii, prin urmare decada de numărare împreună cu multivibratorul este un senzor electronic de numere aleatoare. Să dăm mai multe exemple de utilizare a acestuia în diverse situații de joc.

La verificarea vitezei de reacție a jucătorilor, un rezistor stabilește o anumită frecvență de funcționare a multivibratorului și viteza la care se schimbă numerele indicatorului (vezi Fig. 168 și 172). Participanții la joc sunt rugați să apese butonul multivibrator de fiecare dată când indicatorul arată un anumit număr preselectat. Cu cât frecvența de comutare este mai mare, cu atât este mai dificil să îndepliniți această condiție. Cei mai lenți sunt eliminați primii; câștigătorul este jucătorul cu cea mai bună reacție. Într-o altă versiune, mai dificilă a jocului, trebuie să continuați să apăsați butonul într-un ritm stabilit de judecător după ce indicatorul dispare. Pentru a face acest lucru, închideți-l cu o perdea mecanică sau opriți-l cu un buton

Un deceniu de numărare împreună cu un multivibrator este deosebit de convenabil de utilizat în jocuri dacă sursa sa de alimentare este autonomă, adică nu este conectată la rețea. În acest caz, se utilizează un indicator LED cu șapte segmente controlat de un decodor de circuit integrat. Suntem deja familiarizați cu acest microcircuit și indicator (Fig. 150, 163). Multivibratorul și circuitele de contor rămân neschimbate. Circuitul unui senzor cu numere aleatorii care funcționează de la o sursă de 5 V este prezentat în Figura 173.

Un exemplu de dispozitiv mai complex care funcționează pe baza unui contor electric este o unitate de întârziere sau temporizator. Figura 174 prezintă o diagramă schematică a unui temporizator care vă permite să porniți diferite sarcini pentru un timp de la 0 la 999 s. Este alcătuit dintr-un numărător zecimal de trei cifre asamblat pe un microcircuit de trei decodoare pe un cip multivibrator și un circuit de control pe un microcircuit, precum și un microcircuit.Sursa de numărare a impulsurilor este un multivibrator reglat la o frecvență de 1 Hz. Impulsurile sale sunt transmise la intrarea unui contor zecimal cu trei cifre. Codurile binare din fiecare cifră sunt transmise decodorelor.La ieșirile lor, semnalele zero apar secvenţial pe măsură ce ajung la intrări.

Orez. 173. Deceniu de recalculare cu indicator LED

codurile binare corespunzătoare. Setarea timpului de întârziere necesar se realizează prin comutatoare care conectează ieșirile decodorului cu elementele microcircuitului.Intrarile elementelor Și sunt conectate în perechi pentru a obține un element.Comutatorul setează unitățile de secunde, comutatorul zeci de secunde iar comutatorul de sute de secunde. Dacă, de exemplu, comutatoarele sunt conectate la pinii 2, 3 și 7 ai decodorului, atunci vor exista trei 0-uri la intrările elementului OR-NOT numai în momentul în care contorul înregistrează 237 de impulsuri sau o perioadă de timp. au trecut egal cu 237 de secunde de la începutul numărării. În acest caz, la ieșirea elementului OR-NOT va apărea un semnal 1. Până în acest moment, pentru toate codurile binare ale contorului, ieșirea elementului logic a fost un semnal zero.

Circuitul de control al temporizatorului funcționează după cum urmează. Butonul „Stop” este mai întâi apăsat; ca urmare, declanșatorul RS asamblat pe microcircuit este setat la starea zero. De la ieșirea directă, nivelul de tensiune zero este furnizat unui tranzistor 1/77, în circuitul emițătorului căruia este conectată înfășurarea releului electromagnetic. Tranzistorul și releul sunt oprite. În același timp, la ieșirea inversă 6 apare un nivel ridicat, care servește ca semnal de resetare pentru contor. Când apăsați butonul „Start”, declanșatorul RS intră în stare unică și 3 apare pe ieșirea directă. nivel de tensiune ridicat, suficient pentru a deschide tranzistorul 1/77 și pentru a acționa releul. Contactele sale închid circuitul de alimentare a sarcinii. Simultan

(click pentru a vizualiza scanarea)

nivelul de tensiune zero eliminat de la ieșirea inversă a declanșatorului „deschide” contorul. Contorul funcționează până când la ieșirile decodorului apar semnale de ieșire corespunzătoare numărului format. În acest caz, așa cum sa menționat deja, la ieșire apare un singur semnal, care este alimentat prin invertor la intrarea declanșatorului. Este setat la starea zero și, în consecință, tranzistorul, releul electromagnetic și sarcina sunt oprite. Contorul este setat la zero.

Cronometrul va afișa ora curentă în secunde dacă LED-urile sunt conectate la ieșirile decodorului. Numărarea timpului va deveni mai convenabilă dacă codurile zecimale binare ale contoarelor sunt furnizate decodorelor care lucrează împreună cu indicatoare cu șapte segmente.

Dacă vă confruntați cu sarcina de a implementa un contor de impulsuri, numărând zeci, sute sau mii, atunci pentru aceasta este suficient să folosiți un ansamblu gata făcut - microcircuitul CD4026. Din fericire, microcircuitul elimină practic toate grijile legate de cablarea microcircuitului și a elementelor suplimentare de potrivire. În același timp, un numărător CD4026 este capabil să „numere” doar până la 10, adică dacă trebuie să numărăm până la 100, atunci folosim 2 microcircuite, dacă până la 1000, atunci 3 etc. Ei bine, să spunem câteva cuvinte despre cip în sine și funcționalitatea acestuia.

Descrierea funcționării contorului CD4026

Inițial, vă prezentăm aspectul și denumirea funcțională a știfturilor de pe cip de contor

În ciuda faptului că totul este în engleză, în principiu totul aici este clar! Citirile contorului cresc cu 1 unitate de fiecare dată când un impuls pozitiv ajunge la contactul „ceas”. În acest caz, la ieșirile a-g apare o tensiune care, atunci când este aplicată unui indicator cu 7 segmente, va afișa numărul de impulsuri.

Contactul „resetare” resetează citirile de numărare atunci când este scurtcircuitat la +.

Pinul „dezactivare ceas” trebuie să fie, de asemenea, conectat la masă.

Contactul „activare afișaj”, de fapt, contactul 3 trebuie conectat la pozitiv.

Contactul „÷10” este de fapt la ieșirea 5, trimite un semnal despre depășirea contorului, astfel încât să poată fi conectat un contor similar și să înceapă numărarea pentru 10, 100, 1000...

Contactul „nu 2” ia valoarea LOW dacă și numai dacă valoarea contorului este 2. În caz contrar, HIGH.

Tensiunea de alimentare de funcționare a microcircuitului este de 3-15 V. Adică are un stabilizator încorporat. Acum să vorbim despre cum să conectați acest microcircuit la ansamblu, adică despre schema circuitului.

Schema de conectare pentru un contor de impulsuri pe un cip CD4026

Aruncă o privire la diagramă. Acesta numără impulsurile de lumină ale modificărilor rezistenței pentru un fotorezistor. Ca fotorezistor, puteți folosi, să zicem, un fotorezistor 5516. Deci, din cauza unei modificări a rezistenței, potențialul de la baza tranzistorului se schimbă și el. Ca urmare, curentul începe să curgă prin circuitul colector-emițător, ceea ce înseamnă că este furnizat un impuls la intrarea 1 a microcircuitului, care trebuie numărat.
De îndată ce primul microcircuit numără 1 zece, atunci apare un impuls la pinul 5 indicând „depășirea” contorului. În cele din urmă, acest impuls este furnizat unui al doilea microcircuit, care funcționează exact pe același principiu. Dar în acest caz, microcircuitul nu mai numără unitățile, ci zeci. Dacă adăugați 3 microcircuite, atunci vor fi sute etc.

Pentru a reseta la 0, aplicați doar un plus la picioarele a 15 microcircuite. Microcircuitul este proiectat să funcționeze cu un indicator cu 7 segmente. Când se aplică uneia dintre ieșirile acestui indicator, obținem numărul de care avem nevoie. Uită-te la masă...

În concluzie, aș vrea să spun încă o dată că contorul de puls în acest caz este funcțional și va necesita costuri și cunoștințe minime din partea dvs. Ceea ce este de asemenea important este că circuitul nu trebuie configurat, cel puțin partea digitală. Singurul lucru este că s-ar putea să trebuiască să vă „jucați” cu rezistențe și un fotorezistor la intrare.

Toată lumea știe de ce există un microcalculator, dar se dovedește că, pe lângă calculele matematice, este capabil de mult mai mult. Vă rugăm să rețineți că dacă apăsați butonul „1”, apoi „+” și apoi apăsați „=”, atunci cu fiecare apăsare a butonului „=” numărul de pe afișaj va crește cu unul. De ce nu un contor digital?

Dacă două fire sunt lipite la butonul „=”, acestea pot fi folosite ca intrare de contor, de exemplu, un contor de ture pentru o mașină de bobinat. Și la urma urmei, contorul poate fi, de asemenea, reversibil; pentru a face acest lucru, trebuie mai întâi să formați un număr pe afișaj, de exemplu, numărul de spire ale bobinei, apoi apăsați butonul „-” și butonul „1”. . Acum, de fiecare dată când apăsați „=", numărul va scădea cu unu.

Cu toate acestea, este nevoie de un senzor. Cea mai simplă opțiune este un comutator lamelă (Fig. 1). Conectăm întrerupătorul cu lame cu fire paralele cu butonul „=”, comutatorul însuși se află pe partea staționară a mașinii de bobinat și fixăm magnetul pe cel mobil, astfel încât în ​​timpul unei rotații a bobinei magnetul să treacă lângă comutatorul cu lame o dată, făcându-l să se închidă.

Asta e tot. Trebuie să înfășurați bobina, să faceți „1+” și apoi cu fiecare tură, adică cu fiecare tură citirile afișajului vor crește cu una. Trebuie să derulați bobina - introduceți numărul de spire ale bobinei pe afișajul microcalculatorului și faceți „-1”, apoi cu fiecare rotație de derulare a bobinei, citirile afișate vor scădea cu una.

Fig.1. Schema de conectare a comutatorului cu lame la calculator.

Și, să presupunem că trebuie să măsurați o distanță mare, de exemplu, lungimea unui drum, dimensiunea unui teren, lungimea unui traseu. Luăm o bicicletă obișnuită. Așa este - atașăm un suport nemetalic cu un comutator cu lame la furcă și atașăm magnetul la una dintre spițele roții bicicletei. Apoi, măsurăm circumferința roții și o exprimăm în metri, de exemplu, circumferința roții este de 1,45 metri, așa că formăm „1,45+”, după care cu fiecare rotație a roții citirile afișate vor crește cu 1,45 metri și, ca urmare, afișajul va afișa distanța parcursă de bicicletă în metri.

Dacă aveți un ceas deșteptător chinezesc cu quartz defect (de obicei mecanismul lor nu este foarte durabil, dar placa electronică este foarte fiabilă), puteți lua o placă de pe el și, conform circuitului prezentat în Figura 2, faceți un cronometru din el și un calculator.

Alimentarea plăcii ceasului cu alarmă este furnizată printr-un stabilizator parametric de pe LED-ul HL1 (LED-ul trebuie să aibă o tensiune continuă de 1,4-1,7V, de exemplu, roșu AL307) și rezistența R2.

Impulsurile sunt generate din impulsurile de control ale motorului pas cu pas al mecanismului de ceas (bobinele trebuie deconectate, placa este utilizată independent). Aceste impulsuri se deplasează prin diodele VD1 și VD2 la baza tranzistorului VT1. Tensiunea de alimentare a plăcii de alarmă este de numai 1,6 V, în timp ce nivelurile impulsurilor la ieșirile pentru motorul pas cu pas sunt și mai mici.

Pentru ca circuitul să funcționeze corect, sunt necesare diode cu un nivel scăzut de tensiune directă, cum ar fi VAT85 sau germaniu.

Aceste impulsuri ajung la comutatorul tranzistorului la VT1 și VT2. Circuitul colector VT2 include înfășurarea unui releu de putere redusă K1, ale cărui contacte sunt conectate în paralel cu butonul „=” al microcalculatorului. Când există o putere de +5V, contactele releului K1 se vor închide la o frecvență de 1 Hz.

Pentru a porni cronometrul, trebuie mai întâi să efectuați acțiunea „1+”, apoi să porniți alimentarea circuitului de modelare a impulsului folosind comutatorul S1. Acum, cu fiecare secundă, citirile afișate vor crește cu una.

Pentru a opri numărarea, pur și simplu opriți alimentarea modelului de impulsuri folosind comutatorul S1.

Pentru a avea un număr pentru reducerea, trebuie mai întâi să introduceți numărul inițial de secunde pe afișajul microcalculatorului, apoi să faceți acțiunea „-1” și să porniți alimentarea modelului de impulsuri cu comutatorul S1. Acum, cu fiecare secundă, citirile afișate vor scădea cu una, iar din ele se va putea judeca cât timp a mai rămas până la un anumit eveniment.

Fig.2. Schemă pentru transformarea unui cuier chinezesc într-un cronometru.

Fig.3. Schema circuitului unui contor de intersecție cu fascicul IR folosind un calculator.

Dacă utilizați un senzor foto cu infraroșu care funcționează la intersecția fasciculului, puteți adapta microcalculatorul pentru a număra unele obiecte, de exemplu, cutii care se deplasează de-a lungul unei benzi transportoare, sau prin instalarea senzorului pe culoar, numărați persoanele care intră în cameră .

O diagramă schematică a unui senzor de reflexie IR pentru lucrul cu un microcalculator este prezentată în Figura 3.

Generatorul de semnal IR este realizat pe un cip A1 de tip „555” (temporizator integrat) Este un generator de impulsuri cu o frecventa de 38 kHz, la iesirea caruia este aprins un LED infrarosu. Frecvența de generare depinde de circuitul C1-R1; atunci când configurați prin selectarea rezistenței R1, trebuie să setați frecvența la ieșirea microcircuitului (pin 3) la aproape 38 kHz. LED-ul HL1 este așezat pe o parte a pasajului, punând pe acesta un tub opac, care trebuie să fie îndreptat cu precizie către fotodetector.

Fotodetectorul este realizat pe cipul HF1 - acesta este un fotodetector integrat standard de tip TSOP4838 pentru sistemele de telecomandă pentru televizoare și alte electrocasnice. Când un fascicul de la HL1 lovește acest fotodetector, ieșirea sa este zero. În absența unui fascicul - unul.

Astfel, nu există nimic între HL1 și HF1 - contactele releului K1 sunt deschise, iar în momentul trecerii oricărui obiect, contactele releului sunt închise. Dacă efectuați acțiunea „1+” pe microcalculator, atunci cu fiecare trecere a unui obiect între HL1 și HF1, citirile afișate ale microcalculatorului vor crește cu una, iar din ele puteți judeca câte cutii au fost expediate sau câte persoane au intrat. .

Kryukov M.B. RK-2016-01.

Acest dispozitiv este conceput pentru a număra numărul de rotații ale arborelui unui dispozitiv mecanic. Pe lângă simpla numărare cu indicație pe afișajul LED în numere zecimale, contorul oferă informații despre numărul de rotații dintr-un cod binar pe zece biți, care poate fi utilizat la proiectarea unui dispozitiv automat. Contorul constă dintr-un senzor optic de viteză, care este un optocupler format dintr-un LED IR care strălucește constant și o fotodiodă, între care se află un disc de material opac în care este decupat un sector. Discul este atașat la arborele unui dispozitiv mecanic, al cărui număr de rotații trebuie numărat. Și, o combinație de două contoare - un contor zecimal cu trei cifre cu ieșire la indicatori LED cu șapte segmente și unul binar cu zece cifre. Contoarele funcționează sincron, dar independent unul de celălalt. LED-ul HL1 emite un flux de lumină continuu, care intră în fotodiodă printr-o fantă din discul de măsurare. Când discul se rotește, sunt generate impulsuri și, deoarece există un singur slot în disc, numărul acestor impulsuri este egal cu numărul de rotații ale discului. Declanșatorul Schmitt de pe D1.1 și D1.2 convertește impulsurile de tensiune pe R2, cauzate de o modificare a fotocurentului prin fotodiodă, în impulsuri de nivel logic adecvate pentru perceperea de către contoarele din seriile K176 și K561. Numărul de impulsuri (numărul de rotații ale discului) este numărat simultan de două contoare - un contor zecimal de trei decenii pe cipurile D2-D4 și unul binar pe D5. Informațiile despre numărul de rotații sunt afișate pe un afișaj digital, compus din trei indicatoare LED cu șapte segmente H1-H3 și sub forma unui cod binar pe zece biți, care este eliminat de la ieșirile contorului D5. Resetarea tuturor contoarelor la zero în momentul pornirii alimentării are loc simultan, ceea ce este facilitat de prezența elementului D1.3. Dacă aveți nevoie de un buton zero, acesta poate fi conectat în paralel cu condensatorul C1. Dacă aveți nevoie ca semnalul de resetare să provină de la un dispozitiv extern sau un circuit logic, trebuie să înlocuiți microcircuitul K561LE5 cu K561LA7 și să deconectați pinul 13 al acestuia de la pinul 12 și C1. Acum zero se poate face prin aplicarea unui zero logic de la un nod logic extern la pinul 13 al D1.3. Circuitul poate folosi alți indicatori LED cu șapte segmente similare cu ALS324. Dacă indicatorii au un catod comun, trebuie să aplicați zero, nu unul, la pinii 6 D2-D4. Microcircuitele K561 pot fi înlocuite cu analogi din seria K176, K1561 sau analogi importați. LED - orice LED IR (de la telecomanda echipamentului). Fotodiodă - oricare dintre cele utilizate în sistemele de telecomandă ale televizoarelor de tip USCT. Setarea constă în setarea sensibilității fotodiodei prin selectarea valorii lui R2.

Radioconstructor nr 2 2003 p. 24

Adesea, atunci când se operează un dispozitiv cu microcontroler, este necesar să se contorizeze timpul „antropomorf” - câte fracții de secundă ar trebui să se aprindă LED-ul, perioada maximă de timp de dublu clic etc. În general, numarați nu numai nano- și microsecunde, dar și zeci de milisecunde, sau chiar secunde, minute și chiar ore (mi-e teamă să spun despre zile...).
În același timp, în microcontrolere este adesea necesar să se ocupe simultan de microsecunde - perioade de puls, așteptare anti-sărire etc.
Există și dispozitive care funcționează continuu multe ore și chiar zile - echipamente aviatice, echipamente auto, dispozitive de fund (uneori vorbim de funcționare continuă pentru câteva zile). În aceste cazuri, depășirea temporizatoarelor și a variabilelor pe 8 biți este inacceptabilă.
Aș dori să combin toate acestea într-o singură soluție elegantă și universală - să am un mijloc de măsurare a timpului cu precizie de microsecunde, care să nu depășească timp de câteva zile.
De ce nu? Am suferit de ceva timp și am venit cu o soluție pentru microcontrolere AVR pe 8 biți. Pentru a face acest lucru, am folosit un cronometru de 8 biți și o variabilă de 4 octeți. În prezent, nu lucrez cu PIC-uri și AT89 și nu sunt familiarizat cu alte platforme încorporate. Cu toate acestea, dacă cititorii ajută, o voi face și pentru ei.
Avantaje – codul este foarte repetabil (fac deja al 5-lea dispozitiv cu el); ușurință în operare (întreruperile nu sunt utilizate pentru partea clientului a lucrării); partea client a codului este condiționat independent de platformă; în întrerupere - o operație de însumare (dar, totuși, pentru o valoare de 4 octeți); nu există niciun dispozitiv extern - un cronometru în timp real.
Am găsit un singur dezavantaj - un astfel de cronometru util și întotdeauna necesar este ocupat...
Articolul va fi de interes în primul rând pentru începători - nu am descoperit America aici.

Teorie

Deci, am la dispoziție un dispozitiv bazat pe Atmega16A cu quartz de 12MHz. Să luăm contorul său de cronometru 0. Acesta este un cronometru de opt biți - este suficient pentru noi. De ce? Numaram:
  1. luăm 12 MHz din cuarț și luăm factorul de împărțire cu 8 - obținem o frecvență de 1500 KHz;
  2. Luăm modul CTC (resetare la coincidență) și setăm întreruperea să coincidă cu 150 - obținem frecvența de întrerupere de 10 KHz;
  3. chiar pe această întrerupere incrementăm variabila (se obține un increment la fiecare 0,1 milisecunde);
  4. dacă este o valoare nesemnată de 32 de biți, se va depăși după aproximativ
    • 429496729,6 milisecunde;
    • 42949,7 secunde;
    • 7158,3 minute;
    • 119,3 ore;
    • 4,97 zile.
Cu alte cuvinte, această soluție creează un cronometru cu o precizie de 0,1 milisecunde timp de (aproape) 5 zile (trebuie, totuși, să ținem cont de faptul că cuarțul real are o eroare - vom afla mai târziu). Și dacă analizezi și valoarea timer-ului 0 în sine - acesta este incrementat la fiecare 2/3 microsecunde - atunci poți obține un contor cu o precizie de 0,67 microsecunde.
Suficient? În spatele ochilor mei. Folosind un contor de 0,1 milisecunde, în proiectele mele:
  • Număr durata strălucirii și pauzele dintre LED-uri;
  • Țin cont de timeout-uri când lucrez cu UART, USB;
  • Am stabilit tot felul de situații în echipamentul de testare - combinații spațio-temporale complexe;
  • Mențin intervale de timp specificate atunci când interogând ADC-ul și alți senzori;
  • Îi spun computerului ora funcționării mele (a dispozitivului) și transmit informații la un interval de timp dat;
  • Ținând cont de contorul până la microsecundă, efectuez un control anti-sărit la apăsarea tastelor, analizând impulsurile în rânduri lungi.
Și toate acestea se potrivesc cu ușurință într-un singur controler ATmega16! Mai mult, acesta nu este Assembler, ci cross-platform C! Și fără contor extern în timp real!
Nu-i rău, nu?

Configurare pentru AVR

Cum să faci toate acestea în AVR?
În primul rând, creăm o variabilă externă, pe care o numesc „DeciMilliSecond”:
// în main.h typedef unsigned long dword; // întreg nesemnat pe 32 de biți extern volatil dword dmsec; // 0.1msec // în main.c volatile dword dmsec;
După cum a menționat corect @no-smoking, această variabilă trebuie să fie volatilă, astfel încât compilatorul să nu încerce să o optimizeze.
Inițializam această variabilă într-o funcție:
dmsec = 0;
Apoi, am setat modul de funcționare al cronometrului 0:
// . timer 0 – 0.1msec Timer0_Mode (TIMER_Mode_CTC | TIMER0_Clk_8); Timer0_Cntr(149); Timer_Int(Timer0_Cmp);
În același timp, în unele MCU_init.h declar tot ce este necesar:
// în 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)
Ei bine, atunci când este posibil, activez întreruperile:
#asm ("SEI")
Rămâne să descriem întreruperea. Acest lucru este mai ușor decât orice înainte:
#include întrerupere Timer0_Compare (void) ( ++dmsec; )
Gata, cronometrul este descris, configurat și rulează!

Setare pentru PIC

Iată ce mi-au spus dragi fani PIC:

La vârf, acest lucru poate fi repetat cu ușurință folosind modulul Timer2. Are o funcție de întrerupere similară prin coincidență.

PR2 = 75 - valoarea la care cronometrul se va reseta și va genera o întrerupere
T2CON.T2CKPS = 2 - prescaler 1:16
T2CON.T2OUTPS = 0 - fără postscaler
T2CON.TMR2ON = pornit - temporizatorul este activat

IPR1.TMR2IP = 1 --întrerupere cu prioritate ridicată
PIR1.TMR2IF = dezactivat -- resetează indicatorul de întrerupere
PIE1.TMR2IE = on -- activați întreruperea când TMR2 și PR2 coincid
INTCON.GIE = ​​pornit -- activați procesarea întreruperii

După cum puteți vedea, prescaler-ul de aici este de 2 ori mai mare, prin urmare PR2 este de 2 ori mai mic.
Aceste setări vor genera întreruperi cu o frecvență de 10 kHz la o frecvență de sistem de 48 MHz (temporizatorul este setat la Fosc/4) - frecvența standard pentru USB Full Speed.

Utilizare

Codul pentru clientul acestui timer este multiplatform (cu excepția accesării valorii timer 0 în AVR).
Iată un fragment din codul de partajare USB:
#include "main.h" // aici este variabila dmsec, next_USB_timeout #include "FT245R.h" // aici sunt funcții pentru lucrul cu modulul USB #include "..\Protocol.h" // aici este microcontrolerul -protocol de schimb de computere // * * // ** Analizați pachetele USB // ** void AnalyzeUSB (void) ( #define RECEIVE_BYTE(B) while (!FT245R_IsToRead)\ ( if (dmsec > end_analyze) return; )\ B = FT245_ReadByte (); #define RECEIVE_WORD(W) // similar pentru 2 octeți #define RECEIVE_DWORD(W) // similar pentru 4 octeți dword end_analyze, d; NewAnalyze: if (!FT245R_IsToRead) // fără pachete? return = dm_analyze + max_USB_timeout; // timeout pentru analiza curentă next_USB_timeout = dmsec + MaxSilence_PC_DEV; // timeout pentru schimbul general RECEIVE_BYTE (b) // comutator antet pachet (b) (case SetFullState: RECEIVE_DWORD (d); // citiți cuvântul is_initialized = 1; // procesează ChangeIndicator () ; break; ) // comută (pachet) merge la NewAnalyze; #undef RECEIVE_BYTE // anulează #define #undef RECEIVE_WORD #undef RECEIVE_DWORD )
Funcțiile macro RECEIVE_BYTE, RECEIVE_WORD, RECEIVE_DWORD implementează proceduri de citire ținând cont de timeout-ul pentru o anumită fază de schimb. Ca rezultat, dacă ceva se agăță de cealaltă parte, microcontrolerul nu va intra în hibernare. Vă rugăm să rețineți - WatchDog nu este necesar! Și totul datorită variabilei/constantei max_USB_timeout, care setează timeout-ul cu o precizie de 0,1 milisecunde.
Analiza „silence on air” folosind variabila next_USB_timeout este implementată în același mod. Acest lucru permite microcontrolerului 1) să știe că computerul a dispărut undeva, 2) să semnaleze acest lucru cumva (în cazul meu, LED-ul „eroare” se aprinde). Constanta/variabila MaxSilence_PC_DEV vă permite să variați conceptul de „tăcere” în cel mai larg interval – de la o fracțiune de milisecundă la câteva zile.
Toate celelalte puncte sunt implementate în mod similar.
Dacă trebuie să utilizați un contor de microsecunde, atunci apare o funcție de comparare:
#define GetUSec(A,B) ( #asm ("CLI"); A = dmsec; B = TCNT0; #asm ("SEI"); ) // ** // ** Diferența de timp între evenimente precisă la 2/ 3usec // ** dword Difference (dword prev_dmsec, byte prev_usec) ( dword cur_dmsec; byte cur_usec; ​​​​dword dif; // . notează ora curentă GetUSec (cur_dmsec, cur_usec); // calculează diferența 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; }
Funcția este trecută de punctul anterior în timp - valoarea anterioară a dmsec și cronometrul 0.
În primul rând, folosim macrocomanda GetUSec pentru a opri întreruperile, astfel încât valoarea dmsec și contorul să nu fie corupte în momentul copierii. Și copiați ora curentă.
În continuare, convertim diferența de timp într-un format de 2/3 microsecunde, ținând cont de overflow.
Ei bine, să revenim de data asta.
Și apoi îl folosim într-un mod obișnuit pentru a controla măsurile anti-sarituri și alte măsuri. Doar nu uitați să întrerupeți și întreruperile atunci când marcați momentul curent în timp - sau mai bine, utilizați macrocomandă GetUSec.

rezultate

Acest cronometru s-a dovedit a fi o soluție extrem de convenabilă pentru mine. Cred ca iti va fi de folos si tie. Și l-am folosit în următoarele proiecte:
  • Situații de împrejmuire a tabloului de distribuție. Aceasta este o placă puternică de jumătate de metru cu trei controlere - ATmega128 ca central și ATmega64 ca două auxiliare (partea dreaptă și stânga). Nu există conexiune galvanică între cele trei controlere și componentele lor - alimentarea se bazează pe ionistori, comunicare prin optocuple. Controlerul central încarcă grupuri ale unor ionistori și în acest moment alimentează ambele părți de la alți ionistori. Aici a trebuit să facem un algoritm în mai multe etape pentru comutarea tuturor acestor lucruri pentru a minimiza interconectarea. În special, vorbim despre lucrul coordonat a 8 relee - temporizatoarele funcționează aici timp de 3,3 ms (timp de răspuns al releului garantat). Ei bine, de fapt, ambele părți controlează 10 relee și aproximativ o jumătate de sută de multiplexoare. Toate aceste echipamente funcționează cu caracteristici de timp clar definite (cu o precizie de 1 ms, durata maximă este de 6 secunde). Ei bine, și, în cele din urmă, timeout banal pentru USB, UART.
  • Senzor de adâncime. Aici rezolv o altă problemă (un proiect în derulare). Există doi conductori (mulți metri lungime) care definesc situația „deplasare în sus cu 1 cm” și „deplasare în jos cu 1 cm”. Există multe modalități de a stabili o direcție. În orice caz, acestea sunt anumite combinații de impulsuri. Folosind acest cronometru, determin săritura și durata unui puls stabil. Timpul maxim admisibil de respingere (10 microsecunde este suficient aici), așteptarea anti-sarire și durata minimă/maximă a impulsului sunt setate de la computer. Ei bine, există un mod de depanare - senzorul devine un analizor logic. Acest lucru vă permite să depanați funcționarea liniei și să ajustați coeficienții. Ei bine, din nou timeout, LED-uri.
  • Senzor de semnal analogic. Un banal ADC cu 8 canale. Aici folosesc un cronometru pentru a menține pauzele necesare.
Dragi utilizatori habra de pe alte platforme, îmi pot spune codul de inițializare pentru cronometrul corespunzător, precum și regulile de accesare - îl voi adăuga aici. Poate fi necesar să selectați ore diferite pentru alte platforme. Dar, în orice caz, ar trebui să fie ceva în câteva unități de microsecunde pentru cronometrul în sine și ceva un multiplu de 100 de microsecunde pentru variabila contor. Pentru că, după cum se dovedește, uneori o milisecundă nu este suficientă.
Acțiune