Jak wymyślić listę wymagań dla mikrokontrolera dla mojego projektu? Jak mogę znaleźć odpowiednie mikrokontrolery?

20

Pracowałem nad projektem sterowania eBike na Arduino MEGA2560. Program uruchamia 3 razy pętle sterowania PID, jedną pętlę kontroli pojemności baterii (interpolacja na podstawie tablic przeglądowych), prędkościomierz (próbki na podstawie kontaktronu), a także ekran LCD do wyświetlania informacji. Wejściami są 3 sygnały analogowe: napięcie akumulatora, prąd i wejście przepustnicy użytkownika, a także wejście cyfrowe: sygnał włączenia / wyłączenia prędkościomierza (kontaktronu). Obecnie, gdy wszystko to działa na „długiej” arytmetyki, Arduino udaje się wykonać 10 pętli na sekundę. Ponieważ ekran TFT LCD wymaga ogromnej mocy obliczeniowej, zastanawiam się nad zastąpieniem go ekranem alfanumerycznym.

Wyjścia składają się z analogowego sygnału przepustnicy docierającego do sterownika silnika, ekranu LCD i potencjalnie kilku innych urządzeń wymagających sygnałów analogowych. Dlatego konwertery ADC są niezbędne, a przetwornik cyfrowo-analogowy byłby bardzo przydatny, chociaż obecnie używam wyjścia PWM Arduino z filtrem dolnoprzepustowym RC. Podobnie, zdolność do odczytu sygnałów cyfrowych i analogowych bez przerywania procesora byłaby świetna.

Chciałbym potencjalnie zrobić z tego produkt konsumencki, dlatego chcę zbudować od podstaw własną platformę z innym mikrokontrolerem, który mógłby dawać mi co najmniej 100 próbek na sekundę (10 razy więcej niż Arduino osiąga). Ponadto, aby uniknąć zmiennoprzecinkowych, moje obliczenia używają długich zmiennych, a zatem liczb większych niż 16 bitów, więc zakładam, że 32-bitowy MCU byłby dobrym pomysłem. Również MCU zdolne do wykonywania obliczeń zmiennoprzecinkowych może być interesujące, aby uprościć matematykę w kodzie.

W końcu nie jestem pewien, jak zacząć szukać MCU, które spełniają te wymagania i umożliwiają szybkie przejście ze środowiska Arduino. Wszelkie wskazówki, jak znaleźć takie MCU, byłyby bardzo mile widziane!

Eliott W.
źródło
1
Niekoniecznie chcę być rekomendowanymi częściami, ale po prostu metodę lub platformę lub wskazówki, jak znaleźć platformę, której potrzebuję.
Eliott W
5
Jest to znacznie lepsze niż poprzednie pytanie, ale wciąż jest bardzo szerokie, a niektóre punkty w twoich wymaganiach nie są jasne. Na przykład, co masz na myśli mówiąc „bez przerywania procesora”? Zgaduję, że tak naprawdę nie chcesz robić ankietowanych we / wy. Musisz także lepiej zrozumieć, ile dokładnie obliczeń trzeba wykonać na każdym zestawie próbek.
Dave Tweed
1
Powinieneś rozważyć użycie matematyki na liczbach całkowitych. To jest właściwe.
Scott Seidman
4
powiązane: Jak wybrać platformę MCU?
Nick Alexeev
4
Matematyka liczb całkowitych, długa lub krótka, jest znacznie szybsza niż zmiennoprzecinkowa; matematyka na liczbach całkowitych dłuższa niż „natywna” głębia bitowa procesora również będzie wolna. Tak więc 32-bit brzmi jak bardzo dobry pomysł, może jedno z urządzeń typu „DSP”.
pjc50,

Odpowiedzi:

18

(Jest to ogólny przewodnik. Podejrzewam, że możesz również skorzystać z optymalizacji kodu, ale to nie wchodzi w zakres tej witryny).

Krok 1: Szorstki dobór, budżet, dostawca

Wybierz jeden z:

  • Komputer (Raspberry Pi, Beagleboard, PC104, Intel Edison itp.). Uruchamia system operacyjny ogólnego zastosowania i ma dużą moc obliczeniową. Droższy i żądny władzy. 10–100 USD.

  • Duży MCU. ARM Cortex-A / PIC32 / dsPIC / AVR32 / TI C DSP itp. Przyzwoita moc obliczeniowa, system operacyjny opcjonalny. ~ 5 USD.

  • Mały MCU. Cortex-M / PIC16. Za mało miejsca dla prawdziwego systemu operacyjnego, może po prostu lekki harmonogram zadań. ~ 2 USD.

  • Tiny MCU. Tak naprawdę tylko w aplikacjach, w których zależy Ci na każdym ostatnim mikroamperu zużycia energii. ~ 1 USD lub mniej.

Na tym etapie powinieneś również rozważyć, których dostawców i łańcuchów narzędzi lubisz, a których nie. Spójrz na koszt takich rzeczy, jak wbudowane urządzenia do debugowania i IDE.

Krok 2: Minimalne urządzenia peryferyjne

Potrzebujesz czegoś takiego jak USB? PCI? HDMI? SATA? Niezwykle szybkie ADC lub DAC? Prawie wszystkie kategorie „małe” lub „małe” nie mają takich urządzeń, chociaż USB jest dość powszechnie dostępny.

Krok 3: Prototyp

Wybierz coś, co spełnia powyższe kryteria, w razie potrzeby losowo, zacznij, dowiedz się, jak to jest wykonalne i ile potrzebujesz miejsca / mocy obliczeniowej. Już to zrobiłeś. Pisanie w C powinno uczynić większość logiki przenośną.

Kiedy będziesz już mieć prototyp, możesz powiedzieć sobie: „Potrzebuję takiego, ale z większą liczbą X” i niech to poprowadzi twoje decyzje.

Krok 4: Zmniejsz

Zasadniczo łatwiej jest zacząć od największego (najbardziej Flash i RAM) członka rodziny procesorów, napisać v1 swojej aplikacji, a następnie wybrać mniejszy, tańszy, aby pasował. Możesz także poświęcić czas na sztukę dopasowywania oprogramowania do mniejszej liczby zasobów. To, co jest warte, zależy od tego, ile jednostek zamierzasz wyprodukować.

pjc50
źródło
14
Krok 0: Łańcuch narzędzi (środowisko programistyczne). Znajdź środowisko programistyczne, w którym możesz pracować dla siebie. To tam wygrał lub przegrał. Nawet jeśli masz krzem, który jest idealnie dopasowany, ale nie możesz sprawić, aby środowisko programistyczne działało (z jakiegokolwiek powodu), Twój projekt nie zacznie działać. (Przykład: Arduino IDE ma swój prototyp oparty na Arduino od podstaw.)
Nick Alexeev
8
Klasyfikowanie Cortex-M jako „małego MCU”, a PIC32 / AVR32 jako „dużego MCU” wydaje się nieco niefortunne. Nie korzystałem osobiście z PIC32 / AVR32, ale na podstawie szybkiego przeglądu zakresu specyfikacji powiedziałbym, że wszystkie powinny być w tym samym przedziale. (Istnieją MCU Cortex-M, które działają z częstotliwością> 200 MHz, mają wiele megabajtów pamięci flash i ponad pół megabajta pamięci RAM)
Aleksi Torhamo
13

Niezły projekt. Oto kilka wskazówek, ale trudno byłoby uogólnić to dla każdego projektu.

Zacznij od wymagań obliczeniowych

To powie ci, jakiego rdzenia potrzebujesz i jakie są ogólne wyniki MCU. Proponuję zacząć od tego, ponieważ oczywiście nie można go rozszerzyć za pomocą komponentów zewnętrznych, w przeciwieństwie do urządzeń peryferyjnych.

Po pierwsze, wydaje się, że używasz ciężkich operacji matematycznych z dużymi liczbami całkowitymi w pętli. Tak jak zasugerowałeś, 32-bitowy byłby tutaj przydatny, dlatego ARM jest idealnym kandydatem. Jeśli chodzi o częstotliwość operacji: obecnie używasz Arduino MEGA2560 (zakładam, że 16 MHz, przypuszczam) i możesz robić 10 pętli / s. Jeśli chcesz osiągnąć 100 pętli / s, powinieneś być w porządku z Cortex-M3 / M4 w zakresie 100 MHz lub więcej (przybliżone oszacowanie). Zauważ, że Cortex-M4F ma jednostkę zmiennoprzecinkową.

Już zawęziliśmy wybór.

Wymagania dotyczące pamięci

Ten jest prosty: wybierz MCU, który ma najwięcej pamięci RAM / Flash w swoim zakresie dla prototypu. Po sprawdzeniu poprawności prototypu przełącz się na MCU z tego samego zakresu, który ma wystarczającą ilość pamięci RAM / Flash, teraz, gdy znasz dokładne wymagania.

Pamiętaj, że nie sądzę, aby Twoja aplikacja wymagała niesamowitej ilości pamięci.

Teraz urządzenia peryferyjne

Potrzebujesz absolutnie ADC. Wszystkie MCU z zakresu, na który patrzymy, mają pewne, więc nie jest to przydatne kryterium. Nie są też cyfrowymi wejściami / wyjściami, chyba że potrzebujesz bardzo dużej ich liczby (co nie wydaje się być twoim przypadkiem).

Wydaje się, że potrzebujesz przetwornika cyfrowo-analogowego. Jest to jednak coś, czego tak naprawdę nie znajdziesz łatwo i zbyt zawęzi kandydatów. Dlatego nie przestrzegamy tego wymogu i pozostaniemy przy PWM i dolnoprzepustowym (co z pewnością jest do zaakceptowania).

Nie wspominasz o żadnym interfejsie komunikacyjnym, z wyjątkiem wyświetlacza LCD (później). W każdym razie wszystkie MCU mają I2C / SPI / UART / ... jeśli potrzebujesz.

LCD

To jest trudniejsze, ponieważ istnieje wiele różnych rozwiązań, które nakładają całkowicie różne wymagania na MCU. Ale nie wybieraj LCD w zależności od MCU. Wybierz LCD, który chcesz dla swojego produktu, a następnie wybierz MCU, który będzie go skutecznie napędzał.

  • Jeśli potrzebujesz znaku LCD: najłatwiejszym i najmniejszym ograniczeniem dla MCU jest rozmowa z nim przez interfejs szeregowy (często SPI). W ten sposób nie będzie używać zbyt wielu PIN-ów, możesz używać mniejszych / tańszych MCU, a szybkość nie stanowi problemu.
  • Jeśli chcesz graficzny wyświetlacz TFT LCD: jeśli jest mały, łącze szeregowe może być nadal odpowiednie. Jednak w przypadku rozdzielczości 320 x 200 lub większej i jeśli chcesz mieć ładny interfejs graficzny, zaczniesz chcieć komunikować się z interfejsem równoległym. W takim przypadku albo użyjesz GPIO (ale to zwiększy obciążenie MCU, ponieważ będziesz musiał bit huknąć linie kontrolne) lub wybierzesz MCU, które ma dedykowany interfejs LCD (który często jest taki sam jak interfejs pamięci zewnętrznej). Ten ostatni stanowi silne ograniczenie wyboru MCU, ale nie masz innych silnych ograniczeń, więc ...

Teraz ty wybierasz

Wejdź na stronę ST Micro / NXP / Atmel i skorzystaj z narzędzi wyboru MCU. Spędzisz również dużo czasu czytając arkusze danych. Nie spiesz się. To nie jest zmarnowane. Wszystko, czego się tu nauczysz, nawet jeśli nie wykorzystasz go specjalnie do tego projektu, może być przydatne.

W tym momencie musisz również spojrzeć na liczbę PIN-ów, których naprawdę potrzebujesz, i sprawdzić schemat multipleksowania wybranych kandydatów MCU, aby sprawdzić, czy możesz użyć wszystkich potrzebnych funkcji PIN-ów. Ponieważ oczywiście będziesz chciał wziąć MCU z najniższą liczbą pinów, która spełnia twoje wymagania (ze względu na koszty / nieruchomości PCB).

Sprawdź ceny / dostępność w Mouser / Digikey. Ale nie powinieneś potrzebować tutaj czegoś szczególnie drogiego. Może około 5 €.

Ostatnia rzecz dotycząca sterowania LCD

Wygląda na to, że aktualizacja wyświetlacza LCD jest częścią głównej pętli. Nie powinno. Zwłaszcza jeśli zapętlasz 100 razy na sekundę, jest to bezużyteczne. Spraw, aby pętla sterująca obliczyła wszystko i dostosuj polecenie silnika przy każdej iteracji, ale po prostu zaktualizuj wartości, aby wyświetlały się gdzieś w pamięci. Następnie niech kolejna pętla o niższym priorytecie wyświetli tę informację użytkownikowi, gdy nie będzie już nic ważniejszego do zrobienia.

Tak, idealnie, wymaga zmiany zadań i innych rzeczy. Rzeczywisty system operacyjny (właściwie FreeRTOS, Coocox OS, Nuttx, ... są one bardzo małe, są w dużej mierze używane na Cortex-M i zapewniają wymagane mechanizmy wielozadaniowości).

ciemny
źródło
Dziękuję bardzo za wyczerpującą odpowiedź! Zauważam, że wszystkie jednostki MCU ARM Cortex działają na 3,3 V. Mój sygnał przepustnicy musi być skalowany między 1 a 5 V. Zgaduję, że jeśli chcę użyć kontrolera ARM, będę musiał znaleźć sposób na zwiększenie napięcia, ponieważ będzie ono ograniczone do 3,3 V z MCU?
Eliott W
Tak. Sygnał przepustnicy jest wyjściem analogowym, prawda? W takim przypadku możesz użyć opampa, aby go wzmocnić.
dim
Nie jestem pewien, czy zgadzam się z ostatnim zdaniem na temat wymagania „prawdziwego systemu operacyjnego”. Przypuszczam, że zależy to od tego, ile chcesz gotowych rozwiązań. Jeśli chcesz czegoś, w czym możesz po prostu rzucić logikę biznesową i zacząć wymieniać jednostki, tak, w pełni funkcjonalny system operacyjny (pamiętaj, że nie musi to oznaczać czegoś takiego jak Windows lub nawet Linux!) Jest z pewnością przydatny.
CVn
1
@ MichaelKjörling, oczywiście, nie miałem na myśli czegoś takiego jak Linux. Ale raczej coś takiego jak na przykład FreeRTOS, Coocox OS lub Nuttx. To właśnie uważam za prawdziwy system operacyjny, choć bardzo mały. Napisałem to, ponieważ w istocie robienie tego na gołym metalu zajmie więcej czasu, utrudni debugowanie i będzie mniej elastyczny. A środowisko Arduino (chociaż nie jestem ekspertem w tej dziedzinie) nie wydaje się zapewniać mechanizmów zadań (i jako takie nie uważam tego za prawdziwy system operacyjny).
przyciemniony
1
Ach W takim razie źle odczytałem „prawdziwą” część. Tylko dla korzyści naszych obcokrajowców, którzy czasami tu trafiają, możesz rozważyć wyjaśnienie tej części w swojej odpowiedzi.
CVn
4

Zauważ, że jest to szeroki temat, na który można poprawnie odpowiedzieć przy użyciu wielu (subiektywnych) podejść.

Ponadto format wymiany stosów nie jest dobry w projektowaniu rozwiązań problemów. Na przykład rzadko zdarza się, aby ludzie zaprojektowali dla Ciebie sprzęt. Zamiast tego proponujesz projekt sprzętu i zadajesz pytania na jego temat.

To mówi...

Zacznij od funkcji procesora, których nie możesz zmienić. Takich jak prędkość i rozmiar pamięci (jeśli dotyczy). Sprawdź, czy potrzebujesz przerwań i jak skomplikowana musi być obsługa przerwań.

Jeśli potrzebujesz wsparcia urządzeń peryferyjnych, takich jak ADC lub DAC, sytuacja jest bardziej złożona. Czy funkcje te powinny być wbudowane w procesor lub być zewnętrzne od procesora. Cena, dokładność, a nawet hałas są czynnikami tej decyzji.

