Obsah:

Počítadlo frekvencií s vysokým rozlíšením: 5 krokov (s obrázkami)
Počítadlo frekvencií s vysokým rozlíšením: 5 krokov (s obrázkami)

Video: Počítadlo frekvencií s vysokým rozlíšením: 5 krokov (s obrázkami)

Video: Počítadlo frekvencií s vysokým rozlíšením: 5 krokov (s obrázkami)
Video: Generate Studio Quality Realistic Photos By Kohya LoRA Stable Diffusion Training - Full Tutorial 2024, November
Anonim

Tento návod ukazuje recipročný čítač frekvencií schopný merať frekvencie rýchlo as primeranou presnosťou. Je vyrobený zo štandardných komponentov a môže byť vyrobený za víkend (trvalo mi to trochu dlhšie:-))

EDIT: Kód je teraz k dispozícii na GitLab:

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

Krok 1: Počítanie frekvencie zo starej školy

Počítanie frekvencie zo starej školy
Počítanie frekvencie zo starej školy
Počítanie frekvencie zo starej školy
Počítanie frekvencie zo starej školy

Starý spôsob, ako merať frekvenciu signálu, je použiť logickú bránu AND, privádzať signál, ktorý sa má merať, do jedného portu a signál s presnosťou 1 sekundy na druhý port a počítať výstup. To funguje celkom dobre pre signály niekoľko kHz až do GHz. Ale čo keď chcete merať nízkofrekvenčný signál s dobrým rozlíšením? Povedzme, že chcete merať frekvenciu siete (tu 50 Hz). Pri starej školskej metóde uvidíte na displeji konštantných 50, ak budete mať šťastie, ale s väčšou pravdepodobnosťou uvidíte prepínač displeja zo 49 na 50 alebo 50 na 51. Rozlíšenie je 1 Hz, a to je všetko. 50,002 Hz nikdy neuvidíte, pokiaľ nie ste ochotní predĺžiť čas brány na 1 000 sekúnd. To je viac ako 16 minút na jedno meranie!

Najlepším spôsobom, ako merať nízkofrekvenčné signály, je zmerať jeho periódu. Ak vezmeme opäť sieť ako príklad, má to obdobie 20 milisekúnd. Vezmite rovnakú logickú bránu AND, napájajte ju, povedzme 10 MHz (impulzy 0,1 us) a váš signál na druhom porte vyjde 200 000 impulzov, takže časový úsek je 20 000,0 uS a to sa prekladá späť na 50 Hz. Keď meriate iba 199650 impulzov, frekvencia je 50,087 Hz, je to oveľa lepšie a merací čas je len jedna sekunda. S vyššími frekvenciami to bohužiaľ nefunguje. Zoberme si napríklad, že teraz chceme merať 40 kHz. S rovnakou vstupnou frekvenciou 10 MHz ako referenčná teraz meriame iba 250 impulzov. Keď napočítame iba 249 impulzov, výpočet poskytne 40161 Hz a s 251 výsledkom je 39840 Hz. To nie je prijateľné rozlíšenie. Výsledky samozrejme zvýšením referenčnej frekvencie zlepšíte, ale to, čo môžete v mikroovládači použiť, je obmedzené.

Krok 2: Recipročná cesta

Recipročná cesta
Recipročná cesta
Recipročná cesta
Recipročná cesta

Riešením, ktoré funguje pre nízke aj vyššie frekvencie, je recipročný čítač frekvencií. Pokúsim sa vysvetliť jeho princíp. Začnite s časom merania, ktorý je približne 1 sekunda, nemusí byť veľmi presný, ale je to primeraný čas na meranie. Zaveďte tento 1 Hz signál do D-flipflopu na D-vstupe. Na výstupoch sa zatiaľ nič nedeje. Pripojte signál, ktorý chcete merať, k vstupu CLOCK na D-flipflop.

Hneď ako tento signál prejde z LOW na HIGH, výstup D-flipflop prenesie stav D-vstupu na výstup (Q). Tento stúpajúci signál sa používa na spustenie počítania vstupného signálu a referenčného hodinového signálu.

