- Normal 0 false false false MicrosoftInternetExplorer4 U nastavku prelazimo na konkretan izbor sklopova i elemenata.
- +5V,+15V,+15V(galvanski odvojeno) i –12V.
Možda najbolje rešenje predstavljaju integrisani stabilizatori napona 7805,7815 i 7912.
KP=30 KI=0.6 KD=0.2
Ovo je rekurzivni oblik zakona upravljanja koji je vrlo pogodan za implementaciju jer se vrednost upravljačke promenljive u(kT) u trenutku kT izračunava na osnovu vrednosti upravljačke promenljive i signala greške (e(kT)) u prethodnim trenutcima.
Konstante koje se ovde pojavljuju su :
OUT0 DATA 30h ; Izlazna promenljiva u(kT)
OUT1 DATA 31h ; u((k-1)T)
EROR0 DATA 32h ; Signal greške e(kT)
EROR1 DATA 33h ; e((k-1)T)
EROR2 DATA 34h ; e((k-2)T)
EROR0ZN BIT 00h ; Znak greške
EROR1ZN BIT 01h
EROR2ZN BIT 02h
SCRCTRL BIT 03h ; Kontrolni bit za upravljanje SCR-ovima
ZNAK1 BIT 04h ; Pomocna prom.
ZNAK2 BIT 05h ;
ZNAKR BIT 06h ;
;KONSTANTE
K1 EQU 7Bh ; K1 = 123
K2 EQU 7Ah ; K2 = 122
K3 EQU 01h ; K3 = 1
TIM1H EQU E5h ; 65535 – 6666 = E5F5 h za Timer1
TIM1L EQU F5h ;
TIM2H EQU F1h ; 65535 – 3750 = F159 h za Timer2
TIM2L EQU 59h ;
ORG 0000h ; Pri resetu ili uključenju ide se na INIC
JMP INIC
ORG 0003h ; INT0 Rutina SCR123
LCALL SCR123
ORG 000Bh ; Timer0 Rutina
LCALL SCR1 ; Generiše ugao paljenja prvog (SCR1) tiristora
ORG 001Bh ; Timer1 Rutina
LCALL PAUZA ; Generiše pauzu u trajanju 6.666 msec
ORG 002Bh ; Timer2 Rutina
LCALL RACUN ; Generiše upravljačku promenljivu OUT0
; NA OVOM MESTU TREBALO BI DEFINISATI TABELU SA UGLOVIMA PALJENJA
ORG 0064h ; Početak TABELE – niži bajtovi
DB EFh,68h,47h,25h,03h, ……. ; Ovo su samo prvih 5 nižih
DB D8h,DCh,DDh,DEh,DFh, …… ; Ovo su samo prvih 5 viših
; INICIJALIZACIJA
ORG 00CDh ; Adresa (205 dec) od koje počinje prog. kod
INIC: CLR IE.7 ; Zabrana svih prekida
MOV PSW,#00h ; Obriši PSW
MOV TMOD,#11h ; Timer0 i Timer1 u MOD1 kao 16 bitni Timer
MOV TCON,#05h ; IE0 i IE1 interapti na opadajuću ivicu
MOV IP,#01h ; Najviši prioritet za IE0
MOV T2CON,#02h ; Timer2 kao Counter u AUTO-RELOAD modu
MOV OUT0,#00h ; Inicijalizuj promenljive
MOV OUT1,#00h ; –
MOV EROR0,#00h ; –
MOV EROR1,#00h ; –
MOV EROR2,#00h ; –
CLR SCRCTRL ; SCRCTRL=0 za SCR2 i SCRCTRL=1 za SCR3
MOV TL1,TIM1L ; Napuni Timer1 sa E5F5h
MOV TH1,TIM1H ;
MOV RCAP2L,TIM2L ; Napuni Auto-reload registre sa F159h
MOV RCAP2H,TIM2H ;
MOV P1,#10001111b ; U port P0 upiši 10001111
SETB IE.7 ; Omogući prekide
SETB T2CON.2 ; Startuj Timer/Counter2
PETLJA: SJMP PETLJA ; Petlja u kojoj se vrti program
SCR123: MOV R1,OUT0 ; R1 = OUT0 = upravljačka prom.
MOV TL0,@R1+100 ; Indirektno napuni TL0 i TH0 sa
MOV TH0,@R1+151 ; vrednostima iz tabele
SETB TCON.4 ; T0 RUN
RETI ; Gotova IE0 rutina
SCR1: CPL P1.2 ; SCR1 ON
SETB TCON.6 ; T1 RUN
CLR TCON.4 ; T0 OFF
CPL P1.2 ;
RETI
PAUZA: JB SCRCTRL,SCR3 ;
CPL P1.3 ; SCR2 ON
CLR TCON.6 ; T1 OFF
MOV TL1,TIM1L ;
MOV TH1,TIM1H ;
SETB TCON.6 ; T1 ON
SETB SCRCTRL ; SCRCTRL=1 i sledeći put ide na SCR3
CPL P1.3 ;
RETI
SCR3: CPL P1.4 ; SCR3 ON
CLR TCON.6 ; T1 OFF
MOV TL1,TIM1L ;
MOV TH1,TIM1H ;
CLR SCRCTRL ; SCRCTRL=0 i sledeći put ide na SCR2
CPL P1.4 ;
RETI
; Slede potprogrami za 2-vo Bajtno sabiranje i oduzimanje
; operand1 : A niži bajt, B viši bajt ; operand2 : R1 niži bajt, R2 viši bajt
; Rezultat : A niži bajt, B viši bajt ; C = 1 negativan rezultat ; C=0 pozitivan
2BSAB: CLR C ; Priprema za sabiranje
ADD A,R1 ; Saberi niže bajtove
MOV R1,A ;
MOV A,B ;
ADDC A,R2 ; Saberi više bajtove i C
JNC KRSAB ; Ako nema C idi na KRSAB
MOV A,#FFh ; Inače vrati MAX (FFFFh) vrednost
MOV B,#FFh ;
RET
KRSAB: MOV B,A
MOV A,R1
RET
2BODU: CLR C ; Pripremi za oduzimanje
SUBB A,R1 ; Oduzmi niže bajtove
MOV R1,A ;
MOV A,B ;
SUBB A,R2 ; Oduzmi više bajtove i C
JNC KRODU ; Ako nije C (- rezultat) idi na KRODU
MOV R2,A
MOV A,R1 ;
CLR C
CPL A ; Inače nađi drugi komplement nižeg
ADD A,#01h ;
MOV R1,A ;
MOV A,R2 ;
CPL A ;
ADDC A,#01h ; i drugi kompl. Višeg bajta
SETB C ; Postavi C – rezultat je negativan
MOV B,A
MOV A,R1 ; Postavi izlaz i vrati se
RET
KRODU: MOV B,A
MOV A,R1
CLR C ; Postavi izlaz, C=0 (rez. je +) i vrati se
RET
;Sledi potprogram za 2B sabiranje sa predznakom
;operand1 : B:A viši i niži bajt i ZNAK1 = 1 ako je negativan
;operand2 : R2:R1 viši i niži bajt i ZNAK2 = 1 ako je negativan
;rezultat : B:A viši i niži bajt i ZNAKR = 1 ako je negativan
SABIRAJ: JB ZNAK1,PG1 ; operand1 <0
JB ZNAK2,PG2 ; operand2 <0
CLR ZNAKR ; op1>0 i op2>0 onda je rez.>0
CALL 2BSAB ; saberi i vrati se
RET
PG2: CALL 2BODU ; op1>0 i op2<0 zato zovi oduzimanje
JC PG3 ; ako je rez<0 skoči na PG3
CLR ZNAKR ; inače je rez >0 , znakr = 0 , vrati se
RET
PG3: SETB ZNAKR ; rez<0 , znakr = 1 , vrati se
RET
PG1: JNB ZNAK2,PG4 ; op1<0 ako je op2>0 skoči na PG4
SETB ZNAKR ; op1<0 i op2<0 pa je rez<0 , znakr=1
CALL 2BSAB
RET
PG4: MOV R3,A ; Zameni mesta oper1 i oper2 i
MOV R4,B ; skoči na PG2
MOV A,R1
MOV B,R2
MOV R1,R3
MOV R2,R4
SJMP PG2
;Sledi potprogram za računanje upravljačke promenljive OUT0
RACUN: CLR T2CON.7 ; Interapt flag TF2 moramo obrisati
CLR P1.5 ; Startuj signal za konverziju B&C =0
MOV A,P2 ; U A se nalazi REF ali u obliku BCD cifri
MOV R1,A
ANL A,#0Fh ; Odseci donji nibl (4 bita) – cifra desetica
MOV B,#0Ah ; U B stavi 10
MUL AB
MOV R2,A
MOV A,R1
SWAP A ; Zameni niblove u A
ANL A,#0Fh ; Odseci donji nibl – cifra jedinica
CLR C
ADD A,R2 ; U A se nalazi REFerentna vrednost
ADC: JB TCON.3,LOADADC ; Čekaj da se obavi konverzija
SJMP ADC
LOADADC: MOV B,P0 ; U B se nalazi reč iz AD konvertora
SETB P1.5
CLR C
SUBB A,B ; U A se nalazi signal greške = REF – AD
CLR EROR0ZN ; EROR0 >0
JNC NASTAVI ; ako nije C NASTAVI
CPL A ; inače je EROR0<0 , nađi drugi komplem.
ADD A,#01h
SETB EROR0ZN ; EROR0 je negativno
NASTAVI: MOV EROR0,A
MOV B,K1 ;
MUL AB ; B:A = K1*EROR0
MOV R1,A ; R2:R1 = K1*EROR0
MOV R2,B
MOV A,EROR2
MOV B,K3
MUL AB ; B:A = K3*EROR2
MOV ZNAK2,EROR0ZN
MOV ZNAK1,EROR2ZN
CALL SABIRAJ ; B:A = K3*EROR2+K1*EROR0
MOV R1,A ; R2:R1 = ——
MOV R2,B
MOV ZNAK2,ZNAKR
MOV A,EROR1 ;
MOV B,K2
MUL AB ; B:A = K2*EROR1
MOV ZNAK1,EROR1ZN
CPL ZNAK1 ; promeni znak pošto se oduzima
CALL SABIRAJ ; U B:A = ER2*K3+ER0*K1-ER1*K2
;Sada ovu sumu treba podeliti sa 32 što je isto kao i pomeranje u desno 5 mesta
; a to je isto što i pomeranje u levo 3 mesta
RLC A
RLC A ; rotiraj 3 puta u levo = deli sa 32
RLC A
ANL A,#07h ; odseci niža 3 bita (00000xxx)
MOV R7,A
MOV A,B ; u A stavi viši bajt
RLC A
RLC A
RLC A ; i podeli ga sa 32
MOV R6,A
MOV B,07h ; u B stavi masku 00000111
ANL B,A ; i odseci niža 3 bita (00000xxx) višeg B.
MOV A,#F8h ; u A stavi masku (11111000)
ANL A,R6 ; i odseci viših 5 bita (xxxxx000) višeg B.
ORL A,R7 ; zalepi xxxxx000 OR 00000xxx
MOV R1,OUT1 ; u R1 stavi OUT1
MOV R2,#00h ; u R2 stavi 00h
CLR ZNAK2 ; ZNAK2 je +
MOV ZNAK1,ZNAKR ; ZNAK1 = ZNAKR
CALL SABIRAJ ; B:A = OUT0 = OUT1 + SUMA/32
JNB ZNAKR,LAB1 ; ako je >0 skoči na LAB1
MOV OUT0,#00h ; inače OUT0 = 00h (MIN)
JMP KRAJ ; idi na kraj
LAB1: MOV R1,A
MOV A,B ; stavi viši bajt u A
JZ LAB2 ; ako je 0 skoči na LAB2
LAB3: MOV OUT0,#32h ; inače OUT0 = (MAX) = 50
JMP KRAJ ; idi na kraj
LAB2: MOV A,#32h
CLR C
SUBB A,R1 ; A = 50 – OUT0
JC LAB3 ; ako je OUT0 >50 skoči na LAB3
MOV OUT0,R1 ; inače je OUT0<50 i nastavi do kraja
KRAJ: MOV OUT1,OUT0
MOV EROR2,EROR1
MOV EROR1,EOR0
MOV EROR2ZN,EROR1ZN
MOV EROR1ZN,EROR0ZN
RETI ;Kraj rutine RACUN
; Kraj programa
END