Anda di halaman 1dari 38

1

Praktek Sistem Kontrol Adaptif Kontrol Adaptif adalah metode pengontrolan yang digunakan oleh alat kontrol sehingga dapat beradaptasi dengan sistem yang dikontrol. Kontrol Adaptif masih memerlukan batasbatas dari perubahan parameter terhadap waktu, sesuai dengan perubahan hukum kontrol itu sendiri. Secara umum sistem kontrol dapat dikelompokkan sebagai berikut: 1. Sistem kontrol open loop 2. Sistem kontrol closed loop Sistem kontrol open loop

Sistem kontrol yang keluarannya tidak berpengaruh pada aksi pengendalian Keluaran tidak diukur atau diumpan balikkan untuk dibandingkan dengan masukan

Sistem kontrol closed loop

Sistem kontrol yang sinyal keluarannya berpengaruh langsung pada aksi pengontrolan Sistem kontrol berumpan balik

Sistem kontrol modern Kompleksitas tinggi Berbasis komputer Kontrol optimal

Kontrol adaptif Kontrol cerdas (learning control)

ATMEL AVR ATmega32 Mikrokontroler ATmega32 merupakan Mikrokontroler generasi AVR (Alf and Vegards Risk processor) [2]. Mikrokontroler AVR memiliki arsitektur RISC (Reduced Instruction Set Computing) 8 bit, semua instruksi dikemas dalam kode 16-bit (16-bits word) dan sebagian besar instruksi dieksekusi dalam 1 siklus clock. Pada perancangan sistem kontrol ini dipilih Mikrokontroler jenis ATMEL AVR RISC dengan pertimbangan sebagai berikut: 1. ATMEL AVR RISC memiliki fasilitas lengkap dan harga relatif murah. 2. Kecepatan maksimum eksekusi instruksi Mikrokontroler mencapai 16 MIPS (Million Instruction per Second), 3. Konsumsi daya yang rendah jika dibandingkan dengan kecepatan eksekusi instruksi.
1. Ketersediaan kompiler C (CV AVR) yang memudahkan user untuk memprogram

menggunakan bahasa C.

Gambar 2.31 Konfigurasi Pin ATmega32 [1] Konfigurasi pin ATmega32 dapat dilihat pada Gambar 2.31. Secara fungsional konfigurasi pin ATmega32 sebagai berikut : 1. VCC merupakan pin yang berfungsi sebagai pin masukan catu daya.

2. GND merupakan pin ground. 3. Port A (PA0..PA7) merupakan pin I/O dua arah dan pin masukan ADC. 4. Port B (PB0..PB7) merupakan pin I/O dua arah dan pin fungsi khusus untuk Timer/Counter, Komparator analog, dan SPI. 5. Port C (PC0..PC7) merupakan pin I/O dua arah dan pin khusus untuk TWI, Komparator analog, functions of the JTAG interface dan Timer Oscilator. 6. Port D (PD0..PD7) merupakan pin I/O dua arah dan pin khusus untuk Komparator analog, Interupsi eksternal, dan Komunikasi serial. 7. RESET merupakan pin yang digunakan untuk me-reset Mikrokontroler. 8. XTAL1 dan XTAL2 merupakan pin masukan clock eksternal. 9. AVCC merupakan pin masukan tegangan untuk ADC. 10. AREF merupakan pin masukan tegangan referensi ADC. ATmega32 memiliki 4 buah port input/output 8 bit, yaitu PORTA, PORTB, PORTC, dan PORTD. Selain sebagai input/output masing masing port juga memiliki fungsi yang lain. PORTA dapat difungsikan sebagai ADC (Analog to Digital Converter), PORTB dapat difungsikan sebagai SPI (Serial Peripheral Interface) communication. Fungsi-fungsi yang lain dapat dilihat pada datasheet ATmega32.

Gambar 2.32 Diagram Blok Fungsional ATmega32 [1]

