Sabtu, 30 November 2013

TIMER SEBAGAI GENERATOR GELOMBANG

Pada entri kali ini saya akan sedikit berbagai pengetahuan mengenai fungsi timer selain menunda jeda, tujuan saya membuata entri ini adalah :
1. memanfaatkan timer sebagai generator gelombang.
2. memanfaatkan timer sebagai generator gelombang dengan adjustable duty cycle.
3. memanfaatkan timer sebagai generator gelombang dengan adjustable frekuensi


ini gan peralatan yang harus di miliki :
1.   Komputer
2.   Arduino Uno
3.   Project board
4.   Kabel jumper
5.   LCD
6.   Potensiometer 10K
7.   LED
8.   Resistor 330 Ohm
9.   Transistor 2N2222
10. Resistor 2K2

Mari kita masuk percobaan I.


PERCOBAAN I
GENERATOR GELOMBANG DENGAN ADJUSTABLE DUTYCYLE

  Pada percobaan kali ini akan dibuat program untuk mengeluarkan gelombang kotak pada pin 9 (OC1A). Gelombang yang akan dikeluarkan pada pin 9 adalah gelombang berbentuk duty cycle dapat diataur lebar nya. Lebar duty cycle akan di atur lebarnya. Lebar duty cycle akan diatur oleh potensiometer yang terhubung pada pin A0. Pada percobaan kali ini akan digunakan fungsi analogWrite yang berfungsi untuk mengeluarkan sinyal gelombang pin pada PWM.

a. Buat Rangkaian seperti gambar dibawah

b. tulis program seperti sintak di bawah
int  val = 0;
void  setup() {
Serial.begin(9600);
pinMode(9,  OUTPUT);
}
void  loop() {
val  =  analogRead(A0);
analogWrite(9,  val/4);
Serial.print("PWM  Value  =  ");
Serial.println(val,DEC);
delay(500);
}

c. Hasil nya




jadi kita dapat mengatur duty cycle dengan mengatur potensiometer nya


'
PERCOBAAN II
GENERATOR GELOMBANG DENGAN AJDUSTABLE FREKUENSI

  
Pada percobaan kali ini gelombang yang akan dikeluarkan pada pin 9 adalah gelombang berbentuk kotak dengan duty cycle yang besarnya tetap yaitu 50%, namun besarnya frekuensi dapat berubah-ubah. Perubahan frekuensi akan diatur oleh pentesiometer yang terhubung pada pin A0. Program pada percobaan kali ini akan menggunakan konfigurasi register untuk mengeluarkan sinyal gelombang pada pin PWM.

a. Gambar Rangkaian seperti gambar dibawah :



b. Tulis program seperti sintaks dibawah :
int  setCycles;

void  set(int  cycles)  {

char  oldSREG;
int  dutyCycle  =  cycles  * 0.5;
if  (dutyCycle  <  6) {
dutyCycle  =  6;
}
if  (dutyCycle  >  1015) {
dutyCycle  =  1015;
}
if  (cycles  <  50)  {
cycles  =  50;
}
oldSREG  =  SREG;
cli();
ICR1  =  cycles;
OCR1A  =  dutyCycle;
SREG  =  oldSREG;
}

void  setup() {

TCCR1A  =  0;
TCCR1B  =  _BV(WGM13);
TCCR1B  &=  ~(_BV(CS10)  |  _BV(CS11)  |  _BV(CS12));
TCCR1B  |=  _BV(CS10);
DDRB  |=  _BV(PORTB1);
TCCR1A  |=  _BV(COM1A1);
}

void  loop() {

int  temp_cycles  = analogRead(A0);
if  (temp_cycles  != setCycles ) {
setCycles  =  temp_cycles;
set(setCycles);
}
}


c. Hasil






jadi kita dapat mengatur frekuensi untuk gelombang duty cycle nya dengan menggunakan potensiometer


