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

Podłączenie przycisków do ATmega8 – jak wyeliminować drgania styków i fałszywe sygnały?

27 Sie 2006 01:59 3649 25
REKLAMA
  • #1 2957659
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #2 2957775
    zerpo
    Poziom 22  
    Posty: 463
    Pomógł: 50
    Ocena: 134
    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....
  • #3 2959183
    marek-72
    Poziom 11  
    Posty: 21
    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
  • #4 2959818
    bogdan_p
    Poziom 39  
    Posty: 3849
    Pomógł: 525
    Ocena: 120
    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
  • #5 2959828
    Konto nie istnieje
    Poziom 1  
  • #6 2959913
    zerpo
    Poziom 22  
    Posty: 463
    Pomógł: 50
    Ocena: 134
    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)...
  • #7 2960075
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #9 2960189
    bogdan_p
    Poziom 39  
    Posty: 3849
    Pomógł: 525
    Ocena: 120
    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
  • #10 2973839
    Konto nie istnieje
    Poziom 1  
  • #11 2973874
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    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
  • #12 2974038
    Konto nie istnieje
    Poziom 1  
  • #13 2974522
    bogdan_p
    Poziom 39  
    Posty: 3849
    Pomógł: 525
    Ocena: 120
    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
  • #14 2974610
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    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:



    Podłączenie przycisków do ATmega8 – jak wyeliminować drgania styków i fałszywe sygnały?

    Rezystory podciągające nie są wogóle potrzebne bo można włączyć wewnętrzne podciąganie pinów wejściowych.
  • #15 2975146
    Konto nie istnieje
    Poziom 1  
  • #16 2975632
    bogdan_p
    Poziom 39  
    Posty: 3849
    Pomógł: 525
    Ocena: 120
    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
  • REKLAMA
  • #17 2975996
    Konto nie istnieje
    Poziom 1  
  • #18 2976188
    _Robak_
    Poziom 33  
    Posty: 2208
    Pomógł: 231
    Ocena: 29
    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
  • #19 2976222
    Konto nie istnieje
    Poziom 1  
  • #20 2976314
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    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
  • #21 2976687
    _Robak_
    Poziom 33  
    Posty: 2208
    Pomógł: 231
    Ocena: 29
    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;-)
  • #22 2976923
    Konto nie istnieje
    Poziom 1  
  • #23 2977502
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    _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.
  • #24 2978732
    Konto nie istnieje
    Poziom 1  
  • #25 2978892
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 123
    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ć.
  • REKLAMA
  • #26 2979293
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z podłączeniem przycisków (mikrowyłączników) do mikrokontrolera ATmega8 w robocie mobilnym, gdzie przyciski mają sygnalizować zderzenie z przeszkodą. Głównym problemem są drgania styków i fałszywe sygnały, które pojawiają się przy bezpośrednim podłączaniu przycisków do portów mikrokontrolera bez odpowiednich rezystorów podciągających. Zalecane jest stosowanie zewnętrznych rezystorów podciągających (np. 4,7 kΩ do Vcc) oraz programowa eliminacja drgań styków przez opóźnienie i ponowne sprawdzenie stanu pinu po około 30 ms.

W dyskusji poruszono także kwestie zakłóceń generowanych przez silniki sterowane przez układ L293D, które powodują fałszywe odczyty przycisków. Sugerowano poprawę filtracji zasilania poprzez dodanie kondensatorów (100 nF i 100 µF) blisko mikrokontrolera i stabilizatora L78L05, a także zapewnienie wspólnej masy (GND) dla zasilania logiki i silników. Zwrócono uwagę na konieczność stosowania zewnętrznych diod zabezpieczających przy L293D oraz na prawidłowe podłączenie pinów AVCC i AGND w ATmega8.

Wskazano, że podciąganie wejść mikrokontrolera można realizować wewnętrznymi rezystorami, ale zewnętrzne rezystory zwiększają odporność na zakłócenia. Omówiono również błędy w programie i schemacie, takie jak niepotrzebne wielokrotne ustawianie DDRB i PORTB oraz nieprawidłowe ustawienia pinów jako wyjścia zamiast wejścia do odczytu stanu przycisków. Podkreślono, że pin ustawiony jako wyjście nie nadaje się do odczytu sygnału z przycisku, a prawidłowa kolejność konfiguracji to najpierw ustawienie kierunku pinu (DDR), a potem włączenie podciągania (PORT).

Alternatywnie zaproponowano bardziej zaawansowane rozwiązania detekcji kolizji, np. czujniki ciśnienia pneumatycznego lub hydraulicznego podłączone do ADC mikrokontrolera, jednak uznano je za droższe i mniej praktyczne w prostych konstrukcjach amatorskich.

Podsumowując, kluczowe rozwiązania to: stosowanie zewnętrznych rezystorów podciągających, filtracja zasilania kondensatorami, prawidłowe podłączenie i konfiguracja pinów ATmega8, eliminacja drgań styków programowo oraz zabezpieczenie układu L293D diodami. Problemy z fałszywymi sygnałami wynikają głównie z zakłóceń elektromagnetycznych generowanych przez silniki i nieodpowiedniej filtracji zasilania.
Wygenerowane przez model językowy.
REKLAMA