5 votos

Cómo depurar la fuga de corriente del STM32L433

Tengo una placa de circuito con STM32L433 que tiene alrededor de 320uA de consumo de corriente de referencia en el modo STOP 2. Sólo LSE con un cristal de 32kHz está activo.

La placa tiene una alimentación analógica Vdda separada que está deshabilitada para el modo de parada. (atado a tierra). Antes de deshabilitar Vdda, el ADC, DAC y OPAMP se deshabilitan y sus pines se ponen en modo OD bajo.

La configuración se realizó mediante el software STM32CubeMX.

¿Alguna idea de cómo depurar esto? He desconectado y medido casi todos los periféricos externos para ver qué está consumiendo corriente, pero parece que el STM32L433 es el culpable.

Estoy midiendo la corriente con un osciloscopio usando una resistencia de 2ohm en serie con la batería. El LDO podría ser responsable de 20uA de la misma, lo que aún deja 300uA sin contabilizar.

EDITAR:

~ 120uA de ello fue usando el STOP 0 en lugar del STOP 2. Esto fue lo que quedó de alguna experimentación. Ahora estoy en 200uA. También he desconectado los chips BMI160 y DRV2603. Y no son el problema.

EDIT2

He soldado otra placa con sólo un STM32L433 y un LDO LP5907-3.0 y un par de condensadores de desacoplamiento. EL MISMO PROBLEMA.

Este es el código mínimo que he utilizado para configurar los GPIOs

GPIO_InitTypeDef GPIO_InitStruct;

/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE()
;
__HAL_RCC_GPIOH_CLK_ENABLE()
;
__HAL_RCC_GPIOA_CLK_ENABLE()
;
__HAL_RCC_GPIOB_CLK_ENABLE()
;

GPIO_InitStruct.Pin = 0xFFFFFFFF;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_InitStruct.Pin, GPIO_PIN_SET);

GPIO_InitStruct.Pin = 0xFFFFFFFF;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_InitStruct.Pin, GPIO_PIN_SET);

GPIO_InitStruct.Pin = 0xFFFFFFFF;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOC, GPIO_InitStruct.Pin, GPIO_PIN_SET);

GPIO_InitStruct.Pin = 0xFFFFFFFF;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOH, GPIO_InitStruct.Pin, GPIO_PIN_SET);

//BOOT0 PIN
GPIO_InitStruct.Pin = GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);

HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI);

EDIT3

El pin USB DM flota cuando el USB está en modo de bajo consumo. Esto causó la corriente vista de 200uA drow. Bajando este pin externamente se eliminan los 200uA. Ahora estoy tratando de encontrar una manera de evitar esto en el firmware.

1 votos

¿Tienes un esquema?

0 votos

¿"Casi" todos los periféricos externos? ¿Por qué no es posible que sea uno de los que no has desconectado? ¿Por qué no usas un amperímetro para medir la corriente consumida?

0 votos

@BenceKaulics lamentablemente no puedo compartirlo

6voto

Jorge Puntos 51

Después de pasar demasiado tiempo en esto aquí están los resultados.

Cuando el USB se pone en modo de bajo consumo después de la suspensión con

void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd){
    .....
    hpcd->Instance->CNTR |= USB_CNTR_FSUSP;
    hpcd->Instance->CNTR |= USB_CNTR_LPMODE;
    ...

Hay un residuo de ~200uA causado por un pin USB DM flotante. (Las entradas digitales flotantes consumen energía ( Implicaciones de las entradas CMOS lentas o flotantes )

La solución es utilizar/activar el circuito de detección de carga de la batería que está incorporado en estos chips.

Algo así:

PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*)hUsbDeviceFS.pData;
USB_TypeDef *USBx = hpcd->Instance;

int stabilizationCounter = 0;

HAL_PCDEx_ActivateBCD(hpcd); 

//run on a 10ms Timer
if( USBx->BCDR & USB_BCDR_DCDET ){
    stabilizationCounter++;
    if( stabilizationCounter >= USBPC_STABILIZATION_TIME ){
        USBD_Start(&hUsbDeviceFS);
        //stop the timer
    }
}else{
    stabilizationCounter = 0;
}

Nota: HAL tiene una void HAL_PCDEx_BCD_VBUSDetect(PCD_HandleTypeDef *hpcd) pero se espera que la llames tú mismo después de que se detecte la alimentación del VBus. Lo que significa un pin extra utilizado y en mi caso una gran remodelación del diseño. Algunos detalles sobre el circuito recomendado por ST están aquí Pautas para el hardware USB y la PCB utilizando los MCUs STM32

Todavía tengo unos 40uA causados por el LDO (~10uA) y una corriente de fuga inversa de un diodo Schottky (~30uA) pero eso está al menos documentado.

4voto

Dams Puntos 61

Es probable que tengas algún pin de entrada flotando. Esto hará que fluya una corriente "excesiva" en la etapa de entrada. O bien configura todos los pines como de salida y llévalos a niveles de ahorro cuando vayas a dormir o asegúrate de que todos los pines de entrada están a niveles de tensión adecuados. Ten en cuenta que los pines de entrada tienen cierta corriente de fuga. Es decir, la resistencia de pull-up/down tiene que ser lo suficientemente pequeña como para seguir tirando a un nivel válido.

3 votos

Ya lo he mencionado en la pregunta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X