STM32F401CC vs ATmega328P

STM32F401 vs ATmega328P
STM32F401

Porównanie mikrokontrolera STM32F401 z ATmega328P wydaje się być jak porównanie Goliata z Dawidem. Czy i tym razem wygra Dawid? Ci z Was, którzy mnie znają wiedzą, że nie zasypię Was tabelkami(tego pełno w sieci) lecz wskażę Wam gdzie są te różnice, czym się objawiają i od czego zależą. Zatem zaczynamy…

► 8 bitów, tak wiele i tak mało – 11110000

8 bitowe układy liczące operują typowo na jednym bajcie czyli na owych ośmiu bitach. Gdy chcemy zsumować 30 + 20 to otrzymamy 50. Wszystko cudownie ale co zrobić gdy chcemy dodać 200 + 200? Jak to co? Dodać! Chwilka, ale na ośmiu bitach możemy zapisać liczby raptem od zera do dwieście pięćdziesiąt pięć. No tak. Zatem wynik 200+200 nie mamy jak zapisać w podstawowym “pojemniku” jakiego używamy czyli jeden bajt. Eureka, weźmy dwa! No. Cudnie, ale to są dwie komórki i operacje na nich nie są już banalne bo trzeba uwzględnić tak zwany bit przeniesienia. A co gdy chcemy dodać 200 tysięcy do 300 tysięcy? Dwa bajty nie wystarczą. To weźmy cztery! Cudownie. Za moment operacje dodawania zamiast wykonać w jednej operacji to będziemy mieli ich 20 – a to kosztuje czas procesora! Żonglowanie jest fajne ale zajmuje czas, którego zapewne nam brakuje. Na dodatek to żonglowanie danymi, by dodać 200k i 300k, zajmuje nam cenne miejsce w pamięci programu i zabiera kolejne równie cenne bajty w pamięci operacyjnej. Rozwiązaniem – przynajmniej na jakiś czas – jest użycie 32 bitowego układu np. STM32F401, który sam w sobie wewnętrznie już działa na 4 bajtowych komórkach. A ile to konkretnie daje nam tego bonusu? Ano tyle, że “na raz” możemy spokojnie zsumować 2 147 483 648 + 2 147 483 647 czyli otrzymamy wynik 4 294 967 295. Tak, ponad 4 miliardy. Niezły bonus. A to wszystko w jednym cyklu pracy układu arytmetycznego.

► Jednostka zmiennoprzecinkowa

Jak pamięcią sięgam, ośmiobitowe maszyny zawsze były jednostkami “uważającymi”, że 3 podzielone na 2 wynosi 1. W związku z tym nie było opcji aby zapisać na 8 bitach liczbę 3,1415926. Jak oni zatem liczyli niektóre wyniki? Zasadniczo 3/2 można zamienić na 30/20 co daje 15 czyli nasze 1,5 tylko 10 razy za duże. W sumie można by było ale do policzenia PI z precyzją do 10 miejsca za pomocą metody dopisania zer po prawej stronie to, byśmy “zaorali” taki procesor albo sami pierwej zaprzestali pisania tego kodu. Zatem jak to jest, że teraz pięknie liczymy 3/2 na ATmega328P? Dzieje się tak gdyż kompilator zamienia nasze skromne 3/2 na skomplikowany ciąg poleceń maszynowych dokonujących tego cudu na 8 bitowej maszynie, która zna tylko liczby Naturalne.

Rozwiązaniem tej niewątpliwie trudnej sytuacji jest użycie – a jakże – 32 bitowej maszyny z wbudowaną jednostką zmiennoprzecinkowa czyli, naszego STM32F401.Jednostka zmiennoprzecinkowa ma sprzętowo zbudowane układy obsługi operacji “na ułamkach”. Co lepsze jednostki mają również stabelaryzowane wartości(z określonym krokiem) dla takich funkcji jak sin, cos, tg, ctg, itd. Posiadają wiele usprawnień, które służą jednemu… obliczyć szybciej.

► Za woooolno, zawsze za wooolno

Czas, a właściwie notoryczny brak wolnego czasu to wyznacznik dzisiejszego życia. Nieustannie gonimy za czymś. Podobnie nasze mikrokontrolery, stale głodne roboty, stale liczące impulsy i notorycznie cierpiące na braki w zasobach wolnego czasu. Życie naszych mikrokontrolerów nieustannie przecinają żądania przerwania pracy celem zajęcia się innym ważnym zadaniem…. „a kiedyś tam wróć sobie i dokończysz poprzednie zadanie”. Czas, prędkość, wydajność, a przy tym optymalizacja i tak dzisiaj zauważana ekonomiczność w działaniu, energooszczędność i wszystko co zaczyna się od eko….

O ile z energooszczędnością to ATmega328 sobie radzi całkiem dzielnie o tyle z ogólną prędkością, która jak wiemy zależy od programu, to nie radzi sobie najlepiej. Tu mamy pochodną 8 bitowej struktury. Jak już wiemy, dzielenie 3/2 to dla maszyny znającej tylko liczby Naturalne to spore wyzwanie. Zatem już na starcie wygrywa STM32, który w sobie ma jednostkę zmiennoprzecinkową. Mało tego, ATmega328P „biegnie” w maksie z taktowaniem 20MHz podczas gdy, STM32F401 frunie jak baletnica przy 84MHz. Istna rakieta. Nie dość, że same obliczenia wykonuje kilkukrotnie szybciej z powodu posiadania jednostki zmiennoprzecinkowej to, jeszcze sam z siebie pracuje 4 razy szybciej. Aż mnie korci zrobić test na obliczenie milion razy jakiegoś pokręconego wzoru.

► Pamięć, zawsze za mało

„…i choćby przyszło tysiąc atletów i każdy zjadłby tysiąc kotletów i każdy nie wiem jak się wytężał…” – to nie wcisną programu bo taki ma ciężar.

Goliat miał wprawdzie większe „zabawki” ale też miał większe „kieszenie”. W naszym przypadku, nie dość, że przy obliczeniach zmiennoprzecinkowych nasz STM32F401 będzie miał krótszy program to jeszcze na dodatek ma większe „kieszenie” niż ATmega328P. Trudno przemilczeć fakt, że zamiast 32kB dostajemy 256kB – a niektóre modele mają więcej). Na dodatek mamy 64kB pamięci operacyjnej zamiast 32kB. Jest gdzie „poszaleć” 😉

► PWM wymiata

PWM w zakresie od 0% – 100% procent z krokiem co 1% jest wygodny. Można łatwo skorelować ustawienia użytkownika z ustawieniami PWM. Fajnie, zero obliczeń. Ma to swoje konsekwencje. Skok co 1 procent nie daje dobrej regulacji, która najczęściej jest potrzebna precyzyjna w dolnym zakresie. ATmega328 daje nam tu możliwość regulacji mniej więcej co około 0,5 procenta. Obecnie dostępne diody LED dobrze świecą już przy słabym wysterowaniu, szczególnie niebieskie. Przy skoku co 0,5% widać wyraźne skoki jasności i trudno jest je przyciemnić.

Tak, powtórzę się jak ostatnio. Tu nam pomoże STM32F401, który dysponuje timer’ami szesnastobitowymi czyli posiadającymi 65536 kroków. Daje regulację z krokiem co 0,0015%. STM32F401 wymiata.

► Plusy ATmega328P

Czy poczciwa ATmega328P jest już tylko do odstawki? Do muzeum? No nie do końca. Nie zawsze bowiem trzeba używać czołgu aby postrzelać do puszek. Aktualnie cena modułu Arduino Nano z ATmega328P jest zdecydowanie niższa i stanowi 50% ceny modułu z STM32F401. Moduł Arduino Nano jest też nieco krótszy. Póki co, dostępność bibliotek i gotowych kodów do wgrania jest większa.

Reasumując, ATmega328P znajdzie swoje zastosowanie wszędzie tam gdzie nie potrzebujemy potęgi obliczeń zmiennoprzecinkowych, szybkiej realizacji zadań, dokładnego sygnału PWM czy ogromu pamięci. STM32F401 będzie jednak przydatny gdy chcemy wysterować ekran LCD i rysować wykresy w miarę aktualne zamiast czekać na kolejne klatki animacji. Oba mają u mnie swoje miejsce w projektach. Który jest lepszy? Zarówno Goliat jak i Dawid mogę się przydać.

Na koniec dodam: zawsze dobieram procesor do projektu.

STM32F401 moduł Blackpill

Odnośniki do dokumentacji

https://www.st.com/en/microcontrollers-microprocessors/stm32f401.html
https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

Odnośniki do użytych fotografii

https://pl.freepik.com/darmowe-zdjecie/buduj-sportowca-z-reka-skrzyzowana-na-boisku-i-boisku_5471737.htm
https://pl.freepik.com/darmowe-zdjecie/mloda-meska-atleta-przygotowywajaca-biegac-brac-pozycje-przy-linia-startowa_5489861.htm

Może Ci się również spodoba