Postingan kali ini masih ada hubungannya sama postingan berseri tentang sistem interupsi di AVR ATMega, dimana pada posting interupsi ATMega dengan Codevision AVR jilid 3 kita menggunakan sensor LM35 sebagai input pengendalian program.
Kita ambil sebuah kasus pendingin otomatis, yang menggunakan sensor suhu kemudian dihubungkan sedemikian rupa melalui mikrokontroler dengan kipas angin. Pada saat suhu berada di bawah 40 derajat celcius maka kipas angin tidak berputar, tetapi setelah suhu berada pada 40 derajat celcius ke atas, maka kipas angin berputar dengan kecepatan menyesuaikan, semakin panas suhunya semakin cepat kipas angin berputar. Untuk mengecek program utama berfungsi, selama suhu berada di bawah 40 derajat mikrokontrol akan membuat LED pada PORTB.0 berkedip2.
Program ini tidak berbeda jauh dengan interupsi jilid 3 hanya saja kali ini kita mengaktifkan timer0 untuk memberikan pulsa yang mengatur kecepatan motor (PWM). Tentu saja kita perlu menambahkan rangkaian driver motor menggunakan IC L293D dan motor DC.
Rangkaiannya bisa anda buat seperti gambar dibawah ini
Dan berikut adalah listing programnya
#include <mega16.h> #include <delay.h> #include <stdlib.h> int temp; float vin; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { // dibuat oleh priyo harjiyono https://anotherorion.com unsigned char rr=0; while(rr<32) { //karena output inverting maka semakin besar vin, semakin kecil //OCRnya OCR0=0xff-vin; PORTB.6=1; delay_ms(30); ++rr; PORTC.0=0; } } #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; } // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T PORTB=0x00; DDRB=0xFF; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x01; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15,629 kHz // Mode: Fast PWM top=FFh // OC0 output: Inverted PWM TCCR0=0x7C; 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=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: On // INT0 Mode: Rising Edge // INT1: Off // INT2: Off GICR|=0x40; MCUCR=0x03; MCUCSR=0x00; GIFR=0x40; // 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: 500,125 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: Free Running ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0xA3; SFIOR&=0x1F; // Global enable interrupts #asm("sei") while (1) { // Place your code here temp = read_adc(0); vin=(float)temp*500/1024; OCR0=0; if(vin>40) { PORTC.0=1; delay_ms(10); } PORTB.6=0; PORTB.0=1; delay_ms(30); PORTB.0=0; delay_ms(30) ; }; }
Download source code sensor suhu kipas angin dan skematiknya
mas listing untuk menyalakan dan mematikan relay dengan sensor suhu itu bisa pake program ini gk mas? atau kita harus membuat ulangdari awal, jika pakai program ini bisa apa saja mas yang harus di ubah? mohon penjelasannya!. qirul.bahari@gmail.com mohon bantuannya mas
bisa mas, ubah perintah abis
if(vin>40) jadi
{
PORTC.0=1;
}
else
{
PORTC.0=0;
}
sisanya dibiarin juga gpp
Priyo Harjiyono motor nya g ada di setting mas,saya buatnya dari sismin atmega8535 keluar ke port B untuk led nya.trus sismin dg led nya ku ikat di kipas angin,trus ku idupin kipas nya mas.
jadinya kayak gitu
Ridho S Himawan mungkin hardware propelernya cuma bisa sampe beberapa karakter saja mas. Setting motornya sebelah mana mas?
Priyo Harjiyono sudah dicoba mas.
tulisannya malah bergabung jadi satu dia mas.
Ridho S Himawan di bagian loop utama mas ridho (while 1) itu kan isinya hanya karakter tulisan RIDHO, nah ditambahin saja karakter lagi untuk tulisan2 berikutnya
Priyo Harjiyono itu dari kipas nya cuma muncul nama ku j mas.
"RIDHO" aja.
saya pingin begitu dijalankan kipasnya yg muncul ada 3 tulisan mas.
misal pertama "ridho" ke dua "pekanbaru" ketiga "indonesia" gitu mas..
itu gimana progrmanya???