epson_matricni_stampac_elektronika_racunari_automatika.rs.jpg
epson_matricni_stampac_elektronika_racunari_automatika.rs.jpgU Bazi znanja, opisana je struktura celog sistema u grubim crtama i na osnovu poznatih karakteristika motora s kojim raspolažemo određeni su svi parametri neophodni za kvalitetno upravljanje pomenutom strukturom. U ovom delu ostalo je da se daju crteži i šeme celog uređaja i naravno algoritmi i program koji će izvršavati mikrokontroler. 

Kratak opis paralelnog interfejsa
 
  Interfejs prema računaru upotrebljen u ovom projektu je u osnovi standardni paraleni interfejs koji se može naći na skoro svakom računaru. Jedino što je on u ovom slučaju proširen sa nekoliko dodatnih signala neophodnih za efikasnije upravljanje. Njihov opis sledi.
  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.
 
slika_1_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg

Slika 1. Osnovni signali na paralelnom interfejsu
 
Linija ERROR je niska kada nastupi neka greška – bilo zbog besmislene komande ili zbog neke teške greške u pozicioniranju. Ako se ERROR aktivira, ovaj uređaj je programiran da čeka dok ne dobije potvrdu o saznavanju za prekid od računara. Tek kada računar potvrdi prihvatanje greške visokim nivoom na ERROR_ACK, uređaj nastavlja sa radom i prihvatanjem komandi, dotle je blokiran. Tu su još dva signala MOTOR_READY i MOVE_ACK. Prvi generiše uređaj i to svaki put kada izvrši jedan korak pri sporom pomeranju glave. Sledeće pomeranje se ne izvršava sve dok računar ne potvrdi prethodni signal visokim nivoom na svom MOVE_ACK-u. Nakon toga MOTOR_READY pada na svoj neaktivni niski nivo i motor pravi sledeći korak ukoliko ima još zadatih koraka koji čekaju na izvršenje. Na prethodnoj slici, dat je i šematski prikaz osnovnih signala pri prenosu reči ovim interfejsom.
 
Prikaz algoritma upravljanja i program mikrokontrolera

 Treba reći nešto o algoritmu uz pomoć kog je realizovano ovo mikrokontrolersko upravljanje koračnim motorom. Pošto se taj motor nalazi u jednom relativno samostalnom uređaju kojim se komanduje sa računara uz pomoć paralelnog kabla, taj upravljački algoritam se mora u izvesnoj meri baviti i komunikacijom. Biće do krupnijih detalja objašnjeni svi delovi upravljačkog programa, a najvažniji delovi koji se tiču upravljanja režimima pojedinačnog koračanja i brzog pozicioniranja biće ilustrovani i grafičkim prikazom algoritma.
  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:

slika_2_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg

Slika 2. Algoritam koračanja

Prvo se utvrdi vrednost koraka 1 ili -1 u zavisnosti od smera koračanja, a posle se odmah proveri da li je uopšte moguće izvesti zadati broj koraka u zadatom smeru. Ako nije, vraća se u glavni program, ali sa setovanim flegom za grešku. Ako je sve u redu, inicijalizuje se brojač, zatraži se sledeća pobuda za faze, brojač se umanji, proveri se da li je možda pisaća glava u nultom položaju, a traži se pomeranje u levo. Ako se utvrdi da jeste, to znači da upravljanje misli da je glava u nekom drugom položaju nego što zaista jeste pa se setuje fleg greške i vraća se u glavni program. Ako je sve u redu, menja se pobuda na sledeći polukorak koja se dobija logičkim sabiranjem sa starom pobudom. Zatim se čeka 3,5ms pozivajući potprogram za softversko kašnjenje. Kada to vreme prođe, uključuje se samo nova faza i čeka se još 1,5ms da se glava malo umiri, ažurira se pokazivač položaja i postavi signal računaru da je korak izvršen i čeka se odgovor računara. Kada se odgovor dobije, ukine se signal o izvršenom koraku. Ako je to bio i poslednji korak, vraća se u glavni program, a ako nije radi se sledeći korak po istom postupku.
  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 100s 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.
 
 

slika_3_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg

Slika 3. Algoritam pozicioniranja
 
Kada se izvršio, DONE fleg se odmah briše, traži se sledeća faza i odmah se i stavlja u promenljivu odakle će je interapt rutina prepisati. Sad sledi niz provera do koje faze je koračanje stiglo. U zavisnosti od toga da li je na redu ubrzavanje, konstantna brzina, korak kada počinje usporavanje, usporavanje ili kraj preduzima se odgovarajuća akcija. To je uzimanje odgovarajuće vrednosti vremena za tajmer koja se i upisuje u za to predviđenu promenljivu VREME. Pri ubrzavanju uzima se vrednost iz tabele, pri usporavanju isto iz tabele i ažurira se DECPNT, pri konstantnoj brzini konstantna vrednost, a za korak početka usporavanja dvostruka prethodna vrednost. Posle toga se vraća na standardnu petlju čekanja da se interapt odradi. Jedino kada se detektuje kraj, zabrane se interapti, zaustavi tajmer i vraća se u glavni program.
  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

 

Električna šema mikrokontrolera i elektronskog pogonskog kola motora
 
Elektronsko kolo mikrokontrolera je jednostavno. Integrisano kolo mikrokontrolera je priključeno na napajanje od 5V – VCC. Njegov reset signal je vezan preko kvaziintegratora i reset signal polako opada kada se uključi napajanje i postiže da resetuje kolo pošto dovoljno sporo opada, a napon napajanja se dovoljno brzo uspostavlja. Oscilator je uobičajeni, prema preporukama proizvođača sa kristalom učestanosti 12MHz. EA/VP je na VCC pošto nema eksternog eproma, nego je program isprogramiran u ugrađenom ROM-u. P3 uopšte nije upotrebljen, pa nijedan pin nije povezan nigde.
  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.
 
Zaključak
 
  Prikazani uređaj, napravljen je dosta jednostavno, nema previše delova, dosta je jednostavan što se tiče hardvera. Sve poslove oko upravljanja preuzima mikrokontroler, tako da pored njega od hardvera ostaju samo napajanje i pogonska energetska kola motora. No ni ovako mikrokontroler nije previše opterećen. Da se preorganizuje upravljanje i da se mnogo više koriste interapti i tajmeri mikrokontrolera, mogao bi se realizovati i upravljački uređaj za više od jednog motora, no to bi zahtevalo znatno složeniji program za upravljanje.
  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.
 
Prilog
 
prilog_1_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg
 
Prilog 1. Skica mehaničke strukture sistema
 
prilog_2_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg
 
Prilog 2. Šema elektronskog kola mikrokontrolera
 
prilog_3_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg
 
Prilog 3. Baferisanje izlaznih signala mikrokontrolera
 
prilog_4_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg
 
Prilog 4. Šema jednog elementa (ima ih 4) drajverskog kola
 
prilog_5_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg
 
Prilog 5. Šema koračnog motora i kako su pogonska kola priključena na njega
 
prilog_6_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg
 
Prilog 6. Električna šema napajanja uredjaj
 
prilog_7_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg
 
Prilog 7. Konektor na kablu uredjaja koji se priključuje na računar
 
  prilog_8_upravljanje_koranim_motorom_u_pogonu_pisae_glave_matrinog_tampaa_elektronika_projekti_automatika.rs.jpg
 
Prilog 8. Detektor nultog položaja (principska šema)

  Teorijska objašnjenja možete pogledati na ovom linku .
 

POSTAVI ODGOVOR

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.