INHOUDSOPGAWE:
- Stap 1: Ou skool frekwensietelling
- Stap 2: Die wedersydse manier
- Stap 3: Hardeware en sy skema
- Stap 4: Die kode
- Stap 5: Akkuraatheid en presisie
Video: Teller met hoë resolusie: 5 stappe (met foto's)
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:23
Hierdie instruksies toon 'n wedersydse frekwensieteller wat frekwensies vinnig en met redelike presisie kan meet. Dit is gemaak met standaardkomponente en kan binne 'n naweek gemaak word (dit het my 'n bietjie langer geneem:-))
EDIT: Die kode is nou beskikbaar op GitLab:
gitlab.com/WilkoL/high-resolution-frequency-counter
Stap 1: Ou skool frekwensietelling
Die ou skool manier om die frekwensie van 'n sein te meet, is om 'n logiese EN-poort te gebruik, die sein wat gemeet moet word, in 'n poort en 'n sein met 'n presiese 1 sekonde hoë tyd na die ander poort te voer en die uitset te tel. Dit werk redelik goed vir seine van 'n paar kHz tot in die GHz. Maar wat as u 'n lae frekwensie sein met 'n goeie resolusie wil meet? Sê dat u die frekwensie van die net wil meet (hier 50 Hz). Met die ou skoolmetode sal u 'n konstante 50 op u skerm sien as u geluk het, maar meer waarskynlik sal u die skerm van 49 na 50 of 50 na 51 sien. Die resolusie is 1 Hz, en dit is dit. U sal nooit 50,002 Hz sien nie, tensy u die poorttyd tot 1000 sekondes wil verhoog. Dit is meer as 16 minute, vir 'n enkele meting!
'N Beter manier om lae frekwensie seine te meet, is om die tydperk daarvan te meet. As ek weer 'n voorbeeld van die hoofstroomnetwerk neem, het dit 'n tydperk van 20 millisekonde. Neem dieselfde logika EN-poort, voer dit met, sê 10 MHz (0,1 us pulse) en u sein op die ander poort kom uit 200000 pulse, dus is die tydsduur 20000,0 uS en dit vertaal terug in 50Hz. As u slegs 199650 pulse meet, is die frekwensie 50.087 Hz, dit is baie beter, en dit is in slegs 'n sekonde meettyd. Ongelukkig werk dit nie goed met hoër frekwensies nie. Neem byvoorbeeld, ons wil nou 40 kHz meet. Met dieselfde ingangsfrekwensie van 10 MHz as die verwysing, meet ons nou net 250 pulse. As ons net 249 pulse tel, gee die berekening 40161 Hz en met 251 is die resultaat 39840 Hz. Dit is nie 'n aanvaarbare besluit nie. Die verhoging van die verwysingsfrekwensie verbeter natuurlik die resultate, maar daar is 'n beperking op wat u in 'n mikrobeheerder kan gebruik.
Stap 2: Die wedersydse manier
'N Oplossing wat vir beide lae en hoër frekwensies werk, is 'n wedersydse frekwensieteller. Ek sal probeer om die beginsel daarvan te verduidelik. U begin met 'n meettyd van ongeveer 1 sekonde, dit hoef nie baie presies te wees nie, maar dit is 'n redelike tyd vir 'n meting. Voer hierdie 1 Hz-sein in 'n D-flipflop op die D-ingang. Daar gebeur nog niks met die uitset (e) nie. Koppel die sein wat u wil meet aan die CLOCK-invoer van die D-flipflop.
Sodra hierdie sein van LAAG na HOOG gaan, dra die uitset van die D-flipflop die toestand van die D-invoer oor na die uitset (Q). Hierdie stygende sein word gebruik om die insetsein sowel as 'n verwysingskloksein te begin tel.
U tel dus TWEE seine op presies dieselfde tyd, die sein wat u wil meet en 'n verwysingsklok. Hierdie verwysingsklok moet 'n presiese waarde hê en stabiel wees; 'n normale kristal ossillator is goed. Die waarde is nie baie belangrik nie, solank dit 'n hoë frekwensie is en die waarde daarvan goed bekend is.
Na 'n geruime tyd, sê 'n paar millisekondes, maak u die D-invoer van die D-flipflop weer laag. By die volgende CLOCK-invoer volg die uitset Q die toestand van die invoer, maar niks gebeur anders nie, want die mikrobeheerder is ingestel om slegs op 'n RISING-sein te reageer. Nadat die meettyd verby is (ongeveer 1 sekonde), maak u die D-invoer HOOG.
By die volgende CLOCK-invoer volg weer die Q-uitset en hierdie RISING-sein aktiveer die mikrobeheerder, hierdie keer om die tel van beide tellers te beëindig.
Die resultaat is twee getalle. Die eerste getal is die aantal pulse wat uit die verwysing getel word. Aangesien ons die verwysingsfrekwensie ken, weet ons ook hoe lank dit geneem het om die pulse te tel.
Die tweede is die getal die aantal pulse van die insetsein wat ons meet. Aangesien ons presies op die RISING -kante van hierdie sein begin het, is ons baie vol vertroue oor die aantal pulse van hierdie insetsein.
Nou is dit net 'n berekening om die frekwensie van die insetsein te bepaal.
'N Voorbeeld, laat ons sê dat ons hierdie seine het en ons wil f-invoer meet. Die verwysing is 10 MHz, gegenereer deur 'n kwarts kristal ossillator. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), die meettyd is ongeveer. 1 sekonde
In hierdie tyd het ons 32 polse getel. Nou neem een periode van hierdie sein 1 / 31.416 = 31830.9 uS. 32 periodes het ons dus 1,0185892 sekondes geneem, wat net meer as 1 sekonde is.
In hierdie 1.0186 sekonde sal ons ook 10185892 pulse van die verwysingssein getel het.
Dit gee ons die volgende inligting: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz
Die formule om die resulterende frekwensie te bereken is: freq = (input_count * f_reference) / ref_count
In ons voorbeeld is dit: f-input = (32 * 10000000) / 10185892 = 31,416 Hz
En dit werk goed vir sowel lae as hoë frekwensies, slegs as die insetsein naby (of selfs hoër as) die verwysingsfrekwensie is, is dit beter om die standaard "gated" meting te gebruik. Maar dan kan ons ook eenvoudig 'n frekwensie-verdeler by die ingangsein voeg, aangesien hierdie wedersydse metode dieselfde resolusie vir enige frekwensie het (tot die verwysing weer). Of u nou 100 kHz direk meet, gedeel deur 'n eksterne 1000x verdeler, die resolusie is dieselfde.
Stap 3: Hardeware en sy skema
Ek het 'n paar van hierdie tipe frekwensietellers gemaak. Lank gelede het ek een gemaak met 'n ATMEGA328 (dieselfde kontroleerder as in 'n Arduino), later met ARM -mikrobeheerders van ST. Die nuutste is gemaak met 'n STM32F407 op 168 MHz. Maar nou het ek gewonder wat as ek dieselfde doen met 'n * baie * kleiner een. Ek het 'n ATTINY2313 gekies, met net 2 kbyte FLASH -geheue en 128 grepe RAM. Die skerm wat ek het, is 'n MAX7219 met 8 sewe segmentskerms daarop; hierdie skerms is beskikbaar op eBay vir slegs 2 euro. 'N ATTINY2313 kan vir ongeveer 1,5 euro gekoop word, die res van die onderdele wat ek gebruik het, kos net 'n sent. Die duurste was waarskynlik die plastiekprojekkas. Later het ek besluit om dit op 'n litium-ioonbattery te laat werk, daarom moes ek 'n (LDO) 3.3V spanningsstabilisator, 'n laai-module vir batterye en die battery self byvoeg. Dit verhoog die prys ietwat, maar ek dink dit kan vir minder as 20 euro gebou word.
Stap 4: Die kode
Die kode is in C met Atmel (Microchip) Studio 7 geskryf en in die ATTINY2313 geprogrammeer met behulp van 'n OLIMEX AVR_ISP (kloon?). Maak die (main.c) in die zip -lêer hieronder oop as u die beskrywing hier wil volg.
INISIALISERING
Eerstens sou die ATTINY2313 'n eksterne kristal gebruik, aangesien die interne RC-ossillator nutteloos is om enigiets te meet. Ek gebruik 'n 10 MHz kristal wat ek op die korrekte frekwensie van 10 000 000 Hz afstel met 'n klein veranderlike kapasitor. Die inisialisering sorg vir die instelling van poorte op insette en uitsette, die opstel van die tydtellers en die onderbrekings en inisialisering van die MAX7219. TIMER0 is ingestel om 'n eksterne horlosie te tel, TIMER1 die interne klok en ook om die waarde van die toonbank aan die stygende rand van ICP af te neem, afkomstig van die D-flipflop.
Ek sal die hoofprogram laas bespreek, dus volg die onderbrekingsroetines.
TIMER0_OVF
Aangesien TIMER0 tot 255 (8 bisse) tel en dan na 0 oorgaan, benodig ons 'n onderbreking om die aantal oorstromings te tel. Dit is al wat TIMER0_OVF doen, tel net die aantal oorstromings. Later word hierdie getal gekombineer met die waarde van die toonbank self.
TIMER1_OVF
TIMER1 kan tot 65536 (16 bis) tel, dus die onderbrekings TIMER1_OVF tel ook die aantal oorstromings. Maar dit doen meer. Dit verminder ook van 152 tot 0, wat ongeveer 1 sekonde neem en dan 'n uitsetpen stel, na die D-invoer van die flipflop. En die laaste ding wat in hierdie onderbreekroetine gedoen word, is om die tydteller te verminder, van 765 na 0, wat ongeveer 5 sekondes neem.
TIMER1_CAPT
Dit is die TIMER1_CAPT-onderbreking wat geaktiveer word elke keer as die D-flipflop 'n sein stuur, aan die stygende rand van die insetsein (soos hierbo verduidelik). Die opnamelogika sorg vir die stoor van die waarde van die TIMER1 -teller op die oomblik van die opname; dit word gestoor, sowel as die oorloopteller. Ongelukkig het TIMER0 nie 'n insetopvangfunksie nie, dus hier word die huidige waarde en die huidige waarde van die oorloopteller gelees. 'N Boodskapsveranderlike is ingestel op een vir die hoofprogram om te vertel dat dit nuwe data is.
Hierna volg twee funksies om die MAX7219 te beheer
SPI
Alhoewel daar 'n Universal Serial Interface (USI) in die chip beskikbaar is, het ek besluit om dit nie te gebruik nie. Die MAX7219 -skerm moet via SPI beheer word, en dit is moontlik met die USI. Maar bitbanging SPI is so eenvoudig dat ek nie die tyd geneem het om dit met die USI te doen nie.
MAX7219
Die protokol vir die opstel van die MAX7219 is ook redelik eenvoudig nadat u die handleiding daarvan gelees het. Dit benodig 'n waarde van 16 bisse vir elke syfer wat bestaan uit 8 bisse vir die syfergetal (1 tot 8) gevolg deur 8 bisse vir die getal wat dit moet vertoon.
HOOF-PROG
Die laaste ding is om die hoofprogram te verduidelik. Dit loop in 'n oneindige lus (terwyl (1)), maar doen eintlik eintlik iets as daar 'n boodskap (1) uit die onderbrekingsroetine is of as die time -outteller tot nul gestyg het (geen insetsein).
Die eerste ding wat u moet doen as die veranderlike boodskap op een ingestel is, is om die tydsberekeningsteller terug te stel, ons weet immers dat daar 'n sein is. Die D-flipflop word teruggestel om dit gereed te maak vir die volgende sneller wat na die meettyd sal kom (wag 'n sekonde).
Die getalle wat in die vangonderbreking geregistreer is, word bygevoeg om die verwysingstelling en insetfrekwensietelling te gee. (ons moet seker maak dat die verwysing nooit nul kan wees nie, aangesien ons dit later sal deel)
Die volgende is 'n berekening van die werklike frekwensie. Ek wil beslis nie drywende getalle op 'n mikrobeheerder gebruik met slegs 2 kbyte flits nie en slegs 128 grepe ram. Ek gebruik heelgetalle. Maar frekwensies kan soos 314,159 Hz wees, met verskeie desimale. Daarom vermenigvuldig ek die invoerfrekwensie nie net met die verwysingsfrekwensie nie, maar ook met 'n vermenigvuldiger, en voeg dan 'n getal by waar die desimale punt moet gaan. Hierdie getalle word baie groot as u dit doen. Bv. met 'n inset van 500 kHz, 'n verwysing van 10 MHz en 'n vermenigvuldiger van 100, gee dit 5 x 10^14, dit is regtig geweldig! Hulle pas nie langer in 'n 32 bis getal nie, so ek gebruik 64 bis getalle wat tot 1,8 x 10^19 kan styg (dit werk goed op 'n ATTINY2313)
En die laaste ding om te doen is om die resultaat na die MAX7219 -skerm te stuur.
Die kode word saamgestel in ongeveer 1600 grepe, sodat dit pas in die 2048 grepe wat in die ATTINY2313 beskikbaar is.
Die lontregisters moet so lees:
UITGEBREID 0xFF
HOOG 0xDF
LAAG 0xBF
Stap 5: Akkuraatheid en presisie
Akkuraatheid en presisie is twee afsonderlike diere. Die presisie hier is sewe syfers; die werklike presisie hang af van die hardeware en die kalibrasie. Ek het die 10 MHz (5 MHz op die toetspunt) gekalibreer met 'n ander frekwensieteller met 'n GPS -gedissiplineerde ossillator.
En dit werk redelik goed; die laagste frekwensie wat ek probeer het, is 0,2 Hz, die hoogste 2 MHz. Dit is in die kol. Bo 2 MHz begin die kontroleerder onderbrekings verloor, nie regtig verbasend as u weet dat TIMER0 by 2 MHz se insetsein meer as 7800 onderbrekings per sekonde genereer nie. En die ATTINY2313 moet ook ander dinge doen, die onderbrekings van die TIMER1, met nog 150 onderbrekings per sekonde en natuurlik die berekeninge doen, die skerm en D-flipflop beheer. As u na die werklike toestel kyk, sal u sien dat ek slegs sewe van die agt syfers van die skerm gebruik. Ek doen dit om verskeie redes.
Eerstens is dat die berekening van die insetfrekwensie 'n afdeling is; dit sal byna altyd 'n res hê, wat u nie sien nie, aangesien dit 'n heelgetal -afdeling is. Tweedens is dat die kwarts kristal ossillator nie temperatuur gestabiliseer is nie.
Die kondensators wat dit op die korrekte 10 MHz afstem, is keramiek, baie sensitief vir temperatuurveranderinge. Dan is daar die feit dat TIMER0 nie 'n ingeboude logika het nie, en dat die onderbrekingsfunksies 'n geruime tyd neem om hul werk te doen. Ek dink sewe syfers is in elk geval goed genoeg.
Aanbeveel:
Webkamera met hoë resolusie: 9 stappe (met foto's)
Webkamera met hoë resolusie: Ek het 'n paar jaar lank 'n RPi -webkamera gebruik (met die PiCam -module). Die vervaardigde beelde was goed, maar dan was daar die oomblik dat ek nie meer tevrede was met die kwaliteit nie. Ek het besluit om 'n webkamera met 'n hoë resolusie te maak. Die volgende dele w
OpenLogger: 'n hoë resolusie, Wi-Fi geaktiveer, open source, draagbare datalogger: 7 stappe
OpenLogger: 'n hoë-resolusie, Wi-Fi-aangeskakel, open source, draagbare datalogger: OpenLogger is 'n draagbare, open source, goedkoop, hoë-resolusie datalogger wat ontwerp is om metings van hoë gehalte te lewer sonder dat dit duur sagteware of skryfprogrammatuur benodig van die begin af. As u 'n ingenieur, wetenskaplike of entoesias is wat nie
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle: 3 stappe
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle: Tans bou ek 'n RC -sender/ontvanger gebaseer op die SX1280 RF -chip. Een van die doelwitte vir die projek is dat ek 'n 12 -bits servo -resolusie van die stokkies tot by die servo's wil hê. Deels omdat moderne digitale servo's 12 -bits reso het
Hoe om 'n rekenaar met maklike stappe en foto's uitmekaar te haal: 13 stappe (met foto's)
Hoe om 'n rekenaar uitmekaar te haal met eenvoudige stappe en foto's: dit is 'n instruksie oor hoe om 'n rekenaar uitmekaar te haal. Die meeste basiese komponente is modulêr en kan maklik verwyder word. Dit is egter belangrik dat u daaroor georganiseerd is. Dit sal u verhinder om onderdele te verloor, en ook om die montering weer
Hoe om hoë resolusie -beelde uit instruksies te haal: 4 stappe
Hoe om hoë resolusie -beelde uit die instruksies te haal: Het u die instruksionele prentjie regtig geniet en wil u 'n kopie daarvan met 'n hoë resolusie stoor? Hierdie wonderlike funksie word maklik oor die hoof gesien