Pada Gambar 2.32 memperlihatkan ATmega32 memiliki bagian sebagai Berikut: 1. Saluran I/O sebanyak 32 buah, yaitu Port A, Port B, Port C, dan Port D. 2. ADC 10 bit sebanyak 8 saluran. 3. Tiga buah Timer/Counter dengan kemampuan pembandingan. 4. CPU yang terdiri atas 32 buah register. 5. Watchdog Timer dengan osilator internal. 6. SRAM sebesar 2 Kbyte. 7. Memori Flash sebesar 32 Kb dengan kemampuan Read While Write. 8. Unit interupsi internal dan eksternal. 9. Port antarmuka SPI. 10. EEPROM (Electrically Erasable Programmable Read Only Memory) sebesar 1K byte yang dapat diprogram saat operasi. 11. Antarmuka komparator analog. 12. Port USART untuk komunikasi serial, kecepatan maksimal 2,5 Mbps. 13. Mikroprosessor 8 bit berbasis RISC kecepatan maksimal 16 MHz. Perangkat input/output digunakan oleh prosessor untuk berkomunikasi dengan dunia luar. Fasilitas input/output merupakan fungsi Mikrokontroler untuk dapat menerima sinyal masukan (input) dan memberikan sinyal keluaran (output). Contoh pemakaian perangkat i/o adalah serial komunikasi pada keyboard, tampilan LCD dan sinyal interupsi dari luar. Sinyal input maupun sinyal output adalah berupa data digital 1 (high, mewakili tegangan 5 volt) dan 0 (low, mewakili tegangan 0 volt). Mikrokontroler ATMEGA 32 memiliki 4 buah PORT 8 bit bidirectional yang dapat difungsikan sebagai PORT input maupun PORT output yaitu PORTA, PORTB , PORTC, dan PORT D. Register digunakan untuk mengatur fungsi dari pin-pin pada tiap port. Register dapat dianalogikan sebagai kumpulan switch on/off yang digunakan untuk mengaktifkan fungsi apa yang akan dipakai dari port Mikrokontroler. Pada setiap port pin terdapat 3 buah register 8 bit: DDRxn, PORTxn, dan PINxn. Register DDRxn digunakan untuk menentukan arah dari pin yang bersangkutan. Jika DDRxn diberikan nilai 1 (high), maka pin digunakan sebagai output. Jika DDRxn diberikan nilai 0 (low), maka pin difungsikan sebagai input. Register PORTxn digunakan untuk mengaktifkan pull-up resistor (pada saat pin difungsikan sebagai input), dan memberikan nilai keluaran pin high/low (pada saat

difungsikan sebagai output). Konfigurasi PORTxn dan DDRxn dapat dilihat pada Tabel 3.3 dibawah. Tabel 3.3 Konfigurasi port pin ATMEGA 32 [2]

Tri-state adalah kondisi diantara high dan low, atau biasa disebut dengan keadaan mengambang (floating). Kondisi tri-state sangat dihindari dalam dunia digital. Keypad Fungsi dari keypad dalam praktek digunakan untuk memasukkan nilai suhu yang dikehendaki. Disamping itu untuk menjalankan dan mematikan kerja sistem kontrol.

Gambar 3.5 Keypad 4x4 Keypad sering digunakan sebagai suatu input pada beberapa peralatan yang berbasis mikroprosesor atau Mikrokontroler. Keypad sesungguhnya terdiri dari sejumlah saklar, yang terhubung sebagai baris dan kolom. Agar Mikrokontroler dapat melakukan scan keypad, maka port mengeluarkan salah satu bit dari 4 bit yang terhubung pada kolom dengan logika low 0 dan selanjutnya membaca 4 bit pada baris untuk menguji jika ada tombol yang ditekan pada kolom tersebut. Sebagai konsekuensi, selama tidak ada tombol yang ditekan,

maka Mikrokontroler akan melihat sebagai suatu logika high 1 pada setiap pin yang terhubung ke baris. Tampilan LCD Pada prektek menggunakan LCD M1632 2x16, fungsi dari LCD untuk menampilkan nilai suhu yang dikehendaki dan manampilkan nilai suhu yang terukur.

Gambar 3.7 Tampilan LCD 2x16 Pada Tabel 3.1, dibawah ini menunjukkan fungsi dari masing-masing pin Tabel 3.1 Fungsi pin LCD 2x16

Sedangkan hubungan antara kaki LCD dan Mikrokontroler pada prektek adalah sebagai berikut:

Gambar 3.8 Hubungan LCD 2x16 dengan Mikrokontroler ADC Dalam merancang perangkat sistem kontrol berbasis Mikrokontroler , diperlukan suatu interface antara besaran analog yang dibaca oleh sensor dengan Mikrokontroler, sebab Mikrokontroler hanya mampu mengolah data dalam bentuk diskrit sehingga diperlukan perangkat yaitu Analog To Digital Convertion (ADC). Agar hasil pembacaan suhu yang terukur dapat mencapai rentang suhu pada obyek prektek, maka perlu diatur tegangan acuan eksternal (Vref). Tegangan acuan eksternal berfungsi menentukan besarnya resolusi ADC dan dapat diatur dengan memberikan referensi rangkaian eksternal Vref pada modul ATmega32. Rangkaian tegangan acuan eksternal yang digunakan adalah sebagai berikut:
+5 V

R 3
1 k

R 4
5 k

D 1
2 7 V V ffp = .2 V lt re in 2 8 o V R

5 K

Gambar 3.11 Tegangan referensi eksternal ADC Tegangan acuan sebesar Vreff=2,283 volt dihasilkan dengan memutar variabel resistor 5Kohm. Contoh: Agar hasil pembacaan suhu yang terukur dapat mencapai rentang suhu pada obyek prektek, maka perlu diatur tegangan acuan eksternal (Vref).

Gambar 3.10 Penguat noninverting untuk LM35 Besar penguatan rangkaian noninverting adalah: A = 1+(Rf/Ri) = 1+(R2/R1) = 1+(12K/10K) =1+1.2 = 2,2 (terukur 2,23 kali) Vout LM35 = Suhu * 10 mV ADC = (Vout LM35 x Resolusi ADC) / Vref (3.1) Vout adalah tegangan keluaran LM35 dan Vref adalah tegangan acuan yang digunakan oleh tegangan acuan eksternal modul ATmega32. Jika menggunakan tegangan acuan 2,283 Volt eksternal maka tingkat keluaran ADC untuk 91,5 derajat Celsius dapat dihitung sebagai berikut: ADC = ((91,5 x 10mv) x 2,23 x 1024) / 2,283 = 915,2 Vreff=2,283 volt Dengan pembagian hasil dengan 10, sehingga didapatkan 91,5, ini adalah nilai temperatur yang tepat yang terukur oleh sensor. PWM Keluaran PWM berfungsi mengatur seberapa besar daya yang diberikan oleh kontrol ke modul pengendali. Modul pengendali dapat menerima rentang tegangan masukan sebesar 1-5Volt DC untuk proses pengendalian 0-100%. Seting PWM menggunakan mode Fast PWM dengan nilai maksimum FFH=255 untuk Duty cycle sebesar 100%. Tegangan rata-rata dari Duty cycle 0-100% keluaran PWM masih berupa gelombang kotak sehingga perlu diratakan menjadi tegangan DC 0-5Volt. Besar tegangan yang dihasilkan merupakan

perbandingan periode ton dan toff dikalikan dengan amplitudonya. dengan rumus sebagai berikut: Vrms= (ton/ton+toff).Vdc

Contoh:
1

Gambar 3.24 Keluaran PWM dengan variasi data register OCR2 Osiloskop hasil

Pada Gambar 3.24 memperlihatkan hasil pengamatan melalui tampilan PWM diambil melalui Pin PD.7 (OC2).

keluaran PWM yaitu dengan memberikan nilai 0 sampai 255 pada register OCR2. Keluaran

1 2 2

(a). OCR2=50

(b). OCR2=150

(c). OCR2=250

Gambar 3.24 Keluaran PWM dengan variasi data register OCR2

10

Praktikum 1
Dengan menggunakan program simulator rancanglah keypad 4x4 untuk memasukkan nilai Set Point ke dalam tampilan LCD 2x16 Peralatan : a. IC ATmega 32 b. LCD 2x16 di PORTC c. Keypad 4x4 (modifikasi) di PORTB Proses praktikum: 1. Ambil Keypad 4x4 dari Library dan edit teks masing-masing tombol sesuai fungsinya 2. LCD 2x16 3. Hubungkan setiap pin ke Mikrokontrol ATmega32 seperti gambar berikut:

2. Dengan Program CodeVision AVR , programlah mikrokontroler dengan langkah sebagai berikut:
1 1. Buka CV AVR., pilih File->New->Project. 2 2. Klik YES ketika terdapat option untuk meggunakan codeWizardAVR. 3 3. Pilih chip yang akan digunakan ATMEGA32 dengan harga clock 4 Mhz.

