본문 바로가기

[ST_MICRO]/STM32WB

STM32WB55 SSM - Zigbee 저전력 테스트

 

이번 프로젝트에서 초 저전력으로 주기적인 데이터 수집이 목표이다. AAA 배터리로 3년을 지속 할 수 있는 것이 목표 이다. 계산상으로 대기모드에서 15uA 이하가 유지 되어야 한다. STM32WB시리즈의 Zigbee 대기모드에서 RF동작이 가능한모드는 STOP2모드나 STNADBY  모드이다. STOP모드에서는 스펙상으로 2.2uA로 되어 있다.

 

STM32WB의 저전력 모드에 대해 측정이 필요 할것 같다.

일반적으로 RF전송을 할 수 있는 모듈의 경우 15~30mA의 소모 전류가 필요 한데 저전력 모드로 들어 가지 않고 노말 5mA로 유지되면서 데이터 전송이 가능하다.

 

Zigbee 모드에서 슬립모드로 진입하면..

  UTIL_LPM_SetStopMode(CFG_INIT_TASK, UTIL_LPM_DISABLE);
  UTIL_LPM_SetOffMode(CFG_INIT_TASK, UTIL_LPM_DISABLE);
  
  /* Enable low power mode for data emiter Task*/
  UTIL_LPM_SetStopMode(CFG_DATA_EMITER_TASK, UTIL_LPM_ENABLE);
  UTIL_LPM_SetOffMode(CFG_DATA_EMITER_TASK, UTIL_LPM_DISABLE);

 

 

파워 다운시 전류가 4mA로 측정된다. 왜 이렇게 높지?

 

 

뭐가 문제일까?

스택이 수행되는 코어(C2)를 슬립모드로 들어가도록 하는 함수가 있다.

/* Initialize the CPU2 reset value before starting CPU2 with C2BOOT */
  LL_C2_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN);

  HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);

 

 

3uA로 줄어 들었지만 아직 스펙 보다는 높다.

 

 

 

\STM32_WB\TRS_EST\Zigbee_v14\Middlewares\ST\STM32_WPAN\zigbee\stack\zcl\st_custom\zcl_custom_ls_client.c

함수에 데이터 전송시 ZbZclSet_custom_ls_ClientCommand() 함수를 이용하는데 이 함수에는 데이터 전송하고 응답을 기다리는 플래그를 세팅하고 있다.

그래서 단순히 전송만 하는 함수 ZbZclSet_custom_ls_ClientCommandN()  를 추가로 만들어 주었다. 저전력 구동을 위해서는 데이터를 보내고 슬립모드로 들어가야 해서 응답을 기다리면 전력 더 많은 소모가 발생 한다.

enum ZclStatusCodeT
ZbZclSet_custom_ls_ClientCommandN(struct ZbZclClusterT *cluster, struct ZbApsAddrT *dst, char *string,
	    void (*callback)(struct ZbZclCommandRspT *rsp, void *arg), void *arg)
{
    struct ZbZclClusterCommandReqT req;
    uint8_t payload[2050];
    uint16_t len;

    len = (uint16_t)strlen(string);
    if (len > 2048) {
      return ZCL_STATUS_INVALID_VALUE;
    }

    putle16(&payload[0], len);
    memcpy(&payload[2], string, len);

    (void)memset(&req, 0, sizeof(req));
    req.dst = *dst;
    req.cmdId = ZCL_SET_CUSTOM_LS_COMMAND_REQ;
    req.noDefaultResp = ZCL_NO_DEFAULT_RESPONSE_FALSE;
    req.payload = payload;
    req.length = len + 2;
    ZbZclClusterCommandReq(cluster, &req, callback, arg);
    return ZCL_STATUS_SUCCESS;
}

 

 

이제 정상 동작한다. 슬립모드로 들어가서 2uA가 측정된다.

 

스위치 누를때 마다 슬립모드에서 깨어나도록 해보자

잘 동작 한다.

하지만 깨어난 후에는 2mA가 흐른다.

깨어나서 다시 STOP 모드로 들어가 주어야 하나?

 

스위치 누를때 마다 깨어나고 다시 STOP모드로 들어가도록 하니 2uA가 흐른다.

  case BUTTON_SW1_PIN:
	  gToggleFlag ^= 1;

	  if(gToggleFlag)
	  {
		  BSP_LED_On(LED2);
	  }else
	  {
		  BSP_LED_Off(LED2);
		  HAL_PWREx_EnterSTOP2Mode(0);
	  }
    break;

 

 

 

 

하드웨어 적으로 좀더 저전력을 구동하려면 내부 코어 파워를 SMPS 모드로 구성하면 된다.

STM32WB55 SSM 보드는 LDO, SMPS 모두 다 구현 할 수 있도록 제작 하였다.

 

 

 



 

 

반응형