PERCOBAAN III
PWM DENGAN ADJUSTABLE FREKUENSI DAN DUTY CYCLE (7 KHz sampai 300KHz)

  Pada percobaan kali ini  gelombang yang akan dikeluarkan pada pin 9 adalah gelombang berbentuk kotak dengan duty cycle dan frekuensi yang dapat beruba-ubah. Perubahaan frekuensi akan diatur oleh potensiometer yang terhubung pada pin A1. 

a. Gambar Rangkaian seperti gambar dibawah :



b. tulis program sepereti sintaks dbawah :

int  setCycles;
int  setDuty;

void  set(int  cycles,  float  duty)  {
char  oldSREG;
int  dutyCycle  =  cycles  *  duty;
if  (dutyCycle  <  6) {
dutyCycle  =  6;
}
if  (dutyCycle  >  1015) {
dutyCycle  =  1015;
}
if  (cycles  <  50)  {
cycles  =  50;
}
oldSREG  =  SREG;
cli();
ICR1  =  cycles;
OCR1A  =  dutyCycle;
SREG  =  oldSREG;
}

void  setup() {
TCCR1A  =  0;
TCCR1B  =  _BV(WGM13);
TCCR1B  &=  ~(_BV(CS10)  |  _BV(CS11)  |  _BV(CS12));
TCCR1B  |=  _BV(CS10);
DDRB  |=  _BV(PORTB1);
TCCR1A  |=  _BV(COM1A1);
}

void  loop() {
int  temp_cycles  = analogRead(A0);
int  temp_duty  =  analogRead(A1);
if  (temp_cycles  != setCycles || temp_duty != setDuty) {
setCycles  =  temp_cycles;
setDuty  =  temp_duty;
set(setCycles,  setDuty  /  1024.0);
}
}


c. Hasil














Minggu, 13 Oktober 2013

interupsi pada arduino

Pada entri kali ini saya akan sedikit membahas mengenai program intrupsi ekternal, pengertian intrupsi adalah  suatu permintaan khusus pada mikrokontroller untuk melakukan sesuatu, jika terjadi interupsi maka program akan menghentikan dahulu apa yang sedang dikerjakan dan melakukan apa yang diminta oleh yang menginterupsi. 
Pada Board arduino uno terdapat 3 intrupsi eksternal yaitu 
1. Intrupsi Eksternal dengan Mode Falling
2. Intrupsi Eksternal dengan Mode Rising
3. Intrupsi Eksternal dengan Mode Any Change

LANGKAH PERCOBAAN
1. Intrupsi Eksternal dengan Mode Falling
    Pada percobaan ini program dibuat untuk memahami penggunaan interupsi eksternal dengan Mode Falling. Dua buah switch akan dih ubungkan pada pin interupsi eksternal 0 (INT0) dan interupsi eksternal 1 (INT1). Pen ekanan switch akan menginterupsi program utama (yang berada pada fungsi loop) d an memaksa untuk menjalankan rutin interupsi yang telah dideskripsikan pada program.
`   Prosedur :
1. Rangkai sesuai gambar dibawah



2. Lalu buat program sintak seperti sintaks dibawah :

#include <LiquidCrystal.h> LiquidCrystal lcd(A0,A1,A2,A3,A4,A5); unsigned int countLoop = 0;

void setup() { lcd.begin(16,2); lcd.clear();

attachInterrupt(0, rutinInterupsi0, FALLING); attachInterrupt(1, rutinInterupsi1, FALLING);

}

void loop() {

lcd.setCursor(0,0);   lcd.print("Main Program");

lcd.setCursor(0,1); lcd.print("Count Loop "); lcd.print(countLoop); countLoop++;

delay(1000);
}

void rutinInterupsi0() {

lcd.setCursor(0,0); lcd.print("Int0 Program"); lcd.setCursor(0,1); lcd.print("Interrupt INT0"); delay(2000);

}

void rutinInterupsi1() {

lcd.setCursor(0,0); lcd.print("Int1 Program"); lcd.setCursor(0,1); lcd.print("Interrupt INT1"); delay(2000);

}





3. Lalu jalankan simulator proteus untuk mengamati proses intrupsi mode falling


   kondisi awal 

kondisi saat switch ditekan

Penjelasan :
         Pada mode falling proses intrupsi terjadi jika switch ditekan karena switch terhubung dengan              ground jika switch terhubung dengan pin maka nilai inputan akan bernilai 0 jadi kesimpulannya          proses falling terjadi jika perubahan input dari 1 ke 0.


2. Intrupsi Eksternal Mode Rising
Dua buah switch akan dihubungkan pada pin INT0 dan I NT1 sama seperti Percobaan 1 Peneka nan switch akan menginterupsi program utama (yang berada pada fungsi loop) da n memaksa untuk menjalankan rutin in terupsi yang telah dideskripsikan pada program. Pada Percobaan mode interupsi yan g digunakan adalah rising

    1. ganti sintaks program seperti dibawah :

#include <LiquidCrystal.h> LiquidCrystal lcd(A0,A1,A2,A3,A4,A5); unsigned int countLoop = 0;

void setup() {

lcd.begin(16,2); lcd.clear(); attachInterrupt(0, rutinInterupsi0, RISING); attachInterrupt(1, rutinInterupsi1, RISING);

}
void loop() {

lcd.setCursor(0,0);   lcd.print("Main Program");

lcd.setCursor(0,1);   lcd.print("Count Loop ");  lcd.print (countLoop);

countLoop++;   delay(1000);
}

void rutinInterupsi0() {

lcd.setCursor(0,0);   lcd.print("Int0 Program");
lcd.setCursor(0,1);   lcd.print("Interrupt INT0");

delay(2000);

}
void rutinInterupsi1() {

lcd.setCursor(0,0);   lcd.print("Int1 Program");

lcd.setCursor(0,1);   lcd.print("Interrupt INT1");

delay(2000);

}



  2.  Gunakan proteus untuk mengamati program intrupsi rising :

Kondisi Awal

Kondisi saat pushbutton ditekan

Kondis saat pushbutton dilepas

Penjelasan:
          Program intrupsi rising terjadi jika saat switch dilepas, jadi saat switch di tekan proram                     intrupsi tidak akan berjalan namu saat switch diepas maka program intrupsi akan aktif jadi                 skesimpulan intrupsi ekternal mode rising akan aktif jika perubahan input dari 0 ke 1.

3. Intrupsi Eksternal Mode Any Change
    Pada Percobaan mode interupsi yang digunakan adalah any change. Dua buah switch akan dihubungkan pada pin INT0 dan INT1. Penekanan switch akan membuat program utama pada fungsi loop terhenti dan mengeksekusi rutin interupsi.

   1. Ganti sintak program seperti dibawah :

         #include <LiquidCrystal.h>
       LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);
unsigned int countLoop = 0;

void setup() {

lcd.begin(16,2);
lcd.clear();

attachInterrupt(0, rutinInterupsi0, CHANGE);

attachInterrupt(1, rutinInterupsi1, CHANGE);

}
void loop() {

lcd.setCursor(0,0);   lcd.print("Main Program");

lcd.setCursor(0,1);   lcd.print("Count Loop ");  lcd.print(countLoop);
countLoop++;   delay(1000);

}

void rutinInterupsi0() {
lcd.setCursor(0,0);   lcd.print("Int0 Program");
lcd.setCursor(0,1);   lcd.print("Interrupt INT0");

delay(2000);

}
void rutinInterupsi1() {

lcd.setCursor(0,0);   lcd.print("Int1 Program");

lcd.setCursor(0,1);   lcd.print("Interrupt INT1");
delay(2000);

}
  
  2. Amati proses pengintrupsian menggunakan mode any change dengan menggunakan simulator proteus :

Kondisi saat switch ditekan
                                 


Kondi saat switch di lepas


Penjelasan :
Karena mode any change ini adalah gabungan dari mode falling dan rising maka saat perubahan masukan input dari 1 ke 0 (falling) maka program akan menjalankan proses intrupsi dan saat perubahan input dari 0 ke 1 maka layar lcd akan menampilkan INT0 atua INT1