Počítate teda DVA signály v rovnakom čase, signál, ktorý chcete merať, a referenčné hodiny. Tieto referenčné hodiny musia mať presnú hodnotu a byť stabilné, normálny kryštálový oscilátor je v poriadku. Hodnota nie je veľmi dôležitá, pokiaľ ide o vysokú frekvenciu a jej hodnota je dobre známa.

Po nejakom čase, povedzme niekoľko milisekúnd, urobíte vstup D D-flipflop opäť nízky. Na nasledujúcom vstupe CLOCK výstup Q sleduje stav vstupu, ale nič iné sa nestane, pretože mikrokontrolér je nastavený tak, aby reagoval iba na RISING signál. Potom, po uplynutí času merania (približne 1 sekundu), urobte vstup D VYSOKÝ.

Opäť na nasledujúcom vstupe CLOCK nasleduje výstup Q a tento RISING signál spustí mikroovládač, tentokrát na ukončenie počítania oboch počítadiel.

Výsledkom sú dve čísla. Prvé číslo je počet impulzov počítaných z referencie. Keďže poznáme referenčnú frekvenciu, poznáme aj čas potrebný na spočítanie týchto impulzov.

Druhým číslom je počet impulzov zo vstupného signálu, ktorý meriame. Keď sme začali presne na RISING hranách tohto signálu, sme si veľmi istí počtom impulzov tohto vstupného signálu.

Teraz je to len výpočet na určenie frekvencie vstupného signálu.

Povedzme napríklad, že máme tieto signály a chceme merať vstup f. Referencia je 10 MHz, generovaná oscilátorom z kremenných kryštálov. f_input = 31,416 Hz f_reference = 10 000 000 Hz (10 MHz), čas merania je cca. 1 sekundu

V tomto čase sme napočítali 32 impulzov. Teraz jedna perióda tohto signálu trvá 1 / 31,416 = 31830,9 uS. 32 periód nám teda trvalo 1,0185892 sekundy, čo je niečo viac ako 1 sekundu.

V tejto 1,0186 sekunde budeme tiež počítať 10185892 impulzov referenčného signálu.

To nám dáva nasledujúce informácie: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Vzorec na výpočet výslednej frekvencie je tento: freq = (počet_ vstupov * f_referencie) / ref_count

V našom prípade to je: f-vstup = (32 * 10000000) / 10185892 = 31,416 Hz

A to funguje dobre pre nízke frekvencie aj pre vysoké frekvencie, iba keď sa vstupný signál blíži (alebo dokonca vyššie ako) k referenčnej frekvencii, je lepšie použiť štandardný „uzavretý“spôsob merania. Potom by sme však mohli tiež jednoducho pridať frekvenčný delič na vstupný signál, pretože táto recipročná metóda má rovnaké rozlíšenie pre akúkoľvek frekvenciu (až do referenčnej hodnoty). Takže bez ohľadu na to, či meriate 100 kHz priamo deleného externým 1 000x deličom, rozlíšenie je rovnaké.

Krok 3: Hardvér a jeho schéma

Hardvér a jeho schéma
Hardvér a jeho schéma
Hardvér a jeho schéma
Hardvér a jeho schéma

Vyrobil som niekoľko z tohto typu čítačov frekvencie. Dávnejšie som vyrobil jeden s ATMEGA328 (rovnaký ovládač ako v Arduine), neskôr s mikrokontrolérmi ARM od ST. Najnovší bol vyrobený s STM32F407 s taktom 168 MHz. Teraz ma však napadlo, čo keď to isté urobím aj s * oveľa * menším. Vybral som ATTINY2313, ktorý má iba 2 kB pamäte FLASH a 128 bajtov pamäte RAM. Displej, ktorý mám, je MAX7219 s 8 sedem segmentovými displejmi, tieto displeje sú k dispozícii na Ebay len za 2 eurá. ATTINY2313 sa dá kúpiť za zhruba 1,5 eura, ostatné diely, ktoré som použil, stoja len centy za kus. Najdrahší bol pravdepodobne plastový projektový box. Neskôr som sa rozhodol, že to nechám bežať na lítium-iónovej batérii, takže som potreboval pridať (LDO) 3,3 V stabilizátor napätia, modul nabíjania batérie a samotnú batériu. To o niečo zvyšuje cenu, ale myslím, že sa dá postaviť za menej ako 20 eur.

Krok 4: Kód

Kód
Kód
Kód
Kód

Kód bol napísaný v jazyku C pomocou Atmel (Microchip) Studio 7 a naprogramovaný do ATTINY2313 pomocou OLIMEX AVR_ISP (klon?). Ak chcete postupovať podľa popisu tu, otvorte súbor (main.c) v nižšie uvedenom súbore zip.

INICIALIZÁCIA

Najprv bol ATTINY2313 nastavený na používanie externého kryštálu, pretože interný RC oscilátor je na meranie čohokoľvek zbytočný. Používam kryštál 10 MHz, ktorý naladím na správnu frekvenciu 10 000 000 Hz malým variabilným kondenzátorom. Inicializácia sa stará o nastavenie portov na vstupy a výstupy, nastavenie časovačov a umožnenie prerušenia a inicializácie MAX7219. TIMER0 je nastavený tak, aby počítal externé hodiny, TIMER1 vnútorné hodiny a tiež aby zachytával hodnotu počítadla na stúpajúcej hrane ICP pochádzajúceho z D-flipflopu.

Ako posledný preberiem hlavný program, takže nasledujú rutiny prerušenia.

TIMER0_OVF

Pretože TIMER0 počíta až 255 (8 bitov) a potom sa pohybuje na 0, potrebujeme prerušenie, aby sme spočítali počet pretečení. To je všetko, čo TIMER0_OVF robí, stačí spočítať počet pretečení. Neskôr sa toto číslo skombinuje s hodnotou samotného počítadla.

TIMER1_OVF

TIMER1 môže počítať až 65 536 (16 bitov), takže prerušenie TIMER1_OVF počíta aj počet pretečení. Ale robí to viac. Tiež sa zníži z 152 na 0, čo trvá asi 1 sekundu, a potom nastaví výstupný kolík, ktorý prejde na vstup D flipflopu. A posledná vec, ktorá sa robí v tejto rutine prerušenia, je zníženie počítadla časového limitu zo 765 na 0, čo trvá asi 5 sekúnd.

TIMER1_CAPT

Toto je prerušenie TIMER1_CAPT, ktoré sa spustí vždy, keď mu D-flipflop pošle signál, na stúpajúcu hranu vstupného signálu (ako je vysvetlené vyššie). Logika zachytávania sa stará o uloženie hodnoty počítadla TIMER1 v okamihu zachytenia, uloží sa rovnako ako počítadlo pretečenia. TIMER0 bohužiaľ nemá funkciu zachytávania vstupov, takže sa tu číta jeho aktuálna hodnota a aktuálna hodnota počítadla pretečenia. Premenná správy je nastavená na jednu, aby hlavný program povedal, že ide o nové údaje.

Ďalej sú to dve funkcie na ovládanie MAX7219

SPI

Aj keď je na čipe k dispozícii univerzálne sériové rozhranie (USI), rozhodol som sa ho nepoužívať. Displej MAX7219 je potrebné ovládať pomocou SPI a to je možné pomocou USI. Ale bitbanging SPI je taký jednoduchý, že som si naň neurobil čas s USI.

MAX7219

Protokol na nastavenie MAX7219 je tiež celkom jednoduchý, keď si prečítate jeho návod. Potrebuje 16 -bitovú hodnotu pre každú číslicu, ktorá pozostáva z 8 bitov pre číselné číslo (1 až 8), po ktorých nasleduje 8 bitov pre číslo, ktoré potrebuje na zobrazenie.

HLAVNÝ PROG

