当使用电池直接供电 或 外部供电低于LDO的输入电压时,会造成STM32 VDD电压不稳定,忽高忽低。
此时通过使用STM32的内部参考电压功能(Embedded internal reference voltage),可以准确的测量ADC管脚对应的电压值,精度 0.01v左右,可以满足大部分应用场景。


计算公式:
PinAdcV = (float)(3 * VREFINT_CAL * PinAdcData) / (float)(VREFINT_Data * (4096-1));
说明:
- VREFINT_CAL = *(__IO uint16_t *)(0X1FF80078);
- VREFINT_Data 即 ADC_IN17的ADC数值;
- PinAdcData 为 待测管脚的ADC数值
基于STM32L151的具体实现:
{
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_4CYCLES;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc,100);
adcPA0Data=(uint16_t)HAL_ADC_GetValue(&hadc);
HAL_ADC_Stop(&hadc);
}{
uint16_t VREFINT_CAL = *(__IO uint16_t *)(0X1FF80078);
uint16_t adcVerfData = 0;
float pa0Volt = 0.0f;
// #define ADC_CHANNEL_VREFINT ADC_CHANNEL_17
sConfig.Channel = ADC_CHANNEL_VREFINT;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_4CYCLES;
if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_ADC_Start(&hadc);
HAL_ADC_PollForConversion(&hadc,100);
adcVerfData=(uint16_t)HAL_ADC_GetValue(&hadc);
HAL_ADC_Stop(&hadc);
pa0Volt = (float)(3 * VREFINT_CAL * adcPA0Data) / (float)(adcVerfData * 4095);
HAL_Delay(1000);
}运行效果:
完整代码下载链接:
https://download.csdn.net/download/ioterr/12972941
本代码已经在下述开发板验证通过,如需实际验证,请移步淘宝:
https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-17393307877.5.7fcc4ecd4r0GYG&id=587323418069
如有任何疑问,欢迎留言交流!
版权声明:本文为ioterr原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。