이번 프로젝트에서 초 저전력으로 주기적인 데이터 수집이 목표이다. 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 모두 다 구현 할 수 있도록 제작 하였다.