Skocz do zawartości

Linefollower adc C


tabbi

Pomocna odpowiedź

Napisałem program wykorzystujący adc w ATMEGA8, pytanie czy dobry jakieś wskazówki ?

Jak dotej pory posługiwałem się na ifach i problem był taki że jeden czujnik lepiej wykrywał linie a drugi gorzej i dlatego postawiony na białej kartce krecil sie w kołko jeden czujnik CNY70 odbijal a drugi juz nie.

Czy mniej wiecej na tym ma polegac i wyrównać wykrywanie linii przez 3 czujniki ?

/* ATmega 8MHz */

#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{   

//wyjscia także do Mostka
DDRD=0xff;

//wyjscia Mostka H
DDRB=0xff;

//wejscia czujnikow
DDRC=0x00;

PORTB |= _BV(1); 
PORTB |= _BV(2); 

//ustawienia ADC 
//ADMUX = 0;             //MUX = 0 
ADCSRA |= (1<<ADEN);      //Enable ADC 
//ADCSRA |= (1<<ADSC);    //start conversion 
//if(bit_is_set(ADCSRA,ADIF));  //set gdy koniec konwersji 
ADCSRA |= (1<<ADPS1)|(1<<ADPS0);     //125kHz dla [b]1MHz[/b] 
ADMUX |= (1<<ADLAR)|(1<<REFS0);//left adjusted/ read onlu ADCH, AVcc jako napięcie odniesienia


 while(1){
//2 lewy czujnik
//4 srodkowy czujnik
//5 prawy czujnik

uint8_t p5, p4,,p2 czulosc;

czulosc = 128;

//POCZĄTEK SPRAWDZANIA CZUJNIKA PODŁĄCZONEGO DO PORTU C5 
ADMUX = (PC5 + 96); //+96 aby ustawić ADLAR i REFS !!!!!WYBÓR CZUJNIKA 
ADCSRA |= (1<<ADSC);    //start conversion 
while(bit_is_clear(ADCSRA,ADIF)); //czekaj na koniec pomiaru 
p5 = ADCH;

if(ADCH > czulosc){ //jeśli zmierzone napięcie jest większe niż ustawiona czułość 
                             //to znaczy że pod czujnikiem jest czarna linia 
             //czujnik wyrył czarną linię 

//skrecamy w prawo
 PORTD |= _BV(2);  // LEWY silnik w przod ON
 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod OFF
} 
else{ 
       //czujnik nie wykrył czarnej linii 

//wylaczamy silniki
 PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 
 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod ON
}

//POCZĄTEK SPRAWDZANIA CZUJNIKA PODŁĄCZONEGO DO PORTU C2 
ADMUX = (PC2 + 96); //+96 aby ustawić ADLAR i REFS !!!!!WYBÓR CZUJNIKA 
ADCSRA |= (1<<ADSC);    //start conversion 
while(bit_is_clear(ADCSRA,ADIF)); //czekaj na koniec pomiaru 
p2 = ADCH;

if(ADCH > czulosc){ 

//skrecamy w lewo
 PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 
 PORTD |= _BV(0);   // PRAWY SILNIK W przod ON
} 
else{ 
       //czujnik nie wykrył czarnej linii 

//wylaczamy silniki
 PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 
 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod ON
}


//POCZĄTEK SPRAWDZANIA CZUJNIKA PODŁĄCZONEGO DO PORTU C4 
ADMUX = (PC4 + 96); //+96 aby ustawić ADLAR i REFS !!!!!WYBÓR CZUJNIKA 
ADCSRA |= (1<<ADSC);    //start conversion 
while(bit_is_clear(ADCSRA,ADIF)); //czekaj na koniec pomiaru 
p2 = ADCH;

if(ADCH > czulosc){ 

//jedziemy prosto
 PORTD |= _BV(2);  // LEWY silnik w przod ON
 PORTD |= _BV(0);   // PRAWY SILNIK W przod ON
} 
else{ 
       //czujnik nie wykrył czarnej linii 

//wylaczamy silniki
 PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 
 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod ON
}


czulosc = (p5/2)+(p4/2)+(p2/2);

/*
// STEROWANIE CZUJNIKAMI
if((PINC & 1 << 5) && (PINC & 1 << 4) && (PINC & 1 << 2))
{
PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 

 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod ON
}

if(!(PINC & 1 << 5) && !(PINC & 1 << 4) && !(PINC & 1 << 2))
{
PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 

 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod ON
}

//skrecanie w lewo
if(!(PINC & 1 << 5) && !(PINC & 1 << 4) && (PINC & 1 << 2))
{
PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 

 PORTD |= _BV(0);   // PRAWY SILNIK W przod ON
}

//gdy tylko z lewej wykrywa czujnik
if(!(PINC & 1 << 5) && (PINC & 1 << 4) && (PINC & 1 << 2))
{
PORTD &= ~_BV(2);  // LEWY silnik w przod OFF 

 PORTD |= _BV(0);   // PRAWY SILNIK W przod ON
}


//skrecanie w prawo
if((PINC & 1 << 5) && !(PINC & 1 << 4) && !(PINC & 1 << 2))
{
PORTD |= _BV(2);  // LEWY silnik w przod ON

 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod OFF
}

// gdy tylko z prawej wykrywa czujnik
if((PINC & 1 << 5) && (PINC & 1 << 4) && !(PINC & 1 << 2))
{
PORTD |= _BV(2);  // LEWY silnik w przod ON

 PORTD &= ~_BV(0);   // PRAWY SILNIK W przod OFF
}

*/


 }


}

Program działa wszystko okej. ADC pomogło w kalibracji czujników

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.