122 lines
2.5 KiB
C
122 lines
2.5 KiB
C
#include "power.h"
|
|
#include "adc.h"
|
|
#include "delay.h"
|
|
|
|
#define INTERNAL_RES 0.128
|
|
#define CHARGING_CUR 1
|
|
|
|
void Power_Pins_Init()
|
|
{
|
|
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
|
|
/* GPIO Ports Clock Enable */
|
|
__HAL_RCC_GPIOA_CLK_ENABLE();
|
|
|
|
/*Configure GPIO pin Output Level */
|
|
HAL_GPIO_WritePin(POWER_PORT, POWER_PIN, GPIO_PIN_RESET);
|
|
|
|
/*Configure GPIO pin : PA3 */
|
|
GPIO_InitStruct.Pin = POWER_PIN;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|
HAL_GPIO_Init(POWER_PORT, &GPIO_InitStruct);
|
|
|
|
/*Configure GPIO pin : PA2 */
|
|
GPIO_InitStruct.Pin = CHARGE_PIN;
|
|
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
|
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
HAL_GPIO_Init(CHARGE_PORT, &GPIO_InitStruct);
|
|
|
|
HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);
|
|
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
|
|
|
|
}
|
|
|
|
void Power_Enable()
|
|
{
|
|
HAL_GPIO_WritePin(POWER_PORT,POWER_PIN,GPIO_PIN_SET);
|
|
}
|
|
|
|
void Power_DisEnable()
|
|
{
|
|
HAL_GPIO_WritePin(POWER_PORT,POWER_PIN,GPIO_PIN_RESET);
|
|
}
|
|
|
|
uint8_t ChargeCheck()//1:charging
|
|
{
|
|
return HAL_GPIO_ReadPin(CHARGE_PORT,CHARGE_PIN);
|
|
}
|
|
|
|
float BatCheck()
|
|
{
|
|
uint16_t dat;
|
|
float BatVoltage;
|
|
HAL_ADC_Start(&hadc1);
|
|
HAL_ADC_PollForConversion(&hadc1,5);
|
|
dat = HAL_ADC_GetValue(&hadc1);
|
|
HAL_ADC_Stop(&hadc1);
|
|
BatVoltage = dat *2 *3.3 /4096;
|
|
return BatVoltage;
|
|
}
|
|
|
|
float BatCheck_8times()
|
|
{
|
|
uint32_t dat=0;
|
|
uint8_t i;
|
|
float BatVoltage;
|
|
for(i=0;i<8;i++)
|
|
{
|
|
HAL_ADC_Start(&hadc1);
|
|
HAL_ADC_PollForConversion(&hadc1,5);
|
|
dat += HAL_ADC_GetValue(&hadc1);
|
|
HAL_ADC_Stop(&hadc1);
|
|
delay_ms(1);
|
|
}
|
|
dat = dat>>3;
|
|
BatVoltage = dat *2 *3.3 /4096;
|
|
return BatVoltage;
|
|
}
|
|
|
|
uint8_t PowerCalculate()
|
|
{
|
|
uint8_t power;
|
|
float voltage;
|
|
voltage = BatCheck_8times();
|
|
|
|
if(ChargeCheck())
|
|
{voltage -= INTERNAL_RES * CHARGING_CUR;}
|
|
|
|
if((voltage >= 4.2))
|
|
{power = 100;}
|
|
else if(voltage >= 4.06 && voltage <4.2)
|
|
{power = 90;}
|
|
else if(voltage >= 3.98 && voltage <4.06)
|
|
{power = 80;}
|
|
else if(voltage >= 3.92 && voltage <3.98)
|
|
{power = 70;}
|
|
else if(voltage >= 3.87 && voltage <3.92)
|
|
{power = 60;}
|
|
else if(voltage >= 3.82 && voltage <3.87)
|
|
{power = 50;}
|
|
else if(voltage >= 3.79 && voltage <3.82)
|
|
{power = 40;}
|
|
else if(voltage >= 3.77 && voltage <3.79)
|
|
{power = 30;}
|
|
else if(voltage >= 3.74 && voltage <3.77)
|
|
{power = 20;}
|
|
else if(voltage >= 3.68 && voltage <3.74)
|
|
{power = 10;}
|
|
else if(voltage >= 3.45 && voltage <3.68)
|
|
{power = 5;}
|
|
return power;
|
|
}
|
|
|
|
void Power_Init(void)
|
|
{
|
|
Power_Pins_Init();
|
|
Power_Enable();
|
|
}
|
|
|
|
|