采用内部基准电压采集电池电压

前言: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,串口打印数据。

参考:STM32如何通过内部VREF得到实际的VDDA值 - STM32/8 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值