Skocz do zawartości

Kurs STM32L4 – #6 – oszczędzanie energii (5 lat na baterii?)


Pomocna odpowiedź

Kurs STM32L4 – #6 – oszczędzanie energii (5 lat na baterii?)

Energooszczędne urządzenia, które na niewielkiej baterii mogą pracować przez długie miesiące, to ciekawe zagadnienie. Warto więc zapamiętać, że jedną z cech STM32L4 jest niski pobór prądu. Tym razem sprawdzimy, jak w stosunkowo prosty sposób można znacznie ograniczyć pobór prądu naszego układu, zmieniając tylko kod programu.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

  • Lubię! 1
Link do komentarza
Share on other sites

Przypominamy: w komentarzach do kursów rozmawiamy wyłącznie na tematy związane z konkretnym kursem. Mile widziane są również informacje od osób, które korzystały wcześniej z naszych poradników. Wszystko po to, aby kursanci, którzy mają zamiar korzystać z tego kursu nie musieli "przedzierać" się przez dziesiątki postów na inne tematy. Tematy na pytanie, które nie są związane z kursem można zadawać na naszym forum o mikrokontrolerach.

Link do komentarza
Share on other sites

Zachęcam do lektury najnowszej części kursu STM32L4! Mam nadzieję, że opisany tu przykład zachęci więcej osób do eksperymentowania z budową energooszczędnych urządzeń. Dla formalności przypominam też, że pomiar tak małych wartości prądu jest dość trudny. Nie każdy miernik będzie nawet wstanie pokazać wskazania w okolicy 1 uA. Nie martwcie się więc, jeśli wykonane przez Was pomiary będą trochę odbiegały od wyników z artykułu - to zupełnie normalne 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Ciekawa seria nowego kursu. Przyjemnie się to czyta. Widzę , że poprzednia część o F4 trafiła do archiwum co jest po części zrozumiałe aczkolwiek gdyby ktoś miał chęć poeksperymentować z poborem energii  i zegarami dla F4. Może skorzystać z poniższego kodu tak dla porównania F4 vs L4, spl vs hal.

/* Switch system clock PLL/HSI/HSE, STM32F411 Discovery, STdPerihp v1.8.0 */

#include "stm32f4xx.h"

GPIO_InitTypeDef  GPIO_InitStructure;
TIM_TimeBaseInitTypeDef tim3;

#define green GPIO_Pin_12
#define orange GPIO_Pin_13
#define red GPIO_Pin_14
#define blue GPIO_Pin_15

#define HSI 0x00
#define HSE 0x04
#define PLL 0x08


int main(void)
{

	/* GPIOG Peripheral clock enable */
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

	  /* Configure pins */
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	  GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;
	  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	  GPIO_Init(GPIOD, &GPIO_InitStructure);

	  /* turn blue led on*/
	  GPIOD->BSRRL = blue;

	  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	  tim3.TIM_Prescaler = 40000;
	  tim3.TIM_CounterMode = TIM_CounterMode_Up;
	  tim3.TIM_Period = 50000;
	  tim3.TIM_ClockDivision = TIM_CKD_DIV1;
	  tim3.TIM_RepetitionCounter = 0;

	  TIM_TimeBaseInit(TIM3, &tim3);
	  TIM_Cmd(TIM3, ENABLE);

	  /* wait 4 seconds */
	  while(TIM_GetCounter(TIM3)<10000); //2500 timer counts/s

	  /* check system clock source */
	  if(RCC_GetSYSCLKSource()== HSI) GPIO_SetBits(GPIOD,green);
	  else if(RCC_GetSYSCLKSource()== HSE) GPIO_SetBits(GPIOD,orange);
	  else if(RCC_GetSYSCLKSource()== PLL) GPIO_SetBits(GPIOD,red);
	  else GPIO_ResetBits(GPIOD,blue);

	  /* wait aditional second */
	  while(TIM_GetCounter(TIM3)<12500);

	  /*check is cpu frequency = 100Mhz*/
	  GPIO_ResetBits(GPIOD,blue | red | green | orange);
	  if(SystemCoreClock == (uint32_t) 100000000) GPIO_ToggleBits(GPIOD,orange);
	  else GPIO_SetBits(GPIOD,blue);

	  /* wait aditional second and reset rcc clocks */
	  while(TIM_GetCounter(TIM3)<15000);
	  RCC_DeInit();
	  SystemCoreClockUpdate();

	  /* check system clock source */
	  if(RCC_GetSYSCLKSource()== HSI) GPIO_SetBits(GPIOD,green);
	  else if(RCC_GetSYSCLKSource()== HSE) GPIO_SetBits(GPIOD,orange);
	  else if(RCC_GetSYSCLKSource()== PLL) GPIO_SetBits(GPIOD,red);

	  /* wait aditional 4 seconds and chceck new cpu frequency */
	  while(TIM_GetCounter(TIM3)<16600); // 400 timer count/s
	  if(SystemCoreClock == (uint32_t) 16000000) GPIO_ToggleBits(GPIOD,orange);

	  /* wait aditional second */
	  while(TIM_GetCounter(TIM3)<17000);

	  RCC_HSEConfig(RCC_HSE_ON);
	  RCC_WaitForHSEStartUp();
	  RCC->CFGR = 0x00000001;

	  /* check system clock source */
	  GPIO_ResetBits(GPIOD, green);
	  if(RCC_GetSYSCLKSource()== HSI) GPIO_SetBits(GPIOD,green);
	  else if(RCC_GetSYSCLKSource()== HSE) GPIO_SetBits(GPIOD,blue);
	  else if(RCC_GetSYSCLKSource()== PLL) GPIO_SetBits(GPIOD,red);

	  /* wait aditional 4 seconds cpu = 8000000 */
	  while(TIM_GetCounter(TIM3)<17800); // 200 tim counts/s
	  GPIO_ToggleBits(GPIOD,blue);

	  PWR_EnterSTANDBYMode();
	for(;;);
}

