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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.