45 lines
1.2 KiB
C
45 lines
1.2 KiB
C
|
|
#include "adc.h"
|
|||
|
|
#include <stdio.h>
|
|||
|
|
|
|||
|
|
ADC_HandleTypeDef hadc1;
|
|||
|
|
|
|||
|
|
void adcInit(void)
|
|||
|
|
{
|
|||
|
|
ADC_ChannelConfTypeDef sConfig = {0};
|
|||
|
|
hadc1.Instance = ADC1;
|
|||
|
|
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
|||
|
|
hadc1.Init.ContinuousConvMode = DISABLE;
|
|||
|
|
hadc1.Init.DiscontinuousConvMode = DISABLE;
|
|||
|
|
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
|||
|
|
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
|||
|
|
hadc1.Init.NbrOfConversion = 1;
|
|||
|
|
if (HAL_ADC_Init(&hadc1) != HAL_OK) Error_Handler();
|
|||
|
|
|
|||
|
|
sConfig.Channel = ADC_CHANNEL_0; /* PA0 */
|
|||
|
|
sConfig.Rank = ADC_REGULAR_RANK_1;
|
|||
|
|
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
|
|||
|
|
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) Error_Handler();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint16_t getAdc(void)
|
|||
|
|
{
|
|||
|
|
uint16_t adc_value = 0;
|
|||
|
|
HAL_ADC_Start(&hadc1);
|
|||
|
|
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
|
|||
|
|
adc_value = HAL_ADC_GetValue(&hadc1);
|
|||
|
|
}
|
|||
|
|
HAL_ADC_Stop(&hadc1);
|
|||
|
|
return adc_value;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/* <20><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>ٷֱȣ<D6B1>0~100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> main.h BAT_* <20><> */
|
|||
|
|
int battery_percent(void)
|
|||
|
|
{
|
|||
|
|
float v = getAdc() * (3.3f / 4096.0f);
|
|||
|
|
v = v * BAT_DIV_RATIO + BAT_OFFSET_V;
|
|||
|
|
float pct = 100.0f * (v - BAT_EMPTY_V) / (BAT_FULL_V - BAT_EMPTY_V);
|
|||
|
|
if (pct < 0) pct = 0;
|
|||
|
|
if (pct > 100) pct = 100;
|
|||
|
|
return (int)pct;
|
|||
|
|
}
|