Arduino檢測(cè)外部電池供電電量方法

[TOC]

測(cè)量電池電量原理

對(duì)于鋰電池而言洁墙,可以用電池電壓近似代替指示電池電量癌别,一般來說單節(jié)鋰電池電壓范圍是3~4.2v歼争,測(cè)得電池電壓后做百分比計(jì)算即可响迂,因此關(guān)鍵即在于如何測(cè)量電池電壓

測(cè)電池電壓可能方案

  • 初始思路 直接ADC測(cè)量電池電壓

ADC測(cè)量的前提是有一個(gè)穩(wěn)定標(biāo)準(zhǔn)的參考電壓Vref考抄,默認(rèn)Arduino的Vref取的是Vcc電壓,而在電池供電下這個(gè)Vcc本身就是變化的蔗彤,也不能用自己去參考自己測(cè)量

結(jié)論 不可行

  • 進(jìn)階思路 電池正負(fù)極并聯(lián)電阻分壓法測(cè)電壓

這個(gè)方法原理上可行川梅,原因是AVR單片機(jī)內(nèi)部有一個(gè)1.1V的基準(zhǔn)參考電壓,可以調(diào)用如下接口使能

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

但電阻會(huì)造成額外持續(xù)的功耗贫途,而電池供電情況下本身往往就是比較強(qiáng)調(diào)低功耗的,另外1.1V電壓較低待侵,造成電阻也必須設(shè)置為將VCC分壓得較小丢早,ADC量程小電阻值也相差大,造成精度較低秧倾,而由于電池本身有內(nèi)阻且會(huì)變化怨酝,進(jìn)一步造成精度下降

結(jié)論:不堪用

  • 推薦方法 正確使用內(nèi)部1.1V基準(zhǔn)電壓

敏銳的同學(xué)會(huì)發(fā)現(xiàn)AVR單片機(jī)設(shè)置的內(nèi)部1.1V基準(zhǔn)電壓應(yīng)該不是用于直接作為Vref使用的,因?yàn)閷?duì)于VCC 5V的情況下那先,很少有直接測(cè)量低于1.1v外部電壓的情況农猬,實(shí)際上,這個(gè)內(nèi)部的1.1v基準(zhǔn)電壓的一個(gè)主要用途就是用于電池供電下測(cè)量電池電壓的售淡,只是方法有點(diǎn)巧妙斤葱。
ADC的計(jì)算方法很簡(jiǎn)單如下:

ADC = Vin/Vref * 2^n

其中可以看到,其實(shí)Vin和Vref是對(duì)稱的揖闸,只需要保證其中一個(gè)值是基準(zhǔn)的揍堕,就可以得到另外一個(gè)值。

也就是說汤纸,我們可以設(shè)外部VCC為Vref衩茸,去“測(cè)量”1.1V的基準(zhǔn)電壓的ADC數(shù)值來反推得到外部VCC的實(shí)際值

是不是很巧妙?這樣不需要任何額外的外部電路蹲嚣,理論可以測(cè)得1.1v以上任意大小電壓递瑰!

換句話說,這樣是限制了ADC的測(cè)量下限來換取測(cè)量上限隙畜,這也是為什么內(nèi)部基準(zhǔn)電壓設(shè)置為1.1v這么小的原因抖部,因?yàn)榧词箤?duì)于普通的1.5v鎳鉻電池低電量下也不會(huì)低于1.1v,atmel的工程師真的是考慮很周到~

代碼

這里直接給出一個(gè)函數(shù)议惰,大家可以直接加到Arduino里調(diào)用即可慎颗,由于Arduino里沒有給出設(shè)置ADC采樣口的接口(即將Vin設(shè)置為內(nèi)部1.1v),因此這里直接配置AVR的寄存器來實(shí)現(xiàn)

#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 reference
  if (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寄存器說明

上述代碼中核心一步是對(duì)ADC多路選擇寄存器ADMUX的配置俯萎,這里給出具體說明

atmega ADMUX寄存器

其中REFS1和REFS0用于設(shè)置Vref傲宜,這里應(yīng)該配置為01對(duì)應(yīng)Vcc口

image.png

MUX3..0用于選擇ADC的輸入Vin,這里應(yīng)配置為內(nèi)部1.1v對(duì)應(yīng)的1110

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夫啊,一起剝皮案震驚了整個(gè)濱河市函卒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撇眯,老刑警劉巖报嵌,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異熊榛,居然都是意外死亡锚国,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門玄坦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來血筑,“玉大人,你說我怎么就攤上這事煎楣〔蜃埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵转质,是天一觀的道長(zhǎng)园欣。 經(jīng)常有香客問我帖世,道長(zhǎng)休蟹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任日矫,我火速辦了婚禮赂弓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哪轿。我一直安慰自己盈魁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布窃诉。 她就那樣靜靜地躺著杨耙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪飘痛。 梳的紋絲不亂的頭發(fā)上珊膜,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音宣脉,去河邊找鬼车柠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竹祷。 我是一名探鬼主播谈跛,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼塑陵!你這毒婦竟也來了感憾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤令花,失蹤者是張志新(化名)和其女友劉穎吹菱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彭则,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鳍刷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俯抖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片输瓜。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芬萍,靈堂內(nèi)的尸體忽然破棺而出尤揣,到底是詐尸還是另有隱情,我是刑警寧澤柬祠,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布北戏,位于F島的核電站,受9級(jí)特大地震影響漫蛔,放射性物質(zhì)發(fā)生泄漏嗜愈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一莽龟、第九天 我趴在偏房一處隱蔽的房頂上張望蠕嫁。 院中可真熱鬧,春花似錦毯盈、人聲如沸剃毒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赘阀。三九已至,卻和暖如春脑奠,著一層夾襖步出監(jiān)牢的瞬間基公,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工捺信, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酌媒,地道東北人欠痴。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像秒咨,于是被迫代替她去往敵國和親喇辽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Arduino Due有14個(gè)數(shù)字I/O雨席,6個(gè)模擬I/O菩咨,一個(gè)復(fù)位開關(guān),一個(gè)ICSP下載口陡厘,7-12v電源供電抽米。 ...
    麥牛2013閱讀 3,335評(píng)論 0 8
  • 選擇題部分 1.(),只有在發(fā)生短路事故時(shí)或者在負(fù)荷電流較大時(shí),變流器中才會(huì)有足夠的二次電流作為繼電保護(hù)跳閘之用。...
    skystarwuwei閱讀 12,896評(píng)論 0 7
  • 前段時(shí)間買了個(gè)晶體測(cè)試儀糙置,很好奇他能測(cè)得供電的電池電壓云茸。我以前一直用ADC采樣,不管用什么電源供電谤饭,電壓如何變化标捺,...
    滄海一聲笑的DIY宇宙閱讀 3,177評(píng)論 0 1
  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 8,985評(píng)論 0 13
  • 1、單電源的優(yōu)缺點(diǎn) 1.1揉抵、單電源系統(tǒng)的優(yōu)點(diǎn) 系統(tǒng)單電源供電亡容,電源容易設(shè)計(jì),電源系統(tǒng)直接一個(gè)LDO就可以設(shè)計(jì)出工作...
    宜居遠(yuǎn)控閱讀 5,835評(píng)論 0 2