Sensor suhu sebagai pengendali kipas angin dengan AVR ATMega

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

interupt atmega lm35 sebagai sensor suhu

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

34 pemikiran pada “Sensor suhu sebagai pengendali kipas angin dengan AVR ATMega”

  1. Judul Harga Beli Sekarang
    Dasar Mikrokontroler Atmega8535 dengan CAVR BUKU ORIGINAL Rp64.000  
    Buku Belajar Sendiri Mikrokontroler AVR Seri ATMega8535 Simulasi, Hardware, Dan Aplikasi Rp70.000  
    Buku 20 Aplikasi Mikrokontroler ATMega 8535 & ATMega 16 Menggunakan Bascom-AVR+CD Rp70.500
    BUKU PRAKTIKUM TEKNOLOGI MICROCONTROLLER ATMEGA- 16 UNTUK SMK/ MAK Rp40.000  
    Buku Dasar Mikrokontroler Atmega8535 dengan CAVR Rp64.000
    BUKU MIKROKONTROLER AVR ATMEGA8535 + CD Rp80.750  
    buku pemrograman mikrokontrorler avr atmega 16 + cd Rp50.000  
  2. Ridho S Himawan 0CR0=0xff-vin mas, ganti saja langsung ocr0=255 / nilai lain, tp nilainya jd konstan, klo mau bisa diubah ya pake yg pertama tp maksimalkan suhu di LM35nya

    Balas
  3. Priyo Harjiyono wah iya mas.arah nya udah bener…
    oke mas ni lagi saya bikin rangkaian nya…lagi gosok rangkaian sismin nya.
    kalau sewaktu2 mau saya rubah kecepatan motornya mas, di bagian mana yg musti di rubah di program nya?

    Balas

Tinggalkan komentar

(Note, links and most HTML attributes are not allowed in comments)

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.

Ingin produk/website Anda kami ulas? Silahkan klik tombol dibawah ini