Tartalomjegyzék:

Nagy felbontású frekvenciaszámláló: 5 lépés (képekkel)
Nagy felbontású frekvenciaszámláló: 5 lépés (képekkel)

Videó: Nagy felbontású frekvenciaszámláló: 5 lépés (képekkel)

Videó: Nagy felbontású frekvenciaszámláló: 5 lépés (képekkel)
Videó: Keysight 3000T 1GHz Oscilloscope Review 2024, November
Anonim

Ez az utasítás egy kölcsönös frekvenciaszámlálót mutat, amely képes a frekvenciák gyors és ésszerű pontosságú mérésére. Szabványos alkatrészekből készül, és hétvégén is elkészíthető (kicsit tovább tartott:-))

EDIT: A kód már elérhető a GitLab -on:

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

1. lépés: Old School gyakoriságszámlálás

Old School gyakoriságszámlálás
Old School gyakoriságszámlálás
Old School gyakoriságszámlálás
Old School gyakoriságszámlálás

A régi iskolai módszer a jel gyakoriságának mérésére az, hogy logikai ÉS kaput használ, a mérendő jelet az egyik portba, a jelet pedig pontosan 1 másodperces magas idővel táplálja a másik portba, és megszámolja a kimenetet. Ez nagyon jól működik néhány kHz -es jeleknél a GHz -ben. De mi van, ha alacsony frekvenciájú jelet szeretne mérni jó felbontásban? Tegyük fel, hogy meg szeretné mérni a hálózati frekvenciát (itt 50 Hz). A régi iskola módszerével állandó 50 -et fog látni a kijelzőn, ha szerencséje van, de valószínűbb, hogy a kijelző 49 -ről 50 -re vagy 50 -ről 51 -re kapcsol. A felbontás 1 Hz, és ennyi. Soha nem fog látni 50,002 Hz -t, hacsak nem hajlandó 1000 másodpercre növelni a kapu idejét. Ez több mint 16 perc, egyetlen méréshez!

Az alacsony frekvenciájú jelek mérésének jobb módja az időtartam mérése. Ha ismét példaként vesszük a hálózati csatlakozót, akkor az időtartama 20 milliszekundum. Vegye ugyanazt a logikai ÉS kaput, táplálja azt mondjuk 10 MHz-rel (0,1 us impulzus), és a jel a másik porton és 200 000 impulzuson keresztül érkezik, tehát a periódusidő 20000,0 uS, és ez 50 Hz-re változik. Ha csak 199650 impulzusokat mér, a frekvencia 50,087 Hz, ez sokkal jobb, és csak egy másodperc alatt érhető el. Sajnos ez nem működik jól magasabb frekvenciákkal. Például most 40 kHz -et akarunk mérni. Ugyanazzal a 10 MHz -es bemeneti frekvenciával, mint a referencia, most mindössze 250 impulzust mérünk. Ha csak 249 impulzust számolunk, a számítás 40161 Hz -et eredményez, 251 -nél pedig az eredmény 39840 Hz. Ez nem elfogadható állásfoglalás. Természetesen a referenciafrekvencia növelése javítja az eredményeket, de van egy korlát, amit egy mikrovezérlőben használhat.

2. lépés: A kölcsönös út

A kölcsönös út
A kölcsönös út
A kölcsönös út
A kölcsönös út

Az alacsony és magasabb frekvenciákra egyaránt alkalmas megoldás a reciprok frekvenciaszámláló. Megpróbálom elmagyarázni az elvét. Körülbelül 1 másodperces mérési idővel indul, nem kell nagyon pontosnak lennie, de ésszerű idő a méréshez. Ezt az 1 Hz-es jelet táplálja a D-bemenet D-flipflop-jába. A kimenet (ek) en még nem történik semmi. Csatlakoztassa a mérni kívánt jelet a D-flipflop CLOCK bemenetéhez.

Amint ez a jel LOW-ról HIGH-ra megy, a D-flipflop kimenete átviszi a D-bemenet állapotát a kimenetre (Q). Ez a RISING jel megy a bemeneti jel és a referencia órajel számlálásának megkezdéséhez.

Tehát KÉT jelet számlál pontosan egy időben, a mérni kívánt jelet és a referencia órát. Ennek a referenciaórának pontos értékkel kell rendelkeznie, és stabilnak kell lennie, normál kristályoszcillátor rendben van. Az érték nem túl fontos, amíg magas frekvenciáról van szó, és az értéke jól ismert.

Egy idő után, mondjuk néhány ezredmásodperc múlva ismét alacsonyra állítja a D-flipflop D-bemenetét. A következő CLOCK-bemenetnél a Q kimenet követi a bemenet állapotát, de semmi más nem történik, mert a mikrovezérlő úgy van beállítva, hogy csak RISING jelre reagáljon. Ezután a mérési idő letelte után (kb. 1 másodperc) a D-bemenetet HIGH-ra állítja.

Ismét a következő CLOCK-bemeneten a Q kimenet következik, és ez a RISING jel aktiválja a mikrovezérlőt, ezúttal befejezve mindkét számláló számlálását.

Az eredmény két szám. Az első szám a referencia alapján számított impulzusok száma. Mivel ismerjük a referenciafrekvenciát, tudjuk azt az időt is, amelyre szükség volt ezen impulzusok számításához.

A második szám az általunk mért bemeneti jel impulzusainak száma. Mivel pontosan e jel RISING szélein kezdtük, nagyon magabiztosak vagyunk a bemeneti jel impulzusainak számában.

Most csak egy számítás a bemeneti jel frekvenciájának meghatározása.

Tegyük fel például, hogy ezek a jelek megvannak, és meg akarjuk mérni az f-bemenetet. A referencia 10 MHz, amelyet kvarckristály oszcillátor generál. f_bevitel = 31,416 Hz f_referencia = 10000000 Hz (10 MHz), a mérési idő kb. 1 másodperc

Ez idő alatt 32 impulzust számoltunk. Ennek a jelnek egy periódusa 1 / 31,416 = 31830,9 uS. Tehát 32 periódusunk 1.0185892 másodpercet vett igénybe, ami alig több mint 1 másodperc.

Ebben az 1,0186 másodpercben a referenciajel 10185892 impulzusát is megszámoltuk.

Ezzel a következő információkat kapjuk: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

A kapott gyakoriság kiszámítására szolgáló képlet a következő: freq = (input_count * f_reference) / ref_count

Példánkban ez: f-input = (32 * 10000000) / 10185892 = 31,416 Hz

És ez jól működik alacsony és magas frekvenciákon is, csak akkor, ha a bemeneti jel közel van (vagy még magasabb) a referenciafrekvenciához, jobb a szabványos "kapu" mérési módot használni. De akkor egyszerűen hozzáadhatnánk egy frekvenciaelosztót is a bemeneti jelhez, mivel ez a kölcsönös módszer ugyanazzal a felbontással rendelkezik minden frekvenciánál (ismét a referenciaértékig). Tehát akár 100 kHz -et mér, akár osztva egy külső 1000x osztóval, a felbontás ugyanaz.

3. lépés: Hardver és vázlata

Hardver és vázlata
Hardver és vázlata
Hardver és vázlata
Hardver és vázlata

Készítettem néhány ilyen típusú frekvenciaszámlálót. Régen készítettem egyet ATMEGA328 -mal (ugyanaz a vezérlő, mint egy Arduino -ban), később az AR AR mikrovezérlőivel. A legújabb 168 MHz -es órajelű STM32F407 -tel készült. De most arra gondoltam, mi lenne, ha ugyanezt tenném egy * sokkal * kisebbel. Az ATTINY2313 -at választottam, amely mindössze 2 kbyte FLASH memóriával és 128 bájt RAM -mal rendelkezik. A kijelzőn van egy MAX7219, rajta 8 hét szegmenses kijelző, ezek a kijelzők mindössze 2 euróért kaphatók az Ebay -en. Egy ATTINY2313 körülbelül 1,5 euróért vásárolható meg, a többi alkatrész, amit használtam, csak centbe kerül darabonként. A legdrágább valószínűleg a műanyag projektdoboz volt. Később úgy döntöttem, hogy lítium-ion akkumulátorral működtetem, ezért hozzá kellett adnom egy (LDO) 3,3 V feszültségstabilizátort, egy akkumulátor-töltő modult és magát az akkumulátort. Ez némileg megnöveli az árat, de azt hiszem, 20 euró alatt is megépíthető.

4. lépés: A kód

A kód
A kód
A kód
A kód

A kódot C -ben írták az Atmel (Microchip) Studio 7 programmal, és OLIMEX AVR_ISP (klón?) Segítségével beprogramozták az ATTINY2313 -ba. Nyissa meg a (main.c) fájlt az alábbi zip fájlban, ha követni szeretné az itt található leírást.

INICIALIZÁCIÓ

Először az ATTINY2313-at úgy állították be, hogy külső kristályt használjon, mivel a belső RC-oszcillátor semmit sem mér. 10 MHz -es kristályt használok, amelyet egy kis, változtatható kondenzátorral hangolok a helyes 10 000 000 Hz frekvenciára. Az inicializálás gondoskodik a bemenetek és kimenetek portjainak beállításáról, az időzítők beállításáról, valamint a MAX7219 megszakításainak és inicializálásának engedélyezéséről. A TIMER0 úgy van beállítva, hogy megszámolja a külső órát, a TIMER1 a belső órát, és rögzíti a számláló értékét az ICP emelkedő szélén, a D-flipflopból.

A főprogramot utoljára fejtem ki, így a következő a megszakítási rutin.

TIMER0_OVF

Mivel a TIMER0 255 -ig (8 bit) számol, majd 0 -ra gurul, megszakításra van szükségünk a túlcsordulások számolásához. TIMER0_OVF csak ennyit tesz, csak számolja a túlcsordulás számát. Később ezt a számot kombinálják a számláló értékével.

TIMER1_OVF

A TIMER1 akár 65536 (16 bit) számolással is rendelkezik, így a megszakítás TIMER1_OVF is számolja a túlcsordulások számát. De többet tesz. Ezenkívül 152-ről 0-ra csökken, ami körülbelül 1 másodpercet vesz igénybe, majd beállít egy kimeneti tüskét, a flipflop D-bemenetére. És ebben a megszakítási rutinban az utolsó dolog az időkorlát-számláló csökkentése, 765-ről 0-ra állítva, ami körülbelül 5 másodperc.

TIMER1_CAPT

Ez az a TIMER1_CAPT megszakítás, amely minden alkalommal aktiválódik, amikor a D-flipflop jelet küld neki, a bemeneti jel emelkedő szélén (a fentiek szerint). A rögzítési logika gondoskodik a TIMER1 számláló értékének mentéséről a rögzítés pillanatában, ez mentésre kerül, valamint a túlfolyó számláló. Sajnos a TIMER0 nem rendelkezik bemeneti rögzítési funkcióval, így itt leolvasható az aktuális értéke és a túlfolyó számláló aktuális értéke. Az üzenetváltozót a főprogram egyikére állítja, hogy megmondja, hogy ezek új adatok.

A következő két funkció a MAX7219 vezérlésére szolgál

SPI

Bár létezik egy univerzális soros interfész (USI) a chipben, úgy döntöttem, hogy nem használom. A MAX7219 kijelzőt SPI -n keresztül kell vezérelni, és ez az USI segítségével lehetséges. De a bitbanging SPI olyan egyszerű, hogy nem szántam rá időt az USI -val.

MAX7219

A MAX7219 beállításának protokollja is nagyon egyszerű, miután elolvasta a kézikönyvet. 16 bites értékre van szüksége minden olyan számjegyhez, amely 8 bitből áll (1-8), majd 8 bit a megjelenítendő számhoz.

FŐPROGRAM

Az utolsó dolog a fő program ismertetése. Végtelen ciklusban fut (míg (1)), de valójában csak akkor tesz valamit, ha üzenet érkezik (1) a megszakítási rutinból, vagy ha az időtúllépési számláló nullára csökkent (nincs bemeneti jel).

Az első dolog, amit meg kell tennie, ha a változó üzenet egyre van állítva, alaphelyzetbe állítja az időtúllépés számlálóját, miután tudjuk, hogy van jel. A D-flipflop alaphelyzetbe áll, hogy készen álljon a következő triggerre, amely a mérési idő (másodperc várakozás) után jön.

A rögzítési megszakításban regisztrált számokat hozzáadjuk a referenciaszám és a bemeneti frekvencia számához. (meg kell győződnünk arról, hogy a referencia soha nem lehet nulla, mivel később megosztjuk vele)

A következő a tényleges gyakoriság kiszámítása. Biztosan nem akarok lebegő számokat használni olyan mikrovezérlőn, amely mindössze 2 kbyte flash -t és csak 128 bájt ramot használ. De a frekvenciák lehetnek 314,159 Hz, több tizedesjeggyel. Ezért a bemeneti frekvenciát nemcsak a referenciafrekvenciával, hanem szorzóval is megszorozom, majd hozzáadok egy számot a tizedesponthoz. Ezek a számok nagyon nagyok lesznek, ha ezt megteszed. Például. 500 kHz bemenettel, 10 MHz -es referenciával és 100 -as szorzóval ez 5 x 10^14 -et ad, ez tényleg hatalmas! Nem fognak beleférni egy 32 bites számba, ezért 64 bites számokat használok, amelyek egészen 1,8 x 10^19 -ig terjednek (ez jól működik az ATTINY2313 -on)

És az utolsó dolog, hogy el kell küldeni az eredményt a MAX7219 kijelzőre.

A kód körülbelül 1600 bájtba áll össze, így illeszkedik az ATTINY2313 -ban elérhető 2048 bájtos vakuhoz.

A biztosítéknyilvántartásoknak így kell olvasniuk:

BŐVÍTETT 0xFF

MAGAS 0xDF

ALACSONY 0xBF

5. lépés: Pontosság és pontosság

Pontosság és precizitás
Pontosság és precizitás
Pontosság és precizitás
Pontosság és precizitás
Pontosság és precizitás
Pontosság és precizitás

A pontosság és a pontosság két külön állat. A pontosság itt hét számjegyű, a tényleges pontosság a hardvertől és a kalibrálástól függ. A 10 MHz -et (a vizsgálati ponton 5 MHz) kalibráltam egy másik frekvenciaszámlálóval, amely rendelkezik GPS fegyelmezett oszcillátorral.

És elég jól működik, a legalacsonyabb frekvencia, amit próbáltam, 0,2 Hz, a legmagasabb 2 MHz. Helyén van. 2 MHz felett a vezérlő elkezdi megszüntetni a megszakításokat, nem igazán meglepő, ha tudja, hogy 2 MHz -es bemeneti jelnél a TIMER0 több mint 7800 megszakítást generál másodpercenként. És az ATTINY2313-nak más dolgokat is el kell végeznie, a TIMER1 megszakításait, további 150 megszakítás másodpercenként, és természetesen a számításokat, a kijelző és a D-flipflop vezérlését. Ha megnézi a tényleges eszközt, látni fogja, hogy a kijelző nyolc számjegyéből csak hetet használok. Több okból is ezt teszem.

Először is az, hogy a bemeneti frekvencia számítása osztás, szinte mindig maradványa lesz, amit nem lát, mivel egész osztás. Másodszor, a kvarckristályos oszcillátor nincs hőmérséklettel stabilizálva.

A megfelelő 10 MHz -re hangoló kondenzátorok kerámiák, nagyon érzékenyek a hőmérsékletváltozásokra. Aztán ott van az a tény is, hogy a TIMER0 -ban nincs beépített rögzítési logika, és a megszakítási funkciók mindegyike némi időt vesz igénybe a munkájuk elvégzéséhez. Szerintem hét számjegy egyébként elég jó.

Ajánlott: