Miki Maus i projektovanje |
Voja Antonić |
Mada projektovanje digitalnih uređaja može da bude i rutinski posao, kreativnim zahvatima se projekat može značajno pojednostaviti i uz to učiniti efikasnijim... |
Kad se nađe pred projektnim zadatkom, iskusni stručnjak će odmah imati ideju kako će koji
problem rešiti i kakav će biti globalni koncept uređaja. Za ovo može da zahvali iskustvu, ali
"biblioteka rešenja" koju čuva u glavi često će ga sprečiti da upotrebi kreativnost tamo gde za
nju ima mesta. Zbog toga, analizirajući mikroprocesorske uređaje svetskih proizvođača, nalazimo
malo rešenja u kojima ima lepote, duha i invencije - ona obiluju konstruktorskim stereotipima,
koji su neoptimizovani, skupi i glomazni.
Mada neki konstruktori, školovani na klasičnim kanonima digitalne tehnike, ovakva rešenja s
potcenjivanjem nazivaju "Miki Maus logikom", to ne bi trebalo da nas spreči da da pustimo mašti
na volju i da projektovanje tretiramo kao kreativni proces...
U službi meteorologije
Ovoga puta ćemo se baviti jednim meteorološkim instrumentom, koji meri brzinu i pravac vetra.
Mada se radi o konkretnom uređaju (slika 1) koji je sagrađen i već dugo u funkciji, nećemo se
upuštati u detaljan opis projekta. Umesto toga, zadržaćemo se na nekim interesantnim detaljima,
pošto preostali deo projekta nosi standardna rešenja, koja je dovoljno samo pomenuti.
Uređaj se sastoji od dve fizičke celine: senzor se nalazi na krovu zgrade, a pokazivač u
prostoriji. Povezani su kablom kroz koji se senzor napaja i šalje podatke do pokazivača. Meri
se brzina vetra uz pomoć standardnog trokrakog rotora sa poluloptastim "hvatačima vetra" i
pravac vetra pomoću vetruške sa jednim krilcem, kao kod starinskih "petlova" na dimnjacima.
Izmerena brzina se prikazuje na numeričkom displeju, a pravac na kružnom nizu od 36 svetlećih
dioda, od kojih je uvek samo jedna upaljena, dakle rezolucija je 10 lučnih stepeni.
Za praćenje brzine obrtanja rotora upotrebljen je magnetni ( hall effect ) senzor, koji se
pobuđuje permanentnim magnetom fiksiranim na rotoru. Situacija sa merenjem pravca vetra je
nešto složenija: postoji šest optičkih refleksionih senzora koji registruju ugaoni položaj
vetruške, pomoću specijalne "šare" iscrtane na disku. Svi ovi podaci se kroz kabl šalju do
pokazivača (dakako, mikroprocesorskog) koji se nalazi u prostotriji.
U kolonu po jedan
Obzirom da je kabl koji spaja ove dve jedinice dug (često preko deset metara) i da je, zbog
rizične montaže i atmosferskih uticaja, prilično "povrediv" deo uređaja, prvi zahtev je da se
svede na što manji broj vodova, ne samo da bi bio jeftiniji i lakši, nego i da bi se
pojednostavila montaža senzora na krovu. Priznajte da je teško priključiti 9-žilni kabl (7
signala, masa i napajanje, kako je trebalo da bude u prvoj verziji) na ploču senzora smeštenu u
kućište jedva nešto veće od loptice za ping-pong, i da to još bude robusno i dobro zaštićeno od
vlage.
Treba, dakle, paralelnu komunikaciju zameniti serijskom, jer kad bitove poređamo "u kolonu po
jedan", umesto devetožilnog biće nam dovoljan i trožilni kabl. Sad počinju da se rađaju
problemi: kako osmisliti sklop koji vrši paralelno-serijsku konverziju 7-bitnog podatka?
Najlakše bi bilo za ovo zadužiti jedan mali i ekonomičan mikrokontroler (recimo, PIC 16C54),
ali uslovi rada sklopa to ne dozvoljavaju: temperatura na krovu zgrade može da se kreće u
granicama koje su šire od radnog opsega standardnog mikrokontrolera, koji je samo od 0 do 70
°C. Kola sa proširenim radnim opsegom su skupa i teško ih je pronaći na tržištu, ali nešto ipak
treba uraditi, samo šta? Mogao bi se dograditi grejač (da ne kažemo žičani otpornik) za
regulaciju temperature zimi, ali šta uraditi leti, kad se kućište senzora usija na suncu?
Srećom, pregled karakteristika svih logičkih familija nam je pokazao jedan ohrabrujući podatak:
CMOS serija CD4000 u najgorem slučaju ima temperaturni radni opseg od -40 do +85°C, što bi
moglo da bude dovoljno. Potrošnja struje je mala, kao i cena, a niska brzina rada je u ovom
slučaju više prednost nego nedostatak, jer osigurava dobru imunost na smetnje, naročito ako u
komšiluku imate nekog radioamatera koji je montirao antenu na dva metra od vašeg senzora.
Manje-više je poznato kako izgledaju diskretna rešenja za serijske davače, ali dobra
optimizacija će nam pokazati da je moguće ostvariti sklop sa samo dva kola: brojač CD4060, koji
sadrži i ulazne invertore pogodne za kvarcni ili RC oscilator i 8-ulazni selektor CD4512.
Pogled na šemu na slici 2 će nam razjasniti princip rada: brojač CD4060 osigurava sekvencijalno
prozivanje jednog po jednog ulaza na selektoru CD4512, i njegovo prosleđivanje do izlaznog
tranzistora. Prvi ulaz je uvek na logičkoj jedinici, i to je start bit, sledi 7
data bitova, a stop signal je, silom prilika, produžen i traje kao 8 bitova. Za ovo
je nadležan INH ( inhibit ) ulaz selektora, koji, kad je logički visok, forsira izlaz na
nizak nivo, bez obzira na stanja na data ulazima. Ovo produžavanje stop signala je
ne samo poželjno, nego i neophodno, jer uvek osigurava ispravno prepoznavanje start bita
od strane prijemnog kola (koje se nalazi na drugom kraju kabla). Kod ovakvih sklopova, gde se
vrši permanentna predaja niza bajtova bez pauze, sa standardno kratkim stop bitom bi
postojala opasnost da prijemnik neki data bit, koji je slučajno stalno visok, pogrešno
detektuje kao start i da nadalje celu sekvencu prima neispravno.
Ovakav sklop omogućava permanentno slanje 7-bitnog podatka po svim standardima za serijski
asinhroni prenos. Srećna okolnost je da nam je u ovom slučaju bio potreban prenos sedam bitova
(šest za poziciju senzora za smer vetra i jedan za brzinu), jer da je bio potreban samo još
jedan bit, košta bi na nas još jedno kolo.
Na prijemnoj strani je dovoljno postaviti jedan pull-up otpornik i signal voditi direktno
na serijski ulaz mikrokontrolera (P3.0 ako je u pitanju 8031), ali nikako ne treba zaboraviti
zaštitu od prenapona i impulsnih smetnji (ovo nije nacrtano na šemi). Još bolje rešenje je da
se signal prosledi optokaplerom, a da se senzor napaja iz zasebnog, galvanski odvojenog
ispravljača. Ovo bi bila dovoljna zaštita od manjih elektrostatičkih naboja, ali pravu
sigurnost od većih električnih pražnjenja bi nam dala samo optička komunikacija kroz
svetlovodna vlakna, jer se radi o opto-senzorima.
U principu je moguće ovakav signal dovesti na serijski ulaz standardnog PC-ja, naravno preko
kola koje je u prošlom broju časopisa opisano pod naslovom "Jedna mala podvala". Ako treba
invertovati signal (a ovde to jeste slučaj), ulaz 0 selektora CD4512 treba spojiti na masu, a
ulaze INH i DIS ( 3-state disable ) međusobno zameniti i na izlaz selektora postaviti jedan
pull-up otpornik prema pozitvnom polu napajanja. Ovako ćemo na kolektoru tranzistora
dobiti visok start i niske stop bitove, a smisao data bitova ćemo, ako
je potrebno, lako invertovati softverski, na prijemnoj strani.
Kolo CD4060 je binarni brojač koji ima izvedene izlaze Q4 do Q10, pa je Q11 preskočen (iz nekog
nejasnog razloga nije izveden na nožicu kola), pa slede izlazi Q12, Q13 i Q14. Pošto nam
trebaju četiri susedna izlaza, možemo da koristimo izlaze Q7-Q10, ali nikako nije moguće
koristiti izlaze Q12-Q14. Na šemi je data rezonantna učestanost kvarc-kristala za brzinu 4800
bauda.
Kolo sa šeme je, zajedno sa svim senzorima, zahvaljujući upotrebi SMD komponenata, realizovano
na kružnoj štampanoj pločici prečnika 30 mm. Tako je ispunjen uslov da se dobije senzor malih
dimenzija.
Dobitna kombinacija
Senzor za pravac vetra je zapravo apsolutni ugaoni optički enkoder sa Grejovim kodom. Da se
malo jasnije izrazimo, očitavanje ugaone pozicije osovine se obavlja optičkim senzorima, koji
detektuju svetle i tamne površine na obrtnom disku. Ono "apsolutni" znači da u svakom trenutku
može da očita apsolutnu ugaonu poziciju, za razliku od inkrementalnog, koji može da čita samo
priraštaj ugla.
Zahtevana rezolucija je 36 pozicija po celom krugu (10 ugaonih stepeni). Jasno je da nam za
predstavljanje ugla treba 6 bitova. Ako bismo koristili standardni binarni kod, postojala bi
opasnost da se na prelaznim tačkama, kad više bitova istovremeno menja stanje, dogodi fatalna
greška zbog mikronske nepreciznosti u izradi i očitavanju, jer su neki bitovi već promenili
stanje, a drugi nisu. Ovaj problem se rešava pomoću Grejovog koda, kod koga se na prelezu
između dve susedne pozicije uvek menja samo po jedan bit.
Grejov kod ima i jedan nedostatak: koliko imamo bitova (ili senzora), toliko nam treba optičkih
zapisa, dakle kod bi morao da bude zapisan na valjkastoj površini cilindra (što bi zahtevalo
velike dimenzije) ili na disku sa šest različitih prstenastih zapisa, sa različitim
poluprečnicima, što bi takođe zahtevalo veliki senzor.
Malo matemetičke kombinatorike je dovelo do jednog srećno uklopljenog (i potpuno nestandardnog)
koda koji ima samo jedan zapis (dakle, svi senzori se nalaze na jednakom rastojanju od obrtne
ose), a pri svakoj promeni ugla se menja samo po jedan bit. Postoji i ekstra pogodnost - ugao
između svaka dva susedna senzora je 60°, dakle senzori su poređani u pravilnoj lepezi oko
osovine, što olakšava preciznu montažu refleksionih optičkih senzora na minijaturnu štampanu
ploču. Ovaj kod je prikazan na slici 3: senzori su označeni parovima strelica. Zadatak softvera
u pokaznoj jedinici uređaja je da pomoću tablice izvrši konverziju očitanog koda u ugao i da
upali jednu od 36 svetlećih dioda na kružnom nizu.
Mozgalica za matematičare
U ovom projektu je postojao još jedan izazov koji konstruktora ne ostavlja ravnodušnim. Zahtev
je bio da se, na posebnu komandu, prikaže i srednja vrednost očitane brzine i pravca vetra za
određeno vreme. Za računanje srednje vrednosti brzine nema nikakvih teškoća, jer je to samo
aritmetička sredina određenog broja memorisanih vrednosti, ali varate se ako mislite da je
usrednjavanje ugla tako jednostavno. I danas se u krugovima zaljubljenika u mikrokontrolere
priča o jednom od "jačih" bagova koji je, nepažnjom programera, zaobišao sve testove i ušao u
stariji tip istog ovakvog uređaja.
O čemu se radi? Ako ugao varira od 39° do 41°, biće ispravno izračunata srednja vrednost od
40°, što je u redu, ali ako varira između 359° i 1°, onda će biti izračunata srednja vrednost
od 180° (pa to je sredina, zar ne?).
Problem je, koliko smešan, toliko i neugodan. Rešenja ima više, a vešt matematičar bi pronašao
i bolji način, ali opredelio sam sa za algoritam koji pomalo zloupotrebljava trigonometriju. Za
svaku memorisanu vrednost ugla se izračunava sinus i kosinus (iz tablice, jer je rezolucija
mala), zatim se računaju srednje vrednosti za obe ove veličine, a onda se iz te dve srednje
vrednosti jednom operacijom deljenja dobija tangens. Iz druge tablice se tangens konvertuje u
ugao (to je brže nego "pošteno" računati arc tg ), i to je srednja vrednost ugla. Problem
deljenja sa nulom je rešen posebnim testom u programu koji nije vodio na poruku greške, nego na
fiksnu vrednost ugla od 90° ili 270°, zavisno od predznaka srednje vrednosti sinusa.
Nisam uspeo da matematički dokažem tačnost ovog algoritma, ali niko od naručilaca nije zapazio
ništa neobično. A to je najvažnije, zar ne?
|