logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C][ATmega8] - Atmega8 + TCRT5000 - niewłaściwe działanie

Cargo1906 11 Lis 2013 12:17 2682 13
  • #1 12939036
    Cargo1906
    Poziom 9  
    Witam,
    jestem w trakcie budowy robota line follow'era.
    Mój mikrokontroler to ATmega8, za czujniki wykorzystuję zaś trzy transoptory TCRT5000.

    Schemat podłączenia:

    [C][ATmega8] - Atmega8 + TCRT5000 - niewłaściwe działanie

    Każde z wyjść czujników podłączam do pinów PC5, PC4 oraz PC3 mikrokontrolera (adc5, adc4, adc3).

    W algorytmie wykorzystuję PWM, by sterować prędkością robota w zależności od położenia w stosunku do czarnej linii.
    Poniżej przedstawiam wyniki pomiarów jakie odczytuję z czujników w danej chwili:

    [C][ATmega8] - Atmega8 + TCRT5000 - niewłaściwe działanie

    Wartości poniżej, zostały wyliczone z wzoru (Vin*5)/256. Napięcie odniesienia to AVCC, równy około 5V.

    Kod odpowiedzialny za inicjalizację ADC, PWM oraz obsługę przerwania od ADC:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    W programie sprawdzam odczyty z czujników i w zależności od tego z jakiego zakresu odczytam wyniki z odpowiednich transoptorów robot ma zachować się w konkretny sposób.
    Kod prezentujący algorytm działania:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Niestety robot nie reaguje jak powinien - koła kręcą się z taką samą prędkością gdy czujniki mają pod sobą czarną linię, jak i białą. Pomiary robiłem kilka razy i przy różnym naświetleniu, wyniki za każdym razem były podobne.
    Nie wiem czy problem jest w samym algorytmie, czy też chodzi o źle dobrane wartości w if'ach, a może to jeszcze coś innego?

    Jest to mój pierwszy robot tego typu, stąd też nie jestem do końca przekonany, czy wszystko robię jak należy, dlatego proszę o zweryfikowanie mojego algorytmu i sposobu rozumowania.

    Męczę się z tym już od kilku tygodni, więc każda rada oraz każdy pomysł będzie na wagę złota.

    Pozdrawiam
  • #2 12939091
    dondu
    Moderator na urlopie...
    Witaj.

    Cargo1906 napisał:
    Nie wiem czy problem jest w samym algorytmie, czy też chodzi o źle dobrane wartości w if'ach, a może to jeszcze coś innego?
    ....
    Męczę się z tym już od kilku tygodni, więc każda rada oraz każdy pomysł będzie na wagę złota.

    Aby szybko znaleźć przyczynę podziel swoje działanie na etapy. Najpierw ustal, czy odczytywane przez robota wyniki pomiarów dla różnego położenia czujników względem linii, są prawidłowe. Następnie, czy obliczenia wykonywane przez Twój algorytm są prawidłowe. ... itd.

    Aby to zrobić wykorzystaj LCD lub RS-232.

    Co jest podłączone pod wejście PC0 (WE4)?
  • #3 12939170
    Cargo1906
    Poziom 9  
    PC0 jest połączony z pinem 3A mostka h. Nie wstawiałem całego schematu, mogę to zrobić jeśli zajdzie potrzeba.

    Spróbuję sprawdzić pomiary z wykorzystaniem wyświetlacza LCD, z RS-232 jeszcze się nie zapoznawałem.
  • #4 12939183
    McMonster
    Poziom 32  
    Z trochę innej beczki, masz rezystory na LEDach przy mikrokontrolerze?
  • #5 12939199
    Cargo1906
    Poziom 9  
    Mam oczywiście. Schemat z TCRT robiłem wczoraj, a wykorzystałem poprzedni schemat z ATmegą. Reszta jest jak należy, przepraszam za pomyłkę.
  • #6 12939202
    dondu
    Moderator na urlopie...
    Pytałem o WE4 dlatego, że port C w tym mikrokontrolerze jest podzielony na dwie części o różnej budowie wewnętrznej. Piny PC0-PC3, to piny przygotowane stricte do pomiarów za pomocą ADC. Współpracują one z zasilaniem przez AVCC i dlatego pomiary na nich są najdokładniejsze i obarczone najmniejszą ilością zakłóceń.

    Część dot. pinów PC4-PC5 jest zasilana z pinu Vcc, czyli z pominięciem dławika L1. Dlatego jeżeli możesz, podłącz swoje czujniki pod piny z przedziału PC0-PC3, a WE4 podłącz pod PC5, a najlepiej wykorzystaj pin z innego portu.

    Niby drobiazg, ale jeżeli robot ma startować w zawodach, to ziarnko do ziarnka ... i medal może będzie :)
  • #7 12939284
    Cargo1906
    Poziom 9  
    Tak też zrobię. Zabieram się właśnie do pracy.

    A sam algorytm wydaje się poprawny?
  • #9 12943717
    Cargo1906
    Poziom 9  
    Sprawdziłem wartości odczytywane z odpowiednich pinów na LCD i różnią się one od otrzymanych wcześniej po przeliczeniu z pomiarów.
    Jednak mam wątpliwości czy pomiary są autentyczne :|

    Sytuacja wygląda następująco:

    Panel z trzema czujnikami TCRT jest przymocowany w docelowym miejscu, w którym ma się znaleźć w robocie. Nad nim umieściłem płytkę z wlutowaną podstawką na ATmegę, a wszystko zasilam 4 bateriami AA 1.5V. Całość jest już polutowana.

    Gdy podłączam wyświetlacz, wyjmuję ATmegę z podstawki i wpinam do płytki stykowej gdzie montuję cały układ z LCD. Jednak ten zasilany jest już z zasilacza 5V. Panel z czujnikami natomiast wciąż zasilam z koszyczka z bateriami. Czy pomiary takie są wiarygodne?

    Po zmianie wartości w if'ach kod algorytmu prezentuje się tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przy pomiarach wyjścia z czujników podłączałem do pinów PC0, PC1 i PC2 ATmegi, WE4 jest teraz pin PC5.

    Robot jednak dalej nie reaguje na czarną linię jak powinien :?
    Zauważyłem też, że gdy algorytm wejdzie już w jeden z warunków skrajnych (robot zjeżdża na którąś ze stron) nie wyskakuje z niego od razu gdy zmieni się kolor pod danym czujnikiem, ale trwa to jakiś czas. Wyniki na wyświetlaczy zmieniały się zaś bez żadnych opóźnień.

    Ponadto na wyświetlaczu zauważyłem, że przewód podłączony do pinu PC0 jest w kodzie przypisany do zmiennej adc1, PC1 to adc2, a PC2 to adc0 i te zmienne pokazują wartości jakie wysyła dany czujnik.
  • #10 12946233
    dondu
    Moderator na urlopie...
    Cargo1906 napisał:
    Gdy podłączam wyświetlacz, wyjmuję ATmegę z podstawki i wpinam do płytki stykowej gdzie montuję cały układ z LCD. Jednak ten zasilany jest już z zasilacza 5V. Panel z czujnikami natomiast wciąż zasilam z koszyczka z bateriami.

    Czy masy są połączone?

    Nie rozumiem:

    Cargo1906 napisał:
    Ponadto na wyświetlaczu zauważyłem, że przewód podłączony do pinu PC0 jest w kodzie przypisany do zmiennej adc1, PC1 to adc2, a PC2 to adc0 i te zmienne pokazują wartości jakie wysyła dany czujnik.

    To jesteś autorem, czy tylko przerabiasz znaleziony program?
  • #11 12946627
    Cargo1906
    Poziom 9  
    8-O
    Masy nie były połączone, wieczorem zrobię pomiary jeszcze raz, już ze wszystkim jak należy.

    Ja jestem autorem programu, jednak nie mam wiele doświadczenia w programowaniu w C, a obsługą przetworników ADC zająłem się całkiem niedawno. Dlatego prosiłem o sprawdzenie kodu, gdyż nie wiedziałem czy wszystko jest tam jak założyłem. Okazało się, że nie wszystko działało jak planowałem, teraz jestem już mądrzejszy.
  • Pomocny post
    #12 12947401
    dondu
    Moderator na urlopie...
    Jeżeli dobrze zrozumiałem mikrokontroler wpięty do płytki z LCD był zasilany z jednego źródła, a podłączone do niego sygnały z płytki z czujnikami, były zasilane z koszyczka z bateriami. W takim przypadku, aby ustalić wspólny punkt odniesienia musisz połączyć masy baterii z koszyczka z masą źródła zasilania mikrokontrolera.

    Przykład dot. tego problemu jest analogiczny do tego: http://mikrokontrolery.blogspot.com/2011/04/B...enia-masy-mikrokontrolera-i-programatora.html
  • #13 12950716
    Cargo1906
    Poziom 9  
    Po złączeniu mas pomiary oczywiście okazały się już bardziej wiarygodne (aż mi głupio, że na to nie wpadłem :oops: ).

    Po skonfigurowaniu wartości warunkowych mój algorytm wygląda następująco:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Robot jeździ i działa jak powinien. Czasem zdarzy mu się wypaść poza trasę na ciasnym zakręcie, by po chwili na nią wrócić, ale to już chyba kwestia doboru prędkości, co też będę starał się poprawiać w dalszej pracy nad programem.

    Bardzo dziękuję za pomoc, szczególnie Tobie dondu - nie wpadłbym na pomysł sprawdzania wartości pomiarów na LCD, a jak się okazało czujniki były dużo bardziej czułe niż przypuszczałem.
    Jeśli pojawią się jeszcze jakieś rady, chętnie ich wysłucham. Jeśli nie, jutro zamknę temat.
    Pozdrawiam i jeszcze raz dzięki za pomoc :)
REKLAMA