当使用电池直接供电 或 外部供电低于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_17sConfig.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

如有任何疑问,欢迎留言交流!

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

  1. STM32L0 ADC使用HAL库关于校准问题的说明

    STM32 系列 ADC校准问题说明 前言 最近是有一个产品用到了ADC,使用的是STM32L051 芯片,使用 STM32CubeMX 生成的代码,本来以为简简单单,但是在调用 HAL ADC校准函 ...

  2. 测量正弦电压信号之自制并行比较型ADC(TINA仿真)测量正弦电压之VFC模块(电压转频率,proteus仿真)

    要求:对一个连续电压信号进行测量,该信号为正弦电压信号,频率是100KHZ,峰峰值为2V. 思路1:选择一些器件根据AD转换原理去搭建一个系统,进 行测量. 思路2:将电压转化成频率,再进行测量. A ...

  3. 关于使用ADC测量内部电压犯的蠢

    GD32测量内部电压时,因为觉得官方函数实在过于复杂(其实就是看不懂),所以写的寄存器版本. 测试的电压标准为12V,但测试结果大概都在1.8~1.9.最后比对成品代码发现是没有考虑两个电阻的分压-- ...

  4. 蓝牙模块与电脑无线通信--AD测量大电压

    单片机的引脚最大输入电压一般为3.3V或者5.0V,电流是25ma,40ma 而电池一般有3.3V-36V不等,电流也是好几A,超过5.0的电池一接到单片机 AD口,可能和三星手机一样.所有我们需要从 ...

  5. opencv 通过标定摄像头测量物体大小_解决方案 | 如何用普通手机准确测量物体体积?...

    点击上方"计算机视觉life",选择"星标" 快速获得第一手干货 本文授权自机器之心. 最近,菜鸟全球科技挑战赛总决赛落幕.赛题「智能体积测量」关注物流要素「长 ...

  6. Arduino - 利用电阻进行分压,测量12V电压

    Arduino针脚供电最大5V,电流最大40毫安左右. 如果直接接入12V电压,则可能烧毁. 所以,需要把12V电压,转变为Arduino可接受的电压和电流值才行. 所以,需要从电压和电流两方面来做限 ...

  7. 第 30 章 ADC—电压采集

    30.1 ADC 简介 30.2 ADC 功能框图剖析 2.1 电压输入范围 2.2 输入通道 1.规则通道 2.注入通道 2.3 转换顺序 1.规则序列 2.注入序列 2.4 触发源 2.5 转换时 ...

  8. 单节锂电池充放电及外部供电自动切换的电路--原理介绍

    目录 单节锂电池充放电及外部供电自动切换的电路--原理介绍 1)电源输入与输出 2) 虚线左边的电路是充电电路 3) 虚线右侧的电路是自动切换电路 4)元器件的选择 5)PCB设计建议 单节锂电池充放 ...

  9. stm32Cubemx实用篇(三):DAC电压输出和ADC电压检测以及内部温度传感器测温

    stm32Cubemx实用篇(三):DAC电压输出和ADC电压检测以及内部温度传感器测温 本章将介绍使用stm32Cubemx软件配置DAC电压输出和ADC电压检测.最终将两个引脚连接起来通过一个AD ...

最新文章

  1. 普罗米修斯 监控_完美的分布式监控系统——普罗米修斯
  2. C - Heavy Transportation POJ - 1797
  3. Zend_Db_Table详解
  4. 【数据库系统概论】考研附加部分重点分析【附加】
  5. 在Linux服务器之间迁移帐号信息
  6. 小森生活显示无可用服务器,《小森生活》无可用游戏服务器解决教程 无可用网关服务器怎么办...
  7. 20211028:DC综合时的内部时钟处理
  8. 运维监控利器Nagios之:Nagios的日常维护和管理
  9. 如何迅速的找到合适的开发者?
  10. java十次方项目链接 视频+资料+讲义
  11. mysql 通讯录的实现_mysql中文排序并实现仿手机通讯录
  12. _beginthread, _beginthreadex
  13. C++ SHFileOperation实现文件、文件夹拷贝、删除、重命名
  14. php 开发模式 自定义,smartprinter虚拟打印机 smarty+adodb+部分自定义类的php开发模式...
  15. android ui组件 推荐,GitHub - zzti/XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!...
  16. 【python爬虫专项(27)】拉勾网数据采集(关键词网址不发生变化)
  17. Swift,任重而道远!
  18. pt-osc在线重建表导致死锁的分析及对应的优化方案
  19. git 如何把develop分支代码合并到master主分支
  20. c语言已知等差数列的第一项为a,等差数列练习题附答案

热门文章

  1. 期权时间价值的异常现象分析
  2. 众网友吐槽:十大累成狗专业。程序员居榜首!!!
  3. Java虚拟机常用命令
  4. java 抽象数据类型_java抽象数据类型
  5. Excel-隐藏时候外宽的线条不显示
  6. java 怪物猎人ol_黑魂三还能中途改变性别吗 | 手游网游页游攻略大全
  7. 良好意识和习惯的培养
  8. java接口调用_java 接口怎么调用
  9. HXU1861系列超高频RFID读写器|读卡器|一体机的串口网口及相关参数设置操作说明与指南
  10. 有一种感情,叫回家过年