Jeśli mają być obsługiwane zewnętrzne urządzenia peryferyjne, należy rozważyć niezbędny rodzaj komunikacji szeregowej. Sprzęt zewnętrzny może wymagać SPI, I2C lub innego typu UART. Jeśli szybkość przesyłania danych jest wysoka, najlepiej znaleźć procesor z funkcjami DMA powiązanymi z jego szeregowymi portami komunikacyjnymi.

Wreszcie, jeśli jest to aplikacja procesora wbudowanego (co zwykle oznacza procesor dedykowany do zadania), rozważ podzielenie wymagań na kilka grup i przypisanie procesora do każdej z nich. Na przykład procesor wyświetlania GUI prawdopodobnie nie potrzebuje funkcji ADC. To obiektywne podejście do rozwiązywania problemów okazało się skuteczne w oprogramowaniu, a przy spadających cenach procesorów można również zastosować do sprzętu.

W prawdziwym świecie takie podejście jest iteracyjne. Oznacza to, że wiele projektów rozpoczyna się od jednego procesora i wymienia różne procesory, gdy pojawiają się problemy ze sprzętem i / lub oprogramowaniem lub zmienia się zakres projektu.

st2000
źródło
Lepiej oceniasz, jakiego rodzaju liczb się spodziewasz, niż kompilator. Unikałbym ogólnego podejścia do używania pływaków. Na przykład może być tak, że wyniki zmiennoprzecinkowe nie są takie same na różnych platformach! Użyłbym arytmetyki liczb całkowitych i dopasowałbym rozwiązanie do twoich potrzeb.
st2000
3

Nie widziałem, żeby ktoś wspominał o kosztach narzędzi. Moja firma wybrała TI CC2541 i dowiedziała się, że została skompilowana tylko z kompilatorem IAR o wartości 4 000 $, co zdecydowanie stanowi przystanek dla hobbystów. Również programista. Może to być 20 USD lub więcej. Tańsze narzędzia wydają się teraz normą, więc może wkrótce to już przeszłość.

Ponadto, jeśli przełożysz go sam, pakiety takie jak TQFP są łatwiejsze niż, powiedzmy, BGA. Na podstawie osobistych doświadczeń trudno jest uzyskać duże BGA.

BSEE
źródło
2

Jeśli produkt jest względnie wrażliwy na cenę i masz przyzwoite fundusze na rozwój, możesz zdobyć kilka tablic ewaluacyjnych i profilować kod na każdym z nich, aby uzyskać pomysł. Powinno to być dość proste, jeśli kod jest napisany w przenośnym C. Oprócz mikro, będziesz oceniał łańcuchy narzędzi z wersjami demo, zanim pokryjesz koszt pełnego IDE, takiego jak IAR lub Keil. W niektórych przypadkach możesz profilować kod wąskiego gardła bezpośrednio w IDE bez sprzętu.

Jeśli jesteś ściśle ograniczony kosztami programowania, być może będziesz musiał pójść na kompromis, aby znaleźć coś, co nie kosztuje zbyt wiele za konfigurację programowania.

Na przykład ST ma płytę ewaluacyjną ARM Cortex M7 z ładnym kolorowym wyświetlaczem za <100 USD. Ma FPU z funkcjami DSP, dzięki czemu możesz z łatwością zrobić wszystko, o czym mówiłeś - prawdopodobnie uruchomisz pętlę PID przy 100 kHz, a nie tylko 100 Hz. Prawdopodobnie jest to przesada, chyba że ten ekran jest priorytetem.

Jeśli szukasz tańszego procesora bez FPU, prawdopodobnie zechcesz profilować kod PID w jego gotowej formie. Upewnij się, że uwzględniono wszystkie współczynniki skalowania i linearyzacji oraz kalibracji, ponieważ mogą się sumować pod względem czasu przetwarzania.

