U jednom od prethodnih tekstova prikazali smo način konstruisanja elektronskog hronometra pomoću hibridnog unipolarnog koračnog motora. U ovom tekstu ćemo prikazati unapređenu verziju tog projekta. Unapređenja se ogledaju u smanjenju broja korišćenih nožica mikrokontrolera uvođenjem multipleksno upravljanog displeja, smanjenju potrošnje struje promenom upravljanja koračnim motorom. Kontrolu hronometra ćemo izvoditi pomoću dva tastera.
Analiza hardvera
Tri od četiri promene koje smo izvršili odnode se praktično samo na softverski deo. Razmotrimo ih ukratko. Tasteri za kontrolu, i dalje su spojeni direktno na ulazno/izlaznu nožicu mikrokontrolera, a zahtevana razlika će se implementirati promenom softvera.
Smanjenje potrošnje struje ćemo postići uključivanjem struje kroz namotaje motora samo kada je to neophodno. Drugim rečima, struju puštamo kroz namotaj samo ako motor treba da se pokrene. U suprotnom, kada motor stoji, struja će biti nulta kroz sve namotaje. Na taj način, potrošnja energije se drastično smanjuje, a zajedno s njom i disipirana toplota. Ovo možemo da uradimo ovako jer koristimo hibridni koračni motor (sa stalnim magnetom) koji ima ne-nulti moment držanja položaja rotora bez pobudne struje, naravno daleko manji od pogonskog koji imamo kada kroz neki namotaj poteče struja. Na ovaj način, motor će zadržati svoj položaj čak i kada isključimo struju namotaja i bez ulaganja energije sačekati pobudu koja će ga pomeriti na položaj koji odgovara sledećem koraku. Ovo, opet zahteva promene samo u softveru, hardver ostaje neizmenjen.
Deo hardvera koji je pretrpeo najveće izmene je dvocifreni sedmosegmentni displej. Zbog zahtevanog multipleksnog prikaza, ovaj deo je kompletno prerađen. Pre nego što se upustimo u razmatranje konačne izvedbe, razmotrimo princip rada multipleksnog displeja. Posmatrajmo primer u kom je potrebno kontrolisati 12 LED-ova i pomoću njihove svetlosti formirati određeni, unapred zadati linijski segment, npr. dve upaljene, dve ugašene, itd. Pri tome, da bismo uštedeli na prekidačima, nećemo koristiti njih 12, koliko ima LED-ova, nego manje. Napomenimo da, jasnosti radi, nećemo odmah primeniti najoptimalniju varijantu.
Slika 1. Jednostavan primer multipleksa
Posmatrajmo kolo dato na slici 1. Vidimo da se zajedno vezane katode četiri LED-a (iz različitih trojki) mogu (donjim) prekidačem spojiti na masu. Sa druge strane, preko četiri (gornja) prekidača možemo da dovedemo (ili ne dovedemo) struju do anoda sva tri LED-a u okviru jedne trojke. Struja će teći kroz neki LED ako je i prekidač uz katodu i uz anodu uključen. Jasno je da na ovaj način ne možemo nezavisno da kontrolišemo svetljenje svakog LED-a i da ne možemo da obavimo postavljeni zadatak. No zahvaljujući tromosti ljudskog oka, ovo ipak možemo da uradimo tako, da posmatrač ima utisak da se nezavisno kontroliše svetlost svakog LED-a. Prvo ćemo uključiti prekidač iznad prve trojke, a od donjih samo one koje se nalaze ispod LED-ova koji treba da svetle u okviru ove trojke. Nakon određenog vremena, isključujemo prekidač iznad prve i uključujemo iznad druge trojke, a donje uključujemo i isključujemo u skladu sa rasporedom svetlećih LED-ova u drugoj trojci. Ovaj ciklus nastavljamo sa samo trećim, a potom samo sa četvrtim gornjim prekidačem uključenim, dok donji određuju koji LED svetli u okviru određenje trojke. Dakle u svakoj trojci za četvrtinu trajanja celog ciklusa zasijaju LED-ovi koje oko treba da vidi kao upaljene. Recipročna vrednost trajanja ciklusa, naziva se frekvencija osvežavanja. U praksi se pokazuje da je ljudsko oko u stanju da primeti treperenja frekvenije niže od oko 50Hz, te u skladu s tim frekvencija osvežavanja ne bi trebalo da bude niža od toga. Svi segmenti koji svetle kod multipleksiranog displeja kao upravo opisani svetle samo određeni deo vremena, a oko registruje priližno integral emitovane svetlosne energije. Da se zbog multipleksa ne bi izgubilo na svetlini segmenta, u intervalima kada LED svetli intenzitet treba da bude n puta veći nego zahtevani intenzitet svetljenja, gde je n broj m-torki koje se multipleksiraju (u našem primeru n=4, m=3 što znači da imamo četiri trojke).
U slučaju hronometra sa dvocifrenim sedmosegmentnim displejem, imaćemo n=2, m=7. Ako imamo sedmosegmentni displej sa decimalnom tačkom i hoćemo da ostavimo mogućnost kontrole decimalne tačke, biće m=8.
Izvedba hardvera
Kompletna šema, data je na slici 2. Jedina značajna promena u odnosu na prethodnu verziju jeste multipleksni displej, tako da ćemo se osvrnuti samo na njega. U prethodom zadatku smo pomenuli da korišćenje portova mikrokontrolera za direktan pogon LED-ova nije preporučljivo kada je u pitanjau 8051, barem ne bez detaljnje analize. Pošto je pri multipleksu LED-ovima potrebno obezbediti veću struju nego bez njega, sada njihov pogon direktno sa porta ne dolazi u obzir. Primenićemo dodatno bafersko kolo značajnih strujnih mogućnosti koje će sa lakoćom da obezbedi potrebnu struju multipleksnom displeju – opredelili smo se za osmobitni, invertujući bafer (engl. buffer/bus driver) 74LS540. Ulogu donjih prekidača sa slike 1. preuzima pomenuto integrisano kolo – pošto imamo osam elemenata u jednoj grupi, osmobitni bafer je upravo ono što nam treba. Sa principske šeme, takođe vidimo da su nam potrebni i prekidači za izbor multipleksne grupe (gornji prekidači, slika 1). U ovom slučaju, to ćemo najjednostavnije postići bipolarnim PNP tranzistorom. Tokom rada sistema, uvek će jedan od dva tranzistora biti uključen i spajaće zajedničku anodu odgovarajuće cifre na napon napajanja. Na toj cifri, svetleće svaki segment čiju katodu bafer dovede na nizak nivo. Na ovoj način, nezavisno kontrolišemo svaku cifru i moći ćemo pomoću softvera u mikrokontroleru da ostvarimo multipleksni prikaz cifara. Iz već ranije analiziranih razloga, vrednosti otpornika preko kojih se napajaju LED segmenti, smanjene su na 820Ω.
Slika 2. Konačna šema hardvera unapređenog hronometra
Analiza softverskog rešenja
Za realizaciju zadatka, biće korišćen donekle izmenjen algoritam. Većina operacija će se izvoditi u glavnom programu (u glavnom toku programa), a jedan jedini prekid (kojeg generiše tajmer) će biti iskorišćen samo da da sinhronišući signal glavnom toku programa. Glavni tok programa predstavljaće jednu veliku petlju koja će u skladu sa sinhronišućim signalom pomerati kazaljke, osvežavati displej za minute, očitavati kontrolne tastere i reagovati na korisnikove komande.
Sama eliminacija odskakanja kontakata se izvodi periodičnim očitavanjem signala sa tastera i upoređivanjem sa zapamćenim stanjem od prethodnog očitavanja. Ukoliko postoji razlika, počinje se sa praćenjem signala koji prispevaju sa tastera. Ukoliko se utvrdi, da se u M uzastopnih očitavanja signal nije menjao (ne postoji razlika u očitanom stanju i stanju zapamćenom od prethodnog očitavanja), smatra se da odskakanja kontakata više nema i poslednje očitano stanje se smatra validnim. M obično ima vrednost od 3 do 10 u zavisnosti od kvaliteta tastera.
Pri diferenciranju, prate se promene na prethodno pročišćenom signalu upoređivanjem sa prethodno zapamćenim stanjem. Ako se detektuje promena, testira se novo stanje signala; zastavica koja treba da pokrene neku aktivnost na odgovarajuću ivicu signala se postavlja u aktivno stanje ako je novo stanje signala visoko ili nisko, zavisno od toga da li se očekuje rastuća ili opadajuća ivica.
Ovde možete skinuti .c file ovog programa za mikrokontroler.
Analiza programa
Konstante, pretprocesorske direktive i korisnički tipovi
Preogram je prilagođen prevodiocu SDCC. Heder fajl uz #include direktivu mogao bi da se razlikuje prilikom upotrebe nekog drugog prevodioca. Definisan je tip byte kao neoznačena osmobitna vrednost. Vrednost TIVAL je u vezi sa periodom i režimom rada tajmera i biće objašnjena zajedno sa inicijalizacijom tajmera.
Konstantni nizovi, enumerisani tip i globalne promenljive
Opet, dva konstantna niza neophodna za ispravno pobuđivanje displeja i koračnog motora moraju biti definisana. Definisanje nizova kao konstantnih dovoljno je da prevodilac za njih predvidi mesto u programskoj memoriji, štedeći na taj način RAM i programski kod potreban za njihovu inicijalizaciju. Primetimo da za uključivanje faze motora, na odgovarajući bit porta moramo dovesti logičku jedinicu. Da bi se određeni segment displeja uključio, priključak katode mora biti na niskom nivou, a pošto je bafer invertujući, u istom slučaju nožica porta mora biti na visokom nivou. Elimenti niza, definisani su u skladu sa upravo izloženim.
Hronometar se može naći u tri različita stanja – zaustavljen (stopped), uključen (running) i u fazi izvođenja reseta (raceback). Za kodovanje trenutnog stanja koristi se enumerisani tip state.
Kao i u prethodnoj verziji, svi podaci bitni za funkcionisanje hronometra skladište se u globalnim promenljivama. Na ovaj način, izbegava se prenos podataka među funkcijama pomoću parametara što nosi određene uštede u sistemima koji rapolažu samo ograničenim resursima kao što je i ovaj razmatrani. Šta koja promenljiva znači, biće objašnjeno uz objašnjenje odgovarajućeg dela koda.
Funkcija Init – inicijalizacija sistema
Ova funkcija ima ulogu da sistem nakon reseta dovede u početno stanje. To obuhvata postavljanje svih promenljivih na početne vrednosti potrebne za ispravno funkcionisanje algoritma rada hronometra, kao i podešavanje hardverskih komponenti mikrokontrolera.
Važan element za funkcionisanje sistema jeste tajmer 0. Jedan od problema sa prethodnom verzijom hronometra bio je problem nepreciznosti čiji su uzrok bili kašnjenje odziva na prekid i režim rada tajmera u kom se on ne reinicijalizuje hardverski. Da bi se taj problem prevazišao i potpuno eliminisao, u ovoj unapređenoj verziji, tajmer radi u modu 2 u kom se nakon preteka i generisanja prekida automatski reinicijalizuje na unapred određenu vrednost bez uticaja servisne funkcije prekida. Na taj način, kašnjenje odziva na prekid više nema nikakvog uticaja na tačnost. Jedino, tajmer je u ovom modu osmobitni i nije moguće postići merenje intervala od 10ms kao u prethodnom slučaju, ali to nije ni neophodno kao što će se videti u nastavku. Tajmer se podešava na vrednost reinicijalizacije od -192 što rezultuje generisanjem prekida svakih
Funkcija T0_svr – servisna funkcija prekida tajmera
Za ispravno funkcionisanje algoritma čiji najveći deo implementira glavni program, potrebno je merenje intervala vremena od 10ms. Nakon isteka tog intervala, postavlja se zastavica tick na vrednost 1. Ista se resetuje u glavnom programu.
Pošto se prekid dešava svakih 250μs, za zahtevani interval od 10ms, potrebno je izbrojati 40 prekida. Upravo to radi i ova servisna funkcija prekida. Promenljiva icnt se pri svakom pozivu uvećava. Kada izbroji 40 poziva, postavlja zastavicu, a promenljiva icnt se resetuje na nulu.
Funkcija MotorOFF
Ova funkcija jednostavno postavlja sve nožice koje kontrolišu struje faza na nizak logički nivo, ukidajući struje u svim fazama.
Funkcija Step
Pozivanjem ove funkcije, pobuda koračnog motora se menja na takav način da će motor načiniti jedan korak napred ili nazad u skladu sa vrednosti promenljive dir. Osim toga, ažurira interni brojač položaja kazaljke, što je bitno za ispravno izvođenje reseta i prikaz proteklih minuta. Nakon 200 izbrojanih koraka, uvećava se brojač minuta i ujedno se i izračunavaju prva i druga cifra broja proteklih minuta u decimalnom brojnom sistemu. Način rada je identičan kao u prethodnoj verziji hronometra, te nećemo zalaziti u dalje detalje.
Funkcija main
Na samom početku, dešava se inicijalizacija sistema pozivom funkcije Init. Nakon toga sledi beskonača petlja izvedena pomoću while(1). Unutar nje je jedan jedini if uslov: if(tick). Dakle, najveći deo funkcije main, nalazi se unutar ovog if uslova, a na samom kraju dela koji se izvršava ako je uslov ispunjen, nalazi se tick=0. Ovim se obezbeđuje da se svakim prekidom koji izazove tajmer 0 (svakih 250μs), jednom izvrši kod unutar if bloka. Ostatak vremena algoritam samo kruži u beskonačnoj petlji. Kod unutar if bloka, podeljen je na nekoliko celina koji su komentarima jasno obeleženi. Analiziraćemo ih redom.
Sekcija za osvežavanje displeja je prva celina u okviru ovog dela. Ako svakih 10ms aktiviramo drugu cifru na multipleksnom displeju, ukupna perioda će iznositi 20ms što odgovara frekvenciji osvežavanja od 50Hz. Zastavica dispdigit označavaće da li se prikazuje prva ili druga cifra. U skladu s tim se niskim nivoom na odgovarajućoj nožici porta 1 aktivira PNP tranzistor koji će strujom napajati samo cifru koju u toj poluperiodi hoćemo da prikažemo. Cifre su sadržane (izračunate u funkciji Step) u promenljivama d1 i d0. One se koriste kao indeksi za konstantan niz digits, a upisom odgovarajućeg elementa na izlazni port, na displeju se formira potrebna cifra.
Pogon kazaljke radi sekcija za pogon kazaljke. Princip rada je gotovo identičan sa onim primenjenim u prethodnoj verziji hronometra. U zavisnosti od stanja (running, stopped ili raceback) kazaljka se pomera na potrebnu stranu ili miruje. Bitna razlika je u drastičnom smanjivanju potrošnje potpunim isključivanjem struja kroz fazne namotaje u trenucima kada pomeranje nije potrebno – na tim mestima, pozivom funkcije MotorOFF, isključuju se struje – nakon što je kazaljka završila sa skokom i kada miruje jer je hronometar zaustavljen.
Eliminacija odskakanja kontakata je sledeći važan zadatak. U promenljivoj oldtast, skladišti se prethodno očitavanje ulaznih portova na koje su tasteri priključeni. U našoj implementaciji, zbog uštede, zajedno se očitavaju oba tastera zbog čega će odskakanje kontakata na jednom tasteru da blokira očitavanje i na drugom sve dok se odskakanje ne završi. Pošto nije neophodno da se istovremeno koriste oba tastera, ovo možemo tolerisati. Provera da li postoji razlika između novog očitavanja i prethodnog izvodi se pomoći isključivo ili (XOR, EXOR) operacijom. Ukoliko neka dva bita nisu jednaka, na tom položaju će se pojaviti logička jedinica. Dakle, ukoliko razlika postoji, rezultat operacije će biti različit od nule, tj. uslov if iskaza će biti ispunjen. Ukoliko se razlika utvrdi, zastavica difok se deaktivira, a brojač safw se inicijalizuje na 5. Svakom sledećom prilikom kada se utvrdi da su očitano i zapamćeno stanje jednaki, umanjuje se brojač safw, a kada dostigne vrednost nula, zastavica difok se ponovo aktivira. difok označava da je očitano stanje na tasteru validno i da diferenciranje sme da se obavi. Na ovaj način, zahtevamo da u 5 uzastopnih očitavanja savkih 10ms na tasteru imamo neizmenjen signal. Nakon toga smatramo da se odskakanje završilo i da su signali stabilni.
Diferenciranje signala sa tastera se radi samo kada su se signali na tasterima stabilisali, a na to ukazuje zastavica difok. Ponovo se poredi novoočitana vrednost sa portova sa ranije zapamćenim prethodnim stanjem olddif i to operacijom isključivo ili i skladišti se u promenljivoj dres. Posebna pogodnost je što je u dres bit na položaju nekog tastera jedinica ako je došlo do promene na tom tasteru. Upravo se to proverava pomoću sledeća dva if uslova. Ako je do promene stanja došlo i trenutno stanje bita je nula, to znači da je u pitanju opadajuća ivica, odnosno taster je upravo pritisnut, a to je ono što želimo da registrujemo. Ta informacija se prosleđuje postavljanjem zastavica SW1 ili SW2 na jedinicu, označavajući da treba preduzeti odgovarajuću akciju u sledećem segmentu glavnog programa.
Poslednja sekcija jeste reagovanje na tastere tj. promena stanja hronometra u zavisnosti od korisnikove akcije (pritiska na tastere). Sa dva if uslova ustanovljava se koja je zastavica aktivirana (SW1 ili SW2) i menja se stanje hronometra u skladu sa tim. Redosled provera zastavica određuje i prioritet određenih tastera – start/stop ima prioritet nad resetom. Nakon što se odregovalo na bilo koji taster, obe zastavice SW se brišu.
Literatura:
- Mikrokontroler 8051/8052, Praktikum za laboratorijske vežbe – Miloš Slankamenac , Kalman Babković , Ivan Mezei
Fakultet tehničkih nauka, Katedra za elektroniku