Kamis, 14 Mei 2015

Pengendalian Kecepatan Motor DC dengan PWM

Pengontrolan motor DC secara sederhana dibagi menjadi dua. Pertama yaitu dengan mengatur arah putaran dan besarnya kecepatan dari putaran motor. Arah putaran motor secara prinsip di atur dengan membalikan polaritas tegangan yang masuk ke motor. Sedangkan besarnya kecepatan putaran motor diatur dengan mengatur tegangannya. Mekanisme pengaturan ini ditangani oleh driver motor.
Driver motor yang digunakan banyak jenisnya. Yang paling sederhana dan mudah dijumpai adalah driver dengan tipe IC L293D dan L298. Driver ini masing-masing memiliki kemampuan memberikan arus maksimal motor sebesar 1A dan 4A. Untuk motor-motor kecil yang memiliki rating arus rendah sangat cocok menggunakan driver motor ini. Akan tetapi pada percobaan ini kita tidak akan menggunakan driver untuk mengatur kerja motor dc.

Cara pengaturan kecepatan yang digunakan adalah dengan menggunakan teknik PWM (Pulse Width Modulation), salah satu teknik untuk mengatur kecepatan motor DC yang umum digunakan. Dengan menggunakan PWM kita dapat mengatur kecepatan yang diinginkan dengan mudah. Teknik PWM untuk pengaturan kecepatan motor adalah, pengaturan kecepatan motor dengan cara merubah-rubah besarnya duty cycle pulsa. Pulsa yang yang berubah ubah duty cycle-nya inilah yang menentukan kecepatan motor. Besarnya amplitudo dan frekuensi pulsa adalah tetap, sedangkan besarnya duty cycle berubah-ubah sesuai dengan kecepatan yang diinginkan, semakin besar duty cylce maka semakin cepat pula kecepatan motor, dan sebaliknya semakin kecil duty cycle maka semakin pelan pula kecepatan motor.

Membuat sinya PWM dengan menggunaka CodeVisionAVR  Pada ATMega16 yang mempunyai 3 buah timer, tetapi disini saya hanya akan menggunakan Timer1 saja yang digunakan untuk membangkitkan sinyal PWM. Pada dasarnya Timer0 dan Timer1 mempunyai 4 buah mode untuk membangkitkan sinyal PWM.
Output pin PWM pada ATMega16 terdapat pada 2 buah pin yaitu PD4 (OC1B) dan PD5 (OC1A).
Gambar 1. Simulasi Rangkaian pada Proteus
Timer1
Mode Phase Correct PWM
Foc1a   =   Fosc/(2*N*TOP)
Foc1b   =   Fosc/(2*N*TOP)
D   =  (OCR1X/TOP)*100%
Mode Fast PWM
Foc1a   =   Fosc/(N*(1+TOP))
Foc1b   =   Fosc/(N*(1+TOP))
D   =  (OCR1X/TOP)*100%
Dimana:
Foc1a = Frekuensi output OC1A
Foc1b = Frekuensi output OC1B
N = Skala clock (mempunyai nilai 1, 8, 64, 256 dan 1024)
D = Duty cycle
Fosc = Frekuensi clock kristal yang digunakan
TOP = nilai maksimum counter (TCNT1),
TOP mempunyai 3 buah nilai untuk kedua mode tersebut yaitu 8 bit (FF), 9 bit (1FF) dan 10 bit (3FF)
Sekarang kita akan membuat aplikasi membangkitkan sinyal PWM dengan periode 20 ms dengan duty cycle 75%, menggunakan Timer1 10 Bit Mode Fast PWM.
Dengan menggunakan kristal 12 Mhz, 
N = 256
TOP = 10 bit = 3FF = 1023
Maka akan didapat frekuensi output (Foc1x) sebesar 45,77 Hz atau jika diubah kedalam peroide 21,8 ms ≈ 20 ms

Untuk Duty cycle:
D = (OCR1X/TOP)*100%
75% = (OCR1X/1023)*100%
OCR1X = 767 = 2FF (dalam hexa)
Gambar 2. Pengaturan Timer 1
Gambar 3. Pengaturan Port Output PWM

Script Program pada CodeVision AVR
#include <mega16.h>
#include <delay.h>

void main(void)
{
// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x30;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 187.500 kHz
// Mode: Fast PWM top=03FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA3;
TCCR1B=0x0B;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x02;
OCR1AL=0xFF;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

while (1)
      {
     
      OCR1B = 767 ;

      };
}

Hasil Percobaan
Gambar 4. Tampilan Output dari simulasi Proteus

1 komentar