11

Kemudian pilih File->Generate,save&exit->nama.c; nama.prj; nama.cwp Setelah dijalankan akan menghasilkan kode sbb: Tambahkan kode-kode untuk akses SetPoint(SP),fungsi geser kursor, run & stop /***************************************************** Project :praktek 1 Chip type Program type Clock frequency Memory model Data Stack size : ATmega32 : Application : 4.000000 MHz : Small : 512

External SRAM size : 0 *****************************************************/

12

#include <mega32.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> #include <delay.h> #include <stdio.h> #include <stdlib.h> #include <math.h> char dt,dtkey,arah; static char a,c; unsigned char a1,a2,a3; int sp_1,baca; unsigned char sp,kk,jj,dd,ee,pross; unsigned char j,k,l,y; char buf[33]; char kiri_sp[3]={2,3,4}; char kanan_sp[3]={2,3,4}; void cursor_on(); void cursor_off(); //fungsi geser kiri nilai set_point................... void geser_sp() {jj=0;kk=1; if (kk==1 && sp==1) {dd--; if (dd>=3)dd=0;a=kiri_sp[dd];kk=0;arah=0;dtkey=0;ee=0; delay_ms(70); } } //fungsi geser kanan nilai set_point...................

13

void geser1_sp() {kk=0;jj=1; if ((jj==1)&&(sp==1)) {dd++; if (dd>2)dd=2;a=kanan_sp[dd];jj=0;arah=0;dtkey=0;ee=0; delay_ms(70); } } //fungsi masukan nilai set_point jika setuju....................... void enter() {ee=1;a1=j;a2=k;a3=l;pross=0; } //fungsi akses set_point.................... void set_sp() {sp=1;c=0;ee=0;} //fungsi stop (mematikan sistim)................... void out_set() {sp=0;baca=0;pross=0;a=0; } //fungsi tampil kursor void cursor_on() { _lcd_ready(); _lcd_write_data(0xf); } void cursor_off() { _lcd_ready(); _lcd_write_data(0xC);

14

} //fungsi pembacaan nilai setpoint void proses() {pross=1;a=0; sp_1 = ((j*100)+(k*10)+(l)); do { baca=sp_1; } while(pross!=1); } //fungsi scan keypad.............................................. void detek_key(void) { PORTB.4=0; dt=(~PINB & 0x0F); switch (dt) { case 1: dtkey=0x01; break; case 2: dtkey=0x02; break; case 4: dtkey=0x03; break; case 8: arah=10;//A akses set_point(Edit) break; }; PORTB.4=1; PORTB.5=0; dt=(~PINB & 0x0F); switch (dt){ case 1: dtkey=0x04; break; case 2: dtkey=0x05;

15

break; case 4: dtkey=0x06; break; case 8: arah=11;//B tombol ( stop ) break; }; PORTB.5=1; PORTB.6=0; dt=(~PINB & 0x0F); switch (dt) { case 1: dtkey=0x07; break; case 2: dtkey=0x08; break; case 4: dtkey=0x09; break; case 8: arah=12;//C geser kiri ( < ) break; }; PORTB.6=1; PORTB.7=0; dt=(~PINB & 0x0F); switch (dt) { case 1: arah=15;//F untuk proses ( RUN ) break; case 2: dtkey=0x00; break; case 4: arah=14;//E masukan nilai set_point ( = ) break; case 8: arah=13;//D geser kanan ( > ) break; }; PORTB.7=1;

16

} void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x0F; DDRB=0xF0; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0xFF; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // LCD module initialization lcd_init(16); lcd_gotoxy(0,0); lcd_putsf(" ==atw=="); delay_ms(1000); lcd_gotoxy(0,1); lcd_putsf(" ===LCD==="); delay_ms(1000); lcd_clear(); #asm ("cli") while (1)

17

{ detek_key(); switch (arah){ case 13: geser_sp(); break; case 12: geser1_sp(); break; case 11: baca=1;pross=1;out_set(); break; case 10: set_sp(); break; case 14: enter(); break; case 15: proses(); break; }; if (c==0 && a==2 && ee==1) j=y=dtkey; if (c==0 && a==3 && ee==1) k=dtkey; if (c==0 && a==4 && ee==1) l=dtkey; lcd_gotoxy(0,0); sprintf(buf,"sp%d%d%d",a1,a2,a3,); lcd_puts(buf); lcd_gotoxy(0,1); sprintf(buf,"tampil=%3d",baca); lcd_puts(buf); lcd_gotoxy(a,c); cursor_on(); delay_ms(100); cursor_off(); }; }

18

Praktikum 2
Dengan bantuan program simulator akan dirancang suatu sistem kontrol open loop, dimana hasil nilai keluaran sesuai dengan nilai masukan dari keypad. Peralatan : a. IC ATmega 32 b. LCD 2x16 c. Keypad 4x4 (modifikasi) d. PWM e. Osiloskop Proses praktikum: 1. Dari praktikum 1 tambahkan keluaran PWM 2. Dengan Program CodeVision AVR , programlah mikrokontroler dengan langkah sebagai berikut:
6 1. Buka CV AVR., pilih File->New->Project. 7 2. Klik YES ketika terdapat option untuk meggunakan codeWizardAVR. 8 3. Pilih chip yang akan digunakan ATMEGA32 dengan harga clock 4 Mhz. 9

4 5

Gambar 3.20 Setting PWM dengan codewizard

19 6

Seting PWM menggunakan mode Fast PWM dengan nilai maksimum FFH=255

untuk Duty cycle sebesar 100%. Kemudian pilih File->Generate,save&exit->nama.c; nama.prj; nama.cwp Setelah dijalankan akan menghasilkan kode sbb: Tambahkan kode-kode untuk akses SetPoint(SP),fungsi geser kursor, run & stop /***************************************************** Project :praktek 2 Chip type Program type Clock frequency Memory model Data Stack size : ATmega32 : Application : 4.000000 MHz : Small : 512

External SRAM size : 0 *****************************************************/ #include <mega32.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> #include <delay.h> #include <stdio.h> #include <stdlib.h> #include <math.h> // Declare your global variables here char dt,dtkey,arah; static char a,c; unsigned char a1,a2,a3;

20

int sp_1,baca; unsigned char sp,kk,jj,dd,ee,pross; unsigned char j,k,l,y; char buf[33]; char kiri_sp[3]={2,3,4}; char kanan_sp[3]={2,3,4}; void cursor_on(); void cursor_off(); //fungsi geser kiri nilai set_point................... void geser_sp() {jj=0;kk=1;cc=1; if (kk==1 && sp==1) {dd--; if (dd>=3)dd=0;a=kiri_sp[dd];kk=0;arah=0;dtkey=0;ee=0; delay_ms(70); } } //fungsi geser nilai nilai set_point................... void geser1_sp() {kk=0;jj=1;cc=1; if ((jj==1)&&(sp==1)) {dd++; if (dd>2)dd=2;a=kanan_sp[dd];jj=0;arah=0;dtkey=0;ee=0; delay_ms(70); } } //fungsi masukan nilai set_point jika setuju....................... void enter() {ee=1;a1=j;a2=k;a3=l;pross=0; } //fungsi akses set_point.................... void set_sp()

21

{sp=1;c=0;ee=0;} //fungsi stop (mematikan sistim)................... void out_set() {sp=0;baca=0;pross=0;a=0; } //fungsi tampil kursor void cursor_on() { _lcd_ready(); _lcd_write_data(0xf); } void cursor_off() { _lcd_ready(); _lcd_write_data(0xC); } //fungsi pembacaan nilai setpoint void proses() {pross=1;a=0; sp_1 = ((j*100)+(k*10)+(l)); do { baca=sp_1; } while(pross!=1); } //fungsi scan keypad.............................................. void detek_key(void) { PORTB.4=0;

22

dt=(~PINB & 0x0F); switch (dt) { case 1: dtkey=0x01; break; case 2: dtkey=0x02; break; case 4: dtkey=0x03; break; case 8: arah=10;//A akses set_point break; }; PORTB.4=1; PORTB.5=0; dt=(~PINB & 0x0F); switch (dt){ case 1: dtkey=0x04; break; case 2: dtkey=0x05; break; case 4: dtkey=0x06; break; case 8: arah=11;//B tombol ( stop ) break; }; PORTB.5=1; PORTB.6=0; dt=(~PINB & 0x0F); switch (dt) { case 1: dtkey=0x07; break; case 2: dtkey=0x08; break; case 4: dtkey=0x09;

23

break; case 8: arah=12;//C geser kiri ( < ) break; }; PORTB.6=1; PORTB.7=0; dt=(~PINB & 0x0F); switch (dt) { case 1: arah=15;//F untuk proses ( RUN ) break; case 2: dtkey=0x00; break; case 4: arah=14;//E masukan nilai set_point ( = ) break; case 8: arah=13;//D geser kanan ( > ) break; }; PORTB.7=1; } void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x0F; DDRB=0xF0; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0xFF;

24

// Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x69; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00; // LCD module initialization lcd_init(16); lcd_gotoxy(0,0); lcd_putsf(" ==atw=="); delay_ms(1000); lcd_gotoxy(0,1); lcd_putsf(" ===LCD==="); delay_ms(1000); lcd_clear(); #asm ("cli") while (1) { OCR2=baca; detek_key(); switch (arah){

25

case 13: geser_sp(); break; case 12: geser1_sp(); break; case 11: baca=1;pross=1;out_set(); break; case 10: set_sp(); break; case 14: enter(); break; case 15: proses(); break; }; if (c==0 && a==2 && ee==1) j=y=dtkey; if (c==0 && a==3 && ee==1) k=dtkey; if (c==0 && a==4 && ee==1) l=dtkey; lcd_gotoxy(0,0); sprintf(buf,"sp%d%d%d",a1,a2,a3,); lcd_puts(buf); lcd_gotoxy(0,1); sprintf(buf,"tampil=%3d",baca); lcd_puts(buf); lcd_gotoxy(a,c); cursor_on(); delay_ms(100); cursor_off(); }; } 3. Amatilah hasil keluaran PWM di kaki PIND.7(OC2) dengan osiloskop dengan mengubah nilai SP = 0 sampai 255 sehingga menghasilkan Duty cyrcle = 0% sampai 100%. 4. Rubahlah tampilan SP dengan posisi yang berbeda.

26

Praktikum 3
Merancang keluaran PWM Duty cyrcle = 0% sampai 100% menjadi tegangan DC 0V sampai 5V Peralatan : a. IC ATmega 32 b. LCD 2x16 c. Keypad 4x4 (modifikasi) d. PWM e. Rangkaian filter DC f. DC Volt meter Proses praktikum: 1. Dari praktikum 1 dan 2 gantilah osiloskop dengan DC Voltmeter 2. Tambahkan rangkain filter DC untuk menghasilkan keluaran PWM menjadi tegangan DC rata. 3. Amatilah hasil keluaran di kaki PIND.7(OC2) dengan DC Voltmeter dengan mengubah nilai SP = 0 sampai 255 sehingga menghasilkan tegangan DC rata 0V sampai 5V.

Praktikum 4

27

Merancang dasar sistem kontrol closed loop dengan proses kontrol tipe ON/OFF Peralatan : a. IC ATmega 32 b. LCD 2x16 c. Keypad 4x4 (modifikasi) d. PWM e. ADC 8 bit f. Rangkaian filter DC g. DC Volt meter
h. LM35 (sensor suhu)

Contoh aplikasi kontrol suhu: Jika SP < Nilai suhu (PV) maka nilai kontrol maksimal (ON) Jika SP > Nilai suhu (PV) maka nilai kontrol minimal (OFF) Error= SP PV Output= Error * Gain ..dimana Gain= nilai maksimal (255)

28

Proses praktikum: 1. Dari praktikum 1,2 dan 3 tambahkan komponen sensor suhu LM35

2. Aturlah ADC dengan resolusi 8 bit di PINA.0 dan tegangan referensi diambil VCC (pin AVCC) sesuai Gambar berikut

29

Chip type Program type Clock frequency Memory model Data Stack size

: ATmega32 : Application : 4.000000 MHz : Small : 512

External SRAM size : 0 *****************************************************/ #include <mega32.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.h> #include <delay.h> #include <stdio.h> #include <stdlib.h> #include <math.h> // Declare your global variables here unsigned char dt,dtkey,arah; static char a,c; unsigned char a1,a2,a3; int sp_1,baca,dtadc,vin,error; unsigned char sp,kk,jj,dd,ee,pross; unsigned char j,k,l,y; char buf[33]; char kiri_sp[3]={2,3,4}; char kanan_sp[3]={2,3,4}; void cursor_on(); void cursor_off();