Posledná vec je vysvetliť hlavný program. Beží v nekonečnej slučke (while (1)), ale v skutočnosti urobí niečo, keď príde správa (1) z rutiny prerušenia alebo keď počítadlo časového limitu klesne na nulu (žiadny vstupný signál).

Prvá vec, ktorú musíte urobiť, keď je správa premennej nastavená na jednu, je vynulovanie počítadla časového limitu, keď už vieme, že je prítomný signál. D-flipflop sa resetuje, aby bol pripravený na ďalšie spustenie, ktoré príde po čase merania (počkajte jednu sekundu).

Čísla zaregistrované v prerušení zachytávania sa sčítajú, aby poskytli počet odkazov a počet vstupných frekvencií. (musíme sa uistiť, že referencia nemôže byť nikdy nulová, pretože ju budeme deliť neskôr)

Ďalej je výpočet skutočnej frekvencie. Určite nechcem používať plávajúce čísla na mikrokontroléri s iba 2 kB flash a iba 128 bajtov pamäte RAM používam celé čísla. Frekvencie však môžu byť až 314,159 Hz s niekoľkými desatinnými miestami. Preto vynásobím vstupnú frekvenciu nielen referenčnou frekvenciou, ale aj multiplikátorom, a potom pridám číslo tam, kde by mala byť desatinná čiarka. Keď to urobíte, tieto čísla budú veľmi veľké. Napr. so vstupom 500 kHz, referenciou 10 MHz a multiplikátorom 100 to dáva 5 x 10^14, to je skutočne obrovské! Do 32 -bitového čísla sa nezmestia, takže používam 64 -bitové čísla, ktoré pôjdu až do 1,8 x 10^19 (to funguje dobre na ATTINY2313)

A posledná vec, ktorú musíte urobiť, je poslať výsledok na displej MAX7219.

Kód sa kompiluje do približne 1 600 bajtov, takže sa zmestí do 2 048 bajtov blesku dostupného v ATTINY2313.

Register poistiek by mal vyzerať takto:

PREDĹŽENÉ 0xFF

VYSOKÝ 0xDF

NÍZKY 0xBF

Krok 5: Presnosť a presnosť

Presnosť a presnosť
Presnosť a presnosť
Presnosť a presnosť
Presnosť a presnosť
Presnosť a presnosť
Presnosť a presnosť

Presnosť a presnosť sú dve rôzne šelmy. Presnosť je tu sedem číslic, skutočná presnosť závisí od hardvéru a kalibrácie. Kalibroval som 10 MHz (5 MHz v testovacom bode) iným čítačom frekvencie, ktorý má oscilátor s disciplínou GPS.

A funguje to celkom dobre, najnižšia frekvencia, ktorú som vyskúšal, je 0,2 Hz, najvyššia 2 MHz. Je to na mieste. Nad 2 MHz začne regulátor strácať prerušenia, čo nie je prekvapujúce, keď viete, že pri vstupnom signáli 2 MHz generuje TIMER0 viac ako 7800 prerušení za sekundu. A ATTINY2313 musí robiť aj ďalšie veci, prerušenia z TIMER1, pri ďalších 150 prerušeniach za sekundu a samozrejme vykonávať výpočty, ovládať displej a D-flipflop. Keď sa pozriete na skutočné zariadenie, uvidíte, že používam iba sedem z ôsmich číslic displeja. Robím to z niekoľkých dôvodov.

Po prvé, výpočet vstupnej frekvencie je delením, takmer vždy bude mať zvyšok, ktorý nevidíte, pretože ide o celočíselné delenie. Druhým je, že oscilátor kremenných kryštálov nie je stabilizovaný teplotou.

Kondenzátory, ktoré ho naladia na správnych 10 MHz, sú keramické, veľmi citlivé na zmeny teploty. Potom je tu skutočnosť, že TIMER0 nemá zabudovanú logiku zachytávania a všetkým funkciám prerušenia trvá určitý čas. Myslím si, že sedem číslic je aj tak dosť dobrých.

Odporúča: