Avtor: Mag. Vladimir Mitrović
Svoj prvi merilnik frekvence sem izdelal že davnega leta 1999, ko sem se šele začel zanimati za BASCOM in mikrokontrolerje družine 8051. Nekaj let kasneje sem se vrnil k isti temi, merilnik pa prilagodil takrat aktualnim AVR mikrokontrolerjem; hkrati sem zasnoval generator impulzov z več fiksnimi frekvencami.
Vsi ti projekti so bili skrbno preizkušeni; zanje sem zasnoval ustrezna tiskana vezja in napisal članke, ki so bili takrat objavljeni v reviji Svet elektronike. Zanimivo je, da sam nisem nikoli sestavil niti ene enote teh naprav na tiskanem vezju, zato sem vsakič, ko sem moral izmeriti frekvenco ali generirati impulze z zanesljivo frekvenco, preprogramiral mikrokontroler in sestavil ustrezno vezje na eksperimentalni plošči…
Ta vsebina je samo za naročnike
Odločil sem se, da bom temu naredil konec! Rezultat je naprava, ki jo bom opisal v tem članku; združuje obe funkciji: merilnik meri frekvence v območju od 0,1 Hz do 10 MHz, generator pa proizvaja pravokotne impulze frekvenc od 0,001 Hz do 8 MHz. Natančnost obeh naprav zagotavlja precizen 24 MHz kvarčni oscilator, ki poganja moja nova najljubša mikrokontrolerja, ATtiny84A in ATtiny44A. V primerjavi z ATtiny4313 imajo sicer manj priključkov (in ustrezno manjše ohišje s 14 priključki), vendar so prevzeli analogno-digitalni pretvornik iz ATmega, model 84A pa ima tudi dvakrat več pomnilnika – obe ti nadgradnji sta v programih pametno izkoriščeni. Izmerjena in generirana frekvenca se prikazujeta na majhnih, 0,91-palčnih OLED-displejih z ločljivostjo 128×32 pikslov.


Opazili boste, da je delovna frekvenca mikrokontrolerja višja od najvišje frekvence, ki jo navaja proizvajalec (20 MHz); vendar pa pri stabilni delovni napetosti 5 V noben izmed vzorcev teh »preklokanih« mikrokontrolerjev med resnično izčrpnimi testi ni pokazal nobenih težav pri delovanju.
Princip generiranja impulzov precizno določene frekvence
Impulze ustvarjamo z delitvijo osnovne frekvence kvarčnega oscilatorja. Glavni razlog za izbiro 24-MHz kvarčnega oscilatorja je, da je število 24 deljivo z različnimi števili, kar nam omogoča, da dosežemo zanimivo paleto frekvenc:
8 MHz, 6 MHz, 4 MHz, 3 MHz, 2 MHz, 1,5 MHz in 1 MHz
V tem »kvazi-geometričnem« zaporedju je razmerje med dvema sosednjima frekvencama bodisi 1,33 bodisi 1,5, kar nam daje enakomerno zapolnjeno dekado s 7 »okroglimi« frekvencami. Z nadaljnjim deljenjem z 10 razširimo to vrsto na skupno 10 dekad, s čimer dosežemo 70 natančno določenih frekvenc vse do najnižje frekvence 1 mHz (= 0,001 Hz)!
Postopek deljenja osnovne frekvence poteka na strojnem nivoju: izvajata ga timerja Timer0 in Timer1, ki sta povezana, kot je prikazano na sliki 1.
8-bitni timer Timer0 deluje v CTC načinu z nastavitvijo fiksnega deljenja z 250. V tem načinu Timer0 spremeni stanje povezanega izhodnega pina OC0B po vsakih 250 odštetih impulzih; Tako bo skupni faktor deljenja 500, 4000, 32000 ali 128000, odvisno od nastavitev vhodnega delilnika (preddelilnika). Timer0 se uporablja le za generiranje frekvenc pod 10 Hz.
Tudi 16-bitni timer Timer1 deluje v CTC načinu s spremenljivim faktorjem deljenja v območju od 2 do 62.500. Po odštetju določenega števila impulzov bo Timer1 dopolnil stanje povezanega izhodnega pina OC1A, s čimer bo ustvaril impulze z določeno frekvenco. Timer1 uporablja dva vira impulzov: impulze iz izhoda povezanega preddelilnika (za frekvence nad 10 Hz) ali impulze, ki jih ustvari Timer0 (za nižje frekvence).


V proces je vključen tudi preddelilnik takta, ki po potrebi razpolovi osnovno frekvenco takta. Dejansko timer in celoten mikrokontroler običajno delujejo pri frekvenci 12 MHz, razen pri generiranju najvišjih frekvenc in nekaterih posebnih nižjih frekvenc.
Natančnost frekvence tako ustvarjenega signala je odvisna izključno od natančnosti kvarčnega kristala, izhodni signal pa je pravokotne oblike z razmerjem signal:pavza 1:1. Edina frekvenca, ki je na ta način ni mogoče ustvariti, je 8 MHz: za ustvarjanje te frekvence bi bilo treba Timer1 nastaviti drugače, z razmerjem signal:pavza 1:2.
Princip merjenja frekvence
Osnovno načelo merjenja frekvence je štetje impulzov: število impulzov, preštetih v eni sekundi, ustreza frekvenci vhodnega signala. Če je čas merjenja natančno določen, bo odstopanje med izmerjeno in dejansko frekvenco ±1 Hz. Ko mikrokontroler deluje pri 24 MHz, bo najvišja frekvenca, ki jo lahko na ta način izmerimo, 12 MHz, najnižja pa seveda 1 Hz.
Zamislil sem si, da bi moral merilnik frekvence prikazati rezultat z resolucijo petih pomembnih digitov in z natančnostjo vsaj 0,01 %. To je natančno odstopanje ±1 Hz pri frekvenci 10 kHz, kar pomeni, da je opisani način merjenja sprejemljiv le za merjenje frekvenc nad 10 kHz. Natančnost merjenja nižjih frekvenc lahko izboljšamo s podaljšanjem merilnega intervala, vendar se odzivnost pri tem spremeni v nesprejemljivo počasno; pravzaprav bi bilo zaželeno, da bi bil merilni interval še krajši od navedene 1 sekunde, kar bi spodnjo merilno frekvenco dvignilo na še višje vrednosti!


Nazadnje sem se odločil, da skrajšam merilni interval na 200 ms in da opisan postopek uporabim le za merjenje frekvenc v območju 1–10 MHz! Shema merjenja je prikazana na sliki 2a. Na sliki so procesi, ki potekajo na ravni strojne opreme, označeni s črno barvo, programske rešitve pa z modro.
Timer0 šteje vhodne impulze v danem časovnem intervalu in je v seriji povezan s Timer1 v verigi, ki deluje na naslednji način:
Timer0 šteje v območju od 0 do 255, nato pa spremeni stanje povezanega izhodnega pina OC0B.
OC0B je vezan na vhodni pin Timerja1, T1;
Timer1 šteje impulze na T1 v razponu 0-65525, nato postavlja svoj overflow bit TOV1;
TOV1, Timer1, T1 in Timer0 tvorijo 26-bitništevec, ki lahkošteje do malo večkot 67,1 milijona.
Na začetku merjenja je treba izbrisati oba timerja in TOV1, vhodni pin T1 pa mora biti postavljen na nizko raven. Nato mikrokontroler zažene Timer0 za časovni interval 200 ms. Ker se oba timerja uporabljata za štetje, se trajanje časovnega intervala določi v programu. Natančnost, ki jo ponuja BASCOM ukaz Waitms, za to ni zadostna, zato je bil napisan podprogram v asemblerju s števci, ki tečejo natanko 200 ms. Po zaustavitvi Timer0 mora program prebrati vrednost iz njegovega 26-bitnega števca in jo pomnožiti s faktorjem 5: če predpostavljamo, da merimo frekvence nad 1 MHz, bomo s tem dobili frekvenco v Hz z natančnostjo, boljšo od 0,0005 %!
V vezju, prikazanem na sliki 2a, moramo še pojasniti modul »HC393«. Način, kako mikrokontroler šteje impulze, ima eno pomanjkljivost: ko frekvenca impulzov preseže polovico taktne frekvence (v našem primeru, ko preseže 12 MHz), se število z naraščanjem frekvence zmanjšuje. Poenostavljeno, vhodno frekvenco 13 MHz bomo odčitali kot (približno) 11 MHz, 14 MHz kot 10 MHz itd. Integrirano vezje HC393 je dvojni 4-bitni števec in bo delovalo kot digitalni filter, ki ga program aktivira za 12,8 µs pred samim merjenjem frekvence. Če je vhodna frekvenca nižja od 10 MHz, HC393 v teh 12,8 µs ne bo uspel prešteti več kot 127, zato bo najpomembnejši bit števca ostal v stanju »0«. Če je frekvenca višja, bo ta bit v času 12,8 µs prešel v stanje »1«, kar program pravilno zazna kot prekomerno visoko vhodno frekvenco in ustavi postopek merjenja.
Če je odčitana vrednost 26-bitnega števca manjša od 200.000, je frekvenca merjenja nižja od 1 MHz, zato bomo meritev ponovili na način, prikazan na sliki 2b. Tudi tu so strojni procesi označeni s črno barvo, programske rešitve pa z modro. Timer0 in Timer1 sta povezana na enak način kot na sliki 2a, vendar Timer0 zdaj šteje taktne impulze iz pogonskega oscilatorja namesto vhodnih impulzov. Na ta način izmerimo trajanje določenega števila period vhodnega signala. Da bi dosegli zahtevano natančnost, je treba pri višjih vhodnih frekvencah izmeriti večje število period in obratno. Tako bomo za frekvence v območju od 100 kHz do 1 MHz izmerili trajanje 50.000 period, za frekvence od 10 kHz do 100 kHz bomo izmerili 5.000 period in tako naprej. Seveda je tudi v tem primeru treba pred vsakim merjenjem izprazniti Timer0, Timer1 in TOV1 ter nastaviti OC0B na »0«.

