Obsah:

Frekvenční čítač s vysokým rozlišením: 5 kroků (s obrázky)
Frekvenční čítač s vysokým rozlišením: 5 kroků (s obrázky)

Video: Frekvenční čítač s vysokým rozlišením: 5 kroků (s obrázky)

Video: Frekvenční čítač s vysokým rozlišením: 5 kroků (s obrázky)
Video: TicWatch PRO 3 ULTRA GPS: Things To Know // How Accurate Is It? 2024, Červenec
Anonim

Tento návod ukazuje reciproční frekvenční čítač schopný měřit frekvence rychle as přiměřenou přesností. Je vyroben ze standardních komponent a může být vyroben za víkend (trvalo mi to trochu déle:-))

EDIT: Kód je nyní k dispozici na GitLab:

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

Krok 1: Počítání frekvence staré školy

Počítání frekvence staré školy
Počítání frekvence staré školy
Počítání frekvence staré školy
Počítání frekvence staré školy

Old school způsob, jak měřit frekvenci signálu, je použít logickou bránu AND, přivést měřený signál do jednoho portu a signál s přesně 1 sekundou nejvyššího času do druhého portu a spočítat výstup. To funguje docela dobře pro signály o několika kHz až do GHz. Ale co když chcete měřit nízkofrekvenční signál s dobrým rozlišením? Řekněme, že chcete měřit frekvenci sítě (zde 50 Hz). U metody staré školy uvidíte na displeji konstantní 50, pokud budete mít štěstí, ale s větší pravděpodobností uvidíte přepnutí displeje z 49 na 50 nebo 50 na 51. Rozlišení je 1 Hz, a to je vše. 50,002 Hz nikdy neuvidíte, pokud nejste ochotni prodloužit čas brány na 1000 sekund. To je více než 16 minut na jedno měření!

Lepší způsob měření nízkofrekvenčních signálů je změřit jeho periodu. Vezmeme -li znovu síť jako příklad, má období 20 milisekund. Vezměte stejnou logickou bránu AND, napájejte ji, řekněme 10 MHz (0,1 us pulsy), a váš signál na druhém portu vyjde 200 000 pulzů, takže časový úsek je 20000,0 uS a to se překládá zpět na 50 Hz. Když měříte pouze pulsy 199650, frekvence je 50,087 Hz, je to mnohem lepší a měří se jen za jednu sekundu. Bohužel to nefunguje dobře s vyššími frekvencemi. Vezměme si například, že nyní chceme měřit 40 kHz. Se stejnou vstupní frekvencí 10 MHz jako referenční nyní měříme pouhých 250 pulzů. Když napočítáme pouhých 249 pulzů, výpočet dává 40161 Hz a při 251 je výsledek 39840 Hz. To není přijatelné rozlišení. Samozřejmě zvýšení referenční frekvence zlepšuje výsledky, ale existuje omezení, co můžete použít v mikrořadiči.

Krok 2: Reciproční cesta

Reciproční cesta
Reciproční cesta
Reciproční cesta
Reciproční cesta

Řešení, které funguje pro nízké i vyšší frekvence, je reciproční čítač frekvencí. Pokusím se vysvětlit jeho princip. Začnete s časem měření, který je přibližně 1 sekunda, nemusí být příliš přesný, ale je to rozumný čas pro měření. Zaveďte tento 1 Hz signál do D-flipflopu na D-vstupu. Na výstupech se zatím nic neděje. Připojte signál, který chcete měřit, ke vstupu CLOCK na D-flipflopu.

Jakmile tento signál přejde z LOW na HIGH, výstup D-flipflop přenese stav D-vstupu na výstup (Q). Tento stoupající signál se používá ke spuštění počítání vstupního signálu a referenčního hodinového signálu.

Počítáte tedy DVĚ signály ve stejnou dobu, signál, který chcete měřit, a referenční hodiny. Tyto referenční hodiny musí mít přesnou hodnotu a být stabilní, normální krystalový oscilátor je v pořádku. Hodnota není příliš důležitá, pokud jde o vysokou frekvenci a její hodnota je dobře známá.

Po nějaké době, řekněme několik milisekund, se D-vstup D-flipflopu opět sníží. Na dalším vstupu CLOCK výstup Q sleduje stav vstupu, ale nic jiného se nestane, protože mikrořadič je nastaven tak, aby reagoval pouze na RISING signál. Poté, po uplynutí doby měření (přibližně 1 sekundu), uděláte vstup D VYSOKÝ.

Opět na dalším vstupu CLOCK následuje výstup Q a tento RISING signál spustí mikrořadič, tentokrát pro ukončení počítání obou čítačů.

Výsledkem jsou dvě čísla. První číslo je počet impulsů počítaných z reference. Jak známe referenční frekvenci, známe také čas potřebný k počítání těchto impulsů.

