Turinys:
- 1 žingsnis: senosios mokyklos dažnumo skaičiavimas
- 2 žingsnis: abipusis kelias
- 3 žingsnis: Aparatūra ir jos schema
- 4 žingsnis: Kodas
- 5 žingsnis: tikslumas ir tikslumas
Video: Aukštos raiškos dažnio skaitiklis: 5 žingsniai (su nuotraukomis)
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:44
Ši instrukcija rodo abipusį dažnių skaitiklį, galintį greitai ir pagrįstai tiksliai išmatuoti dažnius. Jis pagamintas iš standartinių komponentų ir gali būti pagamintas savaitgalį (man prireikė šiek tiek daugiau laiko:-))
Redaguoti: Kodą dabar galima rasti „GitLab“:
gitlab.com/WilkoL/high-resolution-frequency-counter
1 žingsnis: senosios mokyklos dažnumo skaičiavimas
Senas mokyklos būdas išmatuoti signalo dažnį yra naudoti loginius AND vartus, perduoti matuojamą signalą į vieną prievadą ir tiksliai 1 sekundės trukmės signalą į kitą prievadą ir suskaičiuoti išvestį. Tai gana gerai tinka kelių kHz signalams į GHz. Bet ką daryti, jei norite išmatuoti žemos dažnio signalą su gera skiriamąja geba? Tarkime, kad norite išmatuoti tinklo dažnį (čia 50 Hz). Taikant senosios mokyklos metodą, jei jums pasisekė, ekrane matysite pastovią 50, bet labiau tikėtina, kad ekrano jungiklį perjungsite nuo 49 iki 50 arba 50 į 51. Skiriamoji geba yra 1 Hz, ir viskas. Jūs niekada nematysite 50,002 Hz, nebent būsite pasiruošę padidinti vartų laiką iki 1000 sekundžių. Tai daugiau nei 16 minučių vienam matavimui!
Geriausias būdas matuoti žemo dažnio signalus yra išmatuoti jo trukmę. Paėmus elektros tinklą kaip pavyzdį, laikotarpis yra 20 milisekundžių. Paimkite tą pačią loginę AND-vartą, maitinkite ją, tarkime, 10 MHz (0,1 us impulsų), o jūsų signalas kitame prievade ir išeina 200 000 impulsų, taigi laikotarpis yra 20000,0 uS, o tai reiškia 50 Hz. Kai matuojate tik 199650 impulsus, dažnis yra 50,087 Hz, tai yra daug geriau ir tai pasiekiama vos per vieną sekundę. Deja, su aukštais dažniais tai neveikia. Pavyzdžiui, dabar norime išmatuoti 40 kHz. Turėdami tą patį 10 MHz įvesties dažnį kaip ir atskaitos, dabar matuojame tik 250 impulsų. Kai skaičiuojame tik 249 impulsus, skaičiavimas suteikia 40161 Hz, o 251 - 39840 Hz. Tai nėra priimtina rezoliucija. Žinoma, padidinus etaloninį dažnį, rezultatai pagerėja, tačiau yra apribojimų, kuriuos galite naudoti mikrovaldiklyje.
2 žingsnis: abipusis kelias
Sprendimas, tinkantis tiek žemiems, tiek aukštesniems dažniams, yra abipusis dažnio skaitiklis. Pabandysiu paaiškinti jo principą. Pradedate nuo matavimo laiko, kuris yra maždaug 1 sekundė, jis neturi būti labai tikslus, tačiau tai yra pagrįstas matavimo laikas. Pateikite šį 1 Hz signalą į D įvesties D-flipflop. Išvestyje (-ėse) dar nieko nevyksta. Prijunkite signalą, kurį norite išmatuoti, prie D-flipflop įvesties CLOCK.
Kai tik šis signalas pereina iš LOW į HIGH, „D-flipflop“išėjimas perkelia D įvesties būseną į išėjimą (Q). Šis RISING signalo veikimas naudojamas įvesties signalo ir atskaitos laikrodžio signalo skaičiavimui pradėti.
Taigi jūs skaičiuojate du signalus tuo pačiu metu, signalą, kurį norite išmatuoti, ir atskaitos laikrodį. Šis atskaitos laikrodis turi turėti tikslią vertę ir būti stabilus, normalus kristalų osciliatorius yra tinkamas. Vertė nėra labai svarbi, kol ji yra aukšto dažnio ir jos vertė yra gerai žinoma.
Po kurio laiko, tarkime, po kelių milisekundžių, D-flipflop D įvestis vėl sumažėja. Kitoje CLOCK įvestyje išėjimas Q seka įvesties būseną, tačiau nieko daugiau neįvyksta, nes mikrovaldiklis nustatytas reaguoti tik į RISING signalą. Pasibaigus matavimo laikui (maždaug 1 sekundė), D įvestį padarysite AUKŠTĄ.
Vėl įvedant kitą laikrodžio įvestį, seka Q išėjimas ir šis RISING signalas suaktyvina mikrovaldiklį, šį kartą nutraukdamas abiejų skaitiklių skaičiavimą.
Rezultatas yra du skaičiai. Pirmasis skaičius yra impulsų, suskaičiuotų iš atskaitos, skaičius. Kaip žinome atskaitos dažnį, mes taip pat žinome laiką, kurio prireikė tiems impulsams suskaičiuoti.
Antrasis skaičius yra impulsų iš įvesties signalo, kurį mes matuojame, skaičius. Pradėję tiksliai nuo RISING šio signalo kraštų, esame labai tikri dėl šio įvesties signalo impulsų skaičiaus.
Dabar tai tik skaičiavimas, siekiant nustatyti įvesties signalo dažnį.
Pavyzdžiui, tarkime, kad turime šiuos signalus ir norime išmatuoti f įvestį. Atskaitos taškas yra 10 MHz, kurį sukuria kvarco kristalų osciliatorius. f_input = 31,416 Hz f_reference = 10000000 Hz (10 MHz), matavimo laikas yra apytikslis. 1 sekundė
Per tą laiką suskaičiavome 32 impulsus. Dabar vienas šio signalo laikotarpis trunka 1/31,416 = 31830,9 uS. Taigi 32 laikotarpiai mums užtruko 1,0185892 sekundes, tai yra šiek tiek daugiau nei 1 sekundė.
Per šią 1,0186 sekundę mes taip pat turėsime suskaičiavę 10185892 atskaitos signalo impulsus.
Tai suteikia mums tokią informaciją: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz
Gauto dažnio apskaičiavimo formulė yra tokia: freq = (input_count * f_reference) / ref_count
Mūsų pavyzdyje tai yra: f-input = (32 * 10000000) / 10185892 = 31.416 Hz
Ir tai gerai veikia tiek žemiems, tiek aukštiems dažniams, tik tada, kai įvesties signalas yra artimas (ar net didesnis nei) atskaitos dažniui, geriau naudoti standartinį „uždarą“matavimo būdą. Bet tada mes taip pat galėtume tiesiog pridėti dažnio skirstytuvą prie įvesties signalo, nes šis abipusis metodas turi tą pačią skiriamąją gebą bet kokiam dažniui (vėl iki nuorodos). Taigi, nesvarbu, ar matuojate 100 kHz, tiesiogiai padalintą iš išorinio 1000x daliklio, skiriamoji geba yra ta pati.
3 žingsnis: Aparatūra ir jos schema
Aš padariau keletą šio tipo dažnio skaitiklių. Seniai aš padariau vieną su ATMEGA328 (tas pats valdiklis, kuris yra „Arduino“), vėliau su ARM mikrovaldikliais iš ST. Naujausias buvo pagamintas naudojant STM32F407, kurio dažnis yra 168 MHz. Bet dabar pagalvojau, kas būtų, jei tą patį padarysiu su * daug * mažesniu. Aš pasirinkau ATTINY2313, turintį tik 2 kbaitus FLASH atminties ir 128 baitų RAM. Mano turimas ekranas yra MAX7219 su 8 septynių segmentų ekranais, kuriuos galima įsigyti „Ebay“tik už 2 eurus. „ATTINY2313“galima nusipirkti už maždaug 1,5 euro, o kitos mano naudojamos dalys kainuoja vos centus už vienetą. Brangiausia tikriausiai buvo plastikinė projekto dėžutė. Vėliau nusprendžiau veikti su ličio jonų baterija, todėl turėjau pridėti (LDO) 3,3 V įtampos stabilizatorių, akumuliatoriaus įkrovimo modulį ir pačią bateriją. Tai šiek tiek padidina kainą, bet manau, kad ją galima pastatyti už mažiau nei 20 eurų.
4 žingsnis: Kodas
Kodas buvo parašytas C naudojant „Atmel“(„Microchip“Studio 7) ir užprogramuotas ATTINY2313 naudojant OLIMEX AVR_ISP (klonas?). Atidarykite (main.c) žemiau esančiame ZIP faile, jei norite sekti čia pateiktą aprašymą.
INICIALIZACIJA
Pirmiausia ATTINY2313 buvo nustatytas naudoti išorinį kristalą, nes vidinis RC-osciliatorius yra nenaudingas bet kam matuoti. Aš naudoju 10 MHz kristalą, kurį su mažu kintamu kondensatoriumi sureguliuoju į teisingą 10 000 000 Hz dažnį. Inicializuojant pasirūpinama, kad prievadai būtų nustatyti įėjimams ir išėjimams, būtų nustatyti laikmačiai, būtų galima pertraukti ir inicijuoti MAX7219. TIMER0 yra nustatytas skaičiuoti išorinį laikrodį, TIMER1-vidinį laikrodį, taip pat fiksuoti skaitiklio vertę kylančiame ICP krašte, gaunamą iš „D-flipflop“.
Paskutinį kartą aptarsiu pagrindinę programą, todėl sekančios pertraukos.
TIMER0_OVF
Kadangi TIMER0 skaičiuoja iki 255 (8 bitai), o tada pereina prie 0, mums reikia pertraukos, kad būtų galima suskaičiuoti perpildymų skaičių. Tai viskas, ką TIMER0_OVF daro, tik suskaičiuokite perpildymo skaičių. Vėliau šis skaičius derinamas su paties skaitiklio verte.
TIMER1_OVF
TIMER1 gali suskaičiuoti iki 65536 (16 bitų), todėl pertraukimo TIMER1_OVF taip pat skaičiuoja perpildymų skaičių. Bet tai daro daugiau. Jis taip pat sumažėja nuo 152 iki 0, o tai užtrunka apie 1 sekundę, o tada nustato išvesties kaištį, pereinant prie flipflop D įvesties. Ir paskutinis dalykas, kuris atliekamas šioje pertraukimo procedūroje, yra sumažinti laiko skirtuko skaitiklį, pereinantį nuo 765 iki 0, o tai trunka apie 5 sekundes.
TIMER1_CAPT
Tai yra TIMER1_CAPT nutraukimas, kuris įjungiamas kiekvieną kartą, kai „D-flipflop“siunčia jam signalą kylančiame įvesties signalo krašte (kaip paaiškinta aukščiau). Užfiksavimo logika rūpinasi, kad išsaugotų TIMER1 skaitiklio vertę fotografavimo metu, ji išsaugoma ir perpildymo skaitiklis. Deja, TIMER0 neturi įvesties fiksavimo funkcijos, todėl čia skaitoma dabartinė jo vertė ir dabartinė perpildymo skaitiklis. Pranešimo kintamasis yra nustatytas vienai pagrindinei programai, kad tai būtų nauji duomenys.
Toliau pateikiamos dvi funkcijos, skirtos valdyti MAX7219
SPI
Nors luste yra universali serijinė sąsaja (USI), aš nusprendžiau jos nenaudoti. „MAX7219“ekraną reikia valdyti naudojant SPI, ir tai įmanoma naudojant USI. Tačiau SPI bitbaningas yra toks paprastas, kad neskyriau laiko tai padaryti su USI.
MAX7219
MAX7219 nustatymo protokolas taip pat yra gana paprastas, kai perskaitysite jo vadovą. Jai reikia 16 bitų vertės kiekvienam skaitmeniui, kurį sudaro 8 skaitmenų skaičiaus bitai (nuo 1 iki 8), o po to - 8 bitai skaičiui, kurį reikia parodyti.
PAGRINDINIS PROGRAMAS
Paskutinis dalykas yra paaiškinti pagrindinę programą. Jis veikia begaline kilpa (tuo tarpu (1)), bet iš tikrųjų ką nors daro tik tada, kai iš pertraukos rutinos gaunamas pranešimas (1) arba kai skirtojo laiko skaitiklis nusileidžia iki nulio (nėra įvesties signalo).
Pirmasis dalykas, kurį reikia padaryti, kai kintamasis pranešimas yra nustatytas į vieną, yra iš naujo nustatyti skirtojo laiko skaitiklį, nes mes žinome, kad yra signalas. „D-flipflop“yra iš naujo nustatytas, kad būtų paruoštas kitam trigeriui, kuris ateis po matavimo laiko (palaukite sekundę).
Fiksavimo pertraukoje užregistruoti skaičiai pridedami, kad būtų gautas atskaitos ir įvesties dažnio skaičius. (turime įsitikinti, kad nuoroda niekada negali būti lygi nuliui, nes vėliau ją padalinsime)
Kitas yra faktinio dažnio apskaičiavimas. Aš tikrai nenoriu naudoti plūduriuojančių skaičių mikrovaldiklyje, kuriame yra tik 2 kB blykstė ir tik 128 baitai RAM, naudoju sveikus skaičius. Tačiau dažnis gali būti panašus į 314,159 Hz su keliais dešimtainiais skaičiais. Todėl padauginu įvesties dažnį ne tik su atskaitos dažniu, bet ir su daugikliu, o tada pridedu skaičių prie to, kur turėtų būti dešimtainis taškas. Kai tai padarysite, šie skaičiai bus labai dideli. Pvz. su 500 kHz įvestimi, 10 MHz nuoroda ir 100 daugintoju, tai suteikia 5 x 10^14, tai tikrai didžiulis! Jie netelpa į 32 bitų skaičių, todėl aš naudoju 64 bitų skaičius, kurie bus iki 1,8 x 10^19 (tai gerai veikia ATTINY2313)
Ir paskutinis dalykas, kurį reikia padaryti, yra nusiųsti rezultatą į MAX7219 ekraną.
Kodas susideda iš maždaug 1600 baitų, todėl tinka 2048 baitų blykstei, kurią galima rasti ATTINY2313.
Saugiklių registrai turėtų būti tokie:
IŠPLĖSTAS 0xFF
AUKŠTAS 0xDF
MAŽAI 0xBF
5 žingsnis: tikslumas ir tikslumas
Tikslumas ir tikslumas yra du atskiri žvėrys. Čia tikslumas yra septyni skaitmenys, o tikrasis tikslumas priklauso nuo aparatūros ir kalibravimo. Aš kalibravau 10 MHz (5 MHz bandymo vietoje) kitu dažnio skaitikliu, turinčiu GPS disciplinuotą osciliatorių.
Ir tai veikia gana gerai, žemiausias dažnis, kurį bandžiau, yra 0,2 Hz, didžiausias - 2 MHz. Tai vietoje. Virš 2 MHz valdiklis pradeda atlaisvinti pertraukas, tikrai nenuostabu, kai žinote, kad esant 2 MHz įvesties signalui TIMER0 sukuria daugiau nei 7800 pertraukimų per sekundę. „ATTINY2313“turi atlikti ir kitus dalykus, pertraukas iš TIMER1, dar 150 pertraukimų per sekundę ir, žinoma, atlikti skaičiavimus, valdant ekraną ir „D-flipflop“. Kai pažvelgsite į tikrąjį įrenginį, pamatysite, kad aš naudoju tik septynis iš aštuonių ekrano skaitmenų. Aš tai darau dėl kelių priežasčių.
Pirma, įvesties dažnio apskaičiavimas yra padalijimas, jis beveik visada turės likutį, kurio nematysite, nes tai yra sveikas skaičius. Antra, kvarco kristalų osciliatorius nėra stabilizuotas temperatūroje.
Kondensatoriai, derinantys jį į teisingą 10 MHz, yra keraminiai, labai jautrūs temperatūros pokyčiams. Tada yra faktas, kad TIMER0 nėra integruotos fiksavimo logikos, o pertraukimo funkcijoms atlikti reikia šiek tiek laiko. Manau, kad septyni skaitmenys yra pakankamai geri.
Rekomenduojamas:
Paprastas dažnio skaitiklis naudojant „Arduino“: 6 žingsniai
Paprastas dažnio skaitiklis naudojant „Arduino“: Šioje pamokoje sužinosime, kaip naudojant „Arduino“padaryti paprastą dažnio skaitiklį. Žiūrėkite vaizdo įrašą
Sufokusuokite „Pi“aukštos kokybės fotoaparatą su „Lego“ir „Servo“: 4 žingsniai (su nuotraukomis)
Sutelkite „Pi“aukštos kokybės fotoaparatą su „Lego“ir „Servo“: su šiek tiek nulaužtu „Lego“elementu, nenutrūkstama servo sistema ir tam tikru „Python“kodu galite sutelkti savo Raspberry Pi aukštos kokybės fotoaparatą iš bet kurios pasaulio vietos! „Pi HQ“kamera yra nuostabi rinkinį, bet kaip radau dirbdamas prie neseniai sukurto „Merlin“
Lengvas aukštos įtampos maitinimo šaltinis: 5 žingsniai (su nuotraukomis)
Lengvas aukštos įtampos maitinimo šaltinis: ši instrukcija padės jums sukurti aukštos įtampos maitinimo šaltinį. Prieš bandydami šį projektą, žinokite keletą paprastų saugos priemonių. Dirbdami su aukštos įtampos maitinimo šaltiniu, visada mūvėkite elektrines pirštines. „Voltage“produkcija
Aukštos raiškos internetinė kamera: 9 žingsniai (su nuotraukomis)
Aukštos raiškos internetinė kamera: keletą metų naudojau RPi pagrįstą internetinę kamerą (su „PiCam“moduliu). Sukurti vaizdai buvo gerai, bet tada buvo momentas, kai nebuvau patenkinta kokybe. Aš nusprendžiau sukurti didelės skiriamosios gebos internetinę kamerą. Šios dalys
LP-2010 AES17 1998 Žemo dažnio (žemo dažnio) perjungimo stiprintuvo filtras: 4 žingsniai
LP-2010 AES17 1998 žemo dažnio (žemo dažnio) perjungimo stiprintuvo filtras: tai puikus D klasės stiprintuvas, žemo dažnio filtro matavimas. Puikus darbas, superiro našumas, lengvas prijungimas leidžia šį produktą lengvai naudoti ir labai verta turėti su aukštos kainos našumas