前言:STM32L432KBU6,电池供电,采集电池电量。电池直接供电,电池电量不会超过3.6V,不分压。
使用32个引脚的芯片,VDDA 引脚和 VDD 引脚连在一起,而内部VREF是和 VDDA 接一起的。VREF,没有引到片外,AD的参考电压就是电池的供电电压VDD。参考电压等于要测量的电池电压。
当使用这个公式时,供电电压改变,采集ADC_value一直都是4000近满量程。
ADC_value = HAL_ADC_GetValue(&hadc1);
Real_value=(float)(ADC_value)/4095*3.3;//2^12
printf("The ADC_value is %d",ADC_value);
printf("The Real_value is %f\n\n",Real_value);
printf(" ");
通过配置,把VREFINT连接到ADC输入引脚,是内部连接。然后再计算实际的VDDA(电池电压)值
根据公式(L432手册中没有写出)
ADC通道配置
ADC时钟尽可能不超过14MHz
修改采样时间
编写ADC_GetValue
uint16_t ADC_GetValue(void)
{
float BAT=0;
int32_t VREFINT_DATA=0;
HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);//校准
HAL_ADC_Start(&hadc1); //start conv
if(HAL_ADC_PollForConversion(&hadc1, 200)== HAL_OK)
{
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
uint16_t VREFT_CAL = *(uint16_t*)(0x1FFF75AA);
VREFINT_DATA= HAL_ADC_GetValue(&hadc1);
BAT=(float)(3.0*VREFT_CAL)/VREFINT_DATA;
}
}
HAL_ADC_Stop(&hadc1); //stop conv
printf("\r\nBat_Value=%lf \r\n",BAT);
return BAT;
}
结果
使用稳压供电3.3V和2.7V,串口打印数据。