Kazalo:

Števec frekvenc visoke ločljivosti: 5 korakov (s slikami)
Števec frekvenc visoke ločljivosti: 5 korakov (s slikami)

Video: Števec frekvenc visoke ločljivosti: 5 korakov (s slikami)

Video: Števec frekvenc visoke ločljivosti: 5 korakov (s slikami)
Video: AQUASCAPING MASTERCLASS BY JUAN PUCHADES - CHALLENGE YOURSELF, CREATE SOMETHING MEMORABLE! 2024, Julij
Anonim

Ta navodilo prikazuje vzajemni števec frekvenc, ki lahko hitro in z razumno natančnostjo meri frekvence. Narejen je s standardnimi komponentami in ga je mogoče narediti čez vikend (trajalo je malo dlje:-))

EDIT: Koda je zdaj na voljo na GitLabu:

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

1. korak: štetje frekvenc stare šole

Štetje frekvenc stare šole
Štetje frekvenc stare šole
Štetje frekvenc stare šole
Štetje frekvenc stare šole

Star način za merjenje frekvence signala je uporaba logičnih vrat IN, podajanje merjenega signala v ena vrata in signal z natančno 1 sekundo visoko časom v druga vrata ter štetje izhoda. To deluje zelo dobro za signale nekaj kHz v GHz. Kaj pa, če želite izmeriti nizkofrekvenčni signal z dobro ločljivostjo? Recimo, da želite izmeriti frekvenco omrežja (tukaj 50 Hz). Pri metodi stare šole boste na zaslonu prikazali konstantnih 50, če boste imeli srečo, vendar boste bolj verjetno videli stikalo zaslona od 49 do 50 ali 50 do 51. Ločljivost je 1 Hz, in to je to. Nikoli ne boste videli 50,002 Hz, razen če ste pripravljeni podaljšati čas prehoda na 1000 sekund. To je več kot 16 minut za eno samo meritev!

Boljši način za merjenje nizkofrekvenčnih signalov je merjenje njegovega obdobja. Če ponovno vzamemo za primer električno omrežje, ima obdobje 20 milisekund. Vzemite isto logično vrata AND-gate, jih napajajte, recimo 10 MHz (0,1 us impulzov) in vaš signal na drugih vratih prihaja iz 200000 impulzov, tako da je čas obdobja 20000,0 uS in to pomeni nazaj v 50Hz. Ko merite samo impulze 199650, je frekvenca 50,087 Hz, kar je veliko bolje in je v samo eni sekundi merilnega časa. Na žalost to ne deluje dobro pri višjih frekvencah. Vzemimo za primer, zdaj želimo izmeriti 40 kHz. Z enako 10 MHz vhodno frekvenco kot referenčna zdaj merimo le 250 impulzov. Ko štejemo le 249 impulzov, izračunamo 40161 Hz, pri 251 pa rezultat 39840 Hz. To ni sprejemljiva rešitev. Seveda povečanje referenčne frekvence izboljša rezultate, vendar obstaja omejitev, kaj lahko uporabite v mikro krmilniku.

2. korak: Vzajemna pot

Vzajemna pot
Vzajemna pot
Vzajemna pot
Vzajemna pot

Rešitev, ki deluje tako za nizke kot za višje frekvence, je števec vzajemnih frekvenc. Poskušal bom razložiti njegovo načelo. Začnete z merilnim časom, ki je približno 1 sekunda, ni nujno, da je zelo natančen, je pa primeren čas za meritev. Ta 1 Hz signal vnesite v D-flipflop na D-vhodu. Na izhodih se še nič ne zgodi. Priključite signal, ki ga želite izmeriti, na vhod URA D-flipflopa.

Takoj ko ta signal preide iz LOW v HIGH, izhod D-flipflopa prenese stanje D-vhoda na izhod (Q). Ta vzhajajoči signal se uporablja za začetek štetja vhodnega signala in signala referenčne ure.

Torej štejete dva signala hkrati, signal, ki ga želite izmeriti, in referenčno uro. Ta referenčna ura mora imeti natančno vrednost in biti stabilna, normalni kristalni oscilator je v redu. Vrednost ni zelo pomembna, če je visoka frekvenca in je njena vrednost dobro znana.

Čez nekaj časa, recimo nekaj milisekund, spet zmanjšate D-vhod D-flipflopa. Pri naslednjem vhodu CLOCK izhod Q sledi stanju vhoda, nič drugega pa se ne zgodi, ker je mikro krmilnik nastavljen tako, da reagira samo na VZPONA signal. Nato po preteku merilnega časa (pribl. 1 sekundo) naredite D-vhod HIGH.

Ponovno pri naslednjem vhodu CLOCK sledi Q izhod in ta RISING signal sproži mikro krmilnik, tokrat za konec štetja obeh števcev.

Rezultat sta dve številki. Prva številka je število impulzov, odštetih od reference. Ker poznamo referenčno frekvenco, vemo tudi čas, potreben za štetje teh impulzov.

Drugo število je število impulzov iz vhodnega signala, ki ga merimo. Ker smo začeli točno na RISING robovih tega signala, smo zelo prepričani glede števila impulzov tega vhodnega signala.

Zdaj je samo izračun za določitev frekvence vhodnega signala.

Recimo, da imamo te signale in želimo izmeriti f-vhod. Referenca je 10 MHz, ki jo ustvari kremenčev kristalni oscilator. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), čas merjenja je pribl. 1 sekunda

V tem času smo prešteli 32 impulzov. Zdaj eno obdobje tega signala traja 1 / 31.416 = 31830.9 uS. 32 obdobij nam je torej vzelo 1,0185892 sekund, kar je nekaj več kot 1 sekundo.

V tej 1.0186 sekundi bomo prešteli tudi 10185892 impulzov referenčnega signala.

To nam daje naslednje podatke: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Formula za izračun nastale frekvence je naslednja: freq = (input_count * f_reference) / ref_count

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

In to dobro deluje tako pri nizkih frekvencah kot pri visokih frekvencah, le ko se vhodni signal približa (ali celo višje od) referenčni frekvenci, je bolje uporabiti standardni "gated" način merjenja. Potem pa bi lahko vhodnemu signalu dodali tudi frekvenčni delilnik, saj ima ta vzajemna metoda enako ločljivost za katero koli frekvenco (spet do referenčne). Torej, če merite 100 kHz neposredno od deljenega z zunanjim ločevalnikom 1000x, je ločljivost enaka.

3. korak: Strojna oprema in njena shema

Strojna oprema in njena shema
Strojna oprema in njena shema
Strojna oprema in njena shema
Strojna oprema in njena shema

Naredil sem nekaj tovrstnih števcev frekvenc. Že dolgo nazaj sem naredil enega z ATMEGA328 (isti krmilnik kot v Arduinu), kasneje z mikro krmilniki ARM iz ST. Zadnji je bil izdelan s STM32F407, ki deluje na 168 MHz. Sedaj pa sem se spraševal, kaj če naredim enako s * precej * manjšim. Izbral sem ATTINY2313, ki ima samo 2 KB pomnilnika FLASH in 128 bajtov RAM -a. Zaslon, ki ga imam, je MAX7219 z 8 sedmimi segmentnimi zasloni, ti zasloni so na voljo na Ebayu za samo 2 evra. ATTINY2313 je mogoče kupiti za približno 1,5 evra. Ostali deli, ki sem jih uporabil, stanejo le centov na kos. Najdražja je bila verjetno plastična projektna škatla. Kasneje sem se odločil, da bo deloval na litij-ionski bateriji, zato sem moral dodati (LDO) 3.3V napetostni stabilizator, modul za polnjenje baterije in samo baterijo. To nekoliko zvišuje ceno, a predvidevam, da jo je mogoče zgraditi za manj kot 20 evrov.

4. korak: Koda

Kodeks
Kodeks
Kodeks
Kodeks

Koda je bila napisana v jeziku C z Atmel (Microchip) Studio 7 in programirana v ATTINY2313 z uporabo OLIMEX AVR_ISP (klon?). Odprite (main.c) v zip datoteki spodaj, če želite slediti opisu tukaj.

INICIALIZACIJA

Najprej je bil ATTINY2313 nastavljen za uporabo zunanjega kristala, saj je notranji RC-oscilator neuporaben za merjenje ničesar. Uporabljam kristal 10 MHz, ki ga nastavim na pravilno frekvenco 10 000 000 Hz z majhnim spremenljivim kondenzatorjem. Inicializacija skrbi za nastavitev vrat na vhode in izhode, nastavitev časovnikov ter omogočanje prekinitev in inicializacije MAX7219. TIMER0 je nastavljen za štetje zunanje ure, TIMER1 za notranjo uro in tudi za zajemanje vrednosti števca na naraščajočem robu ICP, ki prihaja iz D-flipflopa.

Nazadnje bom razpravljal o glavnem programu, zato sledijo rutine prekinitev.

TIMER0_OVF

Ker TIMER0 šteje do 255 (8 bitov) in se nato premakne na 0, potrebujemo prekinitev za štetje števila prelivov. To je vse, kar počne TIMER0_OVF, samo preštejte število prelivov. Kasneje se to število združi z vrednostjo samega števca.

TIMER1_OVF

TIMER1 lahko šteje do 65536 (16 bitov), zato prekinitev TIMER1_OVF šteje tudi število prelivov. Ampak naredi več. Zmanjša se tudi s 152 na 0, kar traja približno 1 sekundo, nato pa nastavi izhodni pin, ki gre na D-vhod flipflopa. In zadnja stvar v tej rutini prekinitev je zmanjšanje števca časovne omejitve s 765 na 0, kar traja približno 5 sekund.

TIMER1_CAPT

