Skocz do zawartości

Multipleksacja - line follower - Atmega32 - 16x KTIR0711S


electrik_eye

Pomocna odpowiedź

Witam!

Jestem w trakcie budowy mojego lf'a. Wykorzystuję atmegę32 (względnie mam też u siebie 128 ale jako, że taktowanie i liczba kanałów ADC jest taka sama a głównie pamięć większa to jej nie używam) i jak też napisałem w temacie chcę podłączyć 16 czujników KTIR0711S pod 8 wejść ADC mojego uC czyli wychodzi, że po 2 czujniki KTIR0711S na jeden kanał. Więc wymagana jest tu multipleksacja. Jedyne rozwiązanie jakie przyszło mi do głowy to pogrupowanie czujników po "8" i włączanie/wyłączanie ich poprzez 2 tranzystory sterowane przez uC. Na kawałkach schematu jest przedstawiona sama idea, bo i "CZ1" i "CZ2" będą powielone razy "8".

Chodzi mi tylko, żebyście sprawdzili, czy to powinno zadziałać i podpowiedzieli jakie też powinny być wartości rezystorów?

Bardzo liczę na Waszą pomoc i z góry dziękuję 🙂

A o to 2 kawałki schematów:

Link do komentarza
Share on other sites

Z kolei korzystając z odczytu czujników analogowo, można uzyskać dużo więcej stanów pośrednich - robot będzie płynniej jeździł. Niestety, szybkość wewnętrznego ADC raczej nie będzie wystarczająca do superszybkiego robota typu impact/silver i innych turbinkowców, ale do nauki, jako coś nowego jak najbardziej. Wydaje mi się, że Harnas w jednym ze swoich lfrów stosował coś takiego, poszukaj w katalogu.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Powyższe będzie działało choćby z uwagi na odwrotne podłączenie tranzystorów w czujnikach.

Narysuj schemat co najmniej z 4 czujnikami (2x2) bo nie umiem domyślić się idei multiplesowania, która Ci chodzi po głowie. Przy okazji pamiętaj, że musisz zabronić w jakiś sposób zgłoszenia stanu niskiego lub wysokiego (w każdym razie aktywnego - tego ze światłem) do wspólnej linii wszystkim niewybranym w danej chwili czujnikom. Acha i napisz czy zdecydowałeś się na sygnał analogowy czy cyfrowy.

Zapodaj kolejny schemat, spokojnie sam go wymyślisz. Czekamy.

Link do komentarza
Share on other sites

Takie coś działało w moim lf

IMG_4dbe914bd7e327057.png

Musisz tylko uważać bo przy wysokiej częstotliwości przełączania u mnie to było co 8 próbek z adc, odczyty pomiędzy czujnikami mocno się różniły, tak jakby nie zdążyły przeładować pojemności ścieżek.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Hmmm... powiem tak - na prawdę myślałem poważnie nad zastosowaniem komparatorów, ale stwierdzułem, że raczej się ich pozbędę, bo jak by na to nie patrzeć to wtedy on będzie decydował za mojego robota czy dany stan pośredni jest czy nie jest czarną linią czy może też jakimś cieniem - a zamierzam zaimplementować do mojego programu kalibrację przed jazdą już pod konkretną trasę z konkretnym oświetleniem także pomyślałem jednak, że komparatorów nie wykorzystam.

@up - w tym twoim rozwiązaniu to enable 1 i 2 to po prostu sygnało "0" lub "1" z uC ? I jak jest logiczne 0 to wtedy czujnik jest aktywny ??

Mile widziane dalsze uwagi, plusy i minusy rozwiązań z komparatorami i bez oraz rady, które są nieocenione 🙂

@marek1707 - schemacik podeślę koło 19:00 bo teraz nie mam akurat eagla na komputerze, z którego piszę.

Dam 2x2 czujników, żeby było widać o co chodzi. A to zablokowanie to będzie właśnie tak, że grupa 8 czujników będzie podłączona do jednego "enable" ( w jakimkolwiek wykonaniu) a druga do drugiego co przy 8 kanałach ADC daje po 2 czujniki na jednym kanale/lini więc będę musiał tylko pilnować, żeby zczytując napięcie z czujnika "x" na kanale "0" mieć wyłączone "(przykładowe) enable 2" dla czujnika "x+1" na kanale "0".

Link do komentarza
Share on other sites

