Sadržaj:

Brojač frekvencija visoke rezolucije: 5 koraka (sa slikama)
Brojač frekvencija visoke rezolucije: 5 koraka (sa slikama)

Video: Brojač frekvencija visoke rezolucije: 5 koraka (sa slikama)

Video: Brojač frekvencija visoke rezolucije: 5 koraka (sa slikama)
Video: Analog-to-Digital Converters (ADC) - Dual Slope and Charge-Balancing ADC 2024, Studeni
Anonim

Ova instrukcija prikazuje uzajamni brojač frekvencija koji može mjeriti frekvencije brzo i s razumnom preciznošću. Napravljen je sa standardnim komponentama i može se napraviti za vikend (trebalo mi je malo duže:-))

EDIT: Kôd je sada dostupan na GitLabu:

gitlab.com/WilkoL/high-resolution-frequency-counter

Korak 1: Brojanje frekvencija stare škole

Brojanje frekvencija stare škole
Brojanje frekvencija stare škole
Brojanje frekvencija stare škole
Brojanje frekvencija stare škole

Stari način mjerenja frekvencije signala je korištenje logičkog AND-gate-a, dovod signala koji se mjeri u jedan port i signal s točno 1 sekundom visokog vremena do drugog porta te prebrojavanje izlaza. Ovo radi prilično dobro za signale od nekoliko kHz do GHz. Ali što ako želite mjeriti niskofrekventni signal s dobrom razlučivošću? Recimo da želite izmjeriti frekvenciju mreže (ovdje 50 Hz). S metodom stare škole vidjet ćete konstantnih 50 na zaslonu ako imate sreće, ali vjerojatnije ćete vidjeti prebacivanje zaslona s 49 na 50 ili 50 na 51. Rezolucija je 1 Hz, i to je to. Nikada nećete vidjeti 50,002 Hz osim ako niste voljni povećati vrijeme ulaza na 1000 sekundi. To je više od 16 minuta, za jedno mjerenje!

Bolji način za mjerenje niskofrekventnih signala je mjerenje njihovog perioda. Ako ponovno uzmemo električnu mrežu, razdoblje je 20 milisekundi. Uzmite istu logičku AND-gate, napajajte je, recimo 10 MHz (0,1 us impulsa), a vaš signal na drugom portu izlazi i izlazi 200 000 impulsa, tako da je razdoblje 20000,0 uS i to se prevodi na 50Hz. Kad izmjerite samo 199650 impulsa, frekvencija je 50.087 Hz, to je puno bolje i to je samo jedna sekunda vremena mjerenja. Nažalost, to ne radi dobro s višim frekvencijama. Uzmimo za primjer, sada želimo izmjeriti 40 kHz. Sa istom ulaznom frekvencijom od 10 MHz kao referentnom, sada mjerimo samo 250 impulsa. Kada brojimo samo 249 impulsa, proračun daje 40161 Hz, a s 251 rezultat je 39840 Hz. To nije prihvatljivo rješenje. Naravno, povećanje referentne frekvencije poboljšava rezultate, ali postoji ograničenje u tome što možete koristiti u mikro kontroleru.

Korak 2: Uzajamni način

Uzajamni način
Uzajamni način
Uzajamni način
Uzajamni način

Rješenje koje radi i na niskim i na višim frekvencijama je uzajamni brojač frekvencija. Pokušat ću objasniti njegov princip. Počinjete s mjernim vremenom koje je otprilike 1 sekunda, ne mora biti vrlo precizno, ali je razumno vrijeme za mjerenje. Unesite ovaj signal od 1 Hz u D-flipflop na D-ulazu. Ništa se još ne događa na izlazima. Spojite signal koji želite mjeriti na ulaz SAT na D-flipflopu.

Čim ovaj signal pređe s LOW na HIGH, izlaz D-flipflopa prenosi stanje D-ulaza na izlaz (Q). Ovaj RISING signal ide za početak brojanja ulaznog signala, kao i referentnog takta.

Dakle, brojite DVA signala u isto vrijeme, signal koji želite mjeriti i referentni sat. Ovaj referentni sat mora imati preciznu vrijednost i biti stabilan, normalni kristalni oscilator je u redu. Vrijednost nije jako važna sve dok je visoka frekvencija i njezina je vrijednost dobro poznata.

Nakon nekog vremena, recimo nekoliko milisekundi, opet ćete smanjiti D-ulaz D-flipflopa. Na sljedećem ulazu CLOCK izlaz Q prati stanje ulaza, ali ništa se drugo ne događa jer je mikro kontroler postavljen da reagira samo na RISING signal. Zatim, nakon što vrijeme mjerenja završi (približno 1 sekunda), učinite D-ulaz VISOKIM.

Ponovno na sljedećem CLOCK-ulazu slijedi Q izlaz i ovaj RISING signal aktivira mikro upravljač, ovaj put da završi odbrojavanje oba brojača.

Rezultat su dva broja. Prvi broj je broj impulsa odbrojan od reference. Kako znamo referentnu frekvenciju, znamo i vrijeme potrebno za brojanje tih impulsa.

Drugi broj je broj impulsa iz ulaznog signala koji mjerimo. Kako smo počeli točno na RISING rubovima ovog signala, vrlo smo sigurni u broj impulsa ovog ulaznog signala.

Sada je samo proračun za utvrđivanje frekvencije ulaznog signala.

Na primjer, recimo da imamo te signale i želimo izmjeriti f-ulaz. Referentna vrijednost je 10 MHz, generirana oscilatorom od kvarcnog kristala. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), vrijeme mjerenja je cca. 1 sekunda

U to vrijeme izbrojali smo 32 impulsa. Sada, jedno razdoblje ovog signala traje 1 / 31.416 = 31830.9 uS. Dakle, 32 razdoblja su nam oduzela 1,0185892 sekunde, što je nešto više od 1 sekunde.

U ovoj 1.0186 sekundi također ćemo izbrojati 10185892 impulsa referentnog signala.

To nam daje sljedeće podatke: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Formula za izračunavanje rezultirajuće frekvencije je ova: freq = (input_count * f_reference) / ref_count

U našem primjeru to je: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

I to dobro funkcionira za niske i visoke frekvencije, samo kad se ulazni signal približi (ili čak i više) referentnoj frekvenciji, bolje je koristiti standardni "gated" način mjerenja. No tada bismo također mogli jednostavno dodati razdjelnik frekvencije ulaznom signalu jer ova recipročna metoda ima istu rezoluciju za bilo koju frekvenciju (opet do referentne). Dakle, mjerite li 100 kHz izravno podijeljeno vanjskim razdjelnikom 1000x, razlučivost je ista.

Korak 3: Hardver i njegova shema

Hardver i njegova shema
Hardver i njegova shema
Hardver i njegova shema
Hardver i njegova shema

Napravio sam nekoliko ovakvih brojača frekvencija. Davno sam napravio jedan s ATMEGA328 (isti kontroler kao i u Arduinu), kasnije s ARM mikrokontrolerima iz ST. Najnoviji je napravljen sa STM32F407 taktom na 168 MHz. Ali sad sam se pitao što ako učinim isto sa * puno * manjim. Odabrao sam ATTINY2313, koji ima samo 2 KB flash memorije i 128 bajtova RAM -a. Zaslon koji imam je MAX7219 s 8 ekrana sa sedam segmenata, koji su dostupni na Ebayu za samo 2 eura. ATTINY2313 se može kupiti za oko 1,5 eura. Ostali dijelovi koje sam koristio koštaju samo cente po komadu. Najskuplja je vjerojatno bila plastična kutija za projekte. Kasnije sam odlučio omogućiti rad na litij-ionskoj bateriji pa sam morao dodati (LDO) 3.3V stabilizator napona, modul za punjenje baterije i samu bateriju. To donekle povećava cijenu, ali pretpostavljam da se može graditi za manje od 20 eura.

Korak 4: Kôd

Kod
Kod
Kod
Kod

Kod je napisan na C jeziku s Atmel (Microchip) Studio 7 i programiran u ATTINY2313 pomoću OLIMEX AVR_ISP (klon?). Otvorite (main.c) u donjoj zip datoteci ako želite slijediti opis ovdje.

INICIJALIZACIJA

Prvo je ATTINY2313 bio postavljen da koristi vanjski kristal jer je unutarnji RC-oscilator beskoristan za mjerenje bilo čega. Koristim kristal od 10 MHz koji podesim na ispravnu frekvenciju od 10 000 000 Hz s malim promjenjivim kondenzatorom. Inicijalizacija se brine za postavljanje portova na ulaze i izlaze, postavljanje mjerača vremena te omogućavanje prekida i inicijalizacije MAX7219. TIMER0 je postavljen za brojanje vanjskog sata, TIMER1 za unutarnji sat, a također i za snimanje vrijednosti brojača na rastućem rubu ICP-a, koji dolazi iz D-flipflopa.

Posljednje ću raspravljati o glavnom programu, pa slijede rutine prekida.

TIMER0_OVF

Kako TIMER0 broji do 255 (8 bita), a zatim se prebacuje na 0, potreban nam je prekid za brojanje broja preljeva. To je sve što TIMER0_OVF radi, samo izbrojite broj prelijevanja. Kasnije se ovaj broj kombinira s vrijednošću samog brojača.

TIMER1_OVF

TIMER1 može brojati do 65536 (16 bita), pa prekid TIMER1_OVF broji i broj prelijevanja. Ali čini više. Također se smanjuje sa 152 na 0 što traje oko 1 sekundu, a zatim postavlja izlazni pin, koji ide na D-ulaz flipflopa. I posljednja stvar koja se radi u ovoj rutini prekida je smanjenje brojača timeout-a, koji ide sa 765 na 0, što traje oko 5 sekundi.

TIMER1_CAPT

Ovo je prekid TIMER1_CAPT koji se aktivira svaki put kada mu D-flipflop pošalje signal, na rastućem rubu ulaznog signala (kao što je gore objašnjeno). Logika hvatanja brine se za spremanje vrijednosti brojača TIMER1 u trenutku hvatanja, sprema se kao i brojač preljeva. Nažalost, TIMER0 nema funkciju snimanja ulaza pa se ovdje očitava njegova trenutna vrijednost i trenutna vrijednost brojača preljeva. Varijabla poruke postavljena je na jedan kako bi glavni program rekao da su to novi podaci.

Slijede dvije funkcije za upravljanje MAX7219

SPI

Iako je u čipu dostupno Univerzalno serijsko sučelje (USI), odlučio sam ga ne koristiti. Zaslon MAX7219 treba kontrolirati putem SPI -ja, a to je moguće uz USI. Ali bitbanging SPI je toliko jednostavan da nisam odvojio vrijeme za to s USI -jem.

MAX7219

Protokol za postavljanje MAX7219 također je vrlo jednostavan nakon što pročitate njegov priručnik. Potrebna mu je 16 -bitna vrijednost za svaku znamenku koja se sastoji od 8 bitova za znamenkasti broj (1 do 8), nakon čega slijedi 8 bita za broj koji treba prikazati.

GLAVNI PROG

Zadnja stvar je objasniti glavni program. Radi u beskonačnoj petlji (while (1)), ali zapravo čini nešto samo ako postoji poruka (1) iz rutine prekida ili kada se brojač vremena čekanja spustio na nulu (nema ulaznog signala).

Prva stvar koju trebate učiniti kada je poruka varijable postavljena na jedan je resetiranje brojača vremena čekanja, nakon svega što znamo da postoji signal. D-flipflop se resetira kako bi bio spreman za sljedeći okidač koji će doći nakon vremena mjerenja (čekanje-sekunda).

Brojevi registrirani u prekidu snimanja dodaju se kako bi dobili referentni broj i ulazni frekvencijski broj. (moramo se pobrinuti da referenca nikada ne može biti nula jer ćemo je kasnije podijeliti)

Slijedi izračun stvarne frekvencije. Sigurno ne želim koristiti plutajuće brojeve na mikrokontroleru sa samo 2 KB flash i samo 128 bajtova rama. Koristim cijele brojeve. Ali frekvencije mogu biti poput 314,159 Hz, s nekoliko decimalnih mjesta. Stoga pomnožim ulaznu frekvenciju ne samo s referentnom frekvencijom nego i s množiteljem, a zatim dodam broj tamo gdje bi trebala biti decimalna točka. Kad to učinite, ti će brojevi postati jako veliki. Npr. s ulazom od 500 kHz, referencom od 10 MHz i množiteljem 100, ovo daje 5 x 10^14, to je stvarno ogromno! Oni se neće više uklopiti u 32 -bitni broj pa koristim 64 -bitne brojeve koji će ići sve do 1,8 x 10^19 (to dobro funkcionira na ATTINY2313)

I posljednje što trebate učiniti je poslati rezultat na zaslon MAX7219.

Kod se kompilira u nekih 1600 bajtova, pa stane u bljesak od 2048 bajtova dostupan u ATTINY2313.

Registri osigurača trebali bi glasiti ovako:

PRODUŽENO 0xFF

VISINA 0xDF

NISKI 0xBF

Korak 5: Točnost i preciznost

Točnost i preciznost
Točnost i preciznost
Točnost i preciznost
Točnost i preciznost
Točnost i preciznost
Točnost i preciznost

Točnost i preciznost dvije su različite zvijeri. Ovdje je preciznost sedam znamenki, a stvarna preciznost ovisi o hardveru i kalibraciji. Kalibrirao sam 10 MHz (5 MHz na ispitnoj točki) s drugim brojačem frekvencija koji ima GPS disciplinirani oscilator.

I radi sasvim dobro, najniža frekvencija koju sam probao je 0,2 Hz, najviša 2 MHz. Na mjestu je. Iznad 2 MHz kontroler počinje gubiti prekide, što i ne čudi kada znate da na ulaznom signalu od 2 MHz TIMER0 generira preko 7800 prekida u sekundi. ATTINY2313 mora raditi i druge stvari, prekide iz TIMER-a1, pri još 150 prekida u sekundi i naravno raditi proračune, kontrolirajući zaslon i D-flipflop. Kad pogledate stvarni uređaj, vidjet ćete da koristim samo sedam od osam znamenki zaslona. Činim to iz nekoliko razloga.

Prvo je to što je izračun ulazne frekvencije podjela, gotovo uvijek će imati ostatak, koji ne vidite jer se radi o cjelobrojnoj podjeli. Drugo je da oscilator kristala kvarca nije stabiliziran temperaturom.

Kondenzatori koji ga podešavaju na ispravnih 10 MHz su keramički, vrlo osjetljivi na promjene temperature. Tu je i činjenica da TIMER0 nema ugrađenu logiku hvatanja, a funkcijama prekida je potrebno neko vrijeme da obave svoj posao. Mislim da je sedam znamenki ionako dovoljno dobro.

Preporučeni: