Subscribe via email

Enter your email address:

Delivered by FeedBurner

Driver Beban AC tanpa Relay

Saat kita ingin mengendalikan beban AC 220 Volt. Entah itu heater, pump ato fan. banyak dari temen2 yang memakai relay. Gak ada salahnya sich make’ relay, but I think rada mahal n makan tempat di PCB.
Sekarang mari kita coba rangkaian alternatif, menggunakan MOC3020 dan BTA12.

  • MOC3020 merupakan OptoTriac, kita menggunakan device ini agar rangkaian control(microcontroller, led, keypad, lcd dan kawan2..)terisolasi dengan rangkaian power. Jadi saat rangkaian power meleduk, rangkaian control tetep aman.
  • BTA12, TRIAC dengan kemampuan beban maximum 12 A. Udah tau blum triac itu apa?? klo blum silahkan klik link ini
image
gambar di atas merupakan rangkaian driver nya.

Part list:
  1. MOC 3020
  2. R 380 ohm
  3. Triac BTA 12
  4. R1 10K ohm
  5. C 100 nano / 400 volt
  6. R2 220K ohm
Saat Logic dari micro berlogika “High” ,
arus akan mengalir dari VCC melewati R 380 ohm kemudian menuju MOC3020. Ini menyebabkan MOC3020 “ON”.
Saat MOC 3020 “ON”, maka TRIAC BTA12 akan ikut “ON”. Arus 220 AC akan melewati TRIAC dan menuju LOAD / BEBAN AC.
Sehingga beban aktif.
Sebaliknya, saat Logic dari micro Low”, maka arus dari VCC tidak masuk ke MOC3020 tetapi akan menuju pin micro.
Ini menyebabakn MOC3020 “OFF” , BTA 12 juga akan “OFF”.
Saat BTA12 berubah dari ON ke OFF, tegangan yang masih ada di BTA12 akan menimbulkan “spike” (loncatan tegangan).
Spike jika pada relay berupa loncatan bunga api.
Spike ini akan memperpendek umur BTA 12.
Nah, makanya rangkaian ini dilengkapi dengan kombinsai R1 dan C. Kombinasi R1 dan C ini disebut rangkaian snubber
R2 digunakan untuk membuang muatan tegangan yang ada di Capasitor saat BTA12 “OFF” .
Jika R2 tidak di pasang, saat BTA12 “OFF”. Capasitor akan terus menerus menyimpan muatan. Ini akan merusak Capasitor.
Seingetku saat memakai rangkaian ini untuk aplikasi heater, jika tidak memakai R2 maka dalam 1*24 jam. Capasitor akan short.
NB:
  • Rangkaian di atas tidak mutlak harus memakai MOC3020. Tapi bisa juga memakai MOC3021, MOC3022 atau MOC3030
  • TRIAC nya juga bisa di ganti BTA16. Klo BTA16 berarti maximum arus menjadi 16 Ampere
  • Dari pengalaman, jika gak memakai rangkaian snubber, kadang2 beban bisa tiba2 nyala n tiba2 mati padahal belum ada perintah dari micro. Dugaan awal ini pengaruh dari spike
    Mohon kritik dan sarannya ^_^ n posting comment di blog ini http://avrku.blogspot.com Trims…
    any question??? send email to zigan@ymail.com
Selengkapnya...

USB AVR ISP downloader

usbasp_kit Dari judul nya pasti semua dah pada ngiler pengen nyoba nih project.. he3…,
YUpz,,, kita akan coba bikin USB downloader buat Atmel AVR microcontroller..

Firmware, Schematic n Driver project nih ak dapet dari temenku Achmad Fiqhi (meet him on FaceBook: vik_ah@yahoo.co.id).
Dia dah nyoba alat ini, n lancar2 aja. Budget yang dia kluarin skitar 50 ribu, jauh lebih murah ketimbang beli USB Downloader yang harganya rata2 diatas 150rb. Makasih banget pokoknya buat temen yg satu ini dah mau bagi2 ilmunya.
Project ini berbasis ATmega48 tapi bisa juga pake’ ATmega8. Yang perlu diinget Firmware nya harus tepat. Di akhir atikel ini kita sudah sertain file2 yang berhubungan dengan project ini,

  • Rangkaian Schematic
  • Firmware
  • Driver
  • AVRdude