Często urządzenia peryferyjne i związana z nimi jakość oprogramowania pośredniego oraz dostępność (i warunki licencji) będą miały duży wpływ na wybór. Jeśli potrzebujesz trybu hosta BT lub Wi-Fi lub USB i plików FAT do przechowywania na pendrivie lub szybkiego interfejsu SD, będą to ważne czynniki. Niektóre układy mają wbudowany kontroler LCD i kontroler digitalizatora, który pozwala na użycie stosunkowo niedrogiego panelu TFT. Nie pomijaj czasami wysokich opłat licencyjnych.

Jeśli masz pojęcie o wymaganej pamięci programu, szybkości przetwarzania i urządzeniach peryferyjnych (w tym FPU), możesz przeprowadzić wyszukiwanie parametryczne u dystrybutora, zanim przejdziesz do kart danych. Niektóre rzeczy, które są zbyt ograniczające, mogą być - pakiet przelotowy, wewnętrzny DAC, wewnętrzny PHY Ethernet, FPU. Żadne z nich nie są prawdopodobnie konieczne i mogą nadmiernie ograniczać twoje wybory przedwcześnie.

Powodzenia z tym, jest to dużo pracy, aby zrobić to poprawnie. Z mojego doświadczenia wynika, że ​​fałszywą ekonomią jest zbyt ścisłe wycinanie nowego produktu, ponieważ klient (klienci) nieuchronnie poprosi o rzeczy, których nie spodziewałeś się i chcesz mieć wolne moce produkcyjne, aby zacząć to od nowa. Z drugiej strony, jeśli produkt jest zbyt drogi, nie będziesz w stanie sprzedać wystarczająco dużo przy odpowiednich marżach, aby utrzymać działalność.

Spehro Pefhany
źródło
1

Istnieje wiele różnych platform, na które możesz zacząć patrzeć, takich jak Arduinos, mikrokontrolery PIC, FPGA i wiele innych. Pracowałem z Arduinos w przeszłości i ma on port ADC zdolny do osiągnięcia 74kS / s. 100 próbek na sekundę jest bardzo powolnych i zastanawiam się, jak się o tym dowiedziałeś? Z drugiej strony chcesz zadać sobie pytanie, czy potrzebujesz jakichkolwiek interfejsów, takich jak SPI, CAN, I2C lub UART. Wszyscy mogą mieć swoje własne korzyści i to ty musisz rozważyć, czy będziesz rozmawiać z jednym lub więcej niewolnikami. Ostatnim, ale prawdopodobnie najważniejszym krokiem byłoby odgadnięcie, ile pinów mikrokontrolera będzie trzeba użyć.

„Zdolność do odczytu sygnałów analogowo-cyfrowych bez przerywania procesora byłaby świetna”. Mogę zgadywać, mówiąc, że nie chcesz zajmować się zewnętrznymi lub wewnętrznymi buforami, które będą krążyć w twoich danych i potencjalnie spowalniają przetwarzanie danych. Czy to prawda? Jeśli tak, to więcej programowania, ale procesory zazwyczaj są w stanie obsłużyć prędkość 100 próbek na sekundę. Do Ciebie należy zaprogramowanie zegara, częstotliwości próbkowania i pozostałych.

Rozważ także przerwania w swoim programie, jeśli chcesz ciągle próbkować dane i wykonać inne zadanie, gdy podniesiona zostanie flaga.

12 Lappie
źródło
2
Myślę, że przegapiłeś punkt. Ma prototyp zbudowany na Arduino. Próbkowanie nie jest wolne. Pętle sterowania SĄ wolne. Ma trzy kontrolery PID obliczane za pomocą zmiennoprzecinkowego Arduino, więc są one wolniejsze niż melasa podczas zimy na Antarktydzie. Zatem próbkowanie nie stanowi problemu. Niewystarczający kod to.
JRE
Masz rację co do tego.
12Lappie
Tak, problem polega na tym, że chociaż moje pętle mają długą arytmetykę, a nie zmiennoprzecinkowe, jest tyle obliczeń, które należy wykonać, że ponieważ Arduino pobiera próbkę raz na pętlę, moja częstotliwość próbkowania jest bardzo mała (obecnie 20 próbek na sekundę) .
Eliott W