30

#define ADC_VREF_TYPE 0x60 // Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } //fungsi geser kiri nilai set_point................... void geser_sp() {jj=0;kk=1; if (kk==1 && sp==1) {dd--; if (dd>=3)dd=0;a=kiri_sp[dd];kk=0;arah=0;dtkey=0;ee=0; delay_ms(70); } } //fungsi geser nilai nilai set_point................... void geser1_sp() {kk=0;jj=1; if ((jj==1)&&(sp==1)) {dd++; if (dd>2)dd=2;a=kanan_sp[dd];jj=0;arah=0;dtkey=0;ee=0; delay_ms(70); } }

31

//fungsi masukan nilai set_point jika setuju....................... void enter() {ee=1;a1=j;a2=k;a3=l;pross=0; } //fungsi akses set_point.................... void set_sp() {sp=1;c=0;ee=0;} //fungsi stop (mematikan sistim)................... void out_set() {sp=0;baca=0;pross=0;a=0; }

//fungsi tampil kursor void cursor_on() { _lcd_ready(); _lcd_write_data(0xf); } void cursor_off() { _lcd_ready(); _lcd_write_data(0xC); } //fungsi pembacaan derajat keenggotaan fuzzy................. void proses() {pross=1;a=0; sp_1 = ((j*100)+(k*10)+(l));

32

do { dtadc=read_adc(0); vin=((dtadc*2)-1); error=sp_1-vin; if(error>0){baca=255;delay_ms(10);} if(error<=0) baca = 0; OCR2=baca; } while(pross!=1); } //fungsi scan keypad.............................................. void detek_key(void) { PORTB.4=0; dt=(~PINB & 0x0F); switch (dt) { case 1: dtkey=0x01; break; case 2: dtkey=0x02; break; case 4: dtkey=0x03; break; case 8: arah=10;//A akses set_point break; };

PORTB.4=1; PORTB.5=0; dt=(~PINB & 0x0F); switch (dt){ case 1: dtkey=0x04;

33

break; case 2: dtkey=0x05; break; case 4: dtkey=0x06; break; case 8: arah=11;//B tombol stop break; }; PORTB.5=1; PORTB.6=0; dt=(~PINB & 0x0F); switch (dt) { case 1: dtkey=0x07; break; case 2: dtkey=0x08; break; case 4: dtkey=0x09; break; case 8: arah=12;//C geser kiri nilai set_point break; }; PORTB.6=1; PORTB.7=0; dt=(~PINB & 0x0F); switch (dt) { case 1: arah=15;//F untuk proses break; case 2: dtkey=0x00; break; case 4: arah=14;//E masukan nilai set_point break;

34

case 8: arah=13;//D geser kanan nilai set_point break; }; PORTB.7=1; } void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x0F; DDRB=0xF0; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh

35

// OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected //ASSR=0x00; //TCCR2=0x69; //TCNT2=0x00; //OCR2=0x00;

// External Interrupt(s) initialization // INT0: Off // INT1: Off

36

// INT2: Off MCUCR=0x00; MCUCSR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=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: 125.000 kHz // ADC Voltage Reference: AVCC pin // Only the 8 most significant bits of // the AD conversion result are used ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x85; // LCD module initialization lcd_init(16); lcd_gotoxy(0,0); lcd_putsf(" ==atw=="); delay_ms(1000); lcd_gotoxy(0,1); lcd_putsf(" ===LCD==="); delay_ms(1000); lcd_clear(); #asm ("cli") while (1) {

37

detek_key(); switch (arah){ case 13: geser_sp(); break; case 12: geser1_sp(); break; case 11: baca=1;pross=1;out_set(); break; case 10: set_sp(); break; case 14: enter(); break; case 15: proses(); break; }; if (c==0 && a==2 && ee==1) j=y=dtkey; if (c==0 && a==3 && ee==1) k=dtkey; if (c==0 && a==4 && ee==1) l=dtkey; lcd_gotoxy(0,0); sprintf(buf,"sp%d%d%d",a1,a2,a3,); lcd_puts(buf); lcd_gotoxy(0,1); sprintf(buf,"tampil=%3d%3d",baca,vin); lcd_puts(buf); lcd_gotoxy(a,c); cursor_on(); delay_ms(100); cursor_off(); };

38