Përmbajtje:

Numëruesi i frekuencës me rezolucion të lartë: 5 hapa (me fotografi)
Numëruesi i frekuencës me rezolucion të lartë: 5 hapa (me fotografi)

Video: Numëruesi i frekuencës me rezolucion të lartë: 5 hapa (me fotografi)

Video: Numëruesi i frekuencës me rezolucion të lartë: 5 hapa (me fotografi)
Video: ЮККА – ПЕРЕСАДКА И УХОД 2024, Korrik
Anonim

Ky udhëzues tregon një numërues të frekuencave reciproke të aftë për të matur frekuencat shpejt dhe me saktësi të arsyeshme. Isshtë bërë me përbërës standardë dhe mund të bëhet në një fundjavë (më mori pak më shumë kohë:-))

EDIT: Kodi tani është i disponueshëm në GitLab:

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

Hapi 1: Numërimi i Frekuencës së Shkollës së Vjetër

Numërimi i Frekuencës së Shkollës së Vjetër
Numërimi i Frekuencës së Shkollës së Vjetër
Numërimi i Frekuencës së Shkollës së Vjetër
Numërimi i Frekuencës së Shkollës së Vjetër

Mënyra e vjetër e shkollës për të matur frekuencën e një sinjali është përdorimi i një porte logjike AND, furnizimi i sinjalit që do të matet në një port dhe një sinjal me një saktësi 1 sekondë të lartë në portin tjetër dhe numërimi i daljes. Kjo funksionon mjaft mirë për sinjalet prej disa kHz mirë në GHz. Por, çfarë nëse doni të matni një sinjal me frekuencë të ulët me rezolucion të mirë? Thuaj se doni të matni frekuencën e rrjetit (këtu 50 Hz). Me metodën e shkollës së vjetër do të shihni një konstante 50 në ekranin tuaj nëse jeni me fat, por ka shumë të ngjarë që ju të shihni kalimin e ekranit nga 49 në 50 ose 50 në 51. Rezolucioni është 1 Hz, dhe kaq. Ju kurrë nuk do të shihni 50.002 Hz nëse nuk jeni të gatshëm të rrisni kohën e portës në një 1000 sekonda. Kjo është më shumë se 16 minuta, për një matje të vetme!

Një mënyrë më e mirë për të matur sinjalet me frekuencë të ulët është matja e periudhës së tij. Marrja e rrjetit si shembull përsëri, ka një periudhë prej 20 milisekonda. Merrni të njëjtën logjikë AND-gate, ushqeni atë me, të themi 10 MHz (0.1 us impulse) dhe sinjali juaj në portin tjetër dhe dalin dalin 200000 impulse, kështu që koha e periudhës është 20000.0 uS dhe kjo përkthehet përsëri në 50Hz. Kur matni vetëm pulsin 199650 frekuenca është 50.087 Hz, kjo është shumë më mirë, dhe është në vetëm një kohë matjeje të sekondës. Fatkeqësisht, kjo nuk funksionon mirë me frekuenca më të larta. Merrni për shembull, ne tani duam të masim 40 kHz. Me të njëjtën frekuencë hyrëse 10 MHz si referencë, ne tani matim vetëm 250 impulse. Kur numërojmë vetëm 249 pulse llogaritja jep 40161 Hz dhe me 251 rezultati është 39840 Hz. Kjo nuk është një zgjidhje e pranueshme. Sigurisht që rritja e frekuencës së referencës përmirëson rezultatet, por ekziston një kufi për atë që mund të përdorni në një mikrokontrollues.

Hapi 2: Mënyra reciproke

Mënyra reciproke
Mënyra reciproke
Mënyra reciproke
Mënyra reciproke

Një zgjidhje që funksionon si për frekuencat e ulëta ashtu edhe për ato më të larta është një numërues i frekuencave reciproke. Do të përpiqem të shpjegoj parimin e tij. Filloni me një kohë matëse që është afërsisht 1 sekondë, nuk duhet të jetë shumë e saktë, por është një kohë e arsyeshme për një matje. Futeni këtë sinjal 1 Hz në një D-flipflop në hyrjen D. Asgjë nuk ndodh ende në daljet (et). Lidhni sinjalin që dëshironi të matni me hyrjen CLOCK të D-flipflop.

Sapo ky sinjal shkon nga LOW në HIGH, dalja e D-flipflop transferon gjendjen e hyrjes D në dalje (Q). Ky sinjal që po rritet po përdoret për të filluar numërimin e sinjalit hyrës, si dhe një sinjal të orës referuese.