W tym wypadku powinno wystarczyć zakresu dla pomiaru prądu na standardowym multimetrze.

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@slon tak, faktycznie kurs o F4 trafił już do archiwum. Minęło sporo czasu od jego publikacji, momentami nie był już on aktualny, a do tego było tam trochę niedomówień. Dlatego zdecydowanie rekomendujemy teraz kurs o L4, bo jest on nieporównywalnie lepszy 😉

@Akunso miło słyszeć, że kurs Ci się podoba! Przyznam, że sam nie wiem skąd dokładnie wziął się temat optymalizacji funkcji HAL_Delay, ale na pewno miało to coś wspólnego z doświadczeniem autora kursu. Może @Elvis powie coś więcej na temat tego skąd pojawił się dokładnie pomysł na taką optymalizację 😉
 

Link do komentarza
Share on other sites

Nawet w programach, gdzie optymalizacja poboru prądu nie jest najważniejsza, często można sporo energii zaoszczędzić wprowadzając procesor w tryb uśpienia, gdy nie ma nic ciekawego do roboty. Prawdę mówiąc planowałem zastąpić HAL_Delay własną wersją, ale przeglądając kod okazało się, że jest ona oznaczona jako weak i nie trzeba było tworzyć innej funkcji tylko nadpisać domyślną - i to może faktycznie trochę sztuczka, chociaż raczej spodziewana skoro autorzy biblioteki tego weak-a dodali 🙂

  • Lubię! 2
Link do komentarza
Share on other sites

Dzięki za kolejną ciekawą część, wciągnął mnie ten temat! Muszę się tylko zaopatrzyć w lepszy miernik, bo nie mam szans zobaczyć u siebie tego mikroampera. Układ działa, a na wyświetlaczu miernika 0,00...

  • Lubię! 1
Link do komentarza
Share on other sites

@Nore21 no tak, pomiar mikroamperów to już ciężki temat, bo podczas typowe majsterkowania rzadko się z tego korzysta. Przyznam, że na potrzeby tego artykułu kupiłem nawet nowy miernik, aby ładnie wyglądał na zdjęciach... i okazało się, że jednak też nie jest w stanie pokazać 1 uA. Stąd w artykule zagościł ostatecznie mój starty miernik 😉

Link do komentarza
Share on other sites

@Treker twój stary miernik jest widzę sporo droższy od mojego nowego. Swoją drogą dobrze było by dodać w kursie pomiar częstotliwości np. dla LSE i LSI poprzez MCO (Microcontro tlle clock output). Zgodnie z dokumentacją dla tego procka jest taka możliwość (rejestr RCC_CFGR).

  • Lubię! 1
Link do komentarza
Share on other sites

45 minut temu, slon napisał:

@Treker twój stary miernik jest widzę sporo droższy od mojego nowego.

Droższy może i tak, ale ma już strasznie zniszczony wyświetlacz (co ostatecznie udało się trochę ukryć na zdjęciach) 😉

  • Lubię! 1
Link do komentarza
Share on other sites

@Treker zastanawiałem się w jakim celu wymieniać taki multimetr ale teraz rozumiem. Na foto stan wygląda na 5. @Elvis robiłem tak z stm8 dla HSI/2 wychodziło jakieś 7,5MHz dla LSI 36,600kHz. Wiem , że do tego celu najlepszy był by oscyloskop ale wiadomo cena. Sam pomiar najdokładniejszy pewnie też nie będzie ale można by było go porównać np. z w wersją programową na przerwaniach. Obecnie mam AN870 (pomiar robi 3x/s) niby chińszczyzna ale mi wystarczy i ma dużo akcesoriów w zestawie.

Link do komentarza
Share on other sites

Pomysł bardzo dobry, szkoda że nie pojawił się wcześniej 😞 Nie wiem, czy jeszcze będzie możliwość dokonywania zmian w tej części - bo pomiar i tak pokazujemy, ale weryfikacja multimetrem mogłaby być interesującym dodatkiem. W CubeMX taka zmiana konfiguracji to jedno kliknięcie, pewnie większy problem to znalezienie odpowiednio dokładnego miernika 🙂

Link do komentarza
Share on other sites

Kolejny świetny odcinek kursu (podobnie jak wszystkie) 🙂 Nigdy wprawdzie nie interesowałem się tematem energooszczędności (w projekcie hobbystycznym, gdzie pracuje nawet jeden silnik, te miliampery "znikają" przy końcowej sumie pobieranej mocy 😉), niemniej jestem pod wrażeniem złożoności tematu i tego, jak w miarę "czytania" artykułu udało się osiągnąć imponująco niskie wartości 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.