piątek, 10 maja 2019

ATSAML10 i ATSAML11 Power Saving Killer in 32-bit ecosystem.

Firma Microchip swoją ofertę rozszerzyła o MCU z rdzeniem Cortex M23 oparty o nowszą w stosunku do Cortex M0/M0+ architekturę ARMv8M. Są to ATSAML10 i ATSAML11. Pisałem już o tym w tym artykule. Pojawienie się na rynku takich konstrukcji w zasadzie za jednym zamachem do lamusa przenosi nam całą rodzinę Cortex M0/M0+. Jeśli ktoś jeszcze tego nie dostrzegł to informuję uprzejmie, że tak jest :). Lepsza wydajność, lepsza energooszczędność, lepsze bezpieczeństwo, praktycznie wszystko lepsze :). Jak zatem przejść obojętnie obok Cortex M23, no po prostu się nie da. Moją szczególną uwagę przykuły aspekty związane z Power Saving . Nie  chodzi tylko o tryby uśpienia ale również o tryb Run Mode . W nowym produkcie Microchipa możemy uzyskać w tym trybie nawet i 25uA/MHz. W sumie myślałem , że to jakaś lipa z takimi poziomami ale jak zobaczyłem na własne oczy możliwości w zakresie Power Saving dostępne w ATSAML10 i 11 uwierzyłem tak jak niewierny Tomasz :)

Ponieważ nie mam jeszcze polutowanej swojej płytki developerskiej dedykowanej dla ATSAML10 i 11 posłużę się wyrobem Microchipa czyli jego płytką SAML11 Xplained Pro Evaluation Kit , którą mam w swoich zbiorach . Płytka Microchipa jest przygotowana do pomiarów prądu i ma specjalną zworkę do tego celu, na której mierzymy prąd pobierany przez MCU.

Na początku nie wiedziałem jak podejść do tematu od strony środowiska. Płytka Microchipa jest dedykowana dla ATMEL Studio a ja na tego zwierza mam alergię. W akcie desperacji w Linuxie do VirtualBox-a z WIN7 ściągnąłem ATMEL Studio 7 i próbowałem go zainstalować. Niestety wyskoczyła mi informacja, że mam nie wspierany system WIN7 i odmowa instalacji. Cie florek, pomyślałem gapiąc się na płytkę i nagle olśnienie. Na płytce znalazłem małe gniazdo w rastrze pinów 1.27 opisane jako Cortex Debug, wyglądem pasowało do złącza jaki mam w swoim programatorze J-Link EduMini. Trop okazał się właściwy. Skoro mogę do płytki podejść moim J-Linkiem to znaczy, że mogę rozmawiać z płytką w środowisku SEGGERA, które wspiera wszystkie ATSAM-y. Huraaa. 

Nie zwlekając radośnie odpalam środowisko SEGGER-a (najszybsze we wszechświecie dla ARM) i tworzę swój pierwszy projekt dla ATSAML11. Wcześniej oczywiście należy doinstalować paczkę dla naszej rodziny MCU. Robimy to w menu Tools--> Package Manager
Przed napisaniem jakiegokolwiek kodu muszę trochę się doinformować.
W datasheet na stronie 1144, zaczyna się rozdział dotyczący parametrów w trybach Power Saving. Mamy tutaj tebeleczki z parametrami dla różnych trybów Power Saving. Biorę sobie na warsztat poniższy fragment dotyczący trybu Run Mode :

W tabelce interesuje mnie wiersz dotyczący zegara 4 MHz bo z takim startuje nasz MCU i nie będę w to ustawienie ingerował. Dla trybu regulatora napięcia Buck , trybu PL0 i napięcia zasilania 3.3 V powinniśmy otrzymać pobór w przedziale 31.9 - 86 uA na MHz. Sprawdźmy czy to prawda.

Wyjaśnienia tutaj wymaga co to jest tryb Buck i PL0. Najpierw co to jest Buck :


Podstawowym trybem pracy MCU jest praca na wewnętrznym liniowym regulatorze napięcia LDO. Bezpośrednio z niego zasilane jest core MCU. Każde LDO generuje straty prądowe wynikające z zasady działania takiego regulatora. Microchip ,wpadł na pomysł aby zoptymalizować te straty wprowadzając dodatkowy tryb  zasilania core z pominięciem LDO. Ten dodatkowy tryb wykorzystuje tzw Buck Converters ,do działania którego potrzebna jest zewnętrzna cewka. Cewkę tą widzimy na rysunku poniżej :