To je prekinitev TIMER1_CAPT, ki se sproži vsakič, ko mu D-flipflop pošlje signal na naraščajočem robu vhodnega signala (kot je razloženo zgoraj). Logika zajema skrbi za shranjevanje vrednosti števca TIMER1 v trenutku zajema, shrani se tudi kot števec prelivanja. Na žalost TIMER0 nima funkcije zajema vhoda, zato se tukaj prebere njegova trenutna vrednost in trenutna vrednost števca pretoka. Spremenljivka sporočila je nastavljena na eno, da glavni program pove, da so to novi podatki.

Sledi dve funkciji za upravljanje MAX7219

SPI

Čeprav je v čipu na voljo univerzalni serijski vmesnik (USI), sem se odločil, da ga ne bom uporabljal. Zaslon MAX7219 je treba upravljati prek SPI, kar je mogoče z USI. Toda bitbanging SPI je tako preprost, da si nisem vzel časa za to z USI.

MAX7219

Tudi protokol za nastavitev MAX7219 je precej preprost, ko preberete njegov priročnik. Za vsako številko, ki je sestavljena iz 8 bitov za številsko številko (1 do 8), potrebuje 16 -bitno vrednost, ki ji sledi 8 bitov za številko, ki jo mora prikazati.

GLAVNI PROG

Zadnja stvar je razložiti glavni program. Deluje v neskončni zanki (while (1)), vendar dejansko naredi nekaj le, če je sporočilo (1) iz rutine prekinitev ali ko je števec časovne omejitve padel na nič (brez vhodnega signala).

Ko je sporočilo spremenljivke nastavljeno na eno, morate najprej ponastaviti števec časovne omejitve, potem ko vemo, da je prisoten signal. D-flipflop se ponastavi, da je pripravljen za naslednji sprožilec, ki bo prišel po času merjenja (čakalna sekunda).

Številke, registrirane v prekinitvi zajema, se dodajo, da se prikaže referenčno število in število vhodnih frekvenc. (poskrbeti moramo, da referenca nikoli ne more biti nič, saj jo bomo kasneje delili)

Nato sledi izračun dejanske frekvence. Zagotovo ne želim uporabljati plavajočih številk na mikrokrmilniku s samo 2 KB bliskavice in samo 128 bajti rama, uporabljam cela števila. Toda frekvence so lahko 314,159 Hz z več decimalkami. Zato pomnožim vhodno frekvenco ne le z referenčno frekvenco, ampak tudi z množiteljem, nato pa dodam številko, kamor naj gre decimalna vejica. Ko to storite, bodo te številke zelo velike. Npr. z vhodom 500 kHz, referenco 10 MHz in množiteljem 100, to daje 5 x 10^14, to je res ogromno! Ne bodo se več prilegali 32 -bitnemu številu, zato uporabljam 64 -bitne številke, ki segajo vse do 1,8 x 10^19 (to dobro deluje na ATTINY2313)

In zadnja stvar je, da rezultat pošljete na zaslon MAX7219.

Koda se zbere v približno 1600 bajtov, zato se prilega bliskavici 2048 bajtov, ki je na voljo v ATTINY2313.

Registri varovalk naj se glasijo tako:

PODALJŠAN 0xFF

VISINA 0xDF

NIZKA 0xBF

5. korak: Natančnost in natančnost

Natančnost in natančnost
Natančnost in natančnost
Natančnost in natančnost
Natančnost in natančnost
Natančnost in natančnost
Natančnost in natančnost

Natančnost in natančnost sta dve ločeni zveri. Tu je natančnost sedem mest, dejanska natančnost pa je odvisna od strojne opreme in umerjanja. 10 MHz (5 MHz na preskusni točki) sem umeril z drugim frekvenčnim števcem, ki ima GPS -oscilator.

In deluje zelo dobro, najnižja frekvenca, ki sem jo poskusil, je 0,2 Hz, najvišja 2 MHz. Je na mestu. Nad 2 MHz krmilnik začne sproščati prekinitve, kar ni presenetljivo, če veste, da pri vhodnem signalu 2 MHz TIMER0 ustvari več kot 7800 prekinitev na sekundo. ATTINY2313 mora narediti tudi druge stvari, prekinitve iz časovnika TIMER1, pri nadaljnjih 150 prekinitvah na sekundo in seveda opraviti izračune, ki nadzorujejo zaslon in D-flipflop. Ko pogledate dejansko napravo, boste videli, da uporabljam le sedem od osmih številk zaslona. To počnem iz več razlogov.

Prvič, izračun vhodne frekvence je deljenje, skoraj vedno bo imel ostanek, ki ga ne vidite, saj gre za celoštevilčno deljenje. Drugič, kremenčev kristalni oscilator ni temperaturno stabiliziran.

Kondenzatorji, ki ga uravnavajo na pravilnih 10 MHz, so keramični, zelo občutljivi na temperaturne spremembe. Potem obstaja dejstvo, da TIMER0 nima vgrajene logike zajema in vse funkcije prekinitve potrebujejo nekaj časa, da opravijo svoje delo. Mislim, da je sedem mest vseeno dovolj.

Priporočena: