最近在搞一个小项目用到了电池电量采集,在网上看到了一个低功耗产品教程可实现电池电压精确采集,特此记录学习。https://www.bilibili.com/video/BV1eV411t7fn?p=31
一般电池电量采集有两种方法:

  1. 加电量采集芯片(库仑计)
  2. 分压电路进行ADC采集,进而计算出电压

对于很多低功耗产品来说,外加一个库仑计的成本是不能接受的,所以一般都是使用分压电路来进行电池电压的采集,而一般低功耗产品都把电阻加大至1M-2M,入下图就是经典的电池电压采集电路。

  • 这样看来貌似很简单的样子,把ADC值取出来,然后再转换为电压即可,实则不然!因为低功耗设备是靠电池供电的,而一般的锂电池的电压是随着电量的降低,电压也随之降低,虽然咱们的电路上一般会加上LDO电源芯片,来让3.6V的电池降压至3.3V给MCU供电。(注:特殊的锂亚电池可以长久保持稳压状态即使电量几乎耗尽)

一般ADC的电压转换方法为:电池电压=3.3*ADC采集值/分压比例

  • 可是咱们为什么用3.3V来乘呢?因为我们已经默认了MCU的电压为3.3V,如果电池电压一直稳定或者是常供电设备,这一点无需关注。但是可充电的锂电池一般随着电量降低电压也会降低,那么当电池的电压降到3.3V以下,经过LDO以后,MCU的电压也会在3.3V以下,再使用3.3带入公式计算,显然是不合理的!
  • 其实ST芯片已经有了一个算法来计算MCU
    VDDA的电压值,这个值是MCU内部自动实时监控的,其中它连接在ADC_IN17通道,通过这个方法咱们就可以确定VDDA的真实电压,同时VREFINT_CAL(校准值)存在MCU内部的寄存器内,而且是只读的。 STM32L051 datasheet如图:


STM32L051 使用手册如图:

那么新的计算公式应该是这样的:
电池电压=真实的VDDA电压ADC采集值/分压比例
其中真实的VDDA电压=3V
基准值/VDDA采集值

电池电压=(3V*基准值/VDDA值)*ADC采集值/分压比例

  • 这样就可以得到非常准确的电池电压了,即使电池降到3.3V以下也是非常准确的。 ADC采集多路可以使用DMA也可以开启连续采集,然后我们把ADC值都取出来带入公式即可。
    实战举例:

  1. 配置电池ADC引脚
  2. 勾选内部参考电压 其实是ADC_IN17
  3. 使能连续转换模式
  4. 配置低功率等待
  5. 配置auto off
  6. 提高采样率提高准确度

下方代码就实现了初始化,校准,然后启动ADC采集,便开始了连续转换(可以配置为读取之后开始下次循环)打印5次最终电池电量BAT_val。分压比例为0.5,所以是4096/2=2028.即:BAT_val = VDDA_val*BAT_DATA/2048;

 ADC1->CR |= ADC_CR_ADCAL; //校准ADCwhile((ADC1->ISR&ADC_ISR_EOCAL)!=ADC_ISR_EOCAL);//等待ADC校准完成ADC1->ISR |= ADC_ISR_EOCAL;//校准ADC完成VREFINT_CAL = *(uint16_t*)0x1FF80078; //获取校准值ADC1->CR |= ADC_CR_ADSTART;//HAL_ADC_Start(&hadc); //启动ADCEnableUsart_IT();printf("123456\r\n");for(uint8_t i=5; i>0; i--){HAL_Delay(1000);while((ADC1->ISR&ADC_ISR_EOC)!=ADC_ISR_EOC);BAT_DATA = ADC1->DR;while((ADC1->ISR&ADC_ISR_EOC)!=ADC_ISR_EOC);VREFINT_DATA = ADC1->DR;VDDA_val = 3.0*VREFINT_CAL/VREFINT_DATA;printf("VDDA_val=%.2f\r\n",VDDA_val);BAT_val = VDDA_val*BAT_DATA/2048;printf("BAT_val=%.2f\r\n",BAT_val);printf("wait %dS to sleep\r\n",i);}


根据我的测试可以满足项目需求!

低功耗产品ADC精确测量电池电压(电量)相关推荐

  1. 钮扣电池电压电量_纽扣厂

    钮扣电池电压电量 S. is a designer and works at the button factory. Despite its scary look, S. goes there eve ...

  2. 电源芯片的静态电流 低功耗产品必须考虑的因素之一

    刚刚开启电子设计生涯的朋友注意了,你要从理想的物理定律世界里面跳出到现实世界里面,读这篇文章之前,先弄清楚一个事实:你电路板上的电源芯片也是有功率损耗的. 每个电路板上都有电源芯片,不管是线性电源芯片 ...

  3. 低功耗产品休眠唤醒电池用电功耗计算

    嵌入式小型低功耗产品电池使用时间计算 原文链接:https://blog.csdn.net/liangcsdn111/article/details/89873898 电池功耗计算 根据低功耗产品耗电 ...

  4. RK3288_Android7.1通过ADC实现电池电量粗略计算上报

    一. 背景及问题: 由于项目需要,板子硬件接的PMU[rk808]是不带电池功能的,不支持库仑计计算电量,而项目又需要接电池使用,所以硬件把电池端接到一个ADC口,做了个简单的电池电路,通过ADC读取 ...

  5. gpio的8种工作模式_【超低功耗系列一】STM32L 低功耗产品和模式

    大家知道意法半导体STM32产品中有四个系列,其中一个很重要的系列是超低功耗系列,今天我们就来聊一下STM32超低功耗系列产品. 意法半导体的超低功耗系列有非常优秀的低功耗表现,在EEMBC(嵌入式微 ...

  6. ES7241D低功耗音频ADC芯片##小爱音响

    顺芯ES7241D 高性能立体声单路音频ADC 24Bit 85dB 200kHZ音频 特征 •高性能多位delta-sigma音频ADC •100 dB信噪比 •-85 dB THD + N •3 ...

  7. ADC 采集电池电量

    单片机内部的多路ADC采集之间可能会相互影响,使用的时候需要参考datasheet,在NUC100中,ADC7 比较与ADC6同时使用时,ADC6的采样就会出问题,采集的电量值一直保持不变. 其次,A ...

  8. 有关用STM32芯片自带的ADC测量电池电压,然后根据放电曲线得到电池容量的问题

    首先,这种方式测量我认为肯定是不能正确得到电池剩余容量的.STM32的ADC参考电压,我们一般设置为3.3V,也就是说ADC采集到的外部电压最高也是3.3V,一般我们使用的电池可能要高于3.3v,这就 ...

  9. ESP32 ESP-IDF ADC监测电池电压(带校正)

    陈拓 2022/06/24-2022/06/24 1. 概述 此示例显示如何配置ADC1并读取连接到GPIO引脚的电压. 引脚功能 在本例中,我们使用默认的ADC_UNIT_1,我们电池供电的应用中将 ...

最新文章

  1. 怎么在html中写当前时间,当前时间(Javascript)在HTML
  2. java数据库视图工具_数据库视图工具类
  3. sublime text3 最新 license注册码分享 2018
  4. C++ Primer 学习笔记_75_模板与泛型编程 --模板定义
  5. Spring Boot—thymeleaf语法规则以及使用
  6. VS编译提示错误“....Consider using strcat_s instead.To disable deprecation, use _CRT_SECURE_NO_WARNINGS.”
  7. 一道C#类型转换的思考题
  8. vuejs项目如何修改node_mudule为公用文件?
  9. CentOS下配置JDK1.6+TOMCAT6
  10. h3c 链路聚合测试_4G/5G聚合路由器在直播中无线多链路聚合图传技术是什么?
  11. 企业级nginx服务优化(三 )Apache+防盗链
  12. 2015阿里天池大数据竞赛-Solution
  13. 基于微信朋友圈实现时间显示样式
  14. Android打开日历账号管理,Android 日历CalendarProvider
  15. 小宁百度了php一句话,赛宁平台web题解(一)
  16. 中国三大互联网巨头陷入移动战争
  17. 参加数据库嘉年华有感
  18. 详解RAI I、C++中的智能指针以及一些常见的面试题
  19. java全景图片切割 全景,基于Three.js实现360度全景图片
  20. JAVA(阶段小结篇)

热门文章

  1. makefile编写知识小结
  2. 解决:RuntimeError: CUDA out of memory. Tried to allocate 64.00 MiB (GPU 0; 4.00 GiB total capacity; 2
  3. 服装实体店运营需要的所有软件,合集在此!(建议收藏)实体店运营 实体店运营干货 实体店运营全流程所需系统推荐
  4. 穷举算法——奶牛碑文(cow)
  5. jnz和djnz_djnz指令的应用方法
  6. QML地图简介(1)
  7. python引用类全局变量_调用全局变量时无法解析的引用? - python
  8. 贪心之最大相容子集合问题
  9. abacus 基本操作
  10. Involution论文解读:从卷积变换出的神经网络新算子