Rangkaian Schematic
      buka folder “circuit
      buka file USBasp.sch menggunakan software PCB maker seperti EAGLE
      dalam file sch ini terdapat contoh rangkaian yang menggunakan ATmega48.
      temen2 bisa mengganti ATmega48 ini dengan ATmega8
    Firmware
    buka folder “../bin/firmware
    disini terdapat file usbasp.atmega48.xxxx-xx-xx.hex (gunakan file ini jika menggunakan ATmega48)
    dan
    usbasp.atmega8.xxxx-xx-xx.hex (gunakan file ini jika menggunakan ATmega8)
    untuk memasukkan firmware awal maka kita harus menggunakan downloder laen yang dah jadi seperti DT-HiQ AVR ISP nya innovativeelectronics.com ato downloader USB nya klinik-robot.com .dll…
    ingat… set jumper J2 saat mengisikan firmware


    Driver
    begitu Firmware dah dimasukin ke micro, berarti USBdownloader kita dah siap pake… tinggal colokin ke PC..
    saa dicolokin maka windows akad detect nih sebagai “new hardware” n butuh driver.
    Nah drivernya ada di "bin/win-driver".
    trus windows pasti bilang klo nih hardware “not digitally signed… n bla bla bla…….” pilih continue anyway.
    AVRdude
    Yooww sekarang kita bisa memasukkan program ke Atmel AVR microcontroller menggunakan USBdownloader kita.
    Untuk memasukkan nya kita memakai software AVRdude.
    caranya:
    klik build.bat ato mega8.bat
    pokoknya file “.bat” di dalam folder “.. bin/firmware“ (folder tempat “avrdude.exe”)
    lalu akan muncul commandprompt (jendela layar hitam)
    ketik:
    avrdude -c usbasp -p atmega8535 -U flash:w:main.hex
    untuk memasukkan program main.hex ke mikro ATmega8535


    NB:

    • FIRMWARE adalah program yg ada pada microcontroller sebuah sistem. Suatu sistem berbasis microcontroller tentu gak akan jalan jika micro nya gk di program.. nah program di dalam mikro ini namannya firmware
    Jumper2 pada USBdownloader ini adalah:
    • J1 (supply power target). Target bisa menggunakan supply +5V dari PC dengan men-set jumper ini. HATI-HATI saat menggunakan jumper ini karena jika target board short circuit resiko nya PC/laptop kita.
    • J2 (update firmware). Set saat mengisi awal atau mengganti program /firmware yg ada pada micro di USBdownloader ini. Penggantian firmware dengan bantuan Downloader yg laen
    • J3 (SCK option). Jika clock target di bawah 1,5MHZ maka jumper ini harus di set. sehingga SCK akan diturunkan dari 375KHz menjadi 8KHz
    Download Firmware , Schematic dan Driver project ini di:

    Server Indonesia:
    http://www.indowebster.com/USBaspFile.html

    Foreign Server:
    Mohon kritik dan sarannya ^_^ n post comment di blog ini. Trims…
    any question??? send email to zigan@ymail.com
    Selengkapnya...

    Bermain dengan Timer 1 AVR


    Yang namanya timer sering kali kita gunakan. Misal saat mau nampilin rpm, kita butuh timer sebagai acuan. Atau untuk menghidupkan device dengan interval tertentu.
    AVR yang saya pakai sebagai contoh adalah ATmega 8535. AVR ini memilki 3 timer. Yaitu:

    1. TIMER 0 (8 bit)
    2. TIMER 1 (16 bit)
    3. TIMER 2 (8 bit)
    Apa yang dimaksud timer 8 bit dan 16 bit?
    timer 8 bit adalah timer yg bisa mencacah/menghitung sampai maksimal nilai 0xFF heksa (dalam biner = 1111 1111). Pada ATmega 8535 ada 2 timer jenis ini yaitu TIMER 0 dan 2
    Klo yg 16 bit nilai maksimalnya 0xFFFF. Pada ATmega8535 timer jenis 16 bit adalah TIMER 1. Artikel kali ini akan membahas TIMER 1.
    Dulu ak disaranin klo timer mau presisi harus memakai bahasa assembly. Hitung jumlah instruksi yg kita tulis. lalu hitung lama waktunya. Hmmmm.. ribet bener...
    Untung aja nemu artikel tentang interrupt timer. Dengan Interrupt kita gak perlu susah2 menghitung berapa waktu yang di perlukan untuk meng eksekusi seluruh program kita. Karena saat program dijalanin, timer juga jalan sendiri (digerakkan XTAL). Trus saat nilai tercapai terjadilah interrupt timer.
    Register yg biasa saya gunakan untuk menset nilai Timer1 adalah register TCNT, register TCNT sendiri dibagi dua: TCNT 1 H dan TCNT 1 L.
    rumus yang digunakan adalah :
    TCNT = (1+0xFFFF) - (waktu *( XTAL / prescaler) )
    waktu --> waktu yg kita inginkan
    XTAL --> frekuensi xtal yg dipakai
    prescaler --> nilai prescaler
    Apa nilai prescaler itu?
    Timer membutuhkan clock source. Biasanya clock source yg saya pakai adalah clock sistem (XTAL). Dan kita bisa menset besarnya nilai ini. Maximum sama dengan XTAL, minimum XTAL/1024. Nah nilai pembagi (1024) ini yg disebur nilai prescaler.
    Macam2 nilai prescaler yg diijinkan: 1, 8 , 64 , 256 , 1024
    Untuk mengubah nilai prescaler timer 1, kita harus merubah nilai register TCCR1B bit 0...2
    image
    gambar diatas di ambil dari data sheet ATmega 8535 hal.113
    Contoh Program:
    Mengakses Timer 1 dengan interval waktu 1 detik.
    #include <mega8535.h>
    #include <stdio.h>
    // LCD di PORT B
    #asm
    .equ __lcd_port=0x18
    #endasm
    #include <lcd.h>

    unsigned char buff[30];
    unsigned long detik;

    // sub rutin saat terjadi interrupt Timer 1
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    TCNT1H=0xC2;
    TCNT1L=0xF7;
    detik++;
    lcd_clear();
    sprintf(buff,"detik %d",detik);
    lcd_puts(buff);
    }
    void main(void)
    {

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: kHz
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x04;
    TCNT1H=0xC2;
    TCNT1L=0xF7;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x04;
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    // Analog Comparator Output: Off
    ACSR=0x80;
    SFIOR=0x00;
    // LCD module initialization
    lcd_init(16);
    // Global enable interrupts
    #asm("sei")
    lcd_putsf("wait...");
    while (1)
    {

    };
    }
    Program di atas menggunakan timer 1 untuk menambah nilai variabel "detik" setiap 1 detik sekali. Kemudian menampilkan hasilnya ke LCD.
    ayo kita mutilasi code program di atas:
    yang akan kita bahas dari program diatas adalah code yang kliatan ruwet aja. Klo yg biasa silahkan lihat di artikel2 sebelumnya .. ^_^
    **************
    // LCD di PORT B
    #asm
    .equ __lcd_port=0x18 -------------->> mendefinisakan bahwa LCD di hubungkan ke PORT B
    #endasm
    #include <lcd.h> --------------->> library untuk fungsi2 akses LCD
    **************
    // sub rutin saat terjadi interrupt Timer 1
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    TCNT1H=0xC2; ----------------------> nilai didapat dari rumus ......
    TCNT1L=0xF7; ----------------------> ....agar Timer 1 bernilai 1 detik
    detik++;
    lcd_clear();
    sprintf(buff,"detik %d",detik); --------------> memasukkan karakter-karakter ke variabel buff
    lcd_puts(buff); --------------------------->menampilkan karakter-karakter variabel buff ke LCD
    }
    Saat kita ingin menampilkan sederet tulisan ke LCD maka kita harus memasukkan karakter-karakter tulisan itu ke suatu variabel array (dalam program di atas adalah variabel "buff"). Baru kemudian data yg ada di variabel array kita tampilkan ke LCD
    ***************

    void main(void)
    {

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: kHz
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    TCCR1A=0x00;
    TCCR1B=0x04; ------------------> prescaler 256
    TCNT1H=0xC2; ------------------> nilai didapat dari rumus ......
    TCNT1L=0xF7; ------------------> ....agar Timer 1 bernilai 1 detik

    inget rumus: TCNT = (1+0xFFFF) - (waktu *( XTAL / prescaler) )
    waktu yg dinginkan adalah 1 detik , XTAL yg saya pakai adl 4 Mhz dan nilai prescaler=256
    Jadi,...............
    TCNT= (1+65535)-(1detik * (4.000.000/256))
    =65536 - (1detik*15625)
    =65536-15625
    = 49911 (desimal)
    = C2F7 (heksadesimal)
    Nilai untuk TCNT yang di dapat dari rumus bernilai 16bit (4 angka Heksadesimal), 2 angka yg di depan kita masukkan ke TCNT1H dan 2 angka yg dibelakang kita masukkan ke TCNT1L
    ****************
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x04; ----------------->Timer/Counter1, Overflow Interrupt Enable
    code di atas hanya men set "Overflow Interrupt Timer 1". Interrupt baru aktif saat ada perintah: #asm("sei")


    pada contoh ini saya pake ATmega 8535, ketika saya coba untuk ATmega 162 nilai TIMSK diubah menjadi TIMSK=0x80;
    ****************
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    // Analog Comparator Output: Off
    ACSR=0x80; ------------> me OFF kan analog comparator
    SFIOR=0x00;
    jika tidak dipakai, sebaiknya analog comparator di OFF. Untuk menghemat pemakaian daya. Hal ini sangat penting jika sumber daya yg digunakan memakai baterai.
    *******************
    // LCD module initialization
    lcd_init(16); ----------------------> inisialisasi LCD 16*2
    *******************
    // Global enable interrupts
    #asm("sei") ----------------------> meng aktifkan Interrupt-interrupt yg sudah di set sebelumnya
    Nah... pada saat ini interrupt Timer 1 aktif
    *******************
    lcd_putsf("wait..."); --------------> menampilkan tulisan wait.. ke LCD
    *********************
    while (1)
    {

    };
    Program ini yg dijalankan oleh microcontroller... mikro hanya muter disini di dalam while(1){...};
    (inget !!! infinite looping di artikel BASIC I/O ).. Jadi mikro sama sekali tidak mengeksekusi perintah.
    lha kok bisa????? bingungg.... ~_~ !
    Disinilah bedanya pake Interrupt!!.
    saat terjadi Interrupt Timer1, alur program mikro akan meloncat ke:
    // sub rutin saat terjadi interrupt Timer 1
    interrupt [TIM1_OVF] void timer1_ovf_isr(void)

    {
    ......................................
    ......yoww..... program yg ada disini yg dijalanin...
    ......................................
    }
    setelah program yg ada di sub rutin INTERRUPT dijalankan, maka alur program mikro akan muter2 lagi di infinite looping
    ******************
    jika ada yg kurang dari program di atas mohon kritik dan sarannya
    any questions?? post comment on this blog: http:\\avrku.blogspot.com
    or send email to: zigan@ymail.com
    CodeVisionAVR C Compiler is copyright by Pavel Haiduc, HP InfoTech s.r.l.
    AVR is a registered trademark of Atmel Corporation.

    <
    Selengkapnya...

    Mengenal ADC (2)

    lm35 Kali ini kita akan ngebahas gimana cara menggunakan ADC yang disambung ke sensor suhu LM35.
    Output dari sensor kita hubungkan dengan PORTA.0 (chanel ADC 0). Untuk kodenya kita gunakan aja CodeWizard agar lebih efisien n kita gak usah pusing2 hafalin register2 AVR.
    Oke sekarang langsung aja:

    1. klik icon CodeWizard di CodeVision AVR. Lalu klik tab ADC image
    2. Pada tampilan tab ADC, centang ADC ENABLED utk mengaktifkan ADCimage
    Use 8 Bits: untuk memilih apakah ADC menggunakan resolusi 10 bit atau 8 bit. Biarkan kosong(jangan di centang) agar ADC menggunakan resolusi 10 bit.
    ADC Interrupt: Interrupt ADC diaktifkan apa tidak.
    High Speed: mode high speed digunakan apa tidak.
    Volt. Ref: referensi tegangan ADC. ubah ke AVCC pin, agar ADC menggunakan referensi teg. 5 volt.

    ADC Clock: untuk memilih frekuensi clock ADC.
    Ada pertanyaan menarik dari Mas HaPE, tentang ADC Clok ini:image
    di keterangan Clok ADC memang tertulis 125.000 kHz.
    Itu bukan 125ribu kHz (125Mhz)
    Tapi 125,000 kHz (125,0 kHz)
    Inget orang Inggris nulis koma pake titik.
    Auto Trigger Source: untuk menentukan sumber trigger ADC
    ...Ok let's finish this thing....
    3. sekarang tinggal klik File ---> Generate, Save and Exit
    image
    lalu kasih nama dan simpen File2nya.
    Contoh program ADC untuk LM35 :

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

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

    #define heater PORTB.0//heater di hubungkan dg PORTB.0
    #define ADC_VREF_TYPE 0x40
    unsigned int read_adc(unsigned char adc_input)
    {
    ADMUX=adc_input|ADC_VREF_TYPE;
    ADCSRA|=0x40;
    delay_us(10);
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
    }

    unsigned char buff[33];
    void lcd_putint(unsigned int dat)
    {
    sprintf(buff,"%d ",dat);
    lcd_puts(buff);
    }

    void main(void)
    {

    unsigned int suhu;
    float adc;

    DDRB=0xff;
    PORTB=0x00;

    // ADC initialization
    // ADC Clock frequency: 125.000 kHz
    // ADC Voltage Reference: AVCC pin
    // ADC High Speed Mode: Off
    // ADC Auto Trigger Source: None
    ADMUX=ADC_VREF_TYPE;
    ADCSRA=0x85;
    SFIOR&=0xEF;

    // LCD module initialization
    lcd_init(16);

    while (1)
    {
    // Place your code here
    adc = read_adc(0);
    adc=adc/255;
    suhu=adc*175;
    suhu=suhu-12;
    if (suhu<27)heater=1;
    if (suhu>32)heater=0;
    lcd_putsf("Suhu= ");
    lcd_putint(suhu);
    delay_ms(1000);
    lcd_clear();

    };
    }
    Program diatas untuk membaca nilai suhu dari sensor LM35 trus hasilnya digunakan sebagai acuan untuk menyalakan Heater yg terhubung ke PORTB.0
    Dalam program diatas terdapat code:
    adc=adc/255;
    suhu=adc*175;
    suhu=suhu-12;
    Fungsi kode diatas untuk mengkalibrasi nilai ADC agar sesuai dengan suhu sebenarnya. Setiap rangkaian memiliki error yg berbeda-beda. jadi nilai untuk kalibrasi harus di sesuaikan.



    any questions?? post comment on this blog: http:\\avrku.blogspot.com
    or send email to: zigan@ymail.com
    CodeVisionAVR C Compiler is copyright by Pavel Haiduc, HP InfoTech s.r.l.
    AVR is a registered trademark of Atmel Corporation.

    Selengkapnya...

    Menghitung Resistor untuk LED

    electronics_led_diagram
    LED memang device kecil yg sepele, tapi kadang kita pusing saat mo nentuin resistor yang akan di seri ke LED untuk membatasi arus yang masuk. Karena bingung akhirnya maen comot aja nilai R nya, dan hasilnya nyala LED gak maksimal klo R nya ke besaren. Ato LED nya gampang meleduk klo R nya terlalu kecil.

    Rumus menghitung nilai R untuk LED

    R= V / I
    Weheee.... sederhana kan... itu kan rumus dasar tegangan.
    Nilai tegangan(V) adalah nilai tegangan sumber(Vs) dikurangi nilai tegangan LED(VL) (nilai tegangan LED diasumsikan 2,2 volt).
    Arus yg boleh melewati LED kira-kira 20mA (0,02 A)
    Jika tegangan sumber 12V besar VL nya adalah: 12-2,2 = 9.8 volt
    R=9.8/ 0.02 = 490 ohm
    Di pasaran sudah nyari R 490 ohm jadi kita nyari yang di atasnya dikit 510 ohm.
    Setiap alat yang di aliri listrik pasti menimbulkan panas, begitu juga R yg kita gunakan ini. Semakin besar Daya maka panas yg dihasilkan juga semakin tinggi. So... kita harus memilih R dengan kapasitas daya yang sesuai agar R nya gak meleduk.. He3.....
    P= V*I
    So.... P= 9.8*0.02 = 0.196 watt
    jadi minimal kita harus memilih LED yang 1/4 Watt (0.25 watt)
    Selengkapnya...

    Search

    Entri Populer

     

    Total Tayangan Halaman

    Diberdayakan oleh Blogger.