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")

****************

// 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)

http://www.AVRku.blogspot.com

zigan@ymail.com

Selengkapnya...


ShoutMix chat widget