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


Kode Assemblynya Ada di bawah:




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





Selamat Mencoba !



Post a Comment

0 Comments