Čeprav natančnost merjenja, prikazana na sliki 2a, ni zadostna za prikaz frekvence, je več kot primerna za določitev frekvenčnega območja, v katerem leži, in s tem števila period, katerih trajanje moramo izmeriti. Števec impulzov je izveden kot podprogram v asemblerju, ki se sinhronizira z padajočim robom vhodnega impulza, zažene Timer0 in ga ustavi po preštetju določenega števila vhodnih impulzov. Število impulzov se enostavno pretvori v frekvenco z natančnostjo, ki presega 0,0001 %, trajanje merjenja pa je pri frekvencah nad 10 Hz 0,5 sekunde ali manj. Za frekvence v območju od 1 Hz do 10 Hz traja merjenje od 0,2 do 2 sekund, za frekvence do 0,1 Hz (kar je določeno kot spodnja meja merjenja) pa do 20 sekund. Pri merjenju najnižjih frekvenc je preddelilnik Timer0 nastavljen na 8-kratno deljenje, saj bi bil celo 26-bitni števec prekratek za zajem štetih impulzov.
Pri opisani metodi merjenja obstaja nevarnost, da se program zatakne v dolgotrajni ali celo neskončni zanki, medtem ko čaka na pojav določenega števila vhodnih impulzov. Do tega pride, če se med merjenjem vhodna frekvenca znatno zniža ali če ni vhodnih impulzov. Da bi preprečili takšno situacijo, bo število impulzov pred začetkom merjenja aktiviralo nadzorni mehanizem, katerega naloga je prekiniti merjenje, ki traja dlje kot približno 2,5 sekunde pri merjenju frekvenc nad 1 Hz ali dlje kot približno 25 sekund pri merjenju nižjih frekvenc.
Električna shema
Električni shematski prikaz obeh naprav je prikazan na sliki 3. Merilnik frekvence sestavljata mikrokontroler ATtiny84A (U2) in binarni števec HC393 (U1), medtem ko je generator impulzov izveden z mikrokontrolerjem ATtiny44A (U3), na katerega izhod je dodan en sam CMOS ojačevalnik, LVC1G126 (U4). Oba mikrokontrolerja poganja skupni kristalni oscilator s frekvenco 24 MHz (Q1), katerega izhod je prek kondenzatorja s kapacitivnostjo 15 pF povezan z njunima vhodoma XTAL1. Da bi mikrokontrolerja lahko sprejela tako generiran taktni signal, je treba nastaviti Fuse bite, kot je prikazano na sliki 4.
Vse nastavitve so standardne, razen izbire oscilatorja: ta vrstica je označena z rdečo puščico. Izbrana nastavitev dejansko predvideva uporabo »standardnega« kvarčnega kristala, ki je na običajen način priključen na izhoda XTAL1 in XTAL2 mikrokontrolerja. Moje izkušnje s 24 MHz kvarčnimi kristali v tej konfiguraciji niso bile dobre; kristali so običajno nihali pri 8 MHz. Po drugi strani pa izbira aktivnega oscilatorja zagotavlja večjo natančnost in stabilnost generirane frekvence. Za dovajanje taktnih impulzov iz zunanjega oscilatorja bi bila potrebna drugačna nastavitev bitov FEDCBA kot na sliki 4, »000000: Ext. Osc.«. Vendar pa je bila taka nastavitev med razvojem programske opreme, ko je bilo treba mikrokontrolerje pogosto ponovno programirati, nepraktična. Po drugi strani so nastavitve, prikazane na sliki 4, dobro delovale tako med ponovnim programiranjem mikrokontrolerja kot tudi v vezju s slike 3, zato so bile ohranjene v končni rešitvi.
Na sliki 3 opazite tudi tipko S2, ki izbira način prikazovanja izmerjene frekvence na zaslonu merilnika frekvence, ter pet-smerno tipko S1 (joystick), povezano z generatorjem impulzov. S1 se odziva na premike ročice (palice) v smeri navzgor-navzdol (izbira frekvenčnega območja), levo-desno (izbira frekvence) in na pritisk na ročico (v končni rešitvi to ni bilo uporabljeno; ohranjeno je bilo kot možnost za prihodnjo nadgradnjo). Ker na mikrokontrolerju U3 ni bilo dovolj vhodnih pinov za priključitev vseh petih stikal na joysticku, smo uporabili trik z upori R6–R9. Ko je palica v srednjem položaju, ni pritisnjeno nobeno stikalo in napetost na analognih vhodih PA2 in PA3 je enaka napajalni napetosti. Če potisnemo palico navzdol ali v desno, se ta napetost zniža na eno tretjino napajalne napetosti. Nazadnje, če palico premaknemo navzgor ali v levo, se napetost na ustreznih izhodih zniža na 0 V. Z merjenjem napetosti na izhodih PA2 in PA3 lahko mikrokontroler ugotovi trenutni položaj palice in izvede ustrezno dejanje.
Poleg oscilatorja Q1 imata oba mikrokontrolerja še en skupni element: trimer R10. Njegov namen je izenačiti svetlost OLED displejev: z vrtenjem drsnika trimerja se svetlost enega zaslona poveča, medtem ko se svetlost drugega zmanjša. Če na obeh napravah uporabljamo enake displeje, naj drsnik ostane v srednjem položaju: standardne svetlosti displejev so običajno dobro uravnotežene. Če pa se odločimo za večbarvne zaslone (npr. modro-rumene, kar izgleda zelo efektno!), bo treba R10 nastaviti tako, da se izenačijo svetlobne jakosti.
Naprava se napaja prek omrežnega napajalnika z izhodno napetostjo 5 V. Poraba toka znaša nekaj deset mA, zato je za ta namen idealen polnilnik za mobilni telefon. Pred uporabo se prepričajte, da je izhodna napetost stabilna, saj vezje ne vsebuje ustreznega napetostnega regulatorja.


Slika 5 prikazuje razpored komponent na tiskanem vezju. Opazili boste, da je vezje zasnovano tako, da omogoča vgradnjo integriranih vezij v običajnih (THT) ali SMD ohišjih. Razlog je preprost: SMD različice je zdaj lažje dobiti in so precej cenejše, poleg tega pa se številna zanimiva integrirana vezja, kot je na primer LVC1G126, proizvajajo izključno v SMD izvedbi; po drugi strani pa mi je bilo med razvojem programa veliko lažje programirati mikrokontrolerje v DIL ohišju. Fotografije na sliki 6 prikazujejo končne različice obeh naprav; na spodnji fotografiji sta na ploščo nameščena tudi displeja.
O programih
Programa za oba mikrokontrolerja, f_met_ATtiny84_SE.bas in f_ref_ATtiny44_SE.bas, sta napisana v programskem jeziku Bascom-AVR, vse rutine, pri katerih je odzivni čas ključnega pomena, pa so napisane v asemblerju. Za prikaz na zaslonu programa uporabljata rutine iz knjižnice OLED$SE.sub, ki smo jo podrobno opisali v reviji Svet elektronike 233–236. V tem primeru je bila knjižnica prilagojena za čip SSD1306 in zmanjšana tako, da zavzema čim manj programskega pomnilnika. Dejansko je bil velik izziv, da se je vse potrebno namestilo v programski pomnilnik, ki je v obeh primerih zapolnjen do 99 %. Da bi zmanjšali porabo programskega pomnilnika, so bile nekatere tabele v programu f_ref_ATtiny44_SE.bas prestavljene v EEPROM mikrokontrolerja, kar je treba upoštevati pri programiranju čipa.
Način uporabe
Ko vklopimo napajalno napetost, generator impulzov preide v stanje pripravljenosti: na zaslonu se prikaže »0 Hz«, svetlost zaslona se zmanjša na minimum, izhodna napetost pa znaša 0 V. Generator aktiviramo spremikom ročice joysticka navzgor ali navzdol. Z nadaljnjim premikanjem navzgor/navzdol izberemo želeni merilni razpon, z premikanjem v levo/desno pa frekvenco znotraj izbranega merilnega razpona (slika 7). Izbrana frekvenca se prikaže z velikimi črkami na sredini zaslona, merilni razpon pa z majhnimi črkami na dnu zaslona.
Merilnik frekvence ima dve merilni območji: osnovno (1 Hz–10 MHz) in razširjeno (0,1 Hz–10 MHz). Takoj po vklopu merilnik frekvence prikaže, kateri merilni razpon je aktiven (slika 8a). Medtem ko je to sporočilo na zaslonu, lahko merilni razpon spremenite s pritiskom na tipko S2 za več kot pol sekunde. Sprememba se shrani v EEPROM in ostane veljavna do naslednje spremembe.
Sporočilo, ki prikazuje izbrani merilni razpon, se izbriše po približno 2 sekundah, nato pa merilnik začne meriti frekvenco vhodnega signala. Signal mora biti pravokotne oblike, združljiv s TTL ali HCT, z optimalno amplitudo 2,5–5 V. Merilnik samodejno izbere merilni razpon, v katerem lahko doseže največjo natančnost.
Možna sta dva načina prikaza:
Izmerjena frekvenca se prikaže z velikimi črkami na sredini displeja, perioda pa z manjšimi črkami na dnu displeja (b) in
Izmerjena perioda je prikazana z velikimi črkami na sredini displeja, frekvenca pa z manjšimi črkami na dnu displeja (c).
Način prikazovanja se spremeni ob pritisku na tipko S2 in ostane shranjen do naslednje spremembe. Odzivni čas tipke S2 je odvisen od merjene frekvence in znaša približno 0,5 s pri višjih frekvencah, 1–2 s pri frekvencah okoli 1 Hz ter do 20 s pri najnižjih frekvencah. Prikaz je neodvisen od izbranega merilnega območja.
Najvišja frekvenca, ki jo lahko merilnik izmeri, je 9,9999 MHz. Če je frekvenca višja, se bo glede na izbrani način prikazovanja prikazalo sporočilo d) ali e).
Če je izbran osnovni merilni razpon, je najnižja frekvenca, ki jo je mogoče meriti, 1 Hz. Če je izbran razširjeni merilni razpon, je najnižja frekvenca, ki jo je mogoče meriti, 0,1 Hz. Kadar je vhodna frekvenca prenizka, se prikaže sporočilo f) ali g). Če to stanje traja več kot eno minuto, se svetlost zaslona zmanjša na najnižjo raven, merilnik frekvence pa preide v stanje pripravljenosti. Merilnik se samodejno vklopi takoj, ko vhodna frekvenca pade v merilni razpon.
Opombe
Odzivni čas po pritisku na tipko S2 je odvisen od izmerjene frekvence, saj mora mikrokontroler najprej zaključiti trenutno merjenje, preden preveri stanje tipke. Pri frekvencah pod 1 Hz lahko to traja 10–20 sekund. Torej, če ne nameravamo meriti tako nizkih frekvenc, priporočam, da izberete osnovno merilno območje, 1 Hz–10 MHz – program bo deloval precej hitreje, delo z napravo pa bo bolj tekoče.
Teoretično mora biti najvišja frekvenca, ki jo lahko izmerimo s štetjem impulzov, nižja od polovice frekvence takta. Glede na to merilo bi v našem primeru najvišja frekvenca, ki jo lahko izmerimo, znašala 12 MHz. Vendar to velja le, če je razmerje med signalom in pavzo 1:1 in če ima signal pravokotne robove ter popolnoma pravokotno obliko. V nasprotnem primeru se najvišja frekvenca zmanjša, saj mikrokontroler ne bo mogel prepoznati vsakega impulza. Na primer, naš merilnik ne bo pravilno izmeril frekvence 8 MHz, če je razmerje med signalom in pavzo 1:2 ali večje. (Meritev, prikazana na fotografiji na sliki 9, je izjema: ker merilnik in generator poganja isti kvarčni oscilator, oba mikrokontrolerja delujeta »v fazi«, zato na merilnik pri tej frekvenci ne vpliva razmerje med signalom in pavzo 1:2.)
Razmerje med signalom in pavzo ne vpliva na natančnost merjenja, dokler je trajanje impulza ali pavze daljše od trajanja enega takta. V našem primeru bi ta meja znašala 41,7 ns, tudi če bi bili impulzi idealno oblikovani.
Programe f_met_ATtiny84_SE.bas in f_ref_ATtiny44_SE.bas ter knjižnico OLED$SSD1306_32x128_mali.sub lahko dobite v uredništvu revije Svet elektronike!
