Kontrol Adaptif adalah metode pengontrolan yang digunakan oleh alat kontrol sehingga Kontrol Adaptif adalah metode pengontrolan yang digunakan oleh alat kontrol sehingga dapat beradaptasi dengan sistem
dapat beradaptasi dengan sistem yang dikontrol. yang dikontrol. Kontrol Adaptif masih Kontrol Adaptif masih memerlukan batas-memerlukan batas- batas d
batas dari perubari perubahan pahan parametearameter terhadap r terhadap waktu, waktu, sesuai sesuai dengadengan perubn perubahan hahan hukum ukum kontrokontrol itul itu sendiri.
sendiri.
Secara umum sistem kontrol dapat dikelompokkan sebagai berikut: Secara umum sistem kontrol dapat dikelompokkan sebagai berikut: 1. Sistem kontrol open loop
1. Sistem kontrol open loop 2. Sistem kontrol closed loop 2. Sistem kontrol closed loop
Sistem kontrol open loop Sistem kontrol open loop
•
• Sistem kontrol yang keluarannya tidak berpengaruh pada aksi pengendalianSistem kontrol yang keluarannya tidak berpengaruh pada aksi pengendalian •
• Keluaran tidak diukur atau diumpan balikkan untuk dibandingkan dengan masukanKeluaran tidak diukur atau diumpan balikkan untuk dibandingkan dengan masukan
Sistem kontrol closed loop Sistem kontrol closed loop
•
• Sistem kontrol yang sinyal keluarannya berpengaruh langsung pada aksiSistem kontrol yang sinyal keluarannya berpengaruh langsung pada aksi
pengo
pengontrolanntrolan
•
• Sistem kontrol berumpan balik Sistem kontrol berumpan balik
Sistem kontrol modern Sistem kontrol modern
•
• Kompleksitas tinggiKompleksitas tinggi •
• Berbasis komputer Berbasis komputer •
•
• Kontrol cerdas (learning control)Kontrol cerdas (learning control)
ATMEL AVR ATmega32 ATMEL AVR ATmega32
Mi
Mikrkrokokonontrotroleler r ATATmemegaga32 32 memerurupakpakan an MiMikrkrokokonontrotroleler r gegenernerasasi i AVAVR R (( Alf Alf and and Vegard’s Risk processor
Vegard’s Risk processor ) ) [2]. Mikrok[2]. Mikrokontontroleroler r AVAVR R memmemilikiliki i arsiarsitektektur tur RISRISC C (( Reduced Reduced Instruction Set Computing
Instruction Set Computing ) 8 bit, semua instruksi dikemas dalam kode 16-bit (16-) 8 bit, semua instruksi dikemas dalam kode 16-bit (16- bits word bits word )) dan
dan sebsebagiagian an besbesar ar instinstrukruksi si diediekseksekuskusi i daldalam am 1 1 siksiklus lus clocclock. k. PadPada a perperancaancangangan n sistsistemem kontrol ini dipilih Mikrokontroler jenis ATMEL AVR RISC dengan pertimbangan sebagai kontrol ini dipilih Mikrokontroler jenis ATMEL AVR RISC dengan pertimbangan sebagai berikut
berikut::
1. ATMEL AVR RISC memiliki fasilitas lengkap dan harga relatif murah. 1. ATMEL AVR RISC memiliki fasilitas lengkap dan harga relatif murah. 2. Kecepatan maksimum eksekusi instruksi Mikrokontroler mencapai 16 MIPS 2. Kecepatan maksimum eksekusi instruksi Mikrokontroler mencapai 16 MIPS
(( Million In Million Instruction per struction per Second Second ),),
3. Konsumsi daya yang rendah jika dibandingkan dengan kecepatan eksekusi instruksi. 3. Konsumsi daya yang rendah jika dibandingkan dengan kecepatan eksekusi instruksi.
1.
1. Ketersediaan kompiler C (CV AVR) yang memudahkan user untuk memprogramKetersediaan kompiler C (CV AVR) yang memudahkan user untuk memprogram menggunakan bahasa C.
menggunakan bahasa C.
Gambar 2.31
Gambar 2.31 Konfigurasi Pin Konfigurasi Pin ATmega32 [1]ATmega32 [1]
Konfigurasi pin ATmega32 dapat dilihat pada Gambar 2.31. Secara Konfigurasi pin ATmega32 dapat dilihat pada Gambar 2.31. Secara fungsional konfigurasi pin ATmega32 sebagai berikut :
fungsional konfigurasi pin ATmega32 sebagai berikut :
1. VCC merupakan pin yang berfungsi sebagai pin masukan catu daya. 1. VCC merupakan pin yang berfungsi sebagai pin masukan catu daya.
2. GND merupakan pin
2. GND merupakan pin ground ground ..
3. Port A (PA0..PA7) merupakan pin I/O dua arah dan pin masukan ADC. 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 4. Port B (PB0..PB7) merupakan pin I/O dua arah dan pin fungsi khusus untuk
Timer/Counter
Timer/Counter , Komparator analog, dan SPI., Komparator analog, dan SPI.
5. Port C (PC0..PC7) merupakan pin I/O dua arah dan pin khusus untuk TWI, 5. Port C (PC0..PC7) merupakan pin I/O dua arah dan pin khusus untuk TWI,
Komparator analog,
Komparator analog, functions o functions of the JTAf the JTAG interfaceG interface dandan Timer Oscilator Timer Oscilator .. 6. Port D (PD0..PD7) merupakan pin I/O dua arah dan pin khusus untuk 6. Port D (PD0..PD7) merupakan pin I/O dua arah dan pin khusus untuk
Komparator analog, Interupsi eksternal, dan Komunikasi serial. Komparator analog, Interupsi eksternal, dan Komunikasi serial.
7. RESET merupakan pin yang digunakan untuk me-reset Mikrokontroler. 7. RESET merupakan pin yang digunakan untuk me-reset Mikrokontroler. 8. XTAL1 dan XTAL2 merupakan pin masukan clock eksternal.
8. XTAL1 dan XTAL2 merupakan pin masukan clock eksternal. 9. AVCC merupakan pin masukan tegangan untuk ADC.
9. AVCC merupakan pin masukan tegangan untuk ADC. 10. AREF merupakan pin masukan tegangan referensi ADC. 10. AREF merupakan pin masukan tegangan referensi ADC.
ATmega32 memiliki 4 buah port input/
ATmega32 memiliki 4 buah port input/ output output 8 bit, yaitu PORTA, PORTB, PORTC,8 bit, yaitu PORTA, PORTB, PORTC, dan PORTD. Selain sebagai input/
dan PORTD. Selain sebagai input/output output masing masing port juga memiliki fungsi yang lain.masing masing port juga memiliki fungsi yang lain. POR
PORTA TA dapdapat at difdifungungsiksikan an sebsebagaagai i ADADC C (( Analog Analog to to Digital Digital Converter Converter ), ), PORPORTB TB dapdapatat difung
difungsikan sebagasikan sebagai i SPI (SPI (Serial Peripheral Interface) communicationSerial Peripheral Interface) communication. Fungsi-fungsi yang. Fungsi-fungsi yang lain dapat dilihat pada
lain dapat dilihat pada datasheet datasheet ATmega32.ATmega32.
Gambar 2.32
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,
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:
D1 2V7 R3 1k +5V R4 5k 5K VR
Vreff pin=2.28 Volt
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
Pada Gambar 3.24 memperlihatkan hasil pengamatan melalui tampilan Osiloskop hasil keluaran PWM yaitu dengan memberikan nilai 0 sampai 255 pada register OCR2. Keluaran PWM diambil melalui Pin PD.7 (OC2).
1
2 (a). OCR2=50 (b). OCR2=150 (c). OCR2=250 2 Gambar 3.24 Keluaran PWM dengan variasi data register OCR2
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.
4
5
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 : ATmega32 Program type : Application Clock frequency : 4.000000 MHz Memory model : Small
External SRAM size : 0 Data Stack size : 512
// 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); } }
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);
//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;
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;
};
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)
{ 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(); }; }
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
3
4
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 : ATmega32 Program type : Application Clock frequency : 4.000000 MHz Memory model : Small
External SRAM size : 0 Data Stack size : 512
*****************************************************/
#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 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()
{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)
{
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;
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;
// 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){
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%.
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.
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
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
Chip type : ATmega32 Program type : Application Clock frequency : 4.000000 MHz Memory model : Small
External SRAM size : 0 Data Stack size : 512
*****************************************************/
#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();
// 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); } }
//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;
{ 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;
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;
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
// 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
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) {
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(); };