Druhým číslem je počet impulsů ze vstupního signálu, který měříme. Když jsme začali přesně na RISING hranách tohoto signálu, jsme si velmi jisti počtem pulzů tohoto vstupního signálu.

Nyní je to jen výpočet pro určení frekvence vstupního signálu.

Řekněme například, že tyto signály máme a chceme změřit f-vstup. Reference je 10 MHz, generovaná oscilátorem z křemenných krystalů. f_input = 31,416 Hz f_reference = 10 000 000 Hz (10 MHz), doba měření je cca. 1 sekunda

V této době jsme napočítali 32 pulzů. Nyní jedna perioda tohoto signálu trvá 1 / 31,416 = 31830,9 uS. 32 period nám tedy trvalo 1,0185892 sekundy, což je něco málo přes 1 sekundu.

V této 1,0186 sekundě budeme také počítat 10185892 impulzů referenčního signálu.

To nám dává následující informace: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Vzorec pro výpočet výsledné frekvence je tento: freq = (input_count * f_reference) / ref_count

V našem případě to je: f-vstup = (32 * 10000000) / 10185892 = 31,416 Hz

A to funguje dobře pro nízké i vysoké frekvence, pouze když se vstupní signál přiblíží (nebo dokonce vyšší než) k referenční frekvenci, je lepší použít standardní „uzavřený“způsob měření. Ale pak bychom také mohli jednoduše přidat frekvenční dělič na vstupní signál, protože tato reciproční metoda má stejné rozlišení pro jakoukoli frekvenci (až na referenci). Ať už tedy měříte 100 kHz přímo děleno externím děličem 1000x, rozlišení je stejné.

Krok 3: Hardware a jeho schéma

Hardware a jeho schéma
Hardware a jeho schéma
Hardware a jeho schéma
Hardware a jeho schéma

Udělal jsem několik z tohoto typu čítačů frekvence. Kdysi dávno jsem vytvořil jeden s ATMEGA328 (stejný ovladač jako v Arduinu), později s mikrořadiči ARM od ST. Poslední byl vyroben s STM32F407 s frekvencí 168 MHz. Ale teď mě napadlo, co když udělám totéž s * mnohem * menším. Vybral jsem ATTINY2313, který má jen 2 kB paměti FLASH a 128 bajtů paměti RAM. Displej, který mám, je MAX7219 s 8 sedmi segmentovými displeji, tyto displeje jsou k dispozici na Ebay za pouhá 2 eura. ATTINY2313 lze koupit za přibližně 1,5 EUR, ostatní díly, které jsem použil, stojí jen centy za kus. Nejdražší byl pravděpodobně plastový projektový box. Později jsem se rozhodl, že to nechám běžet na lithium-iontové baterii, takže jsem potřeboval přidat (LDO) 3.3V stabilizátor napětí, nabíjecí modul baterie a samotnou baterii. To poněkud zvyšuje cenu, ale myslím, že to lze postavit za méně než 20 EUR.

Krok 4: Kód

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

Kód byl napsán v jazyce C pomocí Atmel (Microchip) Studio 7 a naprogramován do ATTINY2313 pomocí OLIMEX AVR_ISP (klon?). Pokud chcete postupovat podle popisu zde, otevřete soubor (main.c) v níže uvedeném souboru zip.

INICIALIZACE

Nejprve byl ATTINY2313 nastaven na použití externího krystalu, protože interní RC oscilátor je k měření čehokoli k ničemu. Používám krystal 10 MHz, který malým variabilním kondenzátorem naladím na správnou frekvenci 10 000 000 Hz. Inicializace se stará o nastavení portů na vstupy a výstupy, nastavení časovačů a povolení přerušení a inicializace MAX7219. TIMER0 je nastaven tak, aby počítal externí hodiny, TIMER1 vnitřní hodiny a také aby zachytil hodnotu čítače na stoupající hraně ICP, přicházející z D-flipflopu.

Hlavní program proberu jako poslední, takže další jsou rutiny přerušení.

TIMER0_OVF

Protože TIMER0 počítá až 255 (8 bitů) a poté se přesune na 0, potřebujeme přerušení, abychom mohli spočítat počet přetečení. To je vše, co TIMER0_OVF dělá, stačí spočítat počet přetečení. Později je toto číslo zkombinováno s hodnotou samotného čítače.

TIMER1_OVF

TIMER1 může počítat až 65 536 (16 bitů), takže přerušení TIMER1_OVF také počítá počet přetečení. Ale dělá víc. Rovněž se sníží z 152 na 0, což trvá asi 1 sekundu, a poté nastaví výstupní pin, který přejde na vstup D flipflopu. A poslední věc, která se v této rutině přerušení provádí, je snížení čítače časového limitu ze 765 na 0, což trvá asi 5 sekund.

TIMER1_CAPT

