Kamis, 12 Januari 2012

Menggunakan ADC Mikrokontroler ATmega 32 dengan CodeVision


Sebenarnya cara ini bisa dipakai untuk mikrokontroler Atmega seri lainnya juga. Saya kali ini akan menggunakan ADC Atmega32 dengan menggunakan CodeVision AVR. Langsung saja buka aplikasi CodeVision AVR kemudian buat project baru setelah itu akan muncul jendela CodeWizard AVR

 
 

Kemudian kita seting ADC dengan mengklik bagian ADC pada jendela CodeWizard AVR tersebut, kemudian seting lah seperti pada gambar berikut


Perlu diperhatikan bahwa, untuk mengisi kolom Volt.Ref sebaiknya mikrokontroler anda pada pin AREF atau AVCC nya terhubung pada catu daya 5VDC (dihubungkan ke VCC). Seting ADC sudah selesai, tapi tidak lengkap jika hasil pembacaan ADC tidak ditampilkan, nah … sekarang kita seting LCD nya sekalian, coba klik bagian LCD dan seting lah seperti berikut


Disini saya pakai LCD pada PORTC dengan konfigurasi pin sudah tertera pada gambar diatas.
Kemudian klik File dan pilih "Generate, Save and Exit" kemudian akan muncul jendela


Isilah nama file sesuai dengan keinginan anda, misalnya ADC, jendela ini akan muncul tiga kali, beri nama dengan nama yang sama (supaya mudah). 

Setelah itu akan muncul list program pada CodeVision yang siap anda buat programnya, jadi disitu anda dapat berkreasi sendiri sesuai keinginan anda, tapi supaya mudah saya menjelaskannya coba hapus saja semua list tersebut kemudian ganti dengan list dibawah ini

#include <mega32.h>
#include <stdio.h>
#include <delay.h>

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

#define ADC_VREF_TYPE 0x20

// 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;
// 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
unsigned char data=0;
char kata[16];

void main(void)
{

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x83;


// LCD module initialization
lcd_init(16);

while (1)
      {
      data=read_adc(0);//baca data yang masuk pada ADC0 yaitu PINA0
      sprintf(kata,"sensor : %d",data);//tampilkan data pada layar LCD
      lcd_gotoxy(0,0);//posisi pada layar lcd
      lcd_puts(kata);
     
      delay_ms(100);//waktu tunda biar nggak kecepetan
      lcd_clear();//clear layar LCD
      // Place your code here

      };
}

Berikut ini adalah hasil yang saya simulasikan di proteus

 


 Silahkan bertanya jika tidak mengerti, selamat mencoba ...

20 komentar:

  1. Bro buat LDR Gmn
    Bisa ga ?

    BalasHapus
    Balasan
    1. bisa, di seri dengan resistor, ada dua konfigurasi, vcc-resistor-LDR-GND dan vcc-LDR-resistor-GND, untuk yang vcc-resistor-LDR-GND node antara resistor-LDR di hubungkan ke pin ADC mikro, dan untuk VCC-LDR-resistor-GND node antara LDR-resistor di hubungkan ke pin ADC mikro,

      Hapus
  2. mau tnya ne mas, , mohon d bantu ya. hehe
    sya bru buat konveyor pke sensor warna mengunakan 1 led dan 1 ldr untuk sensornya. nah saya binggungnya d programnya, bagaimana agar supaya motor bisa bergerak kekanan dengan waktu sekian detik. dan juga sebaliknya motor bisa berputar kiri sekian detik. mohon d balas ya. . terimakasih

    BalasHapus
    Balasan
    1. bisa sekali...
      jika pake motor DC (bukan stepper) maka untuk mengontrol motor agar dapat di kendalikan arah putarnya gunakan H-Brige Motor Driver, coba cari di google. kemudian masalah pewaktuannya bisa menggunkan delay atau menggunakan counter interupt timer.

      Semoga Bermanfaat

      Hapus
    2. deskripsi programnya kurang lebih seperti ini mas. jd ktika bendaputih lewat output teg ldr 0-1,5v motordc berputar kekanan 4detik, dan ketika benda hitam lewat teg output 2-3v motordc berputar kekiri 4dtik. sedangkan keadaan normal tanpa ada benda yang lewat teg output ldr 3,5v keatas maka motor tidak berputar,
      ini prog yg sya buat mas, tp sya simulasikan d isis kog msh trobel msalah pewaktuanya tidak bekerja.
      while (1)
      {
      // Place your code here
      read_adc(0);
      if(read_adc(0)<=80) {PORTC=0b11111110;
      delay_ms(500);PORTC=0b11111111;}
      else if(read_adc(0)<=153) {PORTC=0b11111101;
      delay_ms(500);PORTC=0b11111111;}
      else PORTC=0b11111111;
      }
      }



      mohon d bantu ya mas,, :)

      Hapus
    3. coba ini ya...
      if(state==0)
      {
      buffer=read_adc(0);
      if(buffer<=80){state=1;PORTC=0b11111110;delay_ms(500);PORTC=0b11111111;}
      else if(buffer<=153){state=2;PORTC=0b11111101;delay_ms(500);PORTC=0b11111111;}
      else{state=0;PORTC=0b11111111;};
      }
      else if(state==1)
      {
      buffer=read_adc(0);
      if(buffer<=80){state=1;}
      else if(buffer<=153){state=2;PORTC=0b11111101;delay_ms(500);PORTC=0b11111111;}
      else{state=0;PORTC=0b11111111;};
      }
      else if(state==2)
      {
      buffer=read_adc(0);
      if(buffer<=80){state=1;PORTC=0b11111110;delay_ms(500);PORTC=0b11111111;}
      else if(buffer<=153){state=2;}
      else{state=0;PORTC=0b11111111;};
      }

      Hapus
    4. mas dapt nilai <80,, >80,, 153 dr mana??

      Hapus
    5. nilai tegangan 1.5 V. adc yg di gunakan adalah 8 bit, 0-255. jadi nilai 1.5 V jika dibaca oleh adc tersebut akan memiliki nilai 80 diperoleh dari (80/256)*5=~1.5. begitu juga yang 153

      Hapus
  3. mas kalo mau baca nilai intensitas cahaya pake LDR codingannya gman ya? apa ada pencerahan?

    BalasHapus
    Balasan
    1. koding sama seperti diatas, hanya saja potensio yang saya pakai diatas diganti dengan LDR yang diseri dengan resistor. susunannya begini : 1. vcc-LDR-resistor-GND atau 2. vcc-resistor-LDR-GND node antara LDR-resistor di hubungkan ke ADC0 nya atmega32... selamat mencoba

      Hapus
  4. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  5. mas saya pengen lebh paham lagi tentang adc

    misal pake ldr ,,saat out ldr pembaagi tegangan 1,6-1,9 vmaka led pertama saja yg menyala

    saat out ldr pembaagi tegangan 2,2-2,4 v maka led kedua saja yg menyala

    saat out ldr pembaagi tegangan 2,6-2,8 v maka led ke3 saja yg menyala

    terima kash atas bantuanya

    BalasHapus
    Balasan
    1. nilai tegangannya di konversi dulu pake rumus (VDC/5)*255. setelah itu buat statement pake if atau lainnya. misal if (read_adc(0)<((1.9/5)*255) && read_adc(0)>((1.6/5)*255)){LED1_ON;};

      Hapus
  6. mas aya mau tanya bagai mana menggerakar 2 motor stepper?? misal pin a 0 =0 motor stepper 1 bergerak 45 drajat cw lalu motor stepper 2 bergerak 90 drajat cw motor stepper 1 bergerak 45 drajat ccw lalu motor stepper 2 bergerak 90 drajat ccw lalu menunggu instruksi berikutnya

    BalasHapus
    Balasan
    1. maaf saya belum pernah menggunaka stepper motor... mungkin bisa cari di google

      Hapus
    2. mas saya mau nanya lagi

      bagaimana qt mau merekam dan memanggil hasil pengukuran adc

      misal di adc 0 qt beri 3 kali input yang ber beda

      lalu hasil pembacaane qt bandingkan di luar

      misal adc0 pertama baca 100
      adc0 ke2 baca 300
      adc0 ke3 baca 500


      lalu dari hasil pembacaan itu qt gunakan untuk menghidupkan led

      jika hasil p1 lebh besar dari k2 dan k3 led 1 nyala

      jika hasil pembacaanberbeda juga menghasilkan nyala led yang beda pula

      Hapus
  7. mas mau nanya, kalau saya buat sensor warna terus gmna ya cara memprogramnya di avr?

    BalasHapus
  8. mas mau nanya ni
    kami mau buat solar cell mengikuti cahaya matahari menggunakan 3 ldr mas
    KIRA" PROGRAM NYA GIMANA YAH MAS?

    BalasHapus
  9. Permisi mas, mau tanya. saya mau buat pada atmega 16 dengan output 2 pin(PORTC.0&PORTC.1) yang dapat di kendalikan dengan potensio pada input PORTA.0, jika input 0-2volt maka PORTC.0 output positif dan PORTC.1 output negatif, jika inpit 2-3volt maka output PORTC.0 negatif dan output PORTC.1 positif. untuk penulisan syntaxnya gmana ya mas?

    BalasHapus
  10. kak nilai adcnya kok gak berubah padahal nilai tegangannya berubah waktu aku ubah resistannya , minta tolong kenapa ya

    BalasHapus