Pra, po numëroni DY sinjale në të njëjtën kohë, sinjalin që dëshironi të matni dhe një orë referimi. Kjo orë referimi duhet të ketë një vlerë të saktë dhe të jetë e qëndrueshme, një oshilator kristal normal është mirë. Vlera nuk është shumë e rëndësishme për sa kohë që është një frekuencë e lartë dhe vlera e saj dihet mirë.

Pas ca kohësh, thuaj disa milisekonda, e bëni përsëri hyrjen D të flipflop-it të ulët. Në hyrjen tjetër të ORA-s dalja Q ndjek gjendjen e hyrjes, por asgjë tjetër nuk ndodh sepse mikrokontrolluesi është i vendosur të reagojë vetëm ndaj një sinjali RISING. Pastaj, pasi të ketë mbaruar koha e matjes (përafërsisht 1 sekondë) e bëni hyrjen D të LART.

Përsëri në hyrjen tjetër të ORA-s, dalja Q vijon dhe ky sinjal RRITJE aktivizon mikrokontrolluesin, këtë herë për të përfunduar numërimin e të dy sporteleve.

Rezultati është dy numra. Numri i parë është numri i impulseve të numëruara nga referenca. Siç e dimë frekuencën e referencës, ne gjithashtu e dimë kohën që u desh për të numëruar ato impulse.

Numri i dytë është numri i impulseve nga sinjali hyrës që ne po masim. Ndërsa filluam saktësisht në skajet e RRITJES së këtij sinjali, ne jemi shumë të sigurt për numrin e impulseve të këtij sinjali hyrës.

Tani është vetëm një llogaritje për të përcaktuar frekuencën e sinjalit hyrës.

Një shembull, le të themi që i kemi këto sinjale dhe duam të masim hyrjen f. Referenca është 10 MHz, e krijuar nga një oshilator kristal kuarci. f_input = 31.416 Hz f_referenca = 10000000 Hz (10 MHz), koha e matjes është përafërsisht. 1 sekondë

Në këtë kohë kemi numëruar 32 impulse. Tani, një periudhë e këtij sinjali merr 1 / 31.416 = 31830.9 uS. Pra, 32 perioda na morën 1.0185892 sekonda, që është pak më shumë se 1 sekondë.

Në këtë 1.0186 sekonda ne gjithashtu do të kemi numëruar 10185892 impulse të sinjalit të referencës.

Kjo na jep informacionin e mëposhtëm: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Formula për llogaritjen e frekuencës që rezulton është kjo: freq = = (input_count * f_reference) / ref_count

Në shembullin tonë është: f-input = (32 * 10000000) / 10185892 = 31.416 Hz

Dhe kjo funksionon mirë për frekuencat e ulëta si dhe frekuencat e larta, vetëm kur sinjali i hyrjes i afrohet (ose edhe më i lartë se) frekuencës së referencës është më mirë të përdoret mënyra standarde e "mbyllur" e matjes. Por atëherë ne thjesht mund të shtojmë një ndarës të frekuencës në sinjalin hyrës pasi kjo metodë reciproke ka të njëjtën rezolutë për çdo frekuencë (përsëri në referencë). Pra, nëse matni 100 kHz drejtpërdrejt të ndarë me një ndarës të jashtëm 1000x, rezolucioni është i njëjtë.

Hapi 3: Hardueri dhe Skema e tij

Hardueri dhe skema e tij
Hardueri dhe skema e tij
Hardueri dhe skema e tij
Hardueri dhe skema e tij

Unë kam bërë disa nga ky lloj numëruesish frekuence. Shumë kohë më parë bëra një me një ATMEGA328 (i njëjti kontrollues si në një Arduino), më vonë me mikrokontrolluesit ARM nga ST. Më e fundit është bërë me një STM32F407 me një frekuencë prej 168 MHz. Por tani pyes veten se çfarë nëse bëj të njëjtën gjë me një * shumë * më të vogël. Zgjodha një ATTINY2313, që ka vetëm 2kbajt memorie FLASH dhe 128 bajt RAM. Ekrani që kam është një MAX7219 me 8 ekrane me shtatë segmente, këto ekrane janë të disponueshme në Ebay për vetëm 2 Euro. Një ATTINY2313 mund të blihet për rreth 1.5 Euro pjesa tjetër e pjesëve që kam përdorur kushtojnë vetëm cent për copë. Më e shtrenjtë ishte ndoshta kutia plastike e projektit. Më vonë vendosa ta bëj atë të funksionojë me një bateri litium-jon, kështu që më duhej të shtoja një stabilizues të tensionit (LDO) 3.3V një modul të ngarkimit të baterisë dhe vetë baterinë. Kjo rrit disi çmimin, por mendoj se mund të ndërtohet për më pak se 20 Euro.

Hapi 4: Kodi

Kodi
Kodi
Kodi
Kodi

Kodi u shkrua në C me Atmel (Microchip) Studio 7 dhe u programua në ATTINY2313 duke përdorur një OLIMEX AVR_ISP (klon?). Hapni (main.c) në skedarin zip më poshtë nëse doni të ndiqni përshkrimin këtu.

INITIALIZIMI

Së pari ATTINY2313 ishte vendosur të përdorte një kristal të jashtëm pasi oshilatori i brendshëm RC është i padobishëm për të matur asgjë. Unë përdor një kristal 10 MHz që e përshtat në frekuencën e duhur 10 000 000 Hz me një kondensator të vogël të ndryshueshëm. Inicimi kujdeset për vendosjen e porteve në hyrje dhe dalje, vendosjen e kohëmatësve dhe mundësimin e ndërprerjeve dhe inicimin e MAX7219. TIMER0 është vendosur për të numëruar një orë të jashtme, TIMER1 orën e brendshme dhe gjithashtu për të kapur vlerën e numëruesit në skajin në rritje të ICP, që vjen nga D-flipflop.

Unë do të diskutoj programin kryesor të fundit, kështu që më pas janë rutinat e ndërprerjes.

TIMER0_OVF

Ndërsa TIMER0 numëron deri në 255 (8 bit) dhe pastaj rrotullohet në 0, ne kemi nevojë për një ndërprerje për të numëruar numrin e tejmbushjeve. Kjo është gjithçka që bën TIMER0_OVF, vetëm numëroni numrin e tejmbushjes. Më vonë ky numër kombinohet me vlerën e vetë numëruesit.

TIMER1_OVF

TIMER1 mund të numërojë deri në 65536 (16 bit), kështu që ndërprerja TIMER1_OVF gjithashtu numëron numrin e tejmbushjeve. Por bën më shumë. Ai gjithashtu zvogëlohet nga 152 në 0, i cili zgjat rreth 1 sekondë dhe më pas vendos një pin dalës, duke shkuar në hyrjen D të flipflop. Dhe gjëja e fundit që bëhet në këtë rutinë të ndërprerjes është zvogëlimi i numëruesit të kohës, duke shkuar nga 765 në 0, që kërkon rreth 5 sekonda.

TIMER1_CAPT

Ky është ndërprerja TIMER1_CAPT që aktivizohet sa herë që D-flipflop i dërgon një sinjal, në skajin në rritje të sinjalit hyrës (siç shpjegohet më sipër). Logjika e kapjes kujdeset për ruajtjen e vlerës së numëruesit TIMER1 në momentin e kapjes, ajo ruhet si dhe numëruesi i tejmbushjes. Fatkeqësisht TIMER0 nuk ka një funksion të kapjes së hyrjes, kështu që këtu lexohet vlera e tij aktuale dhe vlera aktuale e numëratorit të tejmbushjes. Një ndryshore mesazhi është vendosur në një për programin kryesor që t'i tregojë se këto janë të dhëna të reja.

Tjetra janë dy funksione për të kontrolluar MAX7219

SPI

Ndërsa ekziston një Ndërfaqe Seriale Universale (USI) në dispozicion në çip, unë zgjodha të mos e përdor. Ekrani MAX7219 duhet të kontrollohet përmes SPI dhe kjo është e mundur me USI. Por bitbanging SPI është aq e thjeshtë sa nuk mora kohë ta bëja me USI.

MAX7219

Protokolli për konfigurimin e MAX7219 është gjithashtu mjaft i thjeshtë pasi të keni lexuar manualin e tij. Ajo ka nevojë për një vlerë 16 bit për çdo shifër që përbëhet nga 8 bit për numrin shifror (1 deri në 8) e ndjekur nga 8 bit për numrin që duhet të shfaqë.

KRYESORE-PROG

Gjëja e fundit është të shpjegoni programin kryesor. Shkon në një lak të pafund (ndërsa (1)) por në fakt bën diçka kur ka një mesazh (1) nga rutina e ndërprerjes ose kur numëruesi i kohës është zvogëluar në zero (nuk ka sinjal hyrës).

Gjëja e parë që duhet bërë kur mesazhi i ndryshueshëm është vendosur në një, është rivendosja e numëruesit të kohës, pasi të gjithë e dimë se ekziston një sinjal i pranishëm. D-flipflop është rivendosur për ta bërë atë gati për shkaktuesin tjetër që do të vijë pas kohës së matjes (prit-një-sekondë).

Numrat e regjistruar në ndërprerjen e kapjes shtohen për të dhënë numërimin e referencës dhe numërimin e frekuencës. (ne duhet të sigurohemi që referenca nuk mund të jetë kurrë zero pasi do ta ndajmë me të më vonë)

Tjetra është llogaritja e frekuencës aktuale. Unë me siguri nuk dua të përdor numra lundrues në një mikrokontrollues me vetëm 2kbajt blic dhe vetëm 128 bajt ram unë përdor numra të plotë. Por frekuencat mund të jenë si 314.159 Hz, me disa numra dhjetorë. Prandaj, unë shumëzoj frekuencën hyrëse jo vetëm me frekuencën e referencës, por edhe me një shumëzues, dhe pastaj shtoj një numër aty ku duhet të shkojë pika dhjetore. Këta numra do të bëhen shumë të mëdhenj kur ta bëni këtë. P.sh. me një hyrje prej 500 kHz, një referencë prej 10 MHz dhe një shumëzues të 100, kjo jep 5 x 10^14, kjo është me të vërtetë e madhe! Ata nuk do të përshtaten aspak në një numër 32 bit, kështu që unë përdor numra 64 bit që do të shkojnë deri në 1.8 x 10^19 (që funksionon mirë në një ATTINY2313)

Dhe gjëja e fundit që duhet bërë është dërgimi i rezultatit në ekranin MAX7219.

Kodi përpilohet në rreth 1600 bajt, kështu që përshtatet në blicin 2048 bajt të disponueshëm në ATTINY2313.

Regjistrat e siguresave duhet të lexohen kështu:

E ZGJATUR 0xFF

I LART 0 0xDF

I UL 0T 0xBF

Hapi 5: Saktësi dhe Saktësi

Saktësi dhe Saktësi
Saktësi dhe Saktësi
Saktësi dhe Saktësi
Saktësi dhe Saktësi
Saktësi dhe Saktësi
Saktësi dhe Saktësi

Saktësia dhe saktësia janë dy kafshë të ndara. Saktësia këtu është shtatë shifra, ajo që saktësia aktuale varet nga pajisja dhe kalibrimi. Kam kalibruar 10 MHz (5 MHz në pikën e provës) me një numërues tjetër frekuence që ka një oshilator të disiplinuar GPS.

Dhe funksionon mjaft mirë, frekuenca më e ulët që kam provuar është 0.2 Hz, më e larta 2 MHz. Spotshtë në vend. Mbi 2 MHz kontrolluesi fillon të humbasë ndërprerjet, nuk është për t'u habitur kur e dini se në sinjalin hyrës 2 MHz TIMER0 gjeneron mbi 7800 ndërprerje në sekondë. Dhe ATTINY2313 duhet të bëjë edhe gjëra të tjera, ndërprerjet nga TIMER1, me 150 ndërprerje të tjera në sekondë dhe sigurisht të bëjë llogaritjet, duke kontrolluar ekranin dhe D-flipflop. Kur shikoni pajisjen aktuale do të shihni që unë përdor vetëm shtatë nga tetë shifrat e ekranit. Unë e bëj këtë për disa arsye.

Së pari është se llogaritja e frekuencës së hyrjes është një ndarje, ajo pothuajse gjithmonë do të ketë një mbetje, të cilën ju nuk e shihni pasi është një ndarje e plotë. E dyta është se oshilatori i kristalit të kuarcit nuk është i stabilizuar në temperaturë.

Kondensatorët që e rregullojnë atë në 10 MHz të saktë janë qeramikë, shumë të ndjeshëm ndaj ndryshimeve të temperaturës. Pastaj është fakti që TIMER0 nuk ka logjikë të kapur të integruar, dhe funksionet e ndërprerjes të gjithë marrin pak kohë për të bërë punën e tyre. Unë mendoj se shtatë shifra është mjaft mirë gjithsesi.

Recommended: