文章目录

  • 测量电池电量原理
    • 测电池电压可能方案
  • 代码
  • atmega寄存器说明

测量电池电量原理

对于锂电池而言,可以用电池电压近似代替指示电池电量,一般来说单节锂电池电压范围是3~4.2v,测得电池电压后做百分比计算即可,因此关键即在于如何测量电池电压

测电池电压可能方案

  • 初始思路 直接ADC测量电池电压

ADC测量的前提是有一个稳定标准的参考电压Vref,默认Arduino的Vref取的是Vcc电压,而在电池供电下这个Vcc本身就是变化的,也不能用自己去参考自己测量

结论 不可行

  • 进阶思路 电池正负极并联电阻分压法测电压

这个方法原理上可行,原因是AVR单片机内部有一个1.1V的基准参考电压,可以调用如下接口使能

analogReference(INTERNAL);use internal 1.1v as Avref
//analogReference(DEFAULT);  use AVcc as AVref

但电阻会造成额外持续的功耗,而电池供电情况下本身往往就是比较强调低功耗的,另外1.1V电压较低,造成电阻也必须设置为将VCC分压得较小,ADC量程小电阻值也相差大,造成精度较低,而由于电池本身有内阻且会变化,进一步造成精度下降

结论:不堪用

  • 推荐方法 正确使用内部1.1V基准电压

敏锐的同学会发现AVR单片机设置的内部1.1V基准电压应该不是用于直接作为Vref使用的,因为对于VCC 5V的情况下,很少有直接测量低于1.1v外部电压的情况,实际上,这个内部的1.1v基准电压的一个主要用途就是用于电池供电下测量电池电压的,只是方法有点巧妙。
ADC的计算方法很简单如下:

ADC = Vin/Vref * 2^n

其中可以看到,其实Vin和Vref是对称的,只需要保证其中一个值是基准的,就可以得到另外一个值。

也就是说,我们可以设外部VCC为Vref,去“测量”1.1V的基准电压的ADC数值来反推得到外部VCC的实际值

是不是很巧妙?这样不需要任何额外的外部电路,理论可以测得1.1v以上任意大小电压!

换句话说,这样是限制了ADC的测量下限来换取测量上限,这也是为什么内部基准电压设置为1.1v这么小的原因,因为即使对于普通的1.5v镍铬电池低电量下也不会低于1.1v,atmel的工程师真的是考虑很周到~

代码

这里直接给出一个函数,大家可以直接加到Arduino里调用即可,由于Arduino里没有给出设置ADC采样口的接口(即将Vin设置为内部1.1v),因此这里直接配置AVR的寄存器来实现

#include "Arduino.h" //用于包含如ADMUX等寄存器的宏#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define ADMUX_VCCWRT1V1 (_BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1))
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
#define ADMUX_VCCWRT1V1 (_BV(MUX5) | _BV(MUX0))
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
#define ADMUX_VCCWRT1V1 (_BV(MUX3) | _BV(MUX2))
#else
#define ADMUX_VCCWRT1V1 (_BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1))
#endif
float Read_Volts(void)
{// Read 1.1V reference against AVcc// set the reference to Vcc and the measurement to the internal 1.1V referenceif (ADMUX != ADMUX_VCCWRT1V1){ADMUX = ADMUX_VCCWRT1V1;// Bandgap reference start-up time: max 70us// Wait for Vref to settle.delayMicroseconds(350); }// Start conversion and wait for it to finish.ADCSRA |= _BV(ADSC);while (bit_is_set(ADCSRA,ADSC)) {};// Result is now stored in ADC.// Calculate Vcc (in V)float vcc = 1.1*1024.0 / ADC;return vcc;
}

注意一定需要包含#include "Arduino.h",包含基本的寄存器宏。

atmega寄存器说明

上述代码中核心一步是对ADC多路选择寄存器ADMUX的配置,这里给出具体说明

其中REFS1和REFS0用于设置Vref,这里应该配置为01对应Vcc口

MUX3…0用于选择ADC的输入Vin,这里应配置为内部1.1v对应的1110

Arduino检测外部电池电量方法相关推荐

  1. 用Arduino实现精准电池电量电压指示器

    多电池供电的应用场合,我们都要随时关注电池剩余电量问题,这一直是个比较头疼的问题,其实Arudino已经内置了精准的电压比较器,可以轻松获取到当前的供电电压,由此只要我们的电路中Arduino的IO口 ...

  2. 基于STM32HAL库ADC+DMA模式,高精度采集电池电量与芯片内部温度方法 (48脚 使用内部参考电压方案)

    目录 概述 1.原理图 2.在这先普及一下概念 3.通过查看STM32L0中文数据手册中301页,第14.10 小节 ,DataSheet 4.ADC通道转换模式的理解 5.STM32CubeMx工具 ...

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

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

  4. Android 电池电量监控初步

    整体思路概览 ①由于要显示电池图标,因此需要一组对应的小icon,程序算出当前电量之后,就在状态栏上显示对应的icon即可.本程序用到的icon已经提供在附件,下载后将里面的icons直接复制到res ...

  5. Android4.4电池电量命令行查看

    命令行查看电池电量方法: #cd /sys/class/power_supply/BATTERY #ls capacity 表示当前电量 status 电池状态 Charging ---> 充电 ...

  6. 干电池电量采集_一种电池电量采集方法与流程

    本发明涉及电池参数采集技术领域,尤其涉及一种电池电量采集方法. 背景技术: 目前,在使用电池的产品上,通常使用电量计来获取电池电量的精确数值.而由于电量计的成本较高,还有一些低成本的产品上,还会通过采 ...

  7. 万用表怎么测量电池容量_万用表怎么检测电池容量_电池电量 - 全文

    1.怎样测量电池电量 检测普通锌锰干电池的电量是否充足,通常有两种方法.第一种方法是通过测量电池瞬时短路电流来估算电池的内阻,进而判断电池电量是否充足:第二种方法是用电流表串联一只阻值适当的电阻,通过 ...

  8. 万用表怎么测量电池容量_万用表怎么检测电池容量_电池电量

    1.怎么样测量电池电量 检测普通锌锰干电池的电量是否充足,通常有两种方法.第一种方法是通过测量电池瞬时短路电流来估算电池的内阻,进而判断电池电量是否充足:第二种方法是用电流表串联一只阻值适当的电阻,通 ...

  9. 万用表怎么测电池内阻_万用表怎么检测电池容量_电池电量

    1.怎样测量电池电量 检测普通锌锰干电池的电量是否充足,通常有两种方法.第一种方法是通过测量电池瞬时短路电流来估算电池的内阻,进而判断电池电量是否充足:第二种方法是用电流表串联一只阻值适当的电阻,通过 ...

最新文章

  1. 引以为戒,特斯拉Kubernetes控制台被黑客攻击
  2. Css的filter常用濾波器屬性及語句大全
  3. pandas将所0值修改为NaN
  4. 悬赏17万:美国“知乎”的沙雕问题,需要AI来识别
  5. idea 查找替换快捷键
  6. 莫拉蒂和4个干儿子的情感
  7. 当股份制银行核心数据遇到国产数据库
  8. 【直播预告】「甦:知识蓄力2020」编辑讲书智慧接力行动
  9. 2021秋软工实践第一次结对编程作业
  10. 等保系列之——网络安全等级保护测评:工作流程及工作内容
  11. android博客集合
  12. Ubuntu20.04的主题美化
  13. 畅通无阻的公式:乘员组从几乎破产变成了吸引500万游客的方式
  14. 移植 linux-5.8.5 到 iTOP-4412(一)build config
  15. 类微信界面的制作-1 类微信app界面框架
  16. 【深度学习人类语言处理】3 语音转换——类别(特征分解、直接转换)、语音分离(评价指标、深度聚类、PIT、TaskNet)
  17. 2020职高计算机录取分数线,四川邮电职校2020单招录取分数线
  18. Tenda U12 网卡 ubuntu 配置
  19. 站长说说之seo首页优化 原创文章不被收录怎么办
  20. 如何制作中间实线 两头细线

热门文章

  1. outlook 2016 英文版 撤回邮件
  2. 社区项目发现的问题四 datatable的注意事项
  3. 二元非洲秃鹫优化算法(Matlab代码实现)
  4. 使用svg-sprite-loader 遇到的问题
  5. c++11的regex使用
  6. 多因子模型的前世今生
  7. redis的zset为什么用调表不用红黑树
  8. Android O 开机动画铃声
  9. 支付宝手机网站支付出现系统繁忙,请稍后再试
  10. 深入探讨 Room 2.4.0 的最新进展