PWM DENGAN MIKROKONTROLER
Sebagaimana yang ditunjukkan pada rangkaian terlampir bit 0 dari port 3 mengendalikan transistor yang difungsikan sebagai saklar. Motor dihidupkan untuk suatu periode watku tertentu dan kemudian di off kan dengan periode waktu tertentu pula. Bagian pada saat motor hidup disebut DUTY CYCLE. Bila duty cycle yang diberikan adalah 10 % maka program ini menyimpan data waktu ON selama 10 siklus dan OFF selama 246 siklus dari 256 siklus.
Berikutnya nilai duty cycle disimpan pada RAM internal yang diberi label dCycle. Komplemen dari duty cycle disimpan pada RAM internal dengan nama dCycleC. Pada perancangan software ini, Timer 0 diaplikasikan dalam mode 2, yaitu 8 bit timer auto reload, yang akan melakukan increment nilai register counter setiap siklus, dan bila terjadi overflow maka data yang berada pada TH0 akan diloadkan ke TL0.
Bila frekuensi kristal yang digunakan adalah 12 Mhz, sehingga jika nilai reload adalah 0 maka
timer 0 akan over flow setiap 256 udetik; dan jika nilai reload adalah FFh maka timer akan over flow setiap 1 udetik.
;==============================================================
; PROGRAMMING ASSEMBLY PROCEDURE
;===============================================================
;1. Program pertama menghidupkan motor dan menempatkan nilai dCycle pada TH0 sebagai nilai reload
;2. Pada saat timer 0 overflow komplemen dari duty cycle dCycleC ditempatkan pada TH0 sebagai
; nilai reload sehingga motor dalam keadaan off.
;3. Keadaan motor on dan off disimpan pada RAM internal dengan nama KeadaanMotor
;4. Demikian seterusnya program menjalankan on dan off;
;
PWM bit P1.0
dCycle equ 30h
dCycleC equ 31h
SettingD equ 32h
;
org 0h
ljmp start
org 0bh
ljmp Timer_Interrupt0
;
start: mov settingD,#128 ; setting kecepatan motor dengan duty cycle = 50 %
mov dCycle,SettingD
mov A,dCycle
cpl A
mov dCycleC,A
Init_TimerInterupt0
;
Setb PWM
;==============================================================================
; RUTINE UTAMA YANG " PALING PENTING DAN KOMPLEKS "
;==============================================================================
Forever: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_Interupsi0:
JB KondisiMotor,MotoroFF
MotorOn:
Setb PWM
Mov TH0,dCycle
Setb KondisiMotor
reti
;
MotorOff:
clr PWM
mov TH0,dcycleC
clr KondisiMotor
reti
;
;===================================================================
;Subrutine Init_interupsi_timer0
;===================================================================
;Subrutine ini digunakan untuk menginisialisasi lokasi RAM bagian low byte
; dan lokasi RAM bagian high byte
;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
ret
;
end
2 comments:
Bos, ini aku sharekan untuk mengakses PWM dengan ATMEGA16 menggunakan codevision
http://iswanto.staff.umy.ac.id/2011/02/27/mengakses-pwm-atmega16-dengan-codevision/
KALO PAKE DUA MOTOR GMN CARANYA PAK??saya belom tau source codenya dengan assembly dengan 2 motor
Post a Comment