WioLTE의 절전 운용에 대한 시행 오류

WioLTE의 소모 전력을 억제하기 위해 반복적으로 실험한 결과
Standby 모드를 사용하여 10mA 미만의 상태를 제어할 수 있습니다.
거기까지의 과정과 스탠바이 모드의 주의점을 적으세요.

계기.


WioLTE에 USB 전압 검사기를 끼워서 전력 소비량 확인
발견 동작 중 최대 260mA 소모.
또 센서 슬립을 슬립으로 만들어 다음 데이터가 전송될 때까지 대기하는 동안에도 10mA~170mA가 많이 소모된다.
USB 전원이 아닌 배터리 전원을 고려하면 배터리가 금방 없어진다.
다른 마이크로컴퓨터에서는 대기 중에 Sleep 모드를 이용했기 때문에
위오 LTE에서도 슬립 모드 등 절전 모드가 있는지 조사해야 한다.

WioLTE 라이브러리에서 준비된 Sleep 함수 사용


WioLTE의 위키 페이지를 봤는데 Sleep 함수가 있어서 써봤어요.
sleep.ino
#include <WioLTEforArduino.h>

WioLTE Wio;

void setup() {
  Wio.Init();
  SerialUSB.println("sleep");
  Wio.Sleep();
}

void loop() {

}
위 절차를 수행하면 Sleep 함수에 들어가면 전류가 10mA 이하~50mA 정도 됩니다.

프로세서의 Standby 모드 사용


나는 전기 소모량을 억제할 수 있는 방법을 찾다가 이런 보도를 발견했다.
WioLTE의 진심을 끌어낸다(저전력 편)
프로세서(STM32F405)의 저전력 모드인 Standby 모드를 사용하면 전력 소모를 1ma 이하로 제어할 수 있다.
지금까지의 숫자가 큰 부분 "진짜!?"이렇게 의심스럽지만 참고하기로 했다.
결과적으로 10mA 미만까지 전류를 제어할 수 있습니다!
하지만 이곳에 상당히 오래 빠졌어요..

서력에서 두 분만 뽑았는데 혼란스러웠어요.


상기 사이트의 프로그램을 실행하면 시퀀스 모니터에 이런 문자열이 표시됩니다.

1919년에 신비로운 서력이 나타났다.
STM32F4xx의 RTClock 라이브러리에 있는 setTime 함수 때문입니다.
settime 함수는 1900년 1월 1일 0시 0분 0초부터 오늘까지 경과된 시간입니다.t형 초수
이 함수는 날짜를 구조 tm형으로 수정하고 프로세서에 시간을 설정하는 데 사용됩니다.
하지만 RTClock은cpp의 settime 함수의 내용을 자세히 관찰하다.

예어를 100으로 나누는 이유를 몰라 서력은 두 자릿수만 유지할 수 있었다.
지금은 2019년이니까 Year는 2019-1900=119라는 숫자가 있어요.
이 함수에 따르면 다음 두 자리 (=19) 의 데이터만 있다
1900+19 = 1919년의 기묘한 서력이 탄생했다.
그리고 요일 wday도 서력의 영향을 받아 편차가 생겨 1919년 당시의 요일을 계산했다.
지난 시간으로만 돌아가기 위해 RTC의 알람 기능으로 복귀하는 방법을 포기했다.
"이렇게 하면 돼!"만약 이런 방법이 있다면 장래의 학습을 위해 나에게 알려줄 수 있다면 매우 좋겠다.

main 함수를 반환하지 않음


RTClock 라이브러리에 기재된 setPeriodic Wakeup 함수
대기 시간의 초를 지정했습니다.
저는 아까 사이트의 Standby 모드 부분을 뽑아서 코드를 살짝 수정한 거예요.
일단 올려놔.
standby.ino
#include <WioLTEforArduino.h>
#include <RTClock.h>
#include <stdio.h>
#include <time.h>
typedef int IRQn_Type;
#define __NVIC_PRIO_BITS          4
#define __Vendor_SysTickConfig    1
#include <libmaple/libmaple_types.h>
#include <libmaple/usbF4/VCP/core_cm4.h>
#include <libmaple/usbF4/VCP/core_cmInstr.h>
#include <libmaple/pwr.h>
#include <libmaple/bkp.h>

WioLTE Wio;
static RTClock rtc(RTCSEL_LSI);

void setup() {
  // put your setup code here, to run once:
  Wio.Init();
}

void loop() {
  // Standbyモードに入っているか確認
  if (PWR_BASE->CSR & (1UL << PWR_CSR_SBF)) {
    PWR_BASE->CSR |= (1UL << PWR_CR_CSBF);
  }

  SerialUSB.println("standby");
  enterStandbyMode(60); // 60秒後に復帰する
}

void clearWUF(){
  // WakeUp Flagビットをクリア
  PWR_BASE->CR |= (1UL << PWR_CR_CWUF); 
}

// Standbyモードへ移行
void setBitStandbyMode() {
  delay(1000UL);

  // PDDS(Power-Down DeepSleep)ビットをセット
  PWR_BASE->CR |= (1UL << PWR_CR_PDDS);

  // WakeUp Flagビットをクリア
  clearWUF();

  // WakeUp Flagビットがクリアされるまで待つ
  while(PWR_BASE->CSR & (1UL << PWR_CSR_WUF)) {
  }

  // Cortex-M4にSLEEPDEEPビットマスクをかける
  SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk);

  // 割り込み待ち(Standbyモード)
  __WFI();
}

void enterStandbyMode(uint16 sleep_sec){
  rtc.setPeriodicWakeup(sleep_sec); // 待機時間(秒数)をセット

  clearWUF();

  setBitStandbyMode();  // Standbyモードに入る
}
그런데 여기에 또 문제가 생겼어요.
복구 정보는 Serial 모니터에 표시되지 않습니다.
하지만 잠시 후 USB 전압계의 전류값이 달라진 것을 발견했다.
설마?setup 함수를 실행하는 동안 LED를 켜 보려고 합니다.
그리고 지정된 대기 시간이 지나면 LED가 빛을 발하기 시작합니다.
프로세서에서 직접 놀린 결과 복구 경로가main 함수에 없습니다
setup 함수에서 다시 시작 = 다시 시작합니다.

총결산


상당히 긴 시간.비록 그와 마주쳤지만, 나는 이것이 프로세서 처리 방법을 이해할 수 있는 좋은 기회라고 생각한다.
새 설비의 참고 자료가 매우 적기 때문에 나는 중요한 것은 기존의 자료를 진지하게 읽는 것이라고 절감했다.

좋은 웹페이지 즐겨찾기