Hmmm... powiem tak - na prawdę myślałem poważnie nad zastosowaniem komparatorów, ale stwierdzułem, że raczej się ich pozbędę, bo jak by na to nie patrzeć to wtedy on będzie decydował za mojego robota czy dany stan pośredni jest czy nie jest czarną linią czy może też jakimś cieniem - a zamierzam zaimplementować do mojego programu kalibrację przed jazdą już pod konkretną trasę z konkretnym oświetleniem także pomyślałem jednak, że komparatorów nie wykorzystam.

Prawda jest taka, że mając komparatory wystarczy sobie praktycznie raz jest ustawić i zawsze będzie dobrze 🙂 Nie ma takich sytuacji, aby nagle robot zwariował. Co z tego, że na trasie jest cień, skoro czujniki są pod płytką, więc prawie zawsze same sobie robią cień na trasie 🙂 Przetestuj takie rozwiązanie i zobaczysz, że nie ma z nim żadnych problemów.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

...Jako, że masz w tej dziedzinie większe doświadczenia - prawdopodobnie was posłucham... Polecalibyście te komparatory LM339 ? Wtedy też zczytywanie z czujników byłoby przez porty I/O. Czy nie wpłynęło by to na szybkość odczytywania negatywnie ?

Link do komentarza
Share on other sites

Skoro już wywiązała się dyskusja, to jakie są rzeczywiste różnice szybkości odczytu analogowego i cyfrowego przez uC? O jakich rzędach wielkości tu mówimy?

Link do komentarza
Share on other sites

Natanoj, wszystko zależy jeszcze od mikrokontrolera na STM'ie z tego co pamiętam 16 kanałów ADC odczytach w czasie jaki AVR potrzebuje na odczyt z jednego, nie mówiąc już o DMA. W nocie konkretnego mikroprocesora znajdziesz informację ile zajmuje mu odczyt z ADC.

Link do komentarza
Share on other sites

Jeśli skorzystasz z rozwiązania Harnasia, nie musisz mi rysować schematu. Po prostu z Twojego nie wynikało jak chcesz to multipleksowanie zrobić, gdzie są wyjścia sygnału itp Natomiast jeśli masz pomysł "autorski", schemat mile widziany - będzie o czym pogadać 🙂

Harnaś, bardzo prosto to zrobiłeś i chwała Ci za to. Możesz dokładniej opisać problem różnic w pomiarach? Bo czasy kilku próbkowań ADC to wcale nie jest szybko i tak dużych pojemności tu nie widzę. Ciekawe. Jakie miałeś oporniki w kolektorach? Pytam, bo wyjścia EN1 i EN2 musiały być w stanie pochłonąć cały prąd 8 czujników bez specjalnego wzrostu napięcia a każdy jego wzrost przekładałby się na błąd pomiaru. Co gorsza gdyby wyjście było za słabe, zmiany oświetlenia jednego czujnika mogłyby zaburzać wyniki z innych z tej samej grupy. Może dlatego warto tam postawić jakiś silny tranzystor lub ograniczyć prąd kolektorów do poniżej 1mA/czujnik czyli dla 5V: oporniki > 5K.

Jedynie do czego bym się przyczepił to to, że zablokowany czujnik widzi na swoim emiterze stan wysoki a na kolektorze może to być prawie 0V z innego czujnika na tej samej linii wyjściowej. Jeżeli zasilanie procesora jest +5V to to jest absolutne maksimum napięcia zwrotnego dla złącz B-E tranzystorów tego czujnika. Trochę po bandzie a jeśli któryś npn będzie słabszy, wpuści trochę prądu i zafałszuje wynik pomiaru sąsiada. Dla niższych zasilań będzie OK.

Czasy "odpowiedzi" systemu czujników analogowych i cyfrowych są nieporównywalne. Nawet najszybszy pomiar przetwornikiem wbudowanym w procesor to będzie ok. 1us (ARM) ale w AVRach mamy przetwornik zjadający 13 zegarów 200kHz czyli dający odpowiedź po 65us. Niestety pierwszy pomiar jest dwa razy dłuższy (kalibracje wewnętrzne ADC) więc trwa 25 zegarów, 125us. Chcąc wczytać 8 czujników musimy przełączać multiplekser wejściowy i zwykle robimy to w najprostszy możliwy sposób, czyli startując ADC za każdym razem gdy zmienimy kanał - robi się już 8x25 taktów czyli dokładnie 1ms. Mając 16 czujników możemy zrobić 500 pełnych odczytów na sekundę przy założeniu, że nie ma żadnego narzutu związanego np. z multipleksowaniem.. W porównaniu do tego wczytanie 8 bitów z portu cyfrowego trwa jedną instrukcję, 2 zegary procesora czyli nawet dla 1MHz mamy 2us - 500 razy szybciej niż 8 pomiarów ADC. Inna sprawa, że mówimy o czasach (czy to 1ms czy 1us) które i tak nie są w ogóle porównywalne do czasów reakcji silników, mechaniki itp.

