OV-Watch/Software/OV_Watch_V2.3.1/BSP/POWER/power.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();
}