Arduino检测外部电池电量方法
文章目录
- 测量电池电量原理
- 测电池电压可能方案
- 代码
- 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检测外部电池电量方法相关推荐
- 用Arduino实现精准电池电量电压指示器
多电池供电的应用场合,我们都要随时关注电池剩余电量问题,这一直是个比较头疼的问题,其实Arudino已经内置了精准的电压比较器,可以轻松获取到当前的供电电压,由此只要我们的电路中Arduino的IO口 ...
- 基于STM32HAL库ADC+DMA模式,高精度采集电池电量与芯片内部温度方法 (48脚 使用内部参考电压方案)
目录 概述 1.原理图 2.在这先普及一下概念 3.通过查看STM32L0中文数据手册中301页,第14.10 小节 ,DataSheet 4.ADC通道转换模式的理解 5.STM32CubeMx工具 ...
- RK3288_Android7.1通过ADC实现电池电量粗略计算上报
一. 背景及问题: 由于项目需要,板子硬件接的PMU[rk808]是不带电池功能的,不支持库仑计计算电量,而项目又需要接电池使用,所以硬件把电池端接到一个ADC口,做了个简单的电池电路,通过ADC读取 ...
- Android 电池电量监控初步
整体思路概览 ①由于要显示电池图标,因此需要一组对应的小icon,程序算出当前电量之后,就在状态栏上显示对应的icon即可.本程序用到的icon已经提供在附件,下载后将里面的icons直接复制到res ...
- Android4.4电池电量命令行查看
命令行查看电池电量方法: #cd /sys/class/power_supply/BATTERY #ls capacity 表示当前电量 status 电池状态 Charging ---> 充电 ...
- 干电池电量采集_一种电池电量采集方法与流程
本发明涉及电池参数采集技术领域,尤其涉及一种电池电量采集方法. 背景技术: 目前,在使用电池的产品上,通常使用电量计来获取电池电量的精确数值.而由于电量计的成本较高,还有一些低成本的产品上,还会通过采 ...
- 万用表怎么测量电池容量_万用表怎么检测电池容量_电池电量 - 全文
1.怎样测量电池电量 检测普通锌锰干电池的电量是否充足,通常有两种方法.第一种方法是通过测量电池瞬时短路电流来估算电池的内阻,进而判断电池电量是否充足:第二种方法是用电流表串联一只阻值适当的电阻,通过 ...
- 万用表怎么测量电池容量_万用表怎么检测电池容量_电池电量
1.怎么样测量电池电量 检测普通锌锰干电池的电量是否充足,通常有两种方法.第一种方法是通过测量电池瞬时短路电流来估算电池的内阻,进而判断电池电量是否充足:第二种方法是用电流表串联一只阻值适当的电阻,通 ...
- 万用表怎么测电池内阻_万用表怎么检测电池容量_电池电量
1.怎样测量电池电量 检测普通锌锰干电池的电量是否充足,通常有两种方法.第一种方法是通过测量电池瞬时短路电流来估算电池的内阻,进而判断电池电量是否充足:第二种方法是用电流表串联一只阻值适当的电阻,通过 ...
最新文章
- 引以为戒,特斯拉Kubernetes控制台被黑客攻击
- Css的filter常用濾波器屬性及語句大全
- pandas将所0值修改为NaN
- 悬赏17万:美国“知乎”的沙雕问题,需要AI来识别
- idea 查找替换快捷键
- 莫拉蒂和4个干儿子的情感
- 当股份制银行核心数据遇到国产数据库
- 【直播预告】「甦:知识蓄力2020」编辑讲书智慧接力行动
- 2021秋软工实践第一次结对编程作业
- 等保系列之——网络安全等级保护测评:工作流程及工作内容
- android博客集合
- Ubuntu20.04的主题美化
- 畅通无阻的公式:乘员组从几乎破产变成了吸引500万游客的方式
- 移植 linux-5.8.5 到 iTOP-4412(一)build config
- 类微信界面的制作-1 类微信app界面框架
- 【深度学习人类语言处理】3 语音转换——类别(特征分解、直接转换)、语音分离(评价指标、深度聚类、PIT、TaskNet)
- 2020职高计算机录取分数线,四川邮电职校2020单招录取分数线
- Tenda U12 网卡 ubuntu 配置
- 站长说说之seo首页优化 原创文章不被收录怎么办
- 如何制作中间实线 两头细线