TUGAS AKHIR SEMESTER 1
MIKROKONTROLLER DAN INTERFACE
MONITORING TEGANGAN, ARUS, DAN DAYA PADA
CHARGER BATERI
Oleh :
Mughni Syahid
NRP. 1310145014
Dosen :
Mohamad Safrodin B.Sc, MT
PROGRAM STUDI DIII TEKNIK ELEKTRO INDUSTRI
DEPARTEMEN TEKNIK ELEKTRO
POLITEKNIK ELEKTRONIKA NEGERI SURABAYA
Kampus ITS Keputih Sukolilo, Surabaya 60111, Jawa Timur, Indonesia
Telp.(031) 5947280 Fax:(031)5946114
MONITORING TEGANGAN, ARUS DAN DAYA
PADA CHARGER BATERAI
I.
TUJUAN
1.
Sebagai tugas akhir semester 1 mata kuliah mikrokontroller dan interface.
2.
Dapat mengaplikasikan visual studio C# sebagai monitoring dan data base MySQL
sebagai media penyimpan data monitoring.
II.
DASAR TEORI
2.1 Sensor Tegangan
Rangkaian sensor tegangan yang dipakai adalah pembagi tegangan dengan
resistor dikarenakan tegangan yang diukur maksimal 27,72 V, sedangkan tegangan
yang diperbolehkan masuk ke ADC pada mikrokontroler maksimal 5 V. Gambar 2.1.
menunjukkan gambar rangkaian sensor tegangan dengan dua buah resistor R1 dan R2.
Gambar 2.1. Rangkaian Sensor Tegangan
Untuk mendapatkan nilai dari resistor yang digunakan adalah dengan rumus
pembagi teganagan seperti pada rumus 2.1 dibawah ini :
2 =
∗
( 1 + 2)(2.1)
Dimana :
R1
: Resistor R1
R2
: Resistor R2
Vi
: Tegangan Input
Vo
: Tagangan Output
2.2 Sensor Arus (ACS 712) 5A
Gambar 2.2.
1Konfigurasi Pin dari IC ACS7 12.
Sensor ACS712 ini pada saat tidak ada arus yang terdeteksi, maka keluaran
sensor adalah 2,5 V. Dan saat arus mengalir dari IP+ ke IP-, maka keluaran akan >2,5
V. Sedangkan ketika arus listrik mengalir terbalik dari IP- ke IP+, maka keluaran akan
< 2,5 V. Berikut ini adalah karakteristik dari sensor suhu ACS712.
Memiliki sinyal analog dengan sinyal-ganguan rendah (low-noise)
Ber-bandwidth 80 kHz
Total output error 1.5% pada Ta = 25°C
Memiliki resistansi dalam 1.2 mΩ
Tegangan sumber operasi tunggal 5.0V
Sensitivitas keluaran: 66 sd 185 mV/A
Tegangan keluaran proporsional terhadap arus AC ataupun DC
Fabrikasi kalibrasi
Tegangan offset keluaran yang sangat stabil
Hysterisis akibat medan magnet mendekati nol
Rasio keluaran sesuai tegangan sumber
2.3
Daya DC
Daya DC adalah perkalian dari tegangan dan arus, sehingga :
=
(2.2)
Dimana :
P = Daya (Watt)
V = Tegangan ( Volt)
I = Arus (Ampere)
1
III.
GAMBAR BLOK DIAGRAM RANGKAIAN
IV.
ALAT DAN BAHAN
Software
1.
Microsoft Visual Studio 2008 C#
2.
XAMPP ( Apache dan MySQL )
3.
MySql Connector
4.
Code Vision AVR
5.
Khazama AVR Programmer
Hardware
1.
Transformator 5A
2.
Rectifier dan Filter
3.
Minimum sistem mikrokontroller Atmega 16
4.
LCD Display16X2
5.
DC – DC Converter ( Buck Converter )
6.
Sensor Tegangan ( Voltage Devider )
7.
Sensor Arus (ACS712) 5A
V.
PROSEDUR PERCOBAAN
A.
Membuat Program di Mikrokontroller
1.
Buka Code Vsision AVR
2.
Setting konfigurasi I/O
4.
Download ke Mikrokontroller dengan Khazama AVR Programmer
B.
Membuat Program di PC / Komputer
1.
Membuat Program Data Base My SQL ( Aktifkan Aphace dan MySQL)
3.
Untuk koneksi data base dengan visual C# maka instal MySQL Connector
4.
Buat Program monitoring di Visual C#
5.
Buat desain Form dan Program
6.
Untuk menambahkan Grafik tambahkan Zedgraph
VI.
HASIL PERCOBAAN
1.
Tampilan monitoring Visual C#
Keterangan :
1.
Grafik Tegangan, Arus, Daya yang ditampilkan per detik / real time
namun tidak disimpan di data base.
2.
Grafik Tegangan / Arus / Daya dari data base yang ditampilkan per menit.
3.
Tabel untuk melihat data yang tersimpan di data base.
4.
Setting COM serial dan tombol connect.
5.
Tombol tools untuk grafik dan data base.
Grafik tegangan naik menandakan proses pengisian. Pada saat arus tegangan
naik maka menggunakan charger metode Arus Konstan sehingga tegangan baterai
yang akan berubah. Saat tegangan baterai mecapai 14,4 V maka metode yang
digunakan Tegangan Konstan sehingga tegangan charger konstan di 14,4V. Karena
kondisi kontrol PI yang tidak stabil serta skala pembacaan sensor sehingga
menyebabkan output menjadi osilasi diantara setpoint 14,4 V.
3.
Membaca data base dan menampilkan grafik arus
Saat awal pengisian baterai maka charger menggunkan metode Arus Konstan
sehingga arus sesuai set point 1,44 A. Namun karena kondisi kontrol PI yang tidak
stabil dan skala pembacaan sensor arus yang besar menyebabkan output dari kontrol
PI osilasi di antara setpoint arus 1,44 A. Setelah Tegangan Charger menjadi 14,4 V
maka metode berubah menjadi Tegangan Konstan set point 14,4V dan arus pengisian
akan turun. Jika arus pengisian turun dan mencapai steady maka menandakan baterai
sudah dalam kondisi penuh dan pengisian selesai.
4.
Membaca data base dan menampilkan grafik daya
5.
Membaca data base di MySQL
Membaca data di MyAdmin SQL yang sudah tersimpan. Karena daya yang banyak
maka ditampilkan yang 500 baris.
6.
Membuat tampilan gafik di MySQL
Untuk mempermudah menganalisa data maka di MySQL data base dapat
ditampilkan ke grafik. Dari tampilan grafik hasilnya sama dengan tampilan grafik di
monitoring Visul C# namun di MySQL data Tegangan, Arus dan Daya ditampilkan
di satu grafik sehingga data arus yang nilainya kecil sulit untuk dianalisa nilainya.
VII.
KESIMPULAN
Dari percobaan ini maka dapat diambil keimpulan diantaranya :
1.
Dengan monitoring data yang ditampilkan di grafik dapat mempermudah
melihat dan menganalisa perubahan data dari sensor.
2.
Dengan penyimpanan data di data base maka akan mempermudah
pengambilan sensor data karena tidak perlu mencatat tiap waktu dan
mengurangi resiko error dan kesalahan saat pengambilan data manual.
VIII.
LAMPIRAN PROGRAM
1.
Program di Mikrokontroller
/*****************************************************
Project : Monitoring Tegangan, Arus, dan Daya pada Charger Baterai
Version : rev 1
Date : 28/10/2015
Author : Mughni Syahid
Company : PENS
Comments: bismillah project mikrokontroller dan interface
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
// Declare your global variables here
#define ADC_VREF_TYPE 0x00
unsigned char lcd[16];
float nilaitt, nilaiaa;
int kirima, kirimv;
float nilai_t, Inte_t=0, error_t=0, P_t=0 , I_t=0 , PI_t=0;
float nilai_a, Inte_a=0, error_a=0, P_a=0 , I_a=0 , PI_a=0;
int da[51], a=0, na=0, aa;
int m=0, o=1, p=0, q=0, ca=1, ct=1, cs=1, charger=0, ;
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
nilaitt=((tt*5.0/1023)*12200)/2200;
{
if(nilaiaa<=500&&o==1)
{ ca=on; ct=off; cs=off; o=0; p=1; q=0; m=0; }
if(nilaitt>=14.4&&p==1)
{ ca=off; ct=on; cs=off; o=0; p=0; q=1; m=0; }
//////////// arus konstan 1.44 A /////////////
if(ca==on)
{
sprintf(lcd,"%.2fV A> %.3fA ",nilaitt,nilaiaa);
lcd_gotoxy(0,1); lcd_puts(lcd);
//////////////// Kontrol PI //////////////////
nilai_a=((adc_ars*5.0/1023)-2.5)/0.185;
error_a=sp_a-nilai_a;
Inte_a=Inte_a+(error_a*tsa);
P_a=kp_a*error_a;
sprintf(lcd,"%.2fV <T %.3fA ",nilaitt,nilaiaa);
lcd_gotoxy(0,1); lcd_puts(lcd);
//////////////// Kontrol PI //////////////////
nilai_t=(((adc_teg*5.0)/1023)*12200)/2200;
error_t=sp_t-nilai_t;
/////////////////// end /////////////////
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
PORTA=0x00;
// Clock source: System Clock
// Clock value: 15,625 kHz
// Mode: Normal top=0xFF
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Ph. correct PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA2;
TCCR1B=0x11;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=200; // TOP=(fclk/(2*N*fpwm)) //138 //150
OCR1AH=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x41;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: ADC Stopped
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
// Alphanumeric LCD initialization
// Connections are specified in the
private void ShowData() {
if (GrafikDB.GraphPane.CurveList.Count <= 0)
return;
LineItem curve1DB = GrafikDB.GraphPane.CurveList[0] as
LineItem;
if (curve1DB == null)
return;
IPointListEdit List1DB = curve1DB.Points as
IPointListEdit;
MySqlDataReader reader = null;
conn.Open();
MySqlCommand cmd = new MySqlCommand(command.CommandText,
conn); double time = (Environment.TickCount - TickStartDB) / 1000.0;
dbteg = Convert.ToInt16(
reader["Tegangan"].ToString());
dbarus = Convert.ToInt16(reader["Arus"].ToString());
GraphPane myPaneDB = GrafikDB.GraphPane;
if (Convert.ToString(CBDB.Text)== "Tegangan")
{
List1DB.Add(i, dbteg);
private void Form1_Load(object sender, EventArgs
RollingPointPairList ListDB = new
RollingPointPairList(60000);
RollingPointPairList List1DB = new
RollingPointPairList(60000);
LineItem curveDB = myPaneDB.AddCurve(" ", ListDB,
Color.Red, SymbolType.None);
waktu = string.Format("{0:yyyy'-'MM'-'dd
HH':'mm':'ss}",tgl);
MySqlConnection conn = koneksi.getkoneksi();
MySqlCommand command = conn.CreateCommand();
command.CommandText = "INSERT INTO data_charger
(Tegangan,Arus,Daya,Waktu) VALUES('" + teg + "','" + arus + "','" + daya + "','" + waktu + "')";
conn.Open();
MySqlCommand cmd = new MySqlCommand(command.CommandText,
conn);
conn.Close();
MySqlCommand cmd = new MySqlCommand(command.CommandText,
conn);
private void lvData_SelectedIndexChanged(object sender,
EventArgs e)
void zedGraphControlT_Load(object sender, EventArgs e)
SerialPort.PortName = Convert.ToString(comboBox.Text);
RollingPointPairList ListT = new
RollingPointPairList(60000);
RollingPointPairList List1T = new
RollingPointPairList(60000);
LineItem curveT = myPaneT.AddCurve("Tegangan", ListT,
Color.Blue, SymbolType.None);
LineItem curve1T = myPaneT.AddCurve(" ", List1T,
Color.YellowGreen, SymbolType.None);
myPaneT.XAxis.Scale.Min = 0;
RollingPointPairList ListA = new
RollingPointPairList(60000);
RollingPointPairList List1A = new
RollingPointPairList(60000);
LineItem curveA = myPaneA.AddCurve("Arus", ListA,
Color.Green, SymbolType.None);
LineItem curve1A = myPaneA.AddCurve(" ", List1A,
Color.Blue, SymbolType.None);
// grafik Daya
GraphPane myPaneD = GrafikDaya.GraphPane;
myPaneD.Title.Text = " Grafik Daya "; myPaneD.XAxis.Title.Text = " Waktu (s) "; myPaneD.YAxis.Title.Text = " Daya (A) ";
RollingPointPairList ListD = new
RollingPointPairList(60000);
RollingPointPairList List1D = new
RollingPointPairList(60000);
LineItem curveD = myPaneD.AddCurve("Daya", ListD,
Color.Red, SymbolType.None);
LineItem curve1D = myPaneD.AddCurve(" ", List1D,
Color.White, SymbolType.None);
myPaneD.XAxis.Scale.Min = 0;
arusint = Convert.ToInt32(DataSerial.Substring(pos2 + 1,
4));
arusfloat = ((arusint * 5 * 1000 /1023 ) - 2500 ) * 1000 / 185;
arus = Convert.ToString(arusfloat);
dayafloat = (Convert.ToInt32(tegfloat) *
Convert.ToInt32(arusfloat))/1000;
dayaint = Convert.ToInt32 (dayafloat) ;
daya = Convert.ToString(dayaint);
LineItem curveT = GrafikTegangan.GraphPane.CurveList[0] as
LineItem;
LineItem curve1T = GrafikTegangan.GraphPane.CurveList[1]
as LineItem;
GrafikTegangan.AxisChange();
LineItem curveA = GrafikArus.GraphPane.CurveList[0] as
LineItem;
LineItem curve1A = GrafikArus.GraphPane.CurveList[1] as
LineItem;
}
LineItem curveD = GrafikDaya.GraphPane.CurveList[0] as
LineItem;
LineItem curve1D = GrafikDaya.GraphPane.CurveList[1] as
LineItem;
private void DrawDB(string setpointDB, string DB)
LineItem curveDB = GrafikDB.GraphPane.CurveList[0] as
LineItem;
LineItem curve1DB = GrafikDB.GraphPane.CurveList[1] as