Chcesz używać USB do komunikacji z komputerem. Jeśli masz wiele mikrokontrolerów, prawdopodobnie tylko jeden z mikrokontrolerów zostanie podłączony bezpośrednio do komputera. Pozostałe mikrokontrolery będą musiały uzyskać polecenia z głównego mikrokontrolera.
Wybór komunikacji zależy od wielu czynników:
- wymagana przepustowość (założymy, że używasz ich z częstotliwością 16 MHz)
- złożoność (okablowanie i kodowanie)
- dwukierunkowy lub master-slave
Prawie wszystkie opcje mają wbudowaną obsługę mikrokontrolera AVR. Nie ma opcji, która mogłaby być rozsądniejsza niż opcje wbudowane, które wymagałyby dodatkowego sprzętu. Ponieważ mają one wbudowaną obsługę, złożoność oprogramowania jest podobna, ponieważ wystarczy skonfigurować port (za pomocą rejestrów), umieścić dane do przesłania do innego rejestru, a następnie uruchomić transmisję, ustawiając bit w innym rejestrze. Wszelkie otrzymane dane znajdują się w innym rejestrze i uruchamiane jest przerwanie, abyś mógł je obsłużyć. Niezależnie od wybranej opcji, jedyną różnicą jest zmiana lokalizacji rejestrów i pewne zmiany w rejestrach konfiguracji.
Pętla USART ma następujące funkcje:
- Maksymalna prędkość transmisji CLK / 16 = 1 MHz (przy zegarze 16 MHz), co oznacza szybkość transferu około 90 KB / s
- w pełni dwukierunkowa komunikacja (bez oznaczenia master lub slave)
- wymaga osobnych przewodów między każdą parą mikrokontrolerów - Atmega32u4 obsługuje natywnie dwa porty USART, ograniczając liczbę mikrokontrolerów, które można podłączyć w sieci w praktyce (lub w końcu otrzymujesz długi ciąg mikrokontrolerów - tj. połączonych na połączonej liście sposób)
Uwaga: tego też byś użył do uzyskania komunikacji RS232, z wyjątkiem tego, że ponieważ RS232 wymaga 10 V, to wymaga sterownika, aby uzyskać te poziomy napięcia. W przypadku komunikacji między mikrokontrolerami nie jest to przydatne (zmieniane są tylko poziomy napięcia).
RS485:
- Zasadniczo używasz portu USART w innym trybie - nie ma przewagi w zakresie przepustowości i może to tylko nieco uprościć okablowanie, ale także to komplikuje. Nie jest to zalecane.
Interfejs dwuprzewodowy:
Jest to również określane jako I2C. Oznacza to, że wszystkie urządzenia mają te same dwa przewody.
Potrzebujesz rezystora podciągającego na obu przewodach
Jest wolny (ponieważ rezystory podciągające mają ograniczoną wartość, a pojemność rośnie wraz ze wzrostem liczby urządzeń i wzrostem długości drutu). W przypadku tego mikrokontrolera AVR prędkość wynosi do 400 kHz - wolniej niż w USART (ale ta prędkość zależy od ograniczenia pojemności). Powodem jest to, że chociaż urządzenie wprawia przewód danych w stan niski, przejście przeciwne uzyskuje się, pozwalając drutowi ponownie unieść się wysoko (rezystor podciągający).
Jest jeszcze wolniejszy, jeśli weźmiesz pod uwagę, że WSZYSTKIE połączenia mają tę samą ograniczoną przepustowość. Ponieważ cała komunikacja ma tę samą ograniczoną szerokość pasma, mogą wystąpić opóźnienia w komunikacji, w których dane muszą poczekać, aż sieć będzie bezczynna, zanim będzie mogła zostać wysłana. Jeśli ciągle wysyłane są inne dane, może to również uniemożliwić przesyłanie danych.
Opiera się na protokole master-slave, w którym master adresuje slave, a następnie wysyła polecenie / żądanie, a następnie slave odpowiada. Jednocześnie może komunikować się tylko jedno urządzenie, więc urządzenie podrzędne musi czekać na zakończenie pracy urządzenia nadrzędnego.
Każde urządzenie może działać zarówno jako master i / lub slave, co czyni go dość elastycznym.
SPI
Właśnie to poleciłbym / wykorzystał do ogólnej komunikacji między mikrokontrolerami.
Jest szybki - do CLK / 2 = 8 MHz (dla CLK przy 16 MHz), co czyni go najszybszą metodą. Jest to możliwe dzięki oddzielnemu przewodowi wyłącznie do zegara.
Przewody danych MOSI, MISO i SCK są współdzielone w całej sieci, co oznacza, że ma prostsze okablowanie.
Jest to format master-slave, ale każde urządzenie może być master i / lub slave. Jednak ze względu na komplikacje związane z wyborem urządzenia podrzędnego w przypadku współdzielonego okablowania (w sieci) należy go używać tylko w sposób hierarchiczny (w przeciwieństwie do interfejsu dwuprzewodowego). TO ZNACZY. jeśli wszystkie urządzenia zostaną zorganizowane w drzewo, urządzenie powinno być nadrzędne tylko dla swoich dzieci, a tylko dla swojego rodzica. Oznacza to, że w trybie slave urządzenie zawsze będzie miało ten sam master. Ponadto, aby to zrobić poprawnie, należy dodać rezystory do MISO / MOSI / SCK do nadrzędnego urządzenia nadrzędnego, aby jeśli urządzenie komunikowało się za urządzeniem (gdy nie zostało wybrane jako urządzenie podrzędne), komunikacja nie wpłynie na komunikację w innych częściach sieć (należy pamiętać, że liczba poziomów, które można to zrobić za pomocą rezystorów jest ograniczona, patrz poniżej, aby uzyskać lepsze rozwiązanie przy użyciu obu portów SPI).
Mikrokontroler AVR może automatycznie potrójnie sygnalizować sygnał MOSI po wybraniu urządzenia podrzędnego i przejść do trybu podrzędnego (jeśli jest w trybie głównym).
Chociaż może to wymagać sieci hierarchicznej, większość sieci może być zorganizowana w sposób drzewiasty, więc zwykle nie jest to istotne ograniczenie
Powyższe można nieco złagodzić, ponieważ każdy mikrokontroler AVR obsługuje dwa oddzielne porty SPI, dzięki czemu każde urządzenie może mieć różne pozycje w dwóch różnych sieciach.
Powiedziawszy to, jeśli potrzebujesz wielu poziomów w swoim drzewie / hierarchii (więcej niż 2), powyższe rozwiązanie wykorzystujące rezystory staje się zbyt skomplikowane, aby działać. W takim przypadku należy zmienić sieć SPI między każdą warstwą drzewa. Oznacza to, że każde urządzenie połączy się ze swoimi dziećmi w jednej sieci SPI, a nadrzędnym w drugiej sieci SPI. Chociaż oznacza to, że masz tylko jedno drzewo połączeń, zaletą jest to, że urządzenie może komunikować się zarówno z jednym z jego dzieci, jak i nadrzędnym w tym samym czasie i nie masz skrzypcowych rezystorów (zawsze trudno jest wybrać odpowiednie wartości) .
Ponieważ ma oddzielne przewody MOSI i MISO, zarówno master, jak i slave mogą komunikować się w tym samym czasie, co daje potencjalny czynnik dwukrotnego wzrostu prędkości. Dodatkowy pin jest wymagany do wyboru slave dla każdego dodatkowego slave, ale nie jest to duże obciążenie, nawet 10 różnych slave wymaga tylko 10 dodatkowych pinów, które można łatwo pomieścić na typowym mikrokontrolerze AVR.
CAN nie jest obsługiwany przez określony mikrokontroler AVR. Ponieważ istnieją inne dobre opcje, w tym przypadku prawdopodobnie nie jest to ważne.
Zaleca się SPI , ponieważ jest szybki, okablowanie nie jest zbyt skomplikowane i nie wymaga skomplikowanych rezystorów podciągających. W rzadkim przypadku, gdy SPI nie w pełni spełnia twoje potrzeby (prawdopodobnie w bardziej skomplikowanych sieciach), możesz użyć wielu opcji (np. Użyć obu portów SPI, wraz z interfejsem dwuprzewodowym, a także sparować niektóre mikrokontrolery za pomocą pętli USART!)
W twoim przypadku użycie SPI oznacza, że oczywiście mikrokontroler z połączeniem USB do komputera może być nadrzędny i może po prostu przesłać odpowiednie polecenia z komputera do każdego urządzenia podrzędnego. Może również odczytać aktualizacje / pomiary z każdego urządzenia podrzędnego i wysłać je do komputera.
Przy 8 MHz i 0,5 m długości drutu nie sądzę, że stanie się to problemem. Ale jeśli tak jest, staraj się bardziej uważać na pojemność (utrzymuj uziemienie i przewody sygnałowe zbyt blisko, a także uważaj na połączenia między różnymi przewodami), a także na zakończenie sygnału. W mało prawdopodobnym przypadku, gdy problem nadal występuje, możesz zmniejszyć częstotliwość taktowania, ale nie sądzę, aby było to konieczne.