外部供电不稳定时准确测量ADC电压基于STM32L151最新HAL库实现方案

当使用电池直接供电 或 外部供电低于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版权协议,转载请附上原文出处链接和本声明。