Kontrol Kecepatan Motor DC Melalui Potensiometer

Dalam Projek ini menggunakan mikrokontroler ATMega 16 sebagai display menggunakan LCD 16×2 Output yang akan dikontrol kecepatannya yaitu  mneggunakan motor DC sebagai inputnya menggunakan Potensiometer dan Driver motornya memakain IC L298. Untuk mengatur suatu kecepatan motor yaitu disini menggunakan menggunakan teknik Pulse Width Modulation atau biasa disebut dengan PWM yaitu dengan mengatur duty cyclenya. Duty cycle itu sendiri menyatakan presentase keadaan logika high dalam satu periode sinyal.

Selama satu siklus atau satu periode jika waktu sinyal pada keadaan high sama dengan low maka dapat dikatakan sinyal mempunyai duty cycle 50%. Semakin besar duty cycle atau keadaan high dalam satu periode maka motor akan berputar semakin cepat begitu juga sebaliknya.

Pada projek ini pengaturan duty cyclenya berasal dari input Potensiometer. Potensiometer ini dihubungkan dengan pin ADC mikrokontroler.  Hasil dari konversi nilai Analog ke digital dari potensio ditampilkan pada LCD.  Semakin besar nilai potensio maka motor akan berputar semakin cepat. Timer/counter 1 digunakan untuk membangkitkan 2 channel Pulse Width Modulation (PWM) yang masing-masing berdiri sendiri atau tidak tergantung satu sama lainnya. Timer Mode yang digunakan yaitu mode Fast PWM 8 bit.  Fast PWM memberikan pulsa PWM frekuensi tinggi. Fast PWM berbeda dengan mode PWM lain, Fast PWM berdasarkan operasi single slope. Counter menghitung dari BOTTOM hingga TOP kemudian kembali lagi mulai menghitung berawal dari BOTTOM. Output mode FAST PWM Timer 1 ini yaitu pada Pin OC1A (PORTD.5) dan Pin OC1B (PORTD.4) yang dihubungkan dengan ENA dan ENB pada driver motor L298D.

Schematic Rangkaian :

Schematic PWM Motor

Setting Codevision AVR :

PWM1 PWM2 PWM3 PWM4

Programnya adalah sebagai berikut :

#include <mega16.h>
#include <lcd.h>
#include <stdio.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

#include <delay.h>

#define ADC_VREF_TYPE 0x20

unsigned char data1,data2;
char lcd_buffer[33];

// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}

// Declare your global variables here

void kec1(unsigned char motor1)
{
OCR1AL=motor1;
PORTD.0=0;
PORTD.1=1;

}

void kec2(unsigned char motor2)
{
OCR1BL=motor2;
PORTD.2=0;
PORTD.3=1;
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// 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=0xFF;

// 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: 10.800 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x0D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 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;

// ADC initialization
// ADC Clock frequency: 691.200 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// LCD module initialization
lcd_init(16);

while (1)
{
// Place your code here
data1=read_adc(0);
kec1(data1);
data2=read_adc(1);
kec2(data2);
lcd_clear();
lcd_putsf(“Motor_Fast_PWM”);
lcd_gotoxy(0,1);
sprintf(lcd_buffer,”PWM1=%d”,data1);
lcd_puts(lcd_buffer);
lcd_gotoxy(8,1);
sprintf(lcd_buffer,”PWM2=%d”,data2);
lcd_puts(lcd_buffer);
delay_ms(100);

};
}

Cara kerja mode Fast PWM 8 bit pada program ini yaitu membandingkan isi register TCNT1 dengan register OCR1A dan OCR1B ( berasal dari nilai konversi ADC channel 0 dan 1) untuk menghasilkan keluaran PWM. Isi register TCNT1 akan mencacah naik setiap interval waktu tertentu detak clock crystal sesuai pengaturan TCCR1B sampai bernilai maksimum yaitu 0x00FF(255). Selama nilai register TCNT1 lebih kecil dari data pembanding yaitu OCR1A atau OCR1B maka keluaran pin OC1A dan OC1B akan high dan jika nilai TCNT1 sudah melebihi data pembanding OCR1A atau OCR1B maka keluaran pin OC1A dan OC1B akan low. Jika nilai TCNT1 sudah mencapai maksimum yaitu 0x00FF (255) maka nilai TCNT1 akan reset kembali menjadi 0x0000.

PWM A ( Output pin OC1A) :

Pulsa PWM

PWM B ( Output pin OC1B) :

Pulsa PWM

TCCR1A=0xA1;
TCCR1B=0x0D;

Register TCCR1A disii 0xA1 berarti mode Fast PWM 8-bit dengan pola keluaran OC1A dan OC1B adalah high selama TCNT1 lebih kecil dari OCR1A-OCR1B dan low setelah TCNT1 melebihi OCR1A-OCR1B. Register TCCR1B diisi 0x0D berarti skala clock 1024. Sehingga jika frekuensi kristal yang digunakan adalah 11.0592 MHz maka akan menghasilkan PWM dengan frekuensi 42 Hz atau dengan periode 23.7 ms atau mendekati 24 ms. Perhitungannya adalah sebagai berikut :

Frekuensi PWM  = Fosc : (N*(1+TOP))

Fpwm                   = 11059200 : (1024*(1+255))

Fpwm                   = 42 Hz

Jika dinyatakan dengan periode :

Periode PWM (Tpwm) = 1 : Fpwm

= (1 + TOP) * Tosc *N

= (1 + 255) * (1 : 11059200) * 1025

= 23.7 ms

data1=read_adc(0);

menyimpan data hasil konversi ADC channel 1 ke variabel data1.

void kec1(unsigned char motor1)
{
OCR1AL=motor1;
PORTD.0=0;
PORTD.1=1;

}

Subrutin untuk menjalankan Motor1 dengan nilai pwm tertentu. Memiliki argumen yang diberi nama motor1. Argumen ini untuk mengatur kecepatan motor1. Pada program utama “kec1(data1) “ menunjukkan data hasil konversi yaitu data1 digunakan untuk mengatur nilai OCR1AL sehingga kecepatan motor dapat berubah-ubah sesuai dengan nilai hasil konversi `ADC Channel 1.

data2=read_adc(1);

menyimpan data hasil konversi ADC channel 2 ke variabel data2.

void kec2(unsigned char motor2)
{
OCR1BL=motor2;
PORTD.2=0;
PORTD.3=1;
}

Subrutin untuk menjalankan Motor2 dengan nilai pwm tertentu. Memiliki argumen yang diberi nama motor2. Argumen ini untuk mengatur kecepatan motor2. Pada program utama “kec2(data2) “ menunjukkan data hasil konversi yaitu data2 digunakan untuk mengatur nilai OCR1BL sehingga kecepatan motor 2 dapat berubah-ubah sesuai dengan nilai hasil konversi ADC Channel 2.

lcd_putsf(“Motor_Fast_PWM”);
lcd_gotoxy(0,1);
sprintf(lcd_buffer,”PWM1=%d”,data1);
lcd_puts(lcd_buffer);
lcd_gotoxy(8,1);
sprintf(lcd_buffer,”PWM2=%d”,data2);
lcd_puts(lcd_buffer);

Digunakan untuk menampilkan data hasil konversi ADC pada LCD 16×2.

 

Output PWM

Menghitung periode sinyal PWM pada osciloscope :

Osciloscope PWM

 

 

Mungkin itu saja dari saya..apabila masih kurang lengkap harap saran dan kritiknya, maklum masih newbie nih : ).

6 Comments

Leave a Reply