Rabu, 10 April 2013

Sensor robot LIne Follower menggunakan ADC menggunakan ATMEGA 8935 dan CVAVR

ADC ( analog digital converter ) yaitu mengubah sinyal analog menjadi sinyal digital. Robot line follower menggunakan sensor cahaya sebagai input pendeteksi garis baik garis putih atau hitam sesuai kondisi yang diinginkan. Sensor Line follower biasanya menggunakan foto dioda dan SB. Pada sistem line follower biasanya output dari sensor masuk ke comperator ( IC 324, IC 339 dll ).

Pada ic atmega 8535 mempunyai pin untuk conversi analog to digital yaitu terletak pada pinA0 - pinA7. 
rumus ADC [ (Vin + 1024)/Vreff  --> 10 bit atau  (Vin + 256)/Vreff  --> 8 bit].

Sebagai simulasi kita gunakan program Proteus.
Langkah - langkah :
1. Buka program cvavr lalu ikuti langkah berikut

2. Buka aplikasi proteus, lalu susun rangkaian seperti dibawah ini.
    IC atmega 8535, Led, dan POT-HG ( var-res)


3. Program
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Standard
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 3/24/2013
Author  : F4CG                            
Company : F4CG                            
Comments: 


Chip type           : ATmega8535
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*****************************************************/

#include <mega8535.h>
#include <delay.h>

#define ADC_VREF_TYPE 0x60 

int reff = 150 ;

// 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;
}

// 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=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// 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=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
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=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// 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: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x82;
SFIOR&=0xEF;

while (1)
      {  
      if ((read_adc(0)< reff)&&(read_adc(1)< reff)&&(read_adc(2)< reff)&&(read_adc(3)< reff)){PORTD = 0b000000000;}
      if ((read_adc(0)>= reff)&&(read_adc(1)< reff)&&(read_adc(2)< reff)&&(read_adc(3)< reff)){PORTD = 0b000000001;}
      if ((read_adc(0)< reff)&&(read_adc(1)>= reff)&&(read_adc(2)< reff)&&(read_adc(3)< reff)){PORTD = 0b000000010;}
      if ((read_adc(0)< reff)&&(read_adc(1)< reff)&&(read_adc(2)>= reff)&&(read_adc(3)< reff)){PORTD = 0b000000100;}
      if ((read_adc(0)< reff)&&(read_adc(1)< reff)&&(read_adc(2)< reff)&&(read_adc(3)>= reff)){PORTD = 0b000001000;}
      if ((read_adc(0)< reff)&&(read_adc(1)>= reff)&&(read_adc(2)>= reff)&&(read_adc(3)< reff)){PORTD = 0b000000110;}
      if ((read_adc(0)>= reff)&&(read_adc(1)>= reff)&&(read_adc(2)< reff)&&(read_adc(3)< reff)){PORTD = 0b000000011;}
      if ((read_adc(0)< reff)&&(read_adc(1)< reff)&&(read_adc(2)>= reff)&&(read_adc(3)>= reff)){PORTD = 0b000001100;} 
      if ((read_adc(0)< reff)&&(read_adc(1)>= reff)&&(read_adc(2)>= reff)&&(read_adc(3)>= reff)){PORTD = 0b000001110;}
      if ((read_adc(0)>= reff)&&(read_adc(1)>= reff)&&(read_adc(2)>= reff)&&(read_adc(3)< reff)){PORTD = 0b000000111;}
      
      
      // Place your code here

      };
}




Tidak ada komentar:

Posting Komentar