Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

czujniki z atmega8

polrus 27 Sie 2006 01:59 3187 25
  • #1 27 Sie 2006 01:59
    polrus
    Poziom 10  

    do mojego jeżdżącego robota na czas testów podłączylem zwykle przyciski na zderzakach które maja sygnalizować zderzenie z przeszkoda.
    Chodzi mi o podłączenie takiego przycisku do procesora. Wiadomo może on albo zwierać do "0" albo do "1" . Dodatkowo można w atmega8 ustawić czy port który działa jako wejście ma być podciągany do "1" czy do "0".
    Przy bezpośrednim podpinaniu tych przycisków do portu (bez żadnych rezystorów) mam takie problemy że:
    a). jeśli ustawie podciąganie portu do "1" a przycisk zderzenia zwiera do "0" to co jakiś czas procesor odbiera niby zwieranie do "0" mimo, że takiego nie bylo i wskakuje w procedurę omijania

    b.) jeśli ustawie podciąganie portu do "0" a przycisk zwiera do "1" to wtedy wszystko jest ok ale dopiero sekundowe przytrzymanie przycisku prowadzi do wykrycia takiego zwarcia.

    Nie chciałbym stosować przerzutników które by zatrzaskiwały sygnały z przycisków zderzeń bo nie mam miejsca na płytce . Czy wobec tego może macie jakieś rady jak rozwiązać ten problem ?

    W przypadku a) nie wiem co może powodować wykrywanie tego zwarcia. Może mimo krótkich czasów zwarcia powinienem zwierać przez rezystory?

    0 25
  • Arrow Multisolution Day
  • #2 27 Sie 2006 08:46
    zerpo
    Poziom 22  

    Witam!
    Jeśli chodzi o tego typu połączenia z uC, to w praktyce stosuje się rozwiązanie "a)", czyli przycisk jest aktywny niskim stanem. Jesto to pewniejsze rozwiązanie. Rezystory podciągające w ATmega mogą płatać różne figle, o czym się już kiedyś przekonałem. Koniecznie dołóż zewnętrzne podciąganie do Vcc, np. przez rezystor 4,7kΩ. Pamiętaj także o zjawisku drganiu styków mechanicznych. Jeśli jeszcze się z tym nie spotkałeś, to przypomne, że chodzi tutaj o zjawisko, kiedy to aktywowanie przycisku generuje kilku(nasto)milisekundowe wahania stanów logicznych. Może to doprowadzić do fałszywych odczytów, albo zczytania przez uC kilku wciśnięć, podczas gdy nastąpiło jedno.
    Można się tego pozbyć programowo przez np. Po wystapięniu stanu niskiego procesor czeka ok 30ms i następnie sprawdza ponownie stan pinu. Jeśli nadal jest niski, to wiadomo....

    0
  • #3 27 Sie 2006 17:30
    marek-72
    Poziom 10  

    hm... apropos detekcji kolizji...
    duzo lepiej jest to robic na czujniku cisnienia, nie na wylaczniku.
    poporstu w chronionym miejscu (miejscach) instalujesz pojemnik o pewnym cisnieniu gazu/cieczy (tzw zderzak pneumatyczny/hydrauliczny) w zaleznosci od potrzeb i podlaczasz go do czujnika, ktory podlaczony jest do ADC mikrokontrolera. pozniej to juz czysta przyjemnosc...
    ma to dwie zalety... masz dynamiczna informacje o nacisku i... masz amortyzacje (scisliwosc medium) :)...
    stad juz niedalego do dynamicznych zdezakow, bo wyobraz sobie co by bylo gdyby sterowac cisnieniem??? pelny wypas! ... a to takie proste! :)

    hej

    0
  • #4 27 Sie 2006 20:48
    bogdan_p
    Poziom 39  

    marek-72 pomysł nie jest zły tylko jest pewne ale ...... koszty
    autorowi tematu chodziło tylko o sposób wysterowania wejścia uC , przy zastosowaniu mikrowyłączników jako czujniki co jest prostym , pewnym i tanim rozwiązaniem , stosowanie czujników ciśnienia w amatorskich prostych konstrukcjach raczej nie ma sensu

    0
  • #5 27 Sie 2006 20:50
    polrus
    Poziom 10  

    No na razie jednak chce sie skupić na najprostszym więc się z ciśnieniem nie będę bawił ale później nawet dobry pomysł.

    Dalej mam niestety problem toteż zagłębie się trochę w mój układ.
    Oprócz wymienionych wyżej zworników do masy mam jeszcze 2x L293NE które sterują mi dwoma gąsienicami mojego robota. Metoda a) (czujniki zwierają do masy poprzez R4k7 )którą opisałem w pierwszym poście działa dopóki nie podłączę silniczków. To znaczy mam podłączone diody które informują mnie o sygnałach wystawianych z uP na sterowniki silników i jak obserwuję diody po naciskaniu przycisków zderzeń to wszystko jest ok.
    Jak jednak podłącze silniczki to po paru sekundach jazdy cos uP "odbija" i sygnalizuje że jakiś z czujników jest zwarty a jest to wykluczone.
    Zrobiłem osobny pakiet baterii tak że 4 baterie paluszki w szeregu zasilają układ analogowy L293NE a drugi zestaw 6 paluszków przez stabilizator L78L05 zasila logikę czyli uP i logiczne wejście Vss układu L293NE.

    Jeżeli trzymam robota w powietrzu czyli nie obciążam jego gąsienic/silniczków to wtedy nie wykrywa tych fałszywych zwarć czujników. Wystarczy że lekko ręką przyhamuję gąsienice czyli bardziej obciążę silniczki to zaczyna wykrywać zwarcie. Rozumiem że obciążenie silniczków może powodować, że zwiększa się moc pobierana z ich zasilania i to może zawahać napięcia ale przecież układ zasilania procka czyli ten, który podciąga napięcie do "1" na pinie do którego podłączony jest czujnik jest stabilizowany układem L78L05 i to jeszcze z innego pakietu baterii mają tylko wspólną masę

    0
  • #6 27 Sie 2006 21:09
    zerpo
    Poziom 22  

    Jeśli to możliwe, to wklej swój schemat, oraz program.
    Podłącz może woltomierz i sprawdź jak zmienia sie napięcie µC podczas obciążania silników. O ile to możliwe dodaj kondensator 100nF na liniach zasilających jak najbliżej procka.
    Zmierz też napięcie, które jest podciągane przez ten 4,7kΩ na czujniku.
    Ile prądu pobierają silniki?
    Możesz też we Fuse bitach uC wyłączyć układ BOR (reset procka przy spadku zasilania)...

    0
  • #7 27 Sie 2006 21:47
    polrus
    Poziom 10  

    sam program jest bardzo prosty - 2 czujniki są na tyle robota i jedzie cały czas w tył aż jakiś z czujników nie zarejestruje przeszkody. Wtedy wycofuje. odbija troche w ktoras ze stron i probuje przejechac jeszcze raz.

    jak widać PINB0 i PINB1 to tam gdzie podłączyłem czujniki

    int main (void)
    {
    DDRB=0xff;
    PORTB=0xff;
    DDRB=0;
    DDRD= 0xff;

    while (1)
    {
    PORTD=tyl;
    if ((PINB & 3) ==1 )
    { //prawy
    PORTD=przod;
    wait_1s();
    PORTD=lewo;
    wait_1s();
    PORTD=przod;
    wait_1s();
    PORTD=prawo;
    wait_1s();
    DDRB=0xff;
    PORTB=0xff;
    DDRB=0;

    }
    if ((PINB & 3) ==2 )
    { //prawy
    PORTD=przod;
    wait_1s();
    PORTD=prawo;
    wait_1s();
    PORTD=przod;
    wait_1s();
    PORTD=lewo;
    wait_1s();
    DDRB=0xff;
    PORTB=0xff;
    DDRB=0;

    }

    if ((PINB & 3) ==0 )
    { //prawy
    PORTD=przod;
    wait_1s();
    wait_1s();
    wait_1s();
    DDRB=0xff;
    PORTB=0xff;
    DDRB=0;
    }

    DDRB=0xff;
    PORTB=0xff;
    DDRB=0;
    }
    return 0;


    }

    0
  • Arrow Multisolution Day
  • #8 27 Sie 2006 22:09
    zerpo
    Poziom 22  

    Niepotrzebnie wpisujesz wszędzie:

    Code:
     DDRB=0xff;
    
    PORTB=0xff;
    DDRB=0;

    Usuń te instrukcje z każdego IFa i końca programu, wystarczy, że tylko na samym początku zainicjalizujesz:
    Code:
    PORTB=0xff;
    
    DDRB=0;


    Poza tym więcej mi do głowy nie przychodzi...

    0
  • #9 27 Sie 2006 22:13
    bogdan_p
    Poziom 39  

    podstawowa sprawa to schemat , oraz to co pisał zerpo filtracja napięcia zasilania tak więc kondensatory 100nF i 100µF jak najbliżej uC , kondesatory przy stabilizatorze LM7805 , to samo przy logice l293 , oczywiście wszystko musisze mieć na wspólnej masie ( GND ) dla obu zasilań , LM 78L05 może mieć za mała wydajność prądową zastosuj LM 7805
    jeszcze jedna sprawa L293NE nie ma wewnętrzych diod zabezpieczajacych dlatego należy je dołączyć zewnętrznie i sprawa poboru prądu przez silniki

    0
  • #10 31 Sie 2006 18:07
    polrus
    Poziom 10  

    z eagla więc nie wygląda najładniej ale oto schemat
    oczywiście między y1 i y2 na l293d jest podpięty silnik - to samo z y3 i y4

    czujniki z atmega8

    0
  • #11 31 Sie 2006 18:18
    McRancor
    VIP Zasłużony dla elektroda

    Popraw ten schemat, bo jest zrobiony fatalnie, za dużo punktów krzyżujących (junction) i ścieżki poprowadzone nie do wszystkich nóg prawidłowo (za daleko przy 10 i 15 nodze L293.

    Poza tym Mega8 ma niepodłączone AVCC i AGND a to błąd

    0
  • #12 31 Sie 2006 19:05
    polrus
    Poziom 10  

    niestety nie mam leprzego programu - punkty łączące dałem żeby było wiadomo że tam gdzie przechodzą 2 prosotpadłe linie to nie łączą się.

    Nie bardzo rozumiem co to znaczy że są "za daleko" poprowadzone ścieżki do l293. Tak czy inaczej to dość prosty schemat. Podlutuje to AVcc i AGnd na wszelki wypadek może coś pomoże.

    Opisze tez troche slownie.
    Na Vcc1 oraz 1-2En i 3-4En układu l293 oraz do zasilania atmeti jest napięcie ze stabilizatora. A zasilanie silników idzie bezpośrednio z baterii.

    Silnikiem 1 sterują w atemedze Piny PD0 i PD1 a silnikiem 2 PD2 i PD3 podając je odpowiednio do wejść 1A-2A i 3A-4A sterujących l293

    czujniki z atmega8

    0
  • #13 31 Sie 2006 21:11
    bogdan_p
    Poziom 39  

    masz żle zasilone AVss i AGnd , GND to zawsze masa , ponadto zasila się z napiecia po stabilizatorze , nadal masz brak kondensatorów przy stabilizatorze , zastosuj również kondesatory elektrolityczne , sterownie przyciskami masz również żle , była o tym mowa podciągnij wejścia do plusa przez opornik 4,7 - 10 KΩ , a przyciski mają zwierać bezpośrednio do masy
    zobacz sobie przykład zasilania http://www.btc.pl/pdf/zl2avr.pdf

    0
  • #14 31 Sie 2006 21:37
    McRancor
    VIP Zasłużony dla elektroda

    To nie wina programu tylko Twojego niechlujstwa że schemat wygląda jakby go kura pazurem bazgroliła, powinno to wyglądać mniej więcej tak:



    czujniki z atmega8

    Rezystory podciągające nie są wogóle potrzebne bo można włączyć wewnętrzne podciąganie pinów wejściowych.

    0
  • #15 01 Wrz 2006 00:40
    polrus
    Poziom 10  

    podpiąłem AVcc, AGnd już był uziemiony tylko źle narysowałem to na tym moim schemacie. Dałem też kondziorki ale dalej to samo. Jedzie przez kilka chwil i nagle dostaje sygnał od czujników a to jest niemożliwe bo jedzie po prostej.

    Silniki przy duuużym obciążeniu biorą tak ~500mA a l293d powinien wytrzymać dla jednego kanału 600mA stałego. A ja na każdy silnik używam 2 kanały bo chcę też kontrolować kierunek obracania. Wg mnie powinienem mieć do dyspozycji nawet 1200mA. Teraz zrobiłem taki eksperyment ze wypiąłem 1 z silników żeby mieć pewność że sumaryczne obciążenie l293 nie przekracza jakiegoś poziomy krytycznego ale widzę że dzieje się to samo. Przy zerowym obciążeniu silniczka działa ok a jak zacznę go lekko hamować to po paru sekundach czujnik wykrywa skręt.
    Jestem pewien że wina jest gdzieś w podłączeniu układu ld293d bo jak między piny sterujące procka PD0-PD3 a wejścia 1A-4A wstawiłem diody to wtedy wszyskto było ok z czujniekiem. Za to silnik nie chciał się kręcić w jedną ze stron przy obciążeniu - po prostu stał.
    TE silniczki jak i cała kostrukcja to jest zabawka koparaka na gąsienicach wielkości ok. 30cm więc te silniczki to nie żadne kolosy. Za to dziwne jest to że mimo że cały ten mój układ zasilany jest z baterii to jak go włączę to na oddalonym o 3 metry telewizorze (który normalnie odbiera idealnie) są duże zakłócenia obrazu :)

    Dodano po 56 [minuty]:

    Skoro te silniczki generują w eterze takie zakłócenia to pomyślałem że może w tych moich przewodach z czujników także. Dlatego oto małę zdjęcie tej mojej koparki
    czujniki z atmega8

    czerwonymi kropkami zaznaczyłem miejsce podpięcia do procka kabelków z czujników (zaznaczone zielonymi strzałkami).
    Na niebiesko oznaczona nr 2 jest wiązka przewodów do silników.
    Dla testu odlutowałem od procka kabelki łączący czujniki z prockiem i problem nie występował.
    Nie jest to wina samych przycisków bo jeśli zostawiłem wiszący w powietrzu kabelki które normalnie łaczą piny PB0 i PB1 to też przychodziły sygnały że czujnik został zwarty a niby jak jak kabelek wisiał w powietrzu

    0
  • #16 01 Wrz 2006 08:24
    bogdan_p
    Poziom 39  

    masz ładnie namalowany schemat przez McRancor , proponuje podciągnij wejścia PB0 , PB1 do Vcc przez oporniki o których była już mowa

    Cytat:
    Wg mnie powinienem mieć do dyspozycji nawet 1200mA

    jezeli taki prąd to pozostaje zastosować L298
    Cytat:
    wstawiłem diody to wtedy wszyskto było ok z czujniekiem. Za to silnik nie chciał się kręcić w jedną ze stron przy obciążeniu - po prostu stał.

    dobrze połączyłeś diody ?
    a jakie zastosowałeś diody ? , muszą to być szybkie diody o odpowiednim prądzie , nie mogą to być zwykłe prostownicze
    na koniec po tylu eksperymentach czy masz pewność że L293 jest jeszcze dobry ?
    proponuje sprawdź sobie sam L293 bez ATMegi , aby mieć pewność bardzo ważna sprawa nie pozostawiaj wejść L293 wiszących w powietrzu , połącz odpowiednią kombinację wejść , zasilanie i sprawdź jak zachowuje się układ , nastepnie zmień połączenie wejść i kolejna próba
    powodzenia

    0
  • #17 01 Wrz 2006 10:32
    polrus
    Poziom 10  

    Diody podłączyłem normalnie tak żeby przepuszczały wyżesze napięcie z PD0-3 do wejść 1A-4A l293d. Dałem diody 1N4148 i nie wydaje mi się żeby musiały mieć odpowiedni prąd bo przechodzi nimi tylko minimalny prąd sterujący kierunkiem obrotu silników wg dokumentacji l239d Iss~=44mA, a nie prąd napędzający silniki. Szybka też nie musi być bo tak często tych silników nie przełączam.



    PB0 i PB1 podciągnąłem do Vcc prze rezystory 4k7 tylko że nie naniosłem tego jeszcze na schemat - wiem że nie jest to konieczne bo procek sam powinien to podciągnąć ale na pewno zwiększy odporność na zakłócenia. Wejść l293 nie zostawiłem wiszących w powietrzu. To co zostawiłem w powietrzu dla eksperymentu to kabelki łączące PB0 i PB1 z czujnikami zwierającymi do masy z tym że odlutowałem te kabelki od samych czujników żeby sprawdzić czy może w samych kabelkach indukują się jakieś śmieci które wykrywane są jak zwarcie przycisków. Okazało się że tak.

    L293 jest jeszcze dobry - zresztą mam 8szt i mogę sobie zmieniać.

    Więc jak na razie problem jest chyba rozwiązany, dałem na odcinku czujniki PB0-1 ekranowane kabelki i już jest ok.

    Morał z tego jest taki że chińskie zabawki potrafią zaskoczyć :)

    0
  • #18 01 Wrz 2006 11:47
    _Robak_
    Poziom 33  

    Widze ze PortD ustawiasz jako wejscie

    Cytat:
    DDRB=0xff;
    PORTB=0xff;
    DDRB=0;


    Ja proponuje inny sposob, ustaw PB0 i PB1 jako wyjscie i na wyjscie ich daj 1, i jesli bedzie 0, czyli przycisk wcisniety to wtedy reaguje, jak juz przycisk bedzie wylaczony to stan pinu wroci na 1, a rezystory podciagajce sa niepotrzebne bo ATMEGI maja je juz.


    widze ze sie troche spoznilem:) ale jak dziala to w porzadku:D

    0
  • #19 01 Wrz 2006 11:58
    polrus
    Poziom 10  

    domyślam się ze w pierwszej linijce chodziło ci o PortB.
    Myślałem że jeśli PIN ustawiony jest jako wyjście to nie można z niego odczytać wiarygodnej wartości z procka. Wtedy chyba trzeba by też zwierać do masy przez jakiś opornik czy nie?

    0
  • #20 01 Wrz 2006 12:18
    McRancor
    VIP Zasłużony dla elektroda

    Jak pin ustawiony jest jako wyjście nie ma sensu odczytywać, bo zawsze będzie ta sama wartość co wpisana do rejestru PORT. Dopiero ustawienie DDR jako wejście powoduje że odczytywanie nabiera sensu, można wtedy ustawić Port na 0 i mamy wejście trójstanowe, a gdy ustawi się nań 1 mamy wejście podciągnięte wewnętrzne do zasilania.

    W programie na początku jest niepotrzebne zamieszanie, najpier ustaw DDRB jako wejście, a potem podciągnij je przez ustawienie rejestru PORTB

    0
  • #21 01 Wrz 2006 14:25
    _Robak_
    Poziom 33  

    Jsli pin ustawiony jest jako wyjscie i ustawiony na nim jest stan wysoki to po przycisnieciu przycisku, ktory jest podlaczony do GND, bedzie na czas przycisniecia stan niski, po puszczeniu przycisku stan wroci na wysoki, wystarczy sprawdzac jaki jest stan pinu, jesli zas ustawimy pin jako wejscie to po przycisnieciu stan ustawi sie na niski i bedzie taki nawet po puszczeniu przycisku, wiec trzeba by znowu ustawic stan wysoki, dlatego pierwsze rozwiazanie wydaje mi sie znacznie lepsze, u mnie sprawdzilo sie w 100%, gorzej z czujnikami bo nie wytrzymaly kontaktow ze sciana;-)

    0
  • #22 01 Wrz 2006 15:44
    polrus
    Poziom 10  

    Robak ma racje. I działa bez problemu

    0
  • #23 01 Wrz 2006 19:03
    McRancor
    VIP Zasłużony dla elektroda

    _Robak_ napisał:
    Jsli pin ustawiony jest jako wyjscie i ustawiony na nim jest stan wysoki to po przycisnieciu przycisku, ktory jest podlaczony do GND, bedzie na czas przycisniecia stan niski, po puszczeniu przycisku stan wroci na wysoki, wystarczy sprawdzac jaki jest stan pinu, jesli zas ustawimy pin jako wejscie to po przycisnieciu stan ustawi sie na niski i bedzie taki nawet po puszczeniu przycisku, wiec trzeba by znowu ustawic stan wysoki, dlatego pierwsze rozwiazanie wydaje mi sie znacznie lepsze, u mnie sprawdzilo sie w 100%, gorzej z czujnikami bo nie wytrzymaly kontaktow ze sciana;-)



    A moim zdaniem to bzdury, mogące prowadzić do uszkodzenia portu, dlatego poprzedni post z taką treścią usunąłem.

    Poczytaj najpierw troche dokumentacji, zmierz prąd płynący przez pin ustawiony jako wyjście w stanie wysokim, zwarty do masy, może to da troche do myślenia.

    Dlaczego niby pullup w pinie wejściowym miałby się wyłączać? Konstruktorzy Atmela popełnili błąd i dopiero Wy go zauważyliście?

    Gdybyś tylko zajżał do dokumentacji, dowiedziałbyś się między innymi że NAJPIERW ustawia się kierunek pinu portu, a POTEM włącza się wewnętrzne podciąganie, u Ciebie port jest w stanie wysokiej impedancji i dzieją się na nim przez to takie cyrki.

    0
  • #24 02 Wrz 2006 00:33
    polrus
    Poziom 10  

    tak czy inaczej działa dla obu opcji - z dokumentacji staram się czytać tylko to co mi jest akurat potrzebne przez co wiele rzeczy mi umyka - moja wina ze czytania dokumentacji nie uważam ze najciekawsze zajęcie na świecie.
    Ale z ciekawości zmierzyłem ten prąd o którym piszesz i przy zwarciu do masy przez amperomierz (chyba możemy uznać to za zwarcie do masy) płynie 75mA - szokująco dużo to to nie jest

    0
  • #25 02 Wrz 2006 02:22
    McRancor
    VIP Zasłużony dla elektroda

    Jeśli to nie jest dużo, to zajżyj na 239 stronę pdfa od Atmegi8 gdzie masz maksymalne dopuszczalne parametry dla procesora, jest tam też maksymalny dopuszczalny prąd na pojedyńczą noge portu.

    Można nie czytać wogóle dokumentacji i potem się dziwić czemu nie działa, albo wogóle się tym nie zajmować.

    0
  • #26 02 Wrz 2006 10:47
    polrus
    Poziom 10  

    McRancor napisał:
    Jeśli to nie jest dużo, to zajżyj na 239 stronę pdfa od Atmegi8 gdzie masz maksymalne dopuszczalne parametry dla procesora, jest tam też maksymalny dopuszczalny prąd na pojedyńczą noge portu.

    Można nie czytać w ogóle dokumentacji i potem się dziwić czemu nie działa, albo w ogóle się tym nie zajmować.

    ale na tym forum są ludzie którzy akurat się zajmują. Tak czy inaczej to nie w tym tkwił błąd chyba tylko właśnie w tych zakłóceniach.
    Tak czy inaczej chciałem podziękować wszystkim którzy poświęcili swój czas i zabrali w tym temacie głos aby mi pomóc. Jak już dorobię czujniki na wysięgniku oraz układ z myszki kukowej który będzie sprawdzał kąt obrotu robota to postaram się wrzucić tu jakiś filmik z jego jazdy.

    0