Acha, przetwornik ADC możemy przyśpieszać - ma programowalny zegar, więc tracąc trochę z dokładności (8, a nawet 6 bitów powinno wystarczyć do zabawy) dostaniesz klilkukrotne przyśpieszenie.

Jeśli chcesz pobawić się w prostą analizę sygnałów, w oceny jakości widoczności trasy, w usuwanie błędów, wykrywanie krawędzi itp to się nie zastanawiaj tylko rób system analogowy - moim zdaniem wcale nie prędkość pomiarów będzie tu ograniczeniem. Jeśli i tak planujesz prostego if-else i porównanie pomiaru z zafiksowanym wzorcem, wstaw komparatory (z histerezą oczywiście) - zrobią to za Ciebie a przy okazji będziesz mógł kręcić potencjometrem zamiast co chwilę przeprogramowywać FLASHa.

Link do komentarza
Share on other sites

Objawiało to się w następujący sposób. Czujniki są połączone w pary, czyli do jednego wyjścia mam podpięte 2 czujniki które na płytce są ułożone symetrycznie, mniej więcej tak:

Emitery są podciągane do masy przez tranzystory IRF7101, dzięki czemu emitery nieużywanych czujników wiszą w powietrzu nie fałszując pomiarów. Rezystory przy kolektorach mają 10k.

Sekwencja odczytu wyglądała tak:

Podciągamy emitery lewych czujników do masy, odłączając prawe - wiszą w powietrzu.

I robimy odczyt czujnika nr 1, czujnika nr 2 i tak dochodzimy do czujnika nr 8 i przełączamy się na prawe ktiry.

Dzięki temu Podciągamy emitery prawych czujników do masy, odłączając lewe- wiszą w powietrzu.

I znowu

I robimy odczyt czujnika nr 1, czujnika nr 2 i tak dochodzimy do czujnika nr 8 i przełączamy się na lewe ktiry...

I od początku 🙂

A teraz moje spostrzeżenia. O ile odczyt przy środkowych czujnikach miał duża amplitude czyli 10 bitowy adc przy czarnym tle zwracał około 950 a przy białym 200, to przy skrajnych czujnikach nie wyglądało to tak różowo. Odczyt na czarnym tle zwracał około 950 a przy białym 850.

Oczywiście sprawdzałem nieraz czy są zwarcia, zmieniałem ktiry, izolowałem od światła zewnętrznego, testowałem na różnych powierzchniach i nic. Zawsze na białym tle bardziej skrajne czujniki podwały większą wartość niż czujnik bliżej środka.

Link do komentarza
Share on other sites

Hemm, hemm, hemm... 😉

Skoro nie będzie to aż taki problem to może jednak przychylę się do rozwiązania z komparatorami LM339, ale wtedy muszę się pożegnać z kalibracją... :/ ''

Nie będzie za to problemu z portami I/O bo w atmedze32 ci ich dostatek 🙂

Ale, dalej nie jestem pewien czy raz ustawiony potencjometr (ewentualne jego zmiany) są porównywalne z 10 bitowym ADC?

I tak - można tak powiedzieć, że będzie to mój pierwszy lf (przynajmniej tak na poważnie), ale nie chcę go traktować tylko jako coś testowego, ale coś z czym będzie można bez wstydu pokazać się na zawodach. Wiadomo, że nie będzie to "Impact" itd., aleee.... 🙂

Domyślnie miała być tu też turbina, ale nie wiem czy dam radę finansowo.

Czy pracująca turbina będzie jakoś zakłócała działanie pozostałych podzespołów, lub negatywnie wpływała na stabilność zasilania itp. ?

Link do komentarza
Share on other sites

przychylę się do rozwiązania z komparatorami LM339, ale wtedy muszę się pożegnać z kalibracją... :/ ''
Niekoniecznie, jest coś takiego jak elektroniczne potencjometry sterowane np. i2c
Link do komentarza
Share on other sites

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.