Toto je přerušení TIMER1_CAPT, které se spustí pokaždé, když mu D-flipflop pošle signál, na stoupající hraně vstupního signálu (jak je vysvětleno výše). Logika zachycení se stará o uložení hodnoty čítače TIMER1 v okamžiku zachycení, uloží se stejně jako čítač přetečení. Bohužel TIMER0 nemá funkci zachycení vstupu, takže zde je načtena jeho aktuální hodnota a její aktuální hodnota čítače přetečení. Proměnná zprávy je nastavena na jednu, aby mu hlavní program řekl, že se jedná o nová data.

Další jsou dvě funkce pro ovládání MAX7219

SPI

I když je na čipu k dispozici univerzální sériové rozhraní (USI), rozhodl jsem se jej nepoužívat. Displej MAX7219 je třeba ovládat pomocí SPI a to je možné pomocí USI. Ale bitbanging SPI je tak jednoduchý, že jsem si s USI neudělal čas.

MAX7219

Protokol k nastavení MAX7219 je také velmi jednoduchý, jakmile si přečtete jeho příručku. Potřebuje 16bitovou hodnotu pro každou číslici, která se skládá z 8 bitů pro číselné číslo (1 až 8), po nichž následuje 8 bitů pro číslo, které potřebuje k zobrazení.

HLAVNÍ PROG

Poslední věcí je vysvětlit hlavní program. Běží v nekonečné smyčce (while (1)), ale ve skutečnosti dělá něco, když je zpráva (1) z rutiny přerušení nebo když čítač časového limitu dosáhl nuly (žádný vstupní signál).

První věc, kterou je třeba udělat, když je proměnná zpráva nastavena na jedničku, je reset počítadla časového limitu, když už víme, že je k dispozici signál. D-flipflop se resetuje, aby byl připraven na další spoušť, která přijde po době měření (počkejte sekundu).

Čísla registrovaná v přerušení záznamu jsou přidána, aby poskytla počet referencí a počet vstupní frekvence. (musíme se ujistit, že reference nikdy nemůže být nulová, protože ji rozdělíme později)

Následuje výpočet skutečné frekvence. Určitě nechci používat plovoucí čísla na mikrokontroléru s pouhými 2 kB flash a pouze 128 bajtů RAM používám celá čísla. Ale frekvence mohou být jako 314,159 Hz, s několika desetinnými místy. Proto vynásobím vstupní frekvenci nejen referenční frekvencí, ale také multiplikátorem, a poté přidám číslo, kam má jít desetinná čárka. Když to uděláte, tato čísla budou velmi velká. Např. se vstupem 500 kHz, referencí 10 MHz a multiplikátorem 100 to dává 5 x 10^14, to je opravdu obrovské! Do 32bitového čísla se nevejdou, takže používám 64bitová čísla, která půjdou až na 1,8 x 10^19 (to funguje dobře na ATTINY2313)

A poslední věc, kterou musíte udělat, je poslat výsledek na displej MAX7219.

Kód se kompiluje na přibližně 1600 bajtů, takže se vejde do 2048 bajtů flash dostupných v ATTINY2313.

Registry pojistek by měly vypadat takto:

ROZŠÍŘENO 0xFF

VYSOKÝ 0xDF

NÍZKÉ 0xBF

Krok 5: Přesnost a přesnost

Přesnost a preciznost
Přesnost a preciznost
Přesnost a preciznost
Přesnost a preciznost
Přesnost a preciznost
Přesnost a preciznost

Přesnost a přesnost jsou dvě oddělená zvířata. Přesnost je zde sedm číslic, skutečná přesnost závisí na hardwaru a kalibraci. Kalibroval jsem 10 MHz (5 MHz na testovacím bodě) jiným frekvenčním čítačem, který má oscilátor s disciplinovanou GPS.

A funguje to docela dobře, nejnižší frekvence, kterou jsem zkoušel, je 0,2 Hz, nejvyšší 2 MHz. Je to na místě. Nad 2 MHz začne řadič ztrácet přerušení, není divu, když víte, že na vstupním signálu 2 MHz generuje TIMER0 přes 7800 přerušení za sekundu. A ATTINY2313 musí dělat i další věci, přerušení z TIMER1, při dalších 150 přerušení za sekundu a samozřejmě provádět výpočty, ovládat displej a D-flipflop. Když se podíváte na skutečné zařízení, uvidíte, že používám jen sedm z osmi číslic displeje. Dělám to z několika důvodů.

První je, že výpočet vstupní frekvence je dělení, téměř vždy bude mít zbytek, který nevidíte, protože jde o celočíselné dělení. Za druhé, že oscilátor křemenných krystalů není teplotně stabilizovaný.

Kondenzátory, které jej naladí na správných 10 MHz, jsou keramické, velmi citlivé na změny teploty. Pak je tu skutečnost, že TIMER0 nemá vestavěnou logiku zachycení a všechny funkce přerušení nějakou dobu trvají. Myslím, že sedm číslic je stejně dost dobré.

Doporučuje: