Skocz do zawartości

Problem z kierunkiem jazdy robota


Pomocna odpowiedź

Napisano

Witam, mam taki problem w programie, robot(mini sumo) jak jedzie do przodu, czy to skreca, czy centralnie prosto jedzie to jest ok. Tak samo jak jedzie do tyłu, też wszystko spoko. Problem pojawia sie, gdy robot jedzie prosto i nagle ma jechac do tylu. Robot staje. nie wykonuje wiecej ruchow. Tak samo jest z jazda tył-> przod. Do tyłu jedzie, ale jak czujnik wykryje ze ma nagle jechac prosto to kaput. Prosiłbym bardzo o pomoc, w środe zawody i jedynie to szwankuje. Wszystko działa ok, procz wlasnie tego, przy zmianie kierunku obrotow silnika silniki nie reaguja wogle na czujniki

oto czesc programu co za to odpowiada:

a=PINC;

b=PINA;

c=a & (0x01); //wykrywanie z lewej strony

d=a & (0x02); //wykrywanie przod lewo

e=a & (0x08); //wykrywanie przod prawo

f=b & (0x01); //wykrywanie z prawej strony

g= a & (0x0A); //wykrywanie 2 przod

h=PIND &(0x04); //wykrywanie tyl

if ((pomiar(4)<800) && (pomiar(3)<800)) //wykrywanie ktirow tylnich rownoczesnie

{

OCR2=30;

OCR0=10;

PORTC |=przod1|przod2;

PORTC &=~((tyl1)&(tyl2));

}

else if ((pomiar(7)<800) && (pomiar(2)<800)) //wykrywanie ktirow przednich rownoczesnie

{

OCR2=30;

OCR0=255;

PORTC |=tyl1|tyl2;

PORTC &=~((przod1)&(przod2));

}

else if ((pomiar(7)<800) && (pomiar(2)>800)) //wykrycie ktira przedniego lewego

{

OCR2=20;

OCR0=255;

PORTC |=tyl1|tyl2;

PORTC &=~((przod1)&(przod2));

_delay_ms(500);

}

else if ((pomiar(2)<800) && (pomiar(7)>800)) //wykrycie ktira przedniego prawego

{

OCR2=255;

OCR0=20;

PORTC |=tyl1|tyl2;

PORTC &=~((przod1)&(przod2));

_delay_ms(500);

}

else if ((pomiar(4)<800) && (pomiar(3)>800)) //wykrycie ktira tylniego lewego

{

OCR2=10;

OCR0=70;

PORTC |=przod1|przod2;

PORTC &=~((tyl1)&(tyl2));

}

else if ((pomiar(3)<800) && (pomiar(4)>800)) //wykrycie ktira tylniego prawego

{

OCR2=70;

OCR0=10;

PORTC |=przod1|przod2;

PORTC &=~((tyl1)&(tyl2));

}

else if(g==0) //sharpy 2 przod

{

OCR0=test1;

OCR2=test2;

PORTC |=przod1|przod2;

PORTC &=~((tyl1)&(tyl2));

}

else if((g!=0)&&(d==0)) //sharp1 przod lewy

{

OCR0=100;

OCR2=test2;

PORTC |=przod1|przod2;

PORTC &=~((tyl1)&(tyl2));

}

else if((g!=0)&&(e==0)) //sharp1 przod prawy

{

OCR0=test1;

OCR2=100;

PORTC |=przod1|przod2;

PORTC &=~((tyl1)&(tyl2));

}

else if(c==0) //sharp1 lewy

{

OCR2=255;

OCR0=100;

PORTC |=przod1|przod2;

PORTC &=~((tyl1)&(tyl2));

}

else if(f==0) //sharp1 prawy

{

OCR2=100;

OCR0=255;

PORTC |=przod1|przod2;

PORTC &=~((tyl1)&(tyl2));

}

else if(h==0) //sharp1 tył

{

PORTC &=~((tyl1)&(tyl2));

OCR2=50;

OCR0=255;

PORTC |=przod1|przod2;

}

else {

OCR2=255;

OCR0=255;

PORTC &=~(przod1&tyl1&przod2&tyl2);

}

}

}

if (pomiar(1)<760)

PORTC |=ledbateria;

else

PORTC &=~ledbateria;

uint16_t pomiar(uint8_t kanal) //to juz po za whilem

{

ADMUX = (ADMUX & 0xF8) |kanal;

ADCSRA |=(1<

while (ADCSRA & (1<

return ADCW;

}

Wygląda to na resetowanie się mikrokontrolera podczas tej zmiany kierunku jazdy, bo wtedy pobierany jest największy prąd. Spróbuj dodać jakiś kondensator elektrolityczny na zasilaniu. Co do programu to najpierw opatrz go większą ilością komentarzy, zaznacz gdzie rozpoczyna się funkcja main i na forum wstawiaj w znacznikach:

[code]
[/code]

, to może wtedy zechce się komuś to przeczytać.

Sprawdź czy po tym zatrzymaniu program nie próbuje wykonywać się od początku. Będziemy mieli potwierdzenie, że to resetowanie.

Ok przepraszam. Problem rozwiazany w zasadzie dosyc dziwnie. Otoz jak mialem np zalaczenie rownoczesnie jazdy przod i rownoczesnie negacja jazdy w tyl to wystarczylo rozdzielic instrukcje, czyli z PORTC |=przod1 | przod2; zrobic osobno portc |= przod1; i portc|=przod2; moze jak sam mowisz, ze ciagnelo za duzy prad, wiec jak rozdzielono to , to moze wtedy osobno ciagna prad. Pierwszy raz sie spotkalem z czyms takim. W sumie moze ktos mial podobnie lub ma racjonalne wyjasnienie tego?

Dziekuje za odzew

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