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!
źródło
Odpowiedzi:
(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ć.
źródło
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ł.
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).
źródło
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.
źródło
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.
źródło
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ść.
źródło
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.
źródło