Zatem aby zminimalizować pobór prądu przez wewnętrzny moduł zasilania musimy przełączyć się na tryb Buck. Dla tego trybu musimy mieć wpięty zewnętrzny dławik 10uH pomiędzy piny VDDOUT i VDDCORE. Na mojej płytce developerskiej taki dławik jest uwzględniony. Na płytce Microchipa również go znajdziemy. Przełączanie pomiędzy trybem LDO a Buck możemy robić w locie za pomocą wpisu w rejestr VREG w module SUPC bit SEL. Tu małą uwaga, ATSAM ma te fajną zaletę , że nie posiada jak inne ARM-y oddzielnego datasheet i manuala. Wszystko co trzeba jest w jednym datasheet, za to lubię ATSAM-y. Szczególnie seria L jest od strony rejestrów fajnie przemyślana i opisana , pomimo rozbudowanych funkcjonalności w większości przypadków można się tutaj szybko odnaleźć.

Teraz rozszyfrujmy co to jest PL0. A jest to po prostu domena energetyczna zoptymalizowana pod kątem zmniejszonego poboru prądu. W domenie tej niektóre rzeczy są ograniczone jak np. maksymalny zegar do 8 MHz.

Zreasumuję wymagania jakie należy spełnić celem optymalizacji Power Saving w trybie Run Mode :

  • Regulator napięcia przełączony w tryb Buck,
  • Domena energetyczna PL0,
  • BOD33 (Brown-Out Detectors) wyłączony,
  • Wait State dla odczytu z pamięci ustawiony na 1,

Ustawmy zatem w odpowiednich rejestrach wymagane wartości i zmierzmy pobór prądu. Poniżej obrazek z programem jaki wykontycypowałem w środowisku SEGGER-a:



Kompiluję program i wgrywam do płytki Microchipa. Zdejmuję zworkę do pomiaru prądu i dokonuję pomiarów.

Wynik jaki otrzymuję dla zegara 4 MHz to 123 uA !!!!!!!. Alleluja. Sprawdzam jak to się ma do danych z tabelki z datasheet gdzie dla wybranego wariantu powinienem otrzymać wynik z przedziału 31.9 - 86 uA na MHz. Mój wynik to 123 / 4 = 30,75 uA / MHz czyli nawet ciut poniżej tego co podaje producent dla wybranego przeze mnie wariantu . Jak dla mnie rewelacja.

Ciekawość ludzka nie zna granic dlatego rozbudowałem swój test o pomiar prądu w trybie Run Mode dla zegara 8 MHz i tutaj niebywałe zaskoczenie . Wynik jaki otrzymałem to 222 uA . Przeliczmy ile to daje na 1 MHz. 222 / 8 = 27,75 uA / MHz. Zwiększając zegar dwukrotnie spodziewać by się można, wzrostu konsumpcji prądu. Okazuje się jednak, że prawa logiki i "fizyki" ATSAML10 i 11 nie obowiązują. Przy zegarze 8 MHz mamy poprawę o 3 uA na 1 MHz w stosunku do zegara 4 MHz. Żyć nie umierać, nie musimy się ograniczać żyłowaniem zegara jeśli chcemy oszczędzać energię, no bajka. 
Poniżej wersja programu jaki zastosowałem dla zegara 8 MHz w środowisku SEGGER-a :



W euforycznym nastroju wpadłem na myśl aby porównać te wyniki do produktu innego producenta popularnego u nas STM-a. Dla porównania wybrałem STM32 z popularnej linii Ultra Low Power L0 model STM32L051K8 z zegarem 32 MHz i flash 64 kB czyli adekwatnie jak nasz ATSAML11. STM nie ma w ofercie  MCU z rdzeniem M23. Przy okazji zobaczymy jak wypadnie zderzenie Cortex M23 z Cortex M0+ w trybie Run Mode.
Zaglądam w datasheet STM-a dla wybranego modelu MCU i wyszukuję tabelek z danymi Power Saving dla trybu Run Mode a poniżej efekt poszukiwań :


Z tabelki wynika, że dla STM32L0 przy zegarze 4 MHz możemy się spodziewać w trybie Run Mode prądu 355 uA w sumie nieźle ale prawie trzy razy gorzej niż w przypadku ATSAML11.

Wniosek stąd prosty jak świński ogon, ATSAML10 i ATSAML11 doskonale nadają się do aplikacji bateryjnych i trudno je przebić biorąc pod uwagę całość czyli tryby uśpienia i tryb Run Mode.  Warto wspomnieć , że ATSAM-y są doposażone w unikalny system  tzw Sleep Walking. Polega to pi razy oko na tym, że podczas trybu uśpienia, dowolne peryferium może zgłosić event wybudzający MCU i po zakończeniu pracy peryferium zgłaszającego potrzebę pobudki , MCU automatycznie przejdzie do kontynuacji trybu uśpienia. Takie bajery dodane do trybów Power Saving dodatkowo zachęcają aby przyjrzeć się tym MCU przez pryzmat zastosowań bateryjnych.

Na koniec obrazek na którym mamy zobrazowane możliwości Power Saving w ATSAML10 i 11 :



Do ATSAM-ów z rdzeniem M23 jeszcze wrócimy a na razie to tyle w temacie.



Pozdrawiam
picmajster.blog@gmail.com



Linki :

ATSAML11 - strona produktu







Brak komentarzy:

Prześlij komentarz