tabbi Napisano Styczeń 10, 2011 Udostępnij Napisano Styczeń 10, 2011 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 More sharing options...
Razonek Maj 29, 2011 Udostępnij Maj 29, 2011 Dlaczego pisze w twoim kodzie tak: /* ATmega 8MHz */ #define F_CPU 1000000L Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »