NAMA
: MOH. FAISOL
KELAS
: 2 D3 ELIN B
NRP
: 1303121040
TUTORIAL II MONITORING PANEL SURYA TUTORIAL BASIC TIMER- CONTER,ADC AND SERIAL COMMUNICATION
I.
INTRODUCTION 1. Plant Description Monitoring panel surya adalah sebuah sistem monitoring nilai tegangan dan besar arus yang akan dimasukkan kedalam accumulator yang kita analogikan sebagai load (beban). Selain melakukan monitoring nilai arus dan tegangan, plant ini juga merupakan sistem yang berperan untuk mengatur tegangan keluaran yang fluktuatif dari panel surya menjadi tegangan yang konstan sebelum dimasukkan ke accumulator. Energi listrik yang fluktuatif dari dari panel surya akibat perubahan cahaya matahari tidak dapat digunakan secara langsung untuk charging accumulator, karena berakibat kepada ketidak ekonomisan penggunaan accumulator baik dalam pemuatan maupun umur penggunaan accumulator itu sendiri (accumulator life time) sebagai media penyimpan. Maka digunkanlah DC-DC boost converter yang merupakan sistem dengan keadalan untuk mengatasi masalah ini. DC-DC boost converter ini dirancang sedemikian rupa sehingga didapat keluaran stabil dengan range 16V s.d 18V /0.0022A DC yang kemudian dapat dimasukkan kedalam accumulator melalui sistem carging. DC-DC buck-bost converter ini akan kita rancang untuk dapat melakukan pengontrolan terhadap keluaran arus dan tegangan dari generator dengan cara membangkitkan PWM pada microcontroler Atmega128 dengan frekuensi sekitar 32 KHZ. Nilai Duty Cycle pada PWM ini akan berubah dan menyesuaikan diri terhadap keluran dari panel surya, sehingga tegangan carging pada accumulator dapat disesuaikan Kata kunci : panel suraya,buck-boost converter, ADC.
2. Lay Out Description
II.
PROGRAM PROSES 1. Please design this circuit control off WLC in PROTEUS dengan chip AtMega128.
2. Circuit description PORT.4 pada plant ini akan menghasilkan PWM dengan frekuensi 31,25 KHz Kita menentukan nilai frekuensi clock timer 8000 KHz itu berarti kita telah menentukan nilai prescaler sebesar 1. πΆππππ π‘ππππ0 =
πΌππ‘πππππ πΆππππ 8000 πΎπ»π§ = = 8000 πΎπ»π§ ππππ πππππ 1
Timer0 adalah timer 8 bit dengan nilai hexa adalah FF H sehingga diketahui nilai OCR0 maksimum (top) adalah 255. Nilai periode gelombang keluaran yang didapat adalah. π=
256 256 = = 32 Β΅s πΆππππ π‘ππππ0 8000 πΎπ»π§
Untuk membuat duty cycle maka yang kita atur adalah nilai OCR0, nilai TON akan semakin besar atau duty cycle semakin besar pada saat nilai OCR0 mendekati 255 dan TON akan semakin kicil atau duty cycle semakin kecil pada saat nilai OCR menjauhi nilai 255. Disini mode yang kita gunakan adalah Phase Correct PWM sehingga nilai periode T tidak lagi 32Β΅s akan tetapi menjadi 64 Β΅s. Sehingga frekuensi timer menjadi 15,625 KHz. Nilai OCR0 akan berubah berubah tergantung pada besar keluaran panel surya. Jika panal surya menghasilkan tegangan rendah, maka nilai OCR0 akan increment, sehingga PWM akan semakin besar dan menyebabkan sudut penyulutan pada Bost converter semakin besar. Dengan adanya aksi ini maka keluaran dari panel surya dinaikkan secar teru menerus sampai pada keaadaan range tagangan 16V s.d 18V. Namun pada saat nilai tegangan dari bost converter melebihi 18 VDC maka nilai OCR0 akan diincrement, sehingga PWM akan semakin kecil dan menyebabkan sudut penyulutan pada Bost converter semakin kecil. Disini nilai OCR0 diatur agar menjaga tegangan keluaran Bost-converter tetap berada pada range 16V s.d 18V. Besar nilai keluaran Bost-converter juga dipengaruhi oleh besar tahanan beban. Disini kita memberi R1=90Kβ¦ dan R2-5Kβ¦. Perbandingan nilai resistansi ini diberikan agar pembacaan tegangan pada R2 maksimal adalah 5V. Besar tegangan keluaran R2 ini akan dilewatkan terlebih dahulu pada zener 1N5231B agar stabil pada harga tegangan maksimal keluaran 5V. Keluaran dari zener akan dibaca pada ADC0 resolusi 10 bit(1023) dan dilakukan perbandingan pada pembacaan tegangan di R2 sehingga didapat pembacaa tegangan pada R1. Pembacaan nilai teganagn R2 akan ditampilkan pada layar LCD 20X4, diikuti oleh pambacaan nilai arus, daya dan Duty cycle. Pada saat tegangan di R1<=16 V maka lampu indikator Under voltage condition pada PORT.1 akan menyala dan apabila R1>=18 V maka lampu indikator Over voltage condition pada PORT.0 akan menyala. Untuk condisi lampu indikator Over current conditon pada PORT.2 manyala jika current >= 0.00022.
3. Setting I/O a. Open CodeVision AVR compiler dan pilih menu File-New.
BLANK PAGE
b. Pilih Project kemudian OK
c. Pilih chip tipe ATmega
d. Pilih tipe chip Atmega128 dengan Clock 8000 KHz
a. Atur Port yang ingin digunakan sebagai Input maupun Output
4. Setting timer0 a. Pilih timer0
b. Tentukan setting seperti gambar dibawah ini.
5. Setting ADC a. Pilih ADC kemudian klik enable
6. Setting serial communication a. Pilih USART0
b. Enable reciver dan transmitter
c. Buka computer management dan bukalah Port (COM & LPT)
d. Double clik sehingga tampil invormasi berikut
e. Atur nilai USART0 dengan informasi diatas
f. Generate,Save and Exit untuk menyipan dan keluar dari pengaturan
g. Simpan dengan nama yang sesuai
h. Buatlah program dibawah #include <mega128.h> #include <delay.h> #include
#ifndef RXB8 #define RXB8 1 #endif #ifndef TXB8 #define TXB8 0 #endif #ifndef UPE #define UPE 2 #endif #ifndef DOR #define DOR 3 #endif #ifndef FE #define FE 4 #endif #ifndef UDRE #define UDRE 5 #endif #ifndef RXC #define RXC 7 #endif #define FRAMING_ERROR (1<
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0; #else unsigned int rx_wr_index0,rx_rd_index0,rx_counter0; #endif bit rx_buffer_overflow0; float voltage1,voltage2,current,a=1,duty,power; unsigned char buff1[20],buff2[20],buff3[20],buff4[20]; interrupt [USART0_RXC] void usart0_rx_isr(void) { char status,data; status=UCSR0A; data=UDR0; if ((status & (FRAMING_ERROR | PARITY_ERROR DATA_OVERRUN))==0) { rx_buffer0[rx_wr_index0++]=data; #if RX_BUFFER_SIZE0 == 256 // special case for receiver buffer size=256 if (++rx_counter0 == 0) rx_buffer_overflow0=1; #else if (rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0; if (++rx_counter0 == RX_BUFFER_SIZE0) { rx_counter0=0; rx_buffer_overflow0=1; } #endif } } #ifndef _DEBUG_TERMINAL_IO_ // Get a character from the USART0 Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter0==0); data=rx_buffer0[rx_rd_index0++]; #if RX_BUFFER_SIZE0 != 256 if (rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; #endif #asm("cli") --rx_counter0; #asm("sei") return data; } #pragma used#endif // USART0 Transmitter buffer #define TX_BUFFER_SIZE0 8 char tx_buffer0[TX_BUFFER_SIZE0]; #if TX_BUFFER_SIZE0 <= 256 unsigned char tx_wr_index0,tx_rd_index0,tx_counter0; #else unsigned int tx_wr_index0,tx_rd_index0,tx_counter0; #endif // USART0 Transmitter interrupt service routine
|
interrupt [USART0_TXC] void usart0_tx_isr(void) { if (tx_counter0) { --tx_counter0; UDR0=tx_buffer0[tx_rd_index0++]; #if TX_BUFFER_SIZE0 != 256 if (tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0; #endif } } #ifndef _DEBUG_TERMINAL_IO_ // Write a character to the USART0 Transmitter buffer #define _ALTERNATE_PUTCHAR_ #pragma used+ void putchar(char c) { while (tx_counter0 == TX_BUFFER_SIZE0); #asm("cli") if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) { tx_buffer0[tx_wr_index0++]=c; #if TX_BUFFER_SIZE0 != 256 if (tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0; #endif ++tx_counter0; } else UDR0=c; #asm("sei") } #pragma used#endif // Standard Input/Output functions #include <stdio.h> #define ADC_VREF_TYPE 0x00 // 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); ADCSRA|=0x10; return ADCW; } void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x1F; PORTC=0x00; DDRC=0x00;
PORTD=0x00; DDRD=0x00; PORTE=0x00; DDRE=0x00; PORTF=0x00; DDRF=0x00; PORTG=0x00; DDRG=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 8000.000 kHz // Mode: Phase correct PWM top=0xFF // OC0 output: Non-Inverted PWM ASSR=0x00; TCCR0=0x61; TCNT0=0x00; OCR0=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; ETIMSK=0x00; // USART0 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 Receiver: On // USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud Rate: 9600 UCSR0A=0x00; UCSR0B=0xD8; UCSR0C=0x06; UBRR0H=0x00; UBRR0L=0x33; // USART1 initialization // USART1 disabled UCSR1B=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 1000.000 kHz // ADC Voltage Reference: AREF pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x83; // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTA Bit 0 // RD - PORTA Bit 1 // EN - PORTA Bit 2 // D4 - PORTA Bit 4 // D5 - PORTA Bit 5
// D6 - PORTA Bit 6 // D7 - PORTA Bit 7 // Characters/line: 20 lcd_init(20); // Global enable interrupts #asm("sei") while (1) { OCR0=a; lcd_gotoxy(0,0); lcd_putsf("Voltage:"); voltage1 = (float)read_adc(0)*5/1024; voltage2 = voltage1*18; sprintf(buff1,"%3.2f",voltage2); lcd_puts(buff1); lcd_gotoxy(0,1); lcd_putsf("Current:"); current=(voltage1+voltage2)/90000; sprintf(buff2,"%3.5f",current); lcd_puts(buff2); lcd_gotoxy(0,2); lcd_putsf("Daya"); lcd_gotoxy(7,2); lcd_putsf(":"); power = voltage2*current; sprintf(buff4,"%3.8f",power); lcd_puts(buff4); if(a>=2){a=a-1;} if (voltage2>=18) { OCR0=a; PORTB.0=1; PORTB.1=0; PORTB.2=0; PORTB.3=0; lcd_gotoxy(0,3); lcd_putsf("Duty"); lcd_gotoxy(7,3); lcd_putsf(": %"); duty=(a/256)*100; sprintf(buff3,"%3.2f",duty); lcd_gotoxy(8,3);lcd_puts(buff3); } if (voltage2<=16) { if(a<=250){a=a+1;} OCR0=a; PORTB.1=1; PORTB.0=0; PORTB.2=0; PORTB.3=0; lcd_gotoxy(0,3); lcd_putsf("Duty"); lcd_gotoxy(7,3); lcd_putsf(": %"); duty=(a/256)*100; sprintf(buff3,"%3.2f",duty); lcd_gotoxy(8,3);lcd_puts(buff3);
} if (current>=0.00022) { if(a<=250){a=a+1;} OCR0=a; PORTB.2=1; PORTB.1=0; PORTB.0=0; PORTB.3=0; lcd_gotoxy(0,3); lcd_putsf("Duty"); lcd_gotoxy(7,3); lcd_putsf(": %"); duty=(a/256)*100; sprintf(buff3,"%3.2f",duty); lcd_gotoxy(8,3);lcd_puts(buff3); } if (voltage2<=18&&voltage2>=16) { OCR0=a; PORTB.0=0; PORTB.1=0; PORTB.2=0; PORTB.3=1; lcd_gotoxy(0,3); lcd_putsf("Duty"); lcd_gotoxy(7,3); lcd_putsf(": %"); duty=(a/256)*100; sprintf(buff3,"%3.2f",duty); lcd_gotoxy(8,3);lcd_puts(buff3); } } III.
} SIMULATION OUTPUT 1. UNDER VOLTAGE CONDITION
2. NORMAL CONDITION
IV.
SERIAL COMMUNICATION 1. PROTEUS CIRCUIT SETTING a. Double clik pada COMPIM sehingga muncul jendela editor. Tentukan setting comport.
2. CODEVISION AVR PROGRAM SETTING a. Bukalah menu setting-terminal
b. Lakukan pengaturan seperti gambar dibawah ini.
3. VSPE SETTING a. Pilih menu divice kemudian create
b. Pilih device type peir kemudian next
c. Pilih menu jenis comport sesuai dengan comport pada proteus dan visual basic setelah selesai clik Finis.
d. Kemudian Running lah
4. VISUAL BASIC SETTING a. Buka jendela baru visual basic 6.0 seperti gambar dibawah ini.
b. Buatlah lay-out seperti gambar dibawah.
c. Clik kanan dan tambahkan komponen microsoft comm control 6.0
d. Tambahkan kedalam Form1
e. Lakukan pengaturan dibawah ini untuk komponen-komponen yang digunakan
5. VISUAL BASIC PROGRAM Dim data As String Dim tegangan, arus, duty As Variant Private Sub cmdcon_Click() If rs232.PortOpen = False Then rs232.PortOpen = True End Sub Private Sub cmddis_Click() If rs232.PortOpen = True Then rs232.PortOpen = False End Sub Private Sub cmdexit_Click() If rs232.PortOpen = True Then rs232.PortOpen = False Unload Me End Sub Private Sub Form_Load() With rs232 .Settings = "9600,n,8,1" .RThreshold = 1 .InputLen = 1 .CommPort = 5 End With End Sub Private Sub rs232_OnComm() data = data + rs232.Input If InStr(data, vbCr) Then txttegangan.Text = Mid$(data, 1, 6) txtarus.Text = Mid$(data, 7, 6) Txtduty.Text = Mid$(data, 14, 6) tegangan = Val(txttegangan.Text) arus = Val(txtarus.Text) duty = Val(Txtduty.Text) data = "" End If End Sub Private Sub Timer1_Timer() If tegangan >= 18 Then oc.FillColor = vbRed Else oc.FillColor = vbBlack End If If tegangan <= 16 Then
uv.FillColor = vbYellow Else uv.FillColor = vbBlack End If If tegangan <= 18 And tegangan >= 16 Then nc.FillColor = vbGreen Else oc.FillColor = vbBlack End If If arus >= 0.0022 Then oc.FillColor = vbBlue Else oc.FillColor = vbBlack End If End Sub 6. SERIAL COMMUNICATION COMPARE OUTPUT
DAFTAR PUSTAKA [1]. Prof. Ir. Abdul Kadir, βENERGIβ, UI-Press, Jakarta, 1987. [2]. Ainur Rofiq, Sutedjo, βStart-Up Busines Initiative for Joblessβ, EEPIS-Press, Surabaya, Indonesia, March 1-27, 1999. [3]. BENJAMIN C. KUO,βAutomatics control system SEVENT Edition, Edisi Bahasa Indonesiaβ, PT.Aditia Media, Yogyakarta,1998 [4]. moh. zaenal efendi, novie ayub W,β STUDI PERBANDINGAN METODE SWITCHING PHASE SHIFTED PWM DENGAN PWM TIPE UNIPOLAR PADA INVERTER 1 PHASA JENIS FULLBRIDGE, IES 2001β, EEPIS Press, eepis-its, surabaya,indonesia, 2001 ,editor dadet pramadihanto
[5]. Sugata Pitakan,βRESUME KONVERSI ENERGIβ, UNESA,Surabaya, seminar 1maret 1999.