Sisukord:

Kõrge eraldusvõimega sagedusloendur: 5 sammu (piltidega)
Kõrge eraldusvõimega sagedusloendur: 5 sammu (piltidega)

Video: Kõrge eraldusvõimega sagedusloendur: 5 sammu (piltidega)

Video: Kõrge eraldusvõimega sagedusloendur: 5 sammu (piltidega)
Video: How To Do Stable Diffusion LORA Training By Using Web UI On Different Models - Tested SD 1.5, SD 2.1 2024, November
Anonim

See juhend annab vastastikuse sagedusloenduri, mis on võimeline sagedusi kiiresti ja mõistliku täpsusega mõõtma. See on valmistatud standardkomponentidest ja seda saab valmistada nädalavahetusel (mul läks natuke kauem aega:-))

EDIT: Kood on nüüd saadaval GitLabis:

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

1. samm: vana kooli sageduste loendamine

Vana kooli sageduste loendamine
Vana kooli sageduste loendamine
Vana kooli sageduste loendamine
Vana kooli sageduste loendamine

Vana kooli viis signaali sageduse mõõtmiseks on kasutada loogilist JA-väravat, toita mõõdetav signaal ühte pessa ja täpselt 1 sekundi kõrguse signaal teise porti ning loendada väljund. See toimib üsna hästi mõne kHz signaalide puhul GHz -s. Aga mis siis, kui soovite mõõta madala eraldusvõimega signaali? Oletame, et soovite mõõta võrgu sagedust (siin 50 Hz). Vana kooli meetodi korral näete õnne korral oma ekraanil konstantset 50, kuid tõenäolisemalt näete ekraani lülitumist 49 -lt 50 -le või 50 -lt 51. Eraldusvõime on 1 Hz ja see on kõik. Te ei näe kunagi 50,002 Hz, kui te pole valmis suurendama värava aega 1000 sekundini. See on rohkem kui 16 minutit ühe mõõtmise jaoks!

Parem viis madala sagedusega signaalide mõõtmiseks on selle perioodi mõõtmine. Võttes taas näiteks elektrivõrgu, on ajavahemik 20 millisekundit. Võtke sama loogika JA-värav, toite seda näiteks 10 MHz-ga (0,1 USA impulssi) ja teie signaal teises pordis ja sealt väljub 200 000 impulssi, seega on ajavahemik 20000,0 uS ja see tähendab 50 Hz. Kui mõõdate ainult 199650 impulssi, on sagedus 50,087 Hz, see on palju parem ja seda vaid ühe sekundi jooksul. Kahjuks ei tööta see kõrgemate sagedustega hästi. Võtame näiteks, nüüd tahame mõõta 40 kHz. Võrdlusega sama 10 MHz sisendsagedusega mõõdame nüüd vaid 250 impulssi. Kui arvestada vaid 249 impulssi, annab arvutus 40161 Hz ja 251 korral on tulemus 39840 Hz. See ei ole vastuvõetav lahendus. Muidugi parandab võrdlussageduse suurendamine tulemusi, kuid mikrokontrolleri kasutamisel on piirangud.

2. samm: vastastikune viis

Vastastikune tee
Vastastikune tee
Vastastikune tee
Vastastikune tee

Lahendus, mis töötab nii madalal kui ka kõrgemal sagedusel, on vastastikune sagedusloendur. Püüan selgitada selle põhimõtet. Alustate mõõtmisajaga, mis on ligikaudu 1 sekund, see ei pea olema väga täpne, kuid see on mõõtmiseks mõistlik aeg. Viige see 1 Hz signaal D-sisendi D-flipflopi. Väljundis (ed) ei juhtu veel midagi. Ühendage signaal, mida soovite mõõta, D-flipflopi CLOCK sisendiga.

Niipea kui see signaal läheb LOW-lt kõrgele, kannab D-flipflopi väljund D-sisendi oleku väljundisse (Q). Seda RISING signaali käivitamist kasutatakse nii sisendsignaali kui ka referentskella signaali lugemise alustamiseks.

Seega loete KAKS signaali täpselt samal ajal, signaali, mida soovite mõõta, ja võrdluskella. Sellel võrdluskellal peab olema täpne väärtus ja see peab olema stabiilne, tavaline kristallostsillaator sobib hästi. Väärtus ei ole väga oluline, kui see on kõrge sagedusega ja selle väärtus on hästi teada.

Mõne aja pärast, näiteks mõni millisekund, muudate D-flipflopi D-sisendi uuesti madalaks. Järgmisel CLOCK-sisendil jälgib väljund Q sisendi olekut, kuid midagi muud ei juhtu, kuna mikrokontroller on seadistatud reageerima ainult RISING signaalile. Seejärel, pärast mõõtmisaja lõppu (umbes 1 sekund), teete D-sisendi HIGH.

Järgmisel CLOCK-sisendil järgneb Q väljund ja see RISING signaal käivitab mikrokontrolleri, seekord lõpetab mõlema loenduri loendamise.

Tulemuseks on kaks numbrit. Esimene number on võrdlusest loetud impulsside arv. Nagu me teame võrdlussagedust, teame ka aega, mis kulus nende impulsside lugemiseks.

Teine number on meie mõõdetava sisendsignaali impulsside arv. Kuna alustasime täpselt selle signaali RISING servadest, oleme selle sisendsignaali impulsside arvu osas väga kindlad.

Nüüd on see vaid arvutus sisendsignaali sageduse määramiseks.

Näiteks oletame, et meil on need signaalid ja me tahame mõõta f-sisendit. Võrdlus on 10 MHz, mis on loodud kvartskristallostsillaatori abil. f_sisend = 31,416 Hz f_reference = 10000000 Hz (10 MHz), mõõtmisaeg on u. 1 sekund

Selle aja jooksul loendasime 32 impulssi. Nüüd võtab selle signaali üks periood 1/31,416 = 31830,9 uS. Seega võttis 32 perioodi aega 1,0185892 sekundit, mis on veidi üle 1 sekundi.

Selle 1,0186 sekundi jooksul loeme ka võrdlussignaali 10185892 impulssi.

See annab meile järgmise teabe: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz

Saadud sageduse arvutamise valem on järgmine: freq = (input_count * f_reference) / ref_count

Meie näites on see: f-sisend = (32 * 10000000) / 10185892 = 31,416 Hz

Ja see toimib hästi nii madalate kui ka kõrgete sageduste puhul, ainult siis, kui sisendsignaal jõuab võrdlussagedusele lähedale (või isegi sellest kõrgemale), on parem kasutada standardset "suletud" mõõtmisviisi. Kuid siis võiksime sisendsignaalile lihtsalt lisada ka sagedusjaguri, kuna sellel vastastikusel meetodil on sama sagedus mis tahes sageduse puhul (kuni võrdlusväärtuseni). Nii et kas mõõdate 100 kHz otse jagatuna välise 1000x jagajaga, on eraldusvõime sama.

Samm: riistvara ja selle skeem

Riistvara ja selle skeem
Riistvara ja selle skeem
Riistvara ja selle skeem
Riistvara ja selle skeem

Olen teinud mõned seda tüüpi sagedusloendurid. Ammu tegin ühe ATMEGA328 -ga (sama kontroller nagu Arduinos), hiljem ST -i ARM -mikrokontrolleritega. Viimane tehti STM32F407 -ga, mille sagedus oli 168 MHz. Nüüd aga mõtlesin, et mis siis, kui teen sama ka * palju * väiksemaga. Valisin ATTINY2313, millel on vaid 2 kbby FLASH mälu ja 128 baiti RAM. Minu ekraan on MAX7219, millel on 8 seitsme segmendi kuvarit, need kuvarid on Ebays saadaval vaid 2 euro eest. ATTINY2313 saab osta umbes 1,5 euro eest, ülejäänud kasutatud osad maksavad vaid sente tükk. Kõige kallim oli ilmselt plastikust projektikarp. Hiljem otsustasin selle töötada liitium-ioonakuga, nii et mul oli vaja lisada (LDO) 3,3 V pinge stabilisaator, aku laadimismoodul ja aku ise. See tõstab hinda mõnevõrra, kuid arvan, et seda saab ehitada vähem kui 20 euro eest.

4. samm: kood

Kood
Kood
Kood
Kood

Kood kirjutati C -s Atmel (Microchip) Studio 7 -ga ja programmeeriti ATTINY2313 -sse OLIMEX AVR_ISP (kloon?) Abil. Avage (main.c) allpool olevas zip -failis, kui soovite siin kirjeldust järgida.

ALGATUS

Esiteks seadistati ATTINY2313 kasutama välist kristalli, kuna sisemine RC-ostsillaator on millegi mõõtmiseks kasutu. Ma kasutan 10 MHz kristalli, mida häälestan väikese muutuva kondensaatoriga õigele 10 000 000 Hz sagedusele. Initsialiseerimine hoolitseb portide seadistamise eest sisenditele ja väljunditele, taimerite seadistamisele ning katkestuste ja MAX7219 lähtestamise võimaldamisele. TIMER0 on seadistatud loendama välist kella, TIMER1 sisemist kella ja jäädvustama ka loenduri väärtust ICP tõusvas servas, mis pärineb D-flipflopist.

Ma arutan põhiprogrammi viimasena, nii et järgmine on katkestusrutiinid.

TIMER0_OVF

Kuna TIMER0 loeb kuni 255 (8 bitti) ja rullub üle 0 -le, vajame ülevoolude arvu lugemiseks katkestust. See on kõik, mida TIMER0_OVF teeb, loendage lihtsalt ülevoolu arv. Hiljem kombineeritakse see arv loenduri enda väärtusega.

TIMER1_OVF

TIMER1 võib loendada kuni 65536 (16 bitti), seega katkestab TIMER1_OVF ka ülevoolude arvu. Kuid see teeb rohkem. See väheneb ka 152-lt 0-le, mis võtab aega umbes 1 sekund ja seejärel seab väljundpinni, minnes flipflopi D-sisendisse. Ja viimane asi, mida selles katkestusrutiinis tehakse, on vähendada ajalõpu loendurit, minnes 765-lt 0-le, mis võtab aega umbes 5 sekundit.

TIMER1_CAPT

See on TIMER1_CAPT katkestus, mis vallandub iga kord, kui D-flipflop saadab sellele signaali sisendsignaali tõusvas servas (nagu eespool selgitatud). Pildistusloogika hoolitseb TIMER1 loenduri väärtuse salvestamise eest jäädvustamise hetkel, see salvestatakse samuti kui ülevoolu loendur. Kahjuks pole TIMER0 -l sisendi hõivamise funktsiooni, nii et siin loetakse selle praegust väärtust ja ülevoolu loenduri praegust väärtust. Põhiprogrammi jaoks on sõnumimuutujaks seatud üks, et öelda, et need on uued andmed.

Järgmisena on kaks funktsiooni MAX7219 juhtimiseks

SPI

Kuigi kiibil on saadaval universaalne jadaliides (USI), otsustasin seda mitte kasutada. MAX7219 ekraani tuleb juhtida SPI kaudu ja see on USI abil võimalik. Kuid SPI bitbanging on nii lihtne, et ma ei võtnud aega seda USI -ga teha.

MAX7219

Samuti on MAX7219 seadistamise protokoll üsna lihtne, kui olete selle kasutusjuhendi läbi lugenud. See vajab 16 -bitist väärtust iga numbri jaoks, mis koosneb 8 -kohalisest numbrist (1 kuni 8), millele järgneb 8 bitti kuvatava numbri jaoks.

PÕHIPROGRAMM

Viimane asi on põhiprogrammi selgitamine. See töötab lõpmatus tsüklis (samas (1)), kuid teeb tegelikult midagi ainult siis, kui katkestusrutiinist on saabunud teade (1) või kui ajalõpu loendur on nullini jõudnud (sisendsignaal puudub).

Esimene asi, mida teha, kui muutuva sõnumi väärtus on üks, lähtestatakse ajalõpu loendur, sest me teame, et signaal on olemas. D-flipflop lähtestatakse, et see oleks valmis järgmiseks päästikuks, mis saabub pärast mõõtmisaega (oodake sekund).

Pildistamise katkestuses registreeritud numbrid lisatakse, et saada võrdlusarv ja sisendsageduse arv. (peame veenduma, et viide ei saa kunagi olla null, kuna jagame sellega hiljem)

Järgmine on tegeliku sageduse arvutamine. Kindlasti ei taha ma kasutada ujuvaid numbreid mikrokontrolleril, mille välklamp on vaid 2 kilobaiti ja ainult 128 baiti mälu. Kuid sagedused võivad olla nagu 314,159 Hz, mitme kümnendkoha täpsusega. Seetõttu korrutan sisendsageduse mitte ainult võrdlussagedusega, vaid ka kordajaga ja lisan seejärel arvu, kuhu koma peaks minema. Need numbrid muutuvad seda tehes väga suureks. Nt. sisendiga 500 kHz, viitega 10 MHz ja kordajaga 100 annab see 5 x 10^14, see on tõesti tohutu! Nad ei mahu 32 -bitisele numbrile, nii et ma kasutan 64 -bitiseid numbreid, mis ulatuvad kuni 1,8 x 10^19 (mis töötab ATTINY2313 korral hästi)

Ja viimane asi, mida teha, on saata tulemus MAX7219 ekraanile.

Kood koondab umbes 1600 baiti, seega sobib see ATTINY2313 saadaval olevasse 2048 baidi välklampi.

Kaitseregistrid peaksid lugema järgmist:

PIKENDATUD 0xFF

KÕRGE 0xDF

MADAL 0xBF

Samm: täpsus ja täpsus

Täpsus ja täpsus
Täpsus ja täpsus
Täpsus ja täpsus
Täpsus ja täpsus
Täpsus ja täpsus
Täpsus ja täpsus

Täpsus ja täpsus on kaks eraldi metsalist. Täpsus on seitse numbrit, tegelik täpsus sõltub riistvarast ja kalibreerimisest. Kalibreerisin 10 MHz (katsepunktis 5 MHz) teise sagedusloenduriga, millel on GPS -distsiplineeritud ostsillaator.

Ja see töötab üsna hästi, madalaim sagedus, mida proovisin, on 0,2 Hz, kõrgeim 2 MHz. See on kohapeal. Üle 2 MHz hakkab kontroller katkestusi kaotama, pole tegelikult üllatav, kui teate, et 2 MHz sisendsignaali korral tekitab TIMER0 üle 7800 katkestuse sekundis. Ja ATTINY2313 peab tegema ka muid asju, katkestusi TIMER1-st, veel 150 katkestust sekundis ja loomulikult arvutusi, kontrollides ekraani ja D-flipflopi. Kui vaatate tegelikku seadet, näete, et kasutan ekraani kaheksast numbrist vaid seitset. Teen seda mitmel põhjusel.

Esiteks on sisendsageduse arvutamine jaotus, sellel on peaaegu alati jääk, mida te ei näe, kuna see on täisarvujaotus. Teiseks on kvartskristallostsillaator temperatuuri stabiliseerimata.

Kondensaatorid, mis häälestavad selle õigele 10 MHz -le, on keraamilised, temperatuurimuutuste suhtes väga tundlikud. Siis on tõsiasi, et TIMER0 -l pole salvestusloogikat sisse ehitatud ja katkestusfunktsioonid võtavad oma töö tegemiseks aega. Minu arvates on seitse numbrit igatahes piisavalt hea.

Soovitan: