Sisukord:
- 1. samm: vana kooli sageduste loendamine
- 2. samm: vastastikune viis
- Samm: riistvara ja selle skeem
- 4. samm: kood
- Samm: täpsus ja täpsus
Video: Kõrge eraldusvõimega sagedusloendur: 5 sammu (piltidega)
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:45
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 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
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
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 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 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:
Lihtne sagedusloendur Arduino abil: 6 sammu
Lihtne sagedusloendur Arduino abil: Selles õpetuses õpime, kuidas Arduino abil lihtsat sagedusloendurit teha. Vaadake videot
Sagedusloendur Arduinoga: 8 sammu (piltidega)
Sagedusloendur Arduinoga: see on lihtne ja odav arduino -põhine sagedusloendur, mis maksis vähem kui 4 dollarit, väikeste ahelate mõõtmine oli väga kasulik
Kõrge eraldusvõimega veebikaamera: 9 sammu (piltidega)
Kõrglahutusega veebikaamera: kasutasin mõned aastad RPi -põhist veebikaamerat (koos PiCami mooduliga). Toodetud piltidega oli kõik korras, kuid siis oli hetk, kus ma polnud kvaliteediga enam rahul. Otsustasin teha suure eraldusvõimega veebikaamera. Järgmised osad on
Kõrge eraldusvõimega PWM -signaali genereerimine RC -servodele STM32 -seadmetega: 3 sammu
Kõrge eraldusvõimega PWM -signaali genereerimine RC -servodele STM32 -seadmetega: praegu ehitan SX1280 RF -kiibil põhinevat RC -saatjat/vastuvõtjat. Üks projekti eesmärke on see, et soovin 12 -bitist servo eraldusvõimet pulgadest servodeni. Osaliselt seetõttu, et kaasaegsetel digitaalsetel servodel on 12 -bitine reso
Kõrge eraldusvõimega piltide eemaldamine juhistest: 4 sammu
Kuidas saada kõrge eraldusvõimega pilte juhistest: Kas teile meeldis see juhendatav pilt ja kas soovite selle kõrge resolutsiooniga koopia salvestada? See suurepärane väike funktsioon jääb kergesti tähelepanuta