Osnovni signali ovog interfejsa su osam linija za podatke D0..D7, kontrolna linija STROBE koja je ulazni signal i još dva izlazna BUSY i ERROR. Svi ovi signali su aktivni na niskom nivou, dakle na nuli. STROBE signal dolazi sa računara i označava da su podaci na linijama za podatke ispravni i da bi prijemni uređaj trebalo da ih preuzme. Postoji i signal ACK u specifikacijama interfejsa ali on se često izostavlja pa je izostavljen i ovde. On bi trebalo da potvrdi prijem podatka. Linija BUSY je na niskom nivou kada uređaj ne može da prima podatke jer je zbog nečeg zauzet. Ovde je aktivan dok se vrši pozicioniranje ili pomeranje signalizirajući računaru da je posao u toku i da čeka sa narednom komandom.
Prvo, koja reč o tome, kako su izlazni i ulazni signali raspoređeni pa portovima mikrokontrolera. P0 služi kao ulazni port za podatke sa paralelnog interfejsa. Na njega su vezane linije D0..D7. P1 upravlja prekidačkim tranzistorima i to sa četiri njih preko donja četiri bita tog porta. P2 upravlja izlaznim kontrolnim signalima paralelnog interfejsa i prima ulazne kontrolne signale. Tačan raspored označen je na šemi koja je data na kraju. P3 nije upotrebljen niti kao port, niti ijedan njegov bit kao neki specijalni ulazno/izlazni pin.
Na samom početku, definisane su promenljive. Čitava lista navedena je na početku asemblerskog listinga. To su vrednosti koje moraju da se čuvaju tokom rada programa jer čuvaju vrednosti od značaja. Te se vrednosti izračunavaju tokom rada programa. Tu su recimo upravljačke reči koje su stigle preko interfejsa, broj potrebnih pomeranja, položaj motora itd.
Na redu je zatim nekoliko instrukcija skokova na odgovarajućim mestima, konkretno na adresi 0000h i 000Bh. Prva adresa je adresa sa koje počinje izvršavanje programa pa ta lokacija sadrži instrukciju skoka na rutinu za obradu reseta. Drugim rečima to je ulazna tačka celog upravljačkog programa. Druga adresa je adresa na koju se skače ako dođe do prekida zbog prekoračenja tajmera 0. To je dakle mesto gde treba da se preusmeri tok programa na rutinu za obradu tog prekida.
Sledeće, na adresi 0010h počinje deo programa koji sprovodi reset akciju. Na početku, postavljaju se neke osnovne promenljive, stek se postavi na odgovarajuće mesto, ulazni portovi se programiraju na jedinice da bi mogli nesmetano da primaju, korisnički flegovi se dovode u početna stanja. Nakon toga kreće se sa dovođenjem pisaće glave u nulti položaj. To se izvodi tako što se motor okreće u desnom smeru i to osam koraka jer za osam koraka motor mora da počne da se okreće u skladu sa pobudom bez obzira na svoj inicijalni položaj. Posle se motor pobuđuje da se okreće u levom smeru i to korak po korak sve dok detektor nultog položaja ne detektuje nulti položaj. Sad smo sigurni da poznajemo položaj motora, postavljamo promenljivu koja sadrži položaj motora na nultu vrednost, i sve je spremno za normalan rad.
Sledi deo koji rukuje paralelnim interfejsom. Čeka se na STROBE signal. Čim on postane nizak, preuzme se reč sa P0. Čeka se na prestanak STROBE signala ako se to već nije desilo, a odmah zatim, čeka se sledeći. Kada se desi, preuzme se i druga reč sa P0. Kratko se analizira komanda i prelazi se na izvršenje komande. Postavljaju se flegovi smera, izdvoji se broj koraka i konačno poziva odgovarajući potprogram – koračanje ili pozicioniranje. Ukoliko se desila greška što se indikuje flegom za grešku, čeka se na potvrdu od računara tj. signal ERROR_ACK. Posle toga se vraća na glavnu petlju upravljača interfejsom. Mora se na ovom mestu objasniti i format upravljačkih reči. Svaka se sastoji iz šesnaest bita koji uvek stižu u dva dela jedan za drugim. Kada drugi stigne, prelazi se na izvršenje komande. Druga reč je jednostavno niža reč broja koraka. Prva reč u svoja niža četiri bita sadrži višu reč. Preostala četiri bita određuju komandu. Ako je četvrti bit te reči jedinica, odmah se prelazi na reset sistema standardnom reset rutinom. Šesti bit govori da li je pomeranje na levo(1) ili na desno(0). Sedmi bit određuje vrstu komande – koračanje(0) ili pozicioniranje(1). Ako je u pitanju koračanje odradi se zadati broj koraka (ukoliko je moguće) u zadatom smeru. Kada je u pitanju pozicioniranje, bit smera se ignoriše, a broj koraka zapravo znači apsolutnu poziciju na koju će se pisaća glava pozicionirati (0 – 880).
Sledi algoritam step režima, odnosno pojedinačnih koraka pri čemu je moguće pisanje. Algoritam je grfički prikazan na slici:
Koristi se potprogram za sledeću fazu. Taj podprogram ima sopstveni brojač pokazivač trenutno aktivne faze i tabelirane vrednosti pobude, ukupno četiri. Kada se zatraži nova vrednost, na osnovu flega smera uveća se ili smanji pokazivač aktivne faze, i vrati se stara i nova vrednost u promenljivama NEW i OLD. Taj algoritam je prilično jednostavan i neće biti dat grafički.
Softverska kašnjenja su realizovana u obliku potprograma (2 odvojena). Radi se o običnooj dvostrukoj petlji. Pri tome, pošto znamo frekvenciju takta koji dovodimo mikrokontroleru (12MHz), znamo i vremena izvršenja pojedinih instrukcija, možemo tačno izračunati kašnjenje koje će svaki od tih potprograma da unese. To je princip na kom rade ova softverska kašnjenja.
Ostaje još da se kaže koja reč o načinu brzog pozicioniranja. On je ujedno i najsloženiji deo celog upravljačkog algoritma. Ne koristi softverska kašnjenja nego koristi tajmer0 i interapte. Interapt rutina je krajnje jednostavna i sve što treba da uradi jeste da iz određenih promenljivih prepiše vrednosti u izlazni port za upravljanje motorom, da napuni nove vrednosti u tajmer i da postavljanjem odgovarajućeg flega obavesti glavni program da je završio. Odgovarajuće vredmosti u pomenute promenljive upisuje glavni program čiji će algoritam biti dat grafički.
Algoritam pozicioniranja. Prvo se naravno proveri da li je komanda ispravna odnosno da li BR_KOR koji sada označava apsolutnu pozicioju pada u opseg koji je dozvoljen tj. pozitivan i manji od 880. Ako je izvan, javlja se greška. Izračunava se BK odnosno broj koraka koji treba da se izvrše. Ako je on veći od nule ide se desno, ako ne onda se ide levo. Postavlja se fleg smera. Uzima se apsolutna vrednost od BK, P je polovina ukupnog broja koraka. Ako je on manji od dužine ubrzavanja u koracima, onda se neće izvršiti ACCLEN broj ubrzavajućih koraka nego P koji je maksimalni mogući broj koraka posle kojih mora početi usporavanje. Izračunava se još gomila promenljivih od kojih svaka označava redni broj koraka jedne od ključnih promena u upravljanju motorom. To se redom CSPD: korak do kog se ubrzava; BTSD: korak do kog se ide konstantnom brzinom, a posle kog sledi korak dvostruke dužine; DCTB: korak posle kog počinje usporavanje; i konačno KRAJ posle koga se prekida rad potprograma i sledi vraćanje u glavni program. Tu su i DECPNT koji je neophidan za pravilno izvršenje dela za usporavanje i naravno KORBROJ za brojanje koraka. Prvo se dozvole interapti i namesti jedan za 100s koji je neophodan da bi se inicirao ceo proces. DONE se postavlja na nulu. (To je inače fleg koji govori da li se interapt desio, postavlja ga interapt servisna rutina, a briše glavni program.) Traži se sledeća faza, postavljaju se promenljive SLED i VREME čije će vrednosti interapt rutina prepisati u odgovarajuće registre, poveća se brojač koraka i sledi čekanje da se interapt rutina izvrši.
Vredno je napomenuti da se vreme dobija iz tabele i to u obliku višeg i nižeg bajta. To radi odgovarajući potprogram.
Time je gotovo sve rečeno o algoritmu upravljanja. Ostaje još da se da kompletan asemblerski listing programa mikrokontrolera Intel_8051. Program je komentarisan tako da se mogu uočiti svi delovi o kojima je bilo reči.
;** Program mikrokontrolera 8051 za upravljanje koracnim motorom **
;******************************************************************
;Promenljive
;******************************************************************
POINTER_FAZA DATA 30H ;trenutno aktivna faza
N DATA 31H ;brojac u reset rutini
NEW DATA 32H ;sledeci novi raspored faza
OLD DATA 33H ;stari raspored faza
BR_KOR_LO DATA 34H
BR_KOR_HI DATA 35H ;brojac koraka (16bit)
POLOZAJ_HI DATA 36H
POLOZAJ_LO DATA 37H ;pokazivac polozaja (16bit)
CSPD DATA 38H ;korak u kom pocinje const. brzina
DRZI_LO DATA 3AH ;korak do kojeg se drzi konstantna
DRZI_HI DATA 3BH ;brzina (16bit)
DCTB_LO DATA 3CH
DCTB_HI DATA 3DH ;korak koji duplo traje (16bit)
BTSD_LO DATA 3EH ;korak posle kog pocinje
BTSD_HI DATA 3FH ;usporavanje (16bit)
KRAJ_LO DATA 40H
KRAJ_HI DATA 41H ;poslednji korak (16bit)
VREME_LO DATA 42H ;vreme koraka pri pozicioniranju
VREME_HI DATA 43H ;(vrednost za tajmer, 16bit)
W1 DATA 20H ;prva rec komande
W2 DATA 21H ;druga rec komande
FLAGS DATA 22H ; Zastavice, jednobitne promenljive
;LEVO – 0, GRESKA – 1, DONE – 2
;******************************************************************
;Konstante
;******************************************************************
ACCLEN EQU 0AH ;duzina ubrzavanja (broj koraka)
KBRZ_LO EQU 6BH ;vreme konstantnog koraka
KBRZ_HI EQU 0FDH
;******************************************************************
;Vektori reseta i interapta Tajmera 0
;******************************************************************
ORG 0000H
LJMP RESACT ;reset vektor
ORG 000BH
LJMP TIM0 ;interapt vektor
;******************************************************************
;Reset akcija – inicijalizacija sistema
;******************************************************************
ORG 0010H
RESACT: MOV POINTER_FAZA,#0 ;resetovanje promenljivih
MOV P0,#0FFH
MOV P2,#0FFH
MOV SP,#60H ;postavlajne steka i
MOV IE,#00H ;podesavanje ostalih
CLR P2.4 ;registara, postavi
CLR P2.2 ;korisnicke zastavice, idemo
MOV N,#08H ;osam pokusaja koraka desno
CLR FLAGS.0 ;levo <- 0
DDESNO: ACALL SLED_FAZA
MOV A,NEW
ORL A,OLD
MOV P1,A
ACALL PAUSE35 ;tehnika polukoraka
MOV P1,NEW
ACALL PAUSE15
JNZ DDESNO
SETB FLAGS.0 ;levo <- 1 ,sada levo do nule
JLEVO: JNB P2.5 NULL_ACH ;ako je nulti polozaj, stani
ACALL SLED_FAZA ;inace mrdaj dalje
MOV A,NEW
ORL A,OLD
MOV P1,A
ACALL PAUSE35
MOV P1,NEW
ACALL PAUSE15
SJMP JLEVO
;******************************************************************
;Glavna petlja, upravljanje interfejsom
;******************************************************************
NULL_ACH: CLR A ;nula postignuta
MOV POLOZAJ_LO,A ;podesi sistemske promenjive
MOV POLOZAJ_HI,A ;na nulu
ACTINT: SETB P2.2 ;aktivira se interfejs
SETB P2.3
WSTROBE: JNB P2.0,WSTROBE ;ceka se strobe signal
MOV W1,P0 ;preuzmi upr. rec 1
STR1: JB P2.0,STR1
STR2: JNB P2.0,STR2 ;cekaj drugi strobe
MOV W2,P0 ;preuzmi upr. rec 2
CLR P2.2
JB W1.4,RESACT ;dekodovanje instrukcije
JB W1.6,LEVSET
SETB FLAGS.0 ;Ako je levo, levo <- 1;
SJMP DIRSET
LEVSET: CLR FLAGS.0
DIRSET: MOV BR_KOR_LO,W2
MOV A,W1
ANL A,#0FH
MOV BR_KOR_HI,A
CLR FLAGS.1
JB W2.7,POSREZ
ACALL STEPPING ;zovi koracanje
SJMP RPOINT
POSREZ: ACALL POSITIONING ;zovi pozicioniranje
RPOINT: JNB FALGS.1,ACTINT
CLR P2.3
WAITEACK: JNB P2.6,WAITEACK ;ceka se na potvrdu prijave
SJMP ACTINT ;greske od strane racunara
;******************************************************************
;Potrprogram koji vraca upravljacku rec na portu koja ukljucuje
;sledecu fazu u zavisnosti od smera obrtanja motora
;******************************************************************
SLED_FAZA: MOV DPTR,#EXT_TAB ;pointer na tabelu
MOV A,POINTER_FAZA ;u zavisnosti od smera
MOV A,@A+DPTR ;izaberi sledecu vrednost
MOV OLD,A
MOV A,POINTER_FAZA
JNB FLAGS.0,DESNO
DEC A
SJMP CEND
DESNO: INC A
CEND: ANL A,#2
MOV POINTER_FAZA,A
MOV A,@A+DPTR
MOV NEW,A
RET
EXT_TAB: FCB 01H,02H,04H,08H ;tabela pobuda
;******************************************************************
;potprogram koji daje kasnjenje od 3,5ms (tacno 3.487ms na 12MHz)
;******************************************************************
PAUSE35: MOV R1,#7
OLOOP: MOV R2,#99
ILOOP: NOP
NOP
NOP
DJNZ R2,ILOOP
DJNZ R1,OLOOP
RET
;******************************************************************
;potprogram koji daje kasnjenje od 1,5ms (tacno 1.511ms na 12MHz)
;******************************************************************
PAUSE15: MOV R1,#3
SLOOP: MOV R2,#100
ULOOP: NOP
NOP
NOP
DJNZ R2,ULOOP
DJNZ R1,SLOOP
RET
;******************************************************************
;Potprogram za realizaciju zadatog broja pojedinacnih koraka
;******************************************************************
STEPPING: JNB LEVO,KDES ;levo ili desno
MOV R3,#0 ;proveri da li je
MOV R4,POLOZAJ_LO ;zadati broj koraka moguce
MOV R5,POLOZAJ_HI ;odrediti obzirom na
CLR C ;trenutni polozaj motora
MOV A,R4 ;ako nije, vrati se s greskom
SUBB A,BR_KOR_LO
MOV R4,A
MOV A,R5
SUBB A,BR_KOR_LO
MOV R5,A
JNC NASTK
KERR: SETB FLAGS.1 ;prijavi gresku
RET
KDES: MOV R3,#0FFH ;sve to za levo pomeranje
MOV A,POLOZAJ_LO
ADD A,BR_KOR_LO
MOV R4,A
MOV A,POLOZAJ_HI
ADDC A,BR_KOR_HI
MOV R5,A
MOV A,R4
CLR C ;krajnji polozaj s desna: 880
SUBB A,#70H ;LO(880)
MOV A,R5
SUBB A,#03H ;HI(880)
JNC KERR
NASTK: MOV R6,BR_KOR_LO ;sve u redu
GPETL: ACALL SLED_FAZA ;glavna petlja koracanja
MOV A,R6
CLR C
SUBB A,#1
MOV R6,A
MOV A,R7
SUBB A,#0
MOV R7,A ;proveri i detektor nultog
JNB P2.5,NERR ;polozaja, pa javi gresku
MOV A,POLOZAJ_LO ;ako je ista uocena
JNZ NERR
MOV A,POLOZAJ_HI
JNZ NERR
SJMP KERR
NERR: MOV A,OLD ;nema greske, odradi korak
ORL A,NEW
MOV P1,A ;polukorak
ACALL PAUSE35 ;cekaj
MOV P1,NEW ;konacni polozaj
ACALL PAUSE15 ;cekaj jos malo
MOV A,POLOZAJ_LO
ADD A,R3 ;azuriraj polozaj
MOV POLOZAJ_LO,A
MOV A,POLOZAJ_HI
ADDC A,#0
MOV POLOZAJ_HI,A
SETB P2.4
WMACK: JNB P2.1,WMACK ;cekaj potvrdu da moze dalje
CLR P2.4 ;sa racunara
MOV A,R6 ;ako nisu svi koraci odradeni
JNZ GPETL ;vrati se u glavnu petlju
MOV A,R7
JNZ GPETL
RET ;inace zavrsi stepping
;******************************************************************
;Interapt servis rutina za interapt tajmera T0
;******************************************************************
TIM0: MOV P1,NEW ;zada novu pobudu za motor
MOV TH0,VREME_HI ;visa rec za tajmer
MOV TL0,VREME_LO ;niza rec za tajmer
SETB FLAGS.2 ;javi gl. programu gotovo
RETI ;vrati se u glavni program
;******************************************************************
;Potprogram koji upravlja brzim pozicioniranjem
;BR_KOR ovde ne znaci broj koraka nego apsolutnu poziciju
;samo se koristi ista promenljiva
;******************************************************************
POSITIONING: MOV A,BR_KOR_HI ;proveri prvo da li je zadata
JNB A.7,POKL ;pozicija dozvoljena
PERR: SETB FLAGS.1 ;ako nije, vrati gresku!
RET
POKL: MOV A,BR_KOR_LO ;provereno je da li je neg.
CLR C ;ostaje da se proveri da nije
SUBB A,#70H ;LO(880)
MOV A,BR_KOR_HI ;vece od 880
SUBB A,#03H ;HI(880)
JNC PERR ;BK <=> R2:R3
MOV A,POLOZAJ_LO
CLR C
SUBB A,BR_KOR_LO ;BK = POLOZAJ – BR_KOR
MOV R2,A
MOV A,POLOZAJ_HI
SUBB A,BR_KOR_HI
MOV R3,A ;utvrdi smer na osnovu znaka
JNB A.7,DESN ;podesi smer
SETB FLAGS.0 ;levo ili desno
SJMP DIRDN ;izvrsi sve proracune;
DESN: CLR FLAGS.0 ;ako je desno onda levo <- 0
DIRDN: MOV A,R3 ;P <=> R4:R5
CLR C
RRC A
MOV R5,A ;P = BK / 2;
MOV A,R2
RRC A
MOV R4,A
CLR C
SUBB A,#ACCLEN
JNC PACC ;P < ACCLEN ?
MOV R6,#ACCLEN ;ACCDEC <=> R6
SJMP LDONE
PACC: MOV R6,R5
LDONE: MOV A,R6
CLR C
RLC A ;TMP = ACCDEC * 2
MOV R7,A ;R7 = TMP
MOV A,R2
CLR C
SUBB A,R7
MOV DRZI_LO,A ;DRZI = BK – TMP
MOV A,R3
SUBB A,#0
MOV DRZI_HI,A
MOV CSPD,R6 ;CSPD = ACCDEC
MOV A,DRZI_LO
ADD A,R6
MOV DCTB_LO,A ;DCTB = CSPD + DRZI
MOV A,DRZI_HI
ADDC A,#0
MOV DCTB_HI,A
MOV A,DCTB_LO
CLR C
SUBB A,#1
MOV BTSD_LO,A ;BTSD = DCTB -1
MOV A,DCTB_HI
SUBB A,#0
MOV BTSD_HI,A
MOV A,DCTB_LO
ADD A,R6 ;R6 <=> DECPNT=ACCDEC
MOV KRAJ_LO,A ;KRAJ = DCTB + ACCDEC
MOV A,DCTB_HI
ADDC A,#0
MOV KRAJ_HI,A
MOV R4,#0 ;R4:R5 – KORBR
MOV R5,R4 ;KORBR <- 0
MOV IP,#02H ;samo t0 je viseg prioriteta
MOV IE,#82H ;dozvoli samo interapt t0
MOV TL0,#9BH
MOV TH0,#0FFH ;za 100us interapt
MOV TCON,#10H ;timer krece
CLR FLAGS.2 ;DONE <- 0
ACALL SLEDECA_FAZA ;motor ce krenuti za 100us
MOV R0,R4
ACALL SLED_VREM ;trazi prvo vreme iz tabele
MOV A,R4
ADD A,#01H
MOV R4,A
ADD A,R5 ;KORBR <- KORBR + 1
ADDC A,#0
MOV R5,A
GPET: JNB FLAGS.2,GPET ;DONE = 1???
CLR FLAGS.2 ;DA!
ACALL SLED_FAZA ;ide se dalje
MOV A,R4 ;ubrzavanje
CLR C
SUBB A,R6
MOV A,R5
SUBB A,#0
JNC CHKPT1 ;KORBROJ >= ACCDEC?
MOV R0,R4 ;Ne!
ACALL SLED_VREM
SJMP GPET
CHKPT1: MOV A,R4 ;Da!
CLR C
SUBB A,BTSD_LO
MOV A,R5
SUBB A,BTSD_HI
JNC CHKPT2 ;KORBROJ >= BTSD?
MOV VREME_LO,#KBRZ_LO ;Ne!
MOV VREME_HI,#KBRZ_HI ;konstantna brzina
SJMP GPET
CHKPT2: MOV A,R4 ;Da!
CLR C
SUBB A,DCTB_LO
MOV A,R5
SUBB A,DCTB_HI
JNC CHKPT3 ;KORBROJ >= DCTB?
MOV A,VREME_LO ;Ne!
CLR C ;Uzmi prethodno vreme
RLC A ;Pomnozi ga sa dva
MOV VREME_LO,A ;Ubaci to vreme!
MOV A,VREME_HI
RLC A
MOV VREME_HI,A
SJMP GPET
CHKPT3: MOV A,R4 ;Da!
CLR C
SUBB A,KRAJ_LO
MOV A,R5
SUBB A,KRAJ_HI
JNC ENDPOS ;KORBROJ >= KRAJ?
MOV R0,R6 ;Ne!
DEC R6 ;DECPNT <= DECPNT – 1
MOV R0,R6
ACALL SLED_VREM ;Usporavaj dalje
SJMP GPET
ENDPOS: MOV TCON,#0 ;Da!
MOV TMOD,#0 ;Zaustavi tajmer
MOV IE,#0 ;Zabrani interapte
RET ;Zavrsi pozicioniranje
;******************************************************************
;Potprogram koji vraca vreme iz tabele ciji se indeks nalazi u R0
;******************************************************************
SLED_VREM: INC R0 ;Vrati visi i nizi bajt
MOV A,R0 ;u VREME _LO i _HI
ACALL GET1 ;indeks se nalazi u R0
MOV VREME_LO,A
MOV A,R0
ACALL GET2
MOV VREME_HI,A
RET
GET1: MOV A,@A+PC ;Uzmi iz nadovezujuce tabele
RET ;vrati se
FCB 58H,6FH,0EBH,0BDH,3FH,0A3H,0DFH
FCB 11H,43H,6BH
GET2: MOV A,@A+PC ;Uzmi iz nadovezujuce tabele
RET ;vrati se
FCB 0F0H,0F9H,0FAH,0FBH,0FCH,0FCH,0FCH
FCB 0FDH,0FDH,0FDH
P0 je ulazni port za D linije interfejsa. P1 sa svoja četiri niža bita kontroliše uključenje pogonskih tranzistora. P2 je mešovit, i ulazni i izlazni. Mora se primetiti još jedna važna stvar. Svi signali koji izlaze iz mikrokontrolera su priključeni na bafersko kolo – drajver magistrale 74LS244. To je urađeno zato što su strujne mogućnosti mikrokontrolera skromne, a za linije koje izlaze iz uređaja poželjno je da budu malo većih strujnih mogućnosti. Pošto na tom kolu ima još slobodnih bafera, kroz to kolo puštaju se i kontrolni signali za uključenje pogonskih tranzistora. To kolo može da da struju od oko 15mA po baferu pri visokom izlaznom naponu i da proguta struju od oko 24mA pri niskom izlaznom naponu. Dakle sasvim u redu. Signali koji izlaze iz uređaja preko interfejsa i oni koji preko istog ulaze povezani su na 25 pinski D konektor kao što je to propisano standardom za računare (PC), stim što su specijalni signali povezani na pinove koji se u ovoj primeni ne koriste ili se uopšte ne koriste kod ovog interfejsa.
Napajanje uređaja izvedeno je kao nezavisno. Daje dva izlazna napona i to VCC – stabilisani jednosmerni napon od 5V, i nestabilisani jednosmerni napon srednje vrednosti 26V. Masa im je zajednička, dakle nema galvanskog odvajanja pogonskog, energeskog dela. Očekivana potrošnja upravljačke elektronike ne bi trebalo da pređe 300mA, a za tu struju i datu vrednost filtarskog kondenzatora od 1000uF brujanje iznosi oko 3V, pa vršna vrednost napona na prvom sekundaru transformatora treba da iznosi oko 10V što daje neophodan prenosni odnos od 26:1. Tada će linearni regulator na svom ulazu imati oko 6,5V, što mu je dovoljno da da ispravan napon od 5V na svom izlazu. Drugi sekundar transformatora radi sa mnogo većim strujama. Nema stabilizacije. Najviše mogu biti uključene dve faze, svaka sa po 1,8A, dakle ukupno 3,6A. Pri tome, ako su filtarski kondenzatori ukupnog kapaciteta 6600uF, brujanje iznosi oko 5V, dakle ±2,5V. Ako se vršna vrednost podesi na 28,5V na sekundaru to će značiti srednju vrednost jednosmernog napona od 26V. Nije neophodno da ta vrednost napona bude mnogo tačna pošto promena od 2,5V pri naponu od 26V unosi promenu struje manje od 10%, a pošto je reč o brujanju i struja će da osciluje oko svoje potrebne vrednosti (1,8A) u svakom namotaju. To zahteva prenosni odnos 9,11:1. U ispravljaču se moraju upotrebiti diode koje izdržavaju struje i preko 4A.
Ostaje još pogonsko tranzistorsko kolo. Glavni prekidač je NPN tranzistor čije strujne mogućnosti treba da budu bar 1,8A pošto je to maksimalna struja koja se ima kroz svaki namotaj motora. Međutim bolje je da se stave tranzistori koji izdržavaju i 3A jer ako dođe do veoma brzog ponovnog uključenja tranzistora, a struja kroz namotaj se još nije ugasila kroz zamajnu diodu, tranzistor će morati da izdrži i inverznu jako veliku struju diode, pa je bolje da je on ipak nešto jači od neophodnog minimuma (1,8A), mada do opisane situacije u uobičajenom radu ipak ne bi trebalo da dolazi. Zamajna dioda bi trebalo da bude bar za 2A. Naponi opterećenja koji se tu javljaju su maksimalno do oko 28V, dakle nisu problematični pa u obzir dolaze niskonaponski tranzistori (40 – 60V). Od tranzistora se zahteva da ima koeficijent strujnog pojačanja od bar hfe=50. Pri struji od 1,8A, njegova bazna struja je bar 60mA da bi bio u zasićenju. Za razdelnik u odnosu kao što je dato na šemi kolektorska struja gornjeg PNP tranzistora je oko 33mA. Ako on ima bar hfe=100, a to za takav tranzistor uopšte nije problem, kolektorska struja prvog poslednjeg NPN tranzistora, odnosno njegova bazna struja, sigurno neće biti veća od 2mA. Naravno sve ove vrednosti su računate kao da su tranzistori u aktivnom režimu. Međutim cilj je da se svi tranzistori dovedu u zasićenje. A to će se i desiti jer podešeno je da sve bazne struje imaju minimalne vrednosti koje će biti dovoljne za to. Ta dovoljna bazna struja za NPN tranzistor biće oko 200uA ako mu je u kolektoru otpornik od 12k, a u baznom kolu otpornik od 220k. Tu bi struju mogao da da i mirokontroler, ali pošto je bilo slobodnih bafera na 74LS244 bolje je da tu struju daje on. Disipacije na ovim malim tranzistorima su u uključenom stanju vrlo male reda nekoliko mW. Na velikom tranzistoru ona iznosi 360mW, što isto ne bi trebalo da bude problem za tranzistor takvih strujnih mogućnosti. Naravno ta snaga može nešto da se izmeni zbog uključivanja – isključivanja. Jedino prinudna otpornost ima značajnu disipaciju od oko 21W kada kroz nju protiče struja pa treba predvideti odgovarajuće hlađenje za njega.
Data je i principska šema detektora nultog položaja. LED dioda stalno emituje svetlost i postavljena je u blizinu fototranzistora. Dok dioda svetli fototranzistor provodi i napon njegovog kolektora je nizak ako je gornja otpornost dovoljno velika. Ako odgovarajući deo pisaće glave prekrije LED diodu fototranzistor prestaje da vodi i kolektorski napon odlazi na visok nivo. Taj se napon dovodi na jedino preostalo bafersko kolo pošto je ovako napravljen detektor veoma male snage.
Sve šeme, date su u prilogu koji sledi.
Nezgodno mesto ovog uređaja je njegov deo za napajanje. Pošto se energetski deo napaja jednosmernom strujom potrebni su ogromni i dosta skupi kondenzatori i veliki transformator koji takođe nije jeftin. Doduše. naponi su niski što možda u nekome popravlja stvar bar što se tiče cene kondenzatora. Stvar bi se možda dala rešiti nekim drugačijim tipom napajanja – možda prekidačkim regulatorom, ali to bi na drugi način usložnilo i poskupelo rešenje.