FEED BACK CONTROL DENGAN PULSE WIDTH MODULATION ( PWM )
Aplikasi berikut digunakan untuk pengendalian kecepatan putaran ( RPM ) motor DC
;1. Setting RPM diatur melalui potensio yang selanjutnya tegangan ini disebut
; analog0 yang merupakan tegangan setting
;2. RPM motor dapat dideteksi dengan menggunakan tachometer yang selanjutnya
; disebut sebagai analog1
;3. Agar dapat diolah oleh mikrokontroler maka diperlukan ADC dan multiplexer
;4. Dengan menggunakan instruksi JC dan JZ maka dilakukan proses perbandingan
; tegangan analog0 dan analog1
;5. Disinilah akan diambil keputusan untuk mempercepat atau memperlambat RPM
; dengan mengatur PWM yang dikeluarkan oleh port P3.0 agar sesuai dengan setting
dCycle equ 30h
dCycleC equ 31h
count equ 32h
Analog0 equ 33h
Analog1 equ 34h
PWM bit P3.0
Channel bit P3.1
PortADC equ P0
;
DCLB equ 000h
DCUB equ 0F0h
;
KondisiMotor bit 20h
;
org 0h
ljmp start
org 0bh
ljmp Timer_Interrupt0
start: call Init_Interupsi_Timer0
clr PWM ; mematikan motor
;============================================
; RUTINE UTAMA
;=============================================
Forever: call ADC
call Update
sjmp Forever
;
;=================================================
;Subrutine Timer_Interupsi0
;=================================================
;Subrutine berikut digunakan untuk memberikan layanan interupsi timer overflow
; bila hal ini terjadi maka nilai reload TH0 akan diloadkan ke TL0
;Pada saat awal KondisiMotor = '1' sehingga bila interupsi ini ditemui maka
; akan menuju pada label motoroff dan ditandai kondisimotor = '0'
;===================================================
Timer_Interrupt0:
JB KondisiMotor,MotoroFF
Setb PWM
Mov TH0,dCycle
Setb KondisiMotor
reti
;
Motoroff:
clr PWM
mov TH0,dcycleC
clr KondisiMotor
reti
;
;===============================================
;Subrutine Init_interupsi_timer0
;Inisialisasi mode timer: timer 0 difungsikan sebagai timer 8 bit mode 2
;===============================================
Init_interupsi_Timer0:
mov TH0,#dCycle
Mov TMOD,#00000010b ; timer0 = sbg timer 8 bit, mode 2
setb ET0 ; Enable timer 0 interupsi
Setb EA ; Master Enable All Interupsi
setb TR0 ; start rock and roll timer 0
Setb KondisiMotor
mov count,#50
mov dCycle,#0
mov dCycleC,#0FFh
ret
;===============================================
;Subrutine Update - Update duty cycle
;Internal register/ RAM yang diberi label count didecrement, ketika count = 0
; maka duty cycle diupdate, shg software counter ini berfungsi agar duty cycle
; tidak berubah terlalu cepat
;=================================================
Update:
djnz count,upDone
mov A,analog1; dari referensi
mov b,analog0; dari sensor tachometer
clr c
subb a,b
jnz update1
ret
Update1:
jc decrease
call higherDC
ret
Decrease:
call lowerDC
UpDone:ret
;
;=============================================
;Subrutine lowerDC - Menurunkan duty cycle
;Subrutine ini akan dikerjakan bila kecepatan motor melebihi setting
;=============================================
LowerDC:mov a,dCycle
cjne a,#DCLB,DecDC
ret
DecDC: dec dCycle
inc dCycleC
ret
;
;=============================================
;Subrutine HigherDC - Menaikkan duty cycle
;Subrutine ini akan dikerjakan bila kecepatan motor dibawah setting
;==============================================
HigherDC:
mov a,dCycle
cjne a,#DCUB,IncDC
ret
IncDC: Inc dCycle
dec dCycleC
ret
;
;=============================================
;Subrutine ADC - Membaca tegangan Setting dan tegangan dari tachometer
;masing-masing disimpan ke register Internal Analog0 dan Analog1
;untuk dibandingkan pada subrutine update
;=============================================
ADC: Clr channel ; Pilih channel X0 dari multiplexer 4051
mov Analog0,PortADC
Setb channel ; Pilih channel X1 dari multiplexer 4051
mov Analog1,PortADC
ret
;
end
No comments:
Post a Comment