STM32F4 - как обнаружить удаленный аккумулятор - PullRequest
0 голосов
/ 31 января 2019

Я хотел бы использовать резервную батарею SRAM в STM32F4 MCU.Есть ли какой-нибудь способ, как обнаружить отключенную / удаленную батарею после подключения напряжения VDD (после сброса)?

Да, я могу сохранить CRC резервного SRAM в резервных регистрах RTC, но я хотел бы получить информацию из некоторого регистра MCU.

Спасибо за ваш ответ

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Vbat внутренне подключен к каналу 18 АЦП.Вам просто нужно включить бит VBATE в регистре АЦП CCR и выполнить преобразование.Этот канал имеет внутренний делитель, и значение чтения составляет 1/4 от фактического.

0 голосов
/ 01 февраля 2019

У меня нет 50 очков репутации, и я не могу добавить комментарий, поэтому пишу здесь.Мой английский не очень хороший, поэтому, если я неправильно понял, поправьте меня.Как я понимаю, вы хотите обнаружить удаленный аккумулятор при запуске вашей программы.Вы можете использовать АЦП для этого.Вы можете определить уровень напряжения с помощью АЦП.Если этот уровень равен 0, это означает, что ваш аккумулятор был удален.Также вы можете определить состояние батареи с помощью АЦП.Например, максимальный уровень заряда аккумулятора составляет 1,5 В, а мертвый уровень - 1,0 В.А значение АЦП - 1,4 В, можно сказать, что состояние батареи хорошее, или значение 1,1 В, можно сказать, что состояние батареи плохое.Вы можете использовать следующие коды для вашего приложения.Первый код предназначен для стандартного периферийного устройства, а второй - для HAL.

Стандартное периферийное устройство

uint8_t Read_ADC(void)
{
    //A0 Bacagindaki ADC verisini okur

    ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles);
    ADC_SoftwareStartConv(ADC1);
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);
    return ADC_GetConversionValue(ADC1);
}

int main(void)
{
    GPIO_InitTypeDef            GPIO_InitStructure;
    ADC_InitTypeDef             ADC_InitStructure;
    ADC_CommonInitTypeDef ADC_CommonInitStructure;
    uint8_t                             ADC_Data = 0;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);



    GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_OType   = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin     =   GPIO_Pin_0;
    GPIO_InitStructure.GPIO_PuPd    = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    ADC_InitStructure.ADC_Resolution            = ADC_Resolution_8b;
    ADC_Init(ADC1,&ADC_InitStructure);

    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;
    ADC_CommonInitStructure.ADC_Mode            = ADC_Mode_Independent;
    ADC_CommonInit(&ADC_CommonInitStructure);

    ADC_Cmd(ADC1,ENABLE);
    ADC_Data = Read_ADC();
} 

Github link

HAL

uint16_t readADC (void)
{
    if(HAL_ADC_PollForConversion(&hadc1,100) == HAL_OK) //ADC okumasinda sikinti yoksa (100 timeout degeri)
        return HAL_ADC_GetValue(&hadc1);
    return 0;
}

в основной функции

    HAL_ADC_Start(&hadc1);

Github link

если напряжение вашей батареи выше, чем ваш максимальный вход АЦП (для stm32 3,3 В), вы должны уменьшитьэто напряжение.Вы можете использовать схему делителя напряжения для этого.

Voltage divider

...