Sensor Arus ACS712
Teori dan Cara Kerja Sensor Arus
Sensor arus listrik ACS712 30A sangat banyak di gunakan di sistem kendali automasi, contoh nya adalah sistem keamanan arus beban pada listrik, monitoring beban arus jarak jauh, kwh meter dan lain lain.
Apakah teman-teman ingin monitoring arus listrik dengan internet? Cukup klik tombol merah di bawah ini.
Sensor ini memiliki ukuran yang sangat mungil, tapi mampu mengukur arus dari -30A sampai dengan 30A. bayangin tuh kalo seandaninya di lalui tegangan 220V, maka daya yang bisa di lewati nya adalah
P = I*V
P = 30A*220V
= 6.600VA
Bagaimana kah cara kerja sensor ACS712 30A ini? Oke setiap arus yang di lalu oleh sensor ini maka ada perubahan tegangan pada ouput sensor. jika dilihat dari datasheet nya, dari tegangan 0-2.5v ini range arus nya sebesar -30A-0A, sementara 2.5V-5.0V ini range nya 0A – 30 A. Lebih jelas nya cara kerja sensor ini bisa dilihat di datasheet ini
Oke kita lanjut ya..
Coding Sensor Arus dengan Codevision
Output sensor arus ACS712 30A ini akan kita hubungkan ke PIN ADC.0 pada ATMEGA16, kemudian langsung kita olah datanya di program,. berikut program nya
#include <mega16.h> #include <delay.h> #include <stdlib.h> // Alphanumeric LCD functions #include <alcd.h> // Declare your global variables here // Voltage Reference: AREF pin #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); // Wait for the AD conversion to complete while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } float adc_volt; float amp; float temps; float watt; unsigned char buf_data[16]; unsigned char buf_amp[16]; unsigned char buf_watt[16]; void main(void) { // Declare your local variables here // Input/Output Ports initialization DDRA=0X00;//penting agar PINA sebagai output PORTA=0X00;//penting utk di setting nilai PORTA=0 // ADC initialization // ADC Clock frequency: 1000.000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTC Bit 0 // RD - PORTC Bit 1 // EN - PORTC Bit 2 // D4 - PORTC Bit 4 // D5 - PORTC Bit 5 // D6 - PORTC Bit 6 // D7 - PORTC Bit 7 // Characters/line: 20 lcd_init(20); while (1) { // Place your code here temps = read_adc(1)*(5.0/1023); adc_volt = fabs(temps-2.50)/0.066;//0.066 di dapat dari data sheet amp = adc_volt; watt = 220 * amp; lcd_gotoxy(0,0); lcd_putsf("UJI SENSOR ARUS"); lcd_gotoxy(0,1); lcd_putsf("VOUT: "); ftoa(temps,3,buf_data); lcd_puts(buf_data); lcd_putsf(" V"); lcd_gotoxy(0,2); lcd_putsf("ARUS: "); ftoa(amp,3,buf_amp); lcd_puts(buf_amp); lcd_putsf(" A"); lcd_gotoxy(0,3); lcd_putsf("DAYA: "); ftoa(watt,3,buf_watt); lcd_puts(buf_watt); lcd_putsf(" WATT"); delay_ms(100); lcd_clear(); } }
Hasil program di atas akan di tampilkan dengan menggunakan LCD 20X4, dan pin pin pada LCD 20×4 di hubungkan ke PORTC.
Hasil nya sangat mengejutkan, ya itu pembacaan sensor yang tidak stabil. datanya arus nya berubah ubah. jika data ini akan kita gunakan untuk monitoring dan mengendalikan sebuah system maka hasilnya akan tidak baik.
saya juga sempat bingung dengan output ACS712 30A ini, kenapa outputnya naik turun dan tidak setabil. ternyata sebabnya adalah karena kita mengukur arus AC. yang mana gelombang arus AC ini mengakibabkan output sensor ini tidak stabil. jadi bagaimana kah cara agar pembacaan nya menjadi stabil.
Untuk Artikel di atas, teman-teman cukup klik saja, maka akan mendapat kan cara agar sensor ini lebih berhasil dalam pembacaan nya. Atau kita bahas saha pada sub bab di bawah ini,
Data Maximum Sensor Arus
Untuk pembacaan output sensor arus yang lebih stabil, kita akan coba sampling ADC dalam beberapa waktu kemudian kita lihat nilai maximum nya. Besar arus AC pada suatu beban tidak lah stabil, pasti ada riak atau gelombang nya. Untuk cara pengambilan Max nya bisa kita lihat pada program di bawah ini,
#include <mega16.h> #include <delay.h> #include <stdlib.h> // Alphanumeric LCD functions #include <alcd.h> // Declare your global variables here // Voltage Reference: AREF pin #define ADC_VREF_TYPE ((0<<REFS1) | (0<<REFS0) | (0<<ADLAR)) // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); // Wait for the AD conversion to complete while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } float arus1, vout1, daya; int adc1, count, dataMin, dataMax; //unsigned char buf_min[10]; unsigned char buf_max[10]; unsigned char buf_arus1[10]; unsigned char buf_daya[10]; void main(void) { // Declare your local variables here DDRA=0X00;//penting agar PINA sebagai output PORTA=0X00;//penting utk di setting nilai PORTA=0 // ADC initialization // ADC Clock frequency: 1000.000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTC Bit 0 // RD - PORTC Bit 1 // EN - PORTC Bit 2 // D4 - PORTC Bit 4 // D5 - PORTC Bit 5 // D6 - PORTC Bit 6 // D7 - PORTC Bit 7 // Characters/line: 16 lcd_init(20); dataMin = adc1; dataMax = adc1; while (1) { // Place your code here for ( count = 0; count < 1000; count++){ adc1 = read_adc(1); if ( adc1 > dataMax ) dataMax = adc1; if ( adc1 < dataMin ) dataMin = adc1; delay_ms(1); } vout1 = dataMax*(5.0/1023); arus1 = fabs(vout1-2.50)/0.066; daya = arus1*220; ftoa(arus1,3,buf_arus1); itoa(dataMax,buf_max); ftoa(daya,2,buf_daya); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("UJI SENSOR ACS712 30"); lcd_gotoxy(0,1); lcd_putsf("AMP: "); lcd_puts(buf_arus1); lcd_putsf(" A"); lcd_gotoxy(0,2); lcd_putsf("MAX: "); lcd_puts(buf_max); lcd_gotoxy(0,3); lcd_putsf("WATT: "); lcd_puts(buf_daya); lcd_putsf(" VA"); dataMax=0; dataMin=0; arus1=0;vout1=0; // reset data } }
Pada program di atas, kita akan membaca sensor Arus dalam satu detik dengan mengabil data sebanyak 1000x. Dalam pembacaan data 1000x ini kita akan melihat data maximun dan data minimum nya. Hal ini di lakukan karena Arus pada Beban AC tidak lah memang stabil.
Pembacaan Sensor Arus dengan Arduino
Bisa kah kita konversi program di atas ke arduino? Dengan struktur yang sama? min max data? Yaps, pasti bisa, karena semua program pada dasarnya memiliki alur yang sama, apalagi sama-sama berbahasa C. Untuk lebih jelas nya mari kita lihat pada program di bawah ini,
float arus0, vout0, daya; int adc0; int dataMin, dataMax; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(A0, INPUT_PULLUP); dataMin = adc0; dataMax = adc0; } void loop() { // put your main code here, to run repeatedly: for ( int i=0; i<1000; i++){ adc0 = analogRead(A0); if ( adc0 > dataMax)dataMax = adc0; if ( adc0 < dataMin)dataMin = adc0; delay(1); } vout0 = dataMax*(5.0/1023); arus0 = fabs(vout0-2.50)/0.066; daya = arus0*220; Serial.print("Arus: "); Serial.println(arus0); Serial.print("Daya: "); Serial.println(daya); dataMin = 0; dataMax = 0; arus0=0; vout0 = 0; }
Program di atas memiliki kesamaan cara kerja dengan program codevision AVR, silahkan teman-teman kembangkan sendiri,
Thanks,
Semoga membantu