標題: 基于BQ26500電池測量設(shè)計論文與源碼下載 [打印本頁]

作者: zhi'yu    時間: 2018-5-23 12:33
標題: 基于BQ26500電池測量設(shè)計論文與源碼下載
摘要

鋰離子電池與其他種類的電池相比有著諸多優(yōu)勢,已經(jīng)成為我們?nèi)粘I钪斜夭豢缮俚囊徊糠。相信在使用鋰離子電池的過程中,我們常會考慮還剩多少電量的問題,但是又找不到好的電量檢測方法,針對該要求,本文設(shè)計了一種基于單片機的鋰離子電池電量檢測系統(tǒng),該檢測系統(tǒng)可以滿足我們?nèi)粘I钪袑︿囯x子電池電量檢測的需求,以全面掌握鋰離子電池的電量狀態(tài)。
本文主要敘述了基于單片機的鋰離子電池電量檢測系統(tǒng)的研究和設(shè)計,該系統(tǒng)主要由模擬量采集、鋰離子電池檢測模塊、單片機模塊、以及LED驅(qū)動顯示電量等相應(yīng)的部分組成,介紹了鋰離子電池的特點、電池電量檢測原理、系統(tǒng)的結(jié)構(gòu)及性能,重點介紹了該系統(tǒng)的軟硬件設(shè)計等。
考慮到檢測系統(tǒng)的復(fù)雜程度、精確性、可靠性等各個方面,本文介紹的設(shè)計方案能夠滿足我們對鋰離子電池電量檢測的要求。隨著電力系統(tǒng)電量的日益擴大和電壓運行等級的不斷提高,傳統(tǒng)的電量檢測系統(tǒng)暴露出越來越多的缺點,難以滿足現(xiàn)代電網(wǎng)向自動化、數(shù)字化發(fā)展的需要。本文首先概述了系統(tǒng)的設(shè)計,LCD顯示部分方面的設(shè)計。然后介紹了AT89C51和BQ26500中電子接口的各項特性,同時對單元的結(jié)構(gòu)原理和功能劃分進行了分析和研究,提出了軟件系統(tǒng)方面的設(shè)計方案,主程序和子程序的流程方案。
目錄

摘要

abstract

1. 緒論

1.1 研究背景

1.2研究意義

1.3 主要研究內(nèi)容

2. 總體方案設(shè)計

2.1方案選擇

2.2 LCD顯示部分

2.2.1 LCD12864 概述

2.2.2 LCD12864基本用途

2.3  電池電量檢測芯片BQ26500

2.3.1 測量原理

2.3.2  電路圖設(shè)計

2.4  數(shù)據(jù)傳輸存儲芯片24C64

2.4.1  24C64概述

2.4.2  24C64引腳說明

2.4.3  24C64特性介紹

2.5  時鐘芯片DS1302

2.5.1  DS1302概述

2.5.2  DS1302引腳說明

3.軟件系統(tǒng)設(shè)計            

3.1 C語言簡介            

3.2  程序設(shè)計流程

3.2.1  初始化

3.2.2  主程序流程圖

3.2.3A/D轉(zhuǎn)換與中斷服務(wù)

3.3  BQ26500總線時序

4.總結(jié)

致謝

參考文獻

附錄



1. 緒論
1.1 研究背景
電池(電池)是指將電解質(zhì)溶液和金屬電極保持在杯、槽、或其他容器或復(fù)合容器空間的一部分中產(chǎn)生電流的裝置,其將化學能轉(zhuǎn)化為電能。這是一個積極的和消極的觀點。隨著科學技術(shù)的進步,電池通常是指發(fā)電的小型設(shè)備。比如太陽能電池。電池的性能參數(shù)主要包括電動勢、容量、比能和電阻。
采用電池作為能源,可獲得穩(wěn)定的電壓、穩(wěn)定的電流、長時間穩(wěn)定的電源、受外界影響小的電流、電池結(jié)構(gòu)簡單、攜帶方便、充放電操作容易、不受外界氣候和溫度的影響。RE,穩(wěn)定可靠的性能,以及在現(xiàn)代社會生活中。所有方面都起著很大的作用,如手機、手表等電子數(shù)字便攜設(shè)備!
額定電壓
電池在常溫下的典型工作電壓也稱為標稱電壓。為選擇不同類型的電池提供參考。電池的實際工作電壓等于正壓電極和負電極的平衡電極電位的差值。它僅與電極中活性物質(zhì)的類型有關(guān),而與活性物質(zhì)的量無關(guān)。電池電壓本質(zhì)上是直流電壓,但在某些特殊條件下,由電極反應(yīng)引起的金屬晶體或某些相膜的相變將引起電壓的輕微波動。這種現(xiàn)象被稱為噪聲。波動幅度很小,但頻率范圍很寬,因此可以區(qū)別于電路中的自激噪聲。
開路電壓
開路電壓下的電池端電壓稱為開路電壓。電池的開路電壓等于電池正極電勢與負極電極電位在電池開路時的差值(即,沒有電流通過兩極)。電池的開路電壓由V表示,即V開路=++-,其中,++和C分別是電池的正極和負極電位。電池的開路電壓通常小于其電動勢。這是因為電池兩極電解液中的電極電位通常不是一個平衡的電極電位,而是一個穩(wěn)定的電極電位。通常可以認為,電池的開路電壓是電池的電動勢。
1.2研究意義
鋰離子電池自問世以來,到現(xiàn)在已經(jīng)發(fā)展成為我們每個人眾多生活必需品當中的一部分,是如今人們在日常生活中使用極其廣泛的一種電池。我國通訊、電力電子等相關(guān)行業(yè)的飛速發(fā)展,使人們對鋰離子電池的利用率和維護工作的重視程度不斷提高,鋰離子電池電量檢測的市場需求隨之越來越大。然而現(xiàn)在的實際情況卻是由于國內(nèi)目前的一些檢測設(shè)備的檢測方法不精確等原因,使其不能完全滿足我們對鋰離子電池電量檢測的需求,同時國外的同類檢測設(shè)備雖然性能較好,但是價格太高,不適合我們?nèi)粘z測使用。微處理器技術(shù)的發(fā)展與電池電量檢測方法的不斷改善,為提高鋰離子電池電量檢測系統(tǒng)的性能和降低其制造成本提供了可能。針對該要求,本文設(shè)計了一種基于單片機的鋰離子電池電量檢測系統(tǒng),該檢測系統(tǒng)的設(shè)計對全面掌握鋰離子電池的電量狀態(tài),提高其利用率具有現(xiàn)實意義。本設(shè)計的研究成果如果能夠得到大家的一致認同,以致今后被廣泛應(yīng)用于我們的日常生活當中,比如應(yīng)用于生活中常用的或常見的便攜式電子產(chǎn)品領(lǐng)域,這必將提高人們的日常生活質(zhì)量,并且還能起到提高鋰離子電池利用率的作用,從另一方面看,這也是從某種程度上響應(yīng)了國家“節(jié)能減排”政策。
1.3 主要研究內(nèi)容
該課題是設(shè)計一個鋰離子電池電量檢測系統(tǒng),研究對象為符合國標GB/T 18287-2000的鋰離子電池,其主要參數(shù)有:標稱電壓3.7V,標稱容量1050mAH,充電電壓4.2V。在做畢業(yè)設(shè)計的這段時間里,自己通過互聯(lián)網(wǎng)查詢、圖書館書籍資料搜索等多種途徑,對該課題的研究內(nèi)容進行了充分的理解與學習,使我對鋰離子電池的電量檢測原理,以及一些基于單片機的C程序編寫等內(nèi)容,都有了進一步的了解與掌握。
本課題研究如何設(shè)計一個滿足我們?nèi)粘I钜蟮匿囯x子電池電量檢測系統(tǒng),要求適用于日常使用,必須控制成本,并且需要滿足精度的要求。本文的設(shè)計思路是利用單片機及一些市場上常見的功能芯片,經(jīng)過綜合所有應(yīng)考慮的重要因素后,最終確定了該檢測系統(tǒng)里的一些重要器件類型,其鋰離子電池的電量檢測部分就選用流行于目前市場上并且較專業(yè)的電池電量檢測芯片BQ26500,輸出部分決定采用LCD輸出顯示。利用電池電量檢測芯片BQ26500,并且數(shù)碼輸出顯示我們所需數(shù)據(jù)的鋰離子電池電量檢測系統(tǒng),該系統(tǒng)由模擬量參數(shù)采集部分、電量檢測部分、中央處理控制部分(單片機)以及LED驅(qū)動顯示等相應(yīng)模塊組成,前兩部分可由BQ26500完成。至此,該基于單片機的鋰離子電池電量檢測系統(tǒng)的整體框架便已明了。
本文重點介紹了該鋰離子電池電量檢測系統(tǒng)的硬件設(shè)計和軟件設(shè)計。硬件設(shè)計的主要職責就是將系統(tǒng)分割成的各個功能部分組合成一個合理的可行性方案。





2. 總體方案設(shè)計2.1方案選擇
該系統(tǒng)總體結(jié)構(gòu)可以劃分為幾個重要部分:鋰離子電池模擬量參數(shù)采集部分、電量檢測部分、中央處理控制部分(單片機)和LED驅(qū)動顯示部分。每個部分重要器件的選型已經(jīng)在前面具體說明,將系統(tǒng)總體結(jié)構(gòu)分為以上各部分后,整個系統(tǒng)的工作原理及重要模塊等信息便簡單明了,系統(tǒng)每個部分都有著其自己重要的責任,只有系統(tǒng)內(nèi)的每個模塊都按其職責正常運行,整個鋰離子電池電池檢測系統(tǒng)才能正常工作。如圖2-1所示,該圖為鋰離子電池電量檢測系統(tǒng)的總體結(jié)構(gòu)框圖,其中模擬量參數(shù)采集部分負責通過傳感器及測量電路等來采集鋰離子電池的模擬量參數(shù),這些參數(shù)包括鋰離子在放電過程中的電流(壓)大小、檢測到的溫度值等相關(guān)參數(shù);電量檢測部分主要負責依據(jù)上部分已經(jīng)采集到的參數(shù),對鋰離子電池的電量進行檢測與計算,這兩個部分可由BQ26500完成;中央處理控制部分即單片機負責對整個系統(tǒng)進行控制;LCD驅(qū)動顯示部分負責驅(qū)動LCD,并對被測鋰離子電池的剩余電量信息進行數(shù)碼輸出顯示。
⑴根據(jù)設(shè)計要求,選擇STC89C51單片機為核心控制器件。
⑵A/D轉(zhuǎn)換采用ADC0809實現(xiàn),與單片機的接口為P1口和P2口的高四位引腳。
⑶將轉(zhuǎn)換結(jié)果進行運算,化為測量值。
方案一:
硬件電路設(shè)計由6個部分組成:A/D轉(zhuǎn)換電路,STC89C51單片機系統(tǒng),LCD顯示系統(tǒng)、時鐘電路、復(fù)位電路以及測量電壓輸入電路。硬件電路設(shè)計框圖如圖所示。
方案二:
硬件電路設(shè)計由6個部分組成:A/D轉(zhuǎn)換電路,STC89C51單片機系統(tǒng),LCD12864顯示系統(tǒng)、時鐘電路、復(fù)位電路以及測量電壓輸入電路。硬件電路設(shè)計框圖如圖所示。



方案論證:
    兩種方案相比較,第二種方案擁有明顯優(yōu)勢。首先方案一的功能太過單一,雖然達成了設(shè)計任務(wù),但實用性較差,沒有實際價值。如果對其進行功能擴展的話,雖然可以解決功能單一的缺陷,但又會由于過多的顯示內(nèi)容而導致由LED數(shù)碼管構(gòu)成的顯示模塊過于復(fù)雜,對焊接工作造成困難,同時顯示效果一般。反觀方案二,在吸取方案一的優(yōu)點的前提之下,將顯示模塊升級為LCD12864,這樣做就可以彌補方案一中的諸多不足,具有顯示內(nèi)容豐富,編程簡單,電路復(fù)雜程度低等優(yōu)勢。
    綜上所述,方案二是一套更為切實可行的方案。
2.2 LCD顯示部分

LCD 12864 外觀圖

2.2.1 LCD12864 概述
12864 是一種具有4 位/8 位并行、2 線或3 線串行多種接口方式,內(nèi)部含有國標一級、二級簡體 中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192 個16*16 點漢字,和128 個16*8 點ASCII 字符 集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機交互圖形界面?梢燥@示8×4 行16×16 點 陣的漢字. 也可完成圖形顯示.低電壓低功耗是其又一顯著特點。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點陣液晶 顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。 被測電流信號 ﹝或被測電壓信號 ﹞經(jīng)電流測頭1﹝或電壓測頭2﹞隔離變換,在二次回路形成高精度毫安級跟蹤電流,經(jīng)采樣電路3轉(zhuǎn)換為跟蹤電壓信號,在經(jīng)定標放大器4進行放大、定標,形成跟蹤電壓輸出Vg;跟蹤電壓信號經(jīng)AC/DC轉(zhuǎn)換器5后,形成直流電壓輸出 。 輸出經(jīng)V/I轉(zhuǎn)換器6后形成直流輸出 , 輸出經(jīng)V/F變換器7后形成頻率輸出 。只有輸出跟蹤電壓 的產(chǎn)品才使用正負電源﹝+E,-E﹞,其他產(chǎn)品才使用單一正電源。
圖2-1中電流測頭1和電壓測頭2是本系列產(chǎn)品的關(guān)鍵部件,屬于精密互感器系列,承擔隔離和線性變換的雙重作用,改變電流測頭規(guī)格或改變電壓測頭的輸入電阻可以改變傳感器的測量范圍。定標放大器4是一個寬帶交流放大器,它產(chǎn)生的電壓輸出 ,在波形和相位上快速跟蹤輸入信號的變化, 輸出型傳感器適用于交流采樣系統(tǒng)。轉(zhuǎn)換器5是配套研發(fā)的專用厚膜集成器件,它把交流電壓信號變換為直流電壓或直流電流輸出。轉(zhuǎn)換原理分為平均值轉(zhuǎn)換和真有效值轉(zhuǎn)換,平均值轉(zhuǎn)換器成本低,適用于標準正弦交流信號轉(zhuǎn)換;真有效值轉(zhuǎn)換器適用于含有多次諧波的交流信號(如三角波、矩形波、梯形波、可控硅調(diào)功波等),單成本較高。轉(zhuǎn)換器5(或轉(zhuǎn)換器6) 的“基準波”接地時,他輸出0~5V(或0~20mA);為它們配加以個高穩(wěn)定的偏置電路,就形成1V~5V(或4mA~20mA);為它們配加一個高穩(wěn)定的偏置電路,就形成了1V~5V(4mA~20mA)輸出。
2.2.2 LCD12864基本用途
1.使用前的準備
先給模塊加上工作電壓,再按照下圖的連接方法調(diào)節(jié)LCD的對比度,使其顯示出黑色的底影。此過程亦可以初步檢測LCD有無缺段現(xiàn)象。
2.字符顯示
帶中文字庫的128X64-0402B每屏可顯示4行8列共32個16×16點陣的漢字,每個顯示RAM可顯示1個中 文字符或2個16×8點陣全高ASCII碼字符,即每屏最多可實現(xiàn)32個中文字符或64個ASCII碼字符的顯示。帶中文字庫的128X64-0402B內(nèi)部提供128×2字節(jié)的字符顯示RAM緩沖區(qū)(DDRAM)。字符顯示是通過將字符顯示編碼寫入該字符顯示RAM實現(xiàn)的。根據(jù)寫入內(nèi)容的不同,可分別在液晶屏上顯示CGROM(中文字庫)、HCGROM(ASCII碼字庫)及CGRAM(自定義字形)的內(nèi)容。三種不同字符/字型的選擇編碼范圍為:0000~0006H(其代碼分別是0000、0002、0004、0006共4個)顯示自定義字型,02H~7FH顯示半寬ASCII碼字符,A1A0H~F7FFH顯示8192種GB2312中文字庫字形。字符顯示RAM在液晶模塊中的地址80H~9FH。字符顯示的RAM的地址與32個字符顯示區(qū)域有著一一對應(yīng)的關(guān)系,其對應(yīng)關(guān)系如下表所示。
80H
81H
82H
83H
84H
85H
86H
87H
90H
91H
92H
93H
94H
95H
96H
97H
88H
89H
8AH
8BH
8CH
8DH
8EH
8FH
98H
99H
9AH
9BH
9CH
9DH
9EH
9FH
3、圖形顯示
先設(shè)垂直地址再設(shè)水平地址(連續(xù)寫入兩個字節(jié)的資料來完成垂直與水平的坐標地址)
垂直地址范圍 AC5...AC0
水平地址范圍 AC3…AC0
2.3  電池電量檢測芯片BQ26500
2.3.1 測量原理
BQ26500的電量檢測原理我們也需要做簡單的了解,BQ26500內(nèi)置了溫度傳感器,它通過內(nèi)置的溫度傳感器和內(nèi)部計數(shù)器來估算被測鋰離子電池的放電程度,放電的同時還可以根據(jù)溫度需要進行溫度補償,并且能夠通過鋰離子電池的放電周期,校準鋰離子電池的實際容量,外接內(nèi)部寫有初始化程序的EEPROM,負責控制電池的管理工作,串口和外部EEPROM可以用來編程。
在日常生活中,使用鋰離子電池是一般都不需要進行溫度保護,因為日常情況下,鋰離子電池工作所在環(huán)境溫度不會超過其工作溫度范圍之外,除非需要該鋰離子電池一直處于長期的持續(xù)的工作狀態(tài),這時候應(yīng)該采取適當?shù)臏囟缺Wo措施。但是BQ26500是一款流行與目前市場上相當專業(yè)的電池電量檢測芯片,BQ26500對被測鋰離子電池進行電量檢測的同時,會檢測鋰離子電池的溫度情況,因為BQ2040內(nèi)置了溫度傳感器,可以進行過熱保護等控制措施,不需要外接熱敏電阻,如果檢測到溫度過低,這時候BQ26500還可以進行溫度補償,不需要外接諧振器等相關(guān)器件,進一步減少了器件,降低了設(shè)計成本。
2.3.2  電路圖設(shè)計
作為一款電池電量檢測芯片,BQ2040負責完成鋰離子電池的電量檢測模塊的功能,它先采集所需被測鋰離子電池的信號參數(shù),然后按照原先已經(jīng)設(shè)定好的算法檢測計算出被測鋰離子電池的電量,通過I2C總線與單片機部分進行數(shù)據(jù)交換,最終通過LCD驅(qū)動顯示部分數(shù)碼輸出顯示鋰離子電池的電量信息給用戶。電量檢測結(jié)果用LCD數(shù)碼輸出顯示,從而讓我們及時了解電量信息,完全掌握鋰離子電池的用電狀態(tài),提高利用率。
本系統(tǒng)電量檢測部分采用電池電量檢測芯片BQ2040,除了支持對鋰離子電池的高精度電量檢測,還滿足其他多種電池的電量檢測工作,比如能夠很好的檢測鎳鎘電池、鎳氫電池的電量。
                                  BQ26500 電路圖


2.4  數(shù)據(jù)傳輸存儲芯片24C642.4.1  24C64概述
24C64芯片屬于24C系列里面常見的一款,該系列的主要功能是數(shù)據(jù)的存儲及傳輸。既然是數(shù)據(jù)傳輸存儲芯片,那么就會有每款芯片帶有多少存儲位的問題,該系列的芯片擁有多少存儲位可以從24C后面的數(shù)字讀出來。如ATMEL的24C64,從后面的數(shù)字可以讀出其存儲位為64K。這個系列的芯片具有許多的優(yōu)勢,例如能重復(fù)擦寫1百萬次以上,并且在其內(nèi)部已經(jīng)存儲成功的數(shù)據(jù)能夠長期保持,時間達100年之久。24C64具有多種封裝形式可供選擇,現(xiàn)如今已被廣大電子行業(yè)從業(yè)者所接受,廣泛應(yīng)用于電力電子各個領(lǐng)域。
ATMEL的24C64是I2C 總線的EEPROM,I2C總線(Inter Integrated Circuit 內(nèi)部集成電路總線)是兩線式串行總線,只占用微處理器的2個I/O 引腳,僅需要時鐘和數(shù)據(jù)兩根線就可以進行數(shù)據(jù)傳輸,令用戶使用起來十分便捷。
2.4.2  24C64引腳說明
圖2-6  24C64引腳分布

表2.5  24C64引腳說明
引腳符號
引腳名稱
引腳描述
A0到A2
地址輸入端
確定連接器件的地址
SDA
串行數(shù)據(jù)端
需要附加一個上拉電阻,雙向引腳,可以輸出或輸入地址及數(shù)據(jù)。
SCL
串行時鐘輸入端
產(chǎn)生串行同步時鐘信號
VCC
電源輸入端
電源電壓輸入
GND
接地端
接地

2.4.3  24C64特性介紹
2.5  時鐘芯片DS13022.5.1  DS1302概述
DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。通過簡單的串行接口,采用三線接口與CPU進行同步通信,內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的靜態(tài)RAM。它具有主電源/后備電源雙電源引腳,VCC1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由VCC1或VCC2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,DS1302由VCC2供電;當VCC2小于VCC1時,DS1302由VCC1供電。
DS1302功能:①日期時間信息;②每月的天數(shù)和閏年的天數(shù)可自動調(diào)整;③通過AM/PM指示決定采用24或12小時格式;④保持數(shù)據(jù)和時鐘信息時功率小于1mW。
2.5.2  DS1302引腳說明
圖2-7  DS1302引腳分布



表2.6  DS1302引腳說明
引腳符號
引腳名稱
引腳描述
X1、X2
晶振引腳
32.768KHz
GND
接地引腳
接地
CE
復(fù)位腳
在讀/寫數(shù)據(jù)期間必須為高
I/O
數(shù)據(jù)輸入/輸出
三線接口時的雙向數(shù)據(jù)線
SCLK
串行時鐘引腳
控制數(shù)據(jù)的輸入與輸出
VCC1、VCC2
電源供電引腳
VCC1:主電源;VCC2:備份電源





3.軟件系統(tǒng)設(shè)計3.1 C語言簡介

C語言是近年來在國內(nèi)外普遍使用的一種程序設(shè)計語言。C語言功能豐富,表達能力強應(yīng)用廣,既有高級語言的特點,也有匯編語言的特點。C是中級語言。它把高級語言的基本結(jié)構(gòu)和語句與低級語言的實用性結(jié)合起來。C 語言可以像匯編語言一樣對位、字節(jié)和地址進行操作, 而這三者是計算機最基本的工作單元。

C是結(jié)構(gòu)式語言。結(jié)構(gòu)式語言的顯著特點是代碼及數(shù)據(jù)的分隔化,即程序的各個部分除了必要的信息交流外彼此獨立。這種結(jié)構(gòu)化方式可使程序?qū)哟吻逦,便于使用、維護以及調(diào)試。C 語言是以函數(shù)形式提供給用戶的,這些函數(shù)可方便的調(diào)用,并具有多種循環(huán)、條件語句控制程序流向,從而使程序完全結(jié)構(gòu)化。

C語言功能齊全。具有各種各樣的數(shù)據(jù)類型,并引入了指針概念,可使程序效率更高。另外C語言也具有強大的圖形功能,支持多種顯示器和驅(qū)動器。而且計算功能、邏輯判斷功能也比較強大。

3.2 程序設(shè)計流程3.2.1  初始化

初始化程序流程圖

初始化程序的功能就是初始化各個端口,使其各部件完成先前的準備工作。設(shè)置好各個端口的功能,比如哪些端口設(shè)置為中斷的輸入口,哪些設(shè)置為外部模塊。設(shè)置完成以后就可以打開各個中斷使能,使系統(tǒng)響應(yīng)相對應(yīng)的中斷跳轉(zhuǎn)程序。


3.2.2  主程序流程圖

主程序流程圖
3.2.3A/D轉(zhuǎn)換與中斷服務(wù)
AT89C51內(nèi)部有兩個16位的可編程定時器/計數(shù)器,T0和T1。定時器實際上是工作在計數(shù)方式下 ,只不過對固定平率的脈沖計數(shù),由于脈沖周期也固定,由計數(shù)值可以計算出計數(shù)時就愛你,有定時的功能。AT89C51的T/C是加1計數(shù)的。當工作在定時器方式時,對振蕩源12分頻的脈沖計數(shù),即每個機器周期計數(shù)值加1,計數(shù)速率1/12fosc,當fosc=12MHz時,計數(shù)速率=1000KHz,即計數(shù)器每加1用時1us。


  A/D轉(zhuǎn)換與中斷服務(wù)流程圖
3.3  BQ26500總線時序
BQ26500采用電源系統(tǒng)管理Veil.0(SMBus)協(xié)議,支持智能電池數(shù)據(jù)管理命令(SBData)和智能電池充電控制(SBData)功能,通過串行接口可以檢測鋰離子電池的充電狀態(tài)、剩余電量、放電剩余時間、電池材料等信息。
SMBus是System Management Bus的縮寫,譯為系統(tǒng)管理總線,SMBus是一種二線制串行總線,它大部分基于I2C(Inter-Integrated Circuit)總線規(guī)范。I2C兩線(串行數(shù)據(jù)SDA和串行時鐘SCL線)式串行總線,用于連接微控制器及其外圍設(shè)備,是微電子通信控制領(lǐng)域廣泛采用的一種總線標準。I2C是同步通信的一種特殊形式,具有接口線少,控制方式簡單,器件封裝形式小,通信速率較高等優(yōu)點。和I2C一樣,SMBus不需增加額外引腳,但是工作頻率只能在10kHz到最高100kHz范圍內(nèi),且專門面向智能電池管理應(yīng)用。SMBus為系統(tǒng)電源管理等任務(wù)提供了一條控制總線,使用SMBus的系統(tǒng),設(shè)備之間發(fā)送和接收消息都是通過SMBus,而不是使用單獨的控制線,這樣可以節(jié)省設(shè)備的管腳數(shù)。
SMBus最初的目的是為智能電池、充電電池和與其他系統(tǒng)通信的微控制器之間的通信鏈路而定義的,如今也被用來連接各種設(shè)備,包括電源相關(guān)設(shè)備,系統(tǒng)傳感器,EEPROM通訊設(shè)備等等,但SMBus最適用于筆記本電腦上,檢測各元件狀態(tài)并更新硬件設(shè)置。

4.總結(jié)
    硬件設(shè)計完成將待設(shè)計的系統(tǒng)分割成各個功能模塊,然后組合成一個合理的可行性方案的任務(wù),用Protel等相關(guān)軟件完成硬件原理圖的設(shè)計后,制成PCB板。軟件設(shè)計則負責根據(jù)系統(tǒng)相關(guān)的功能要求,進行模塊的編程等,完成硬件設(shè)計后,我們可以通過Keil4.0等類似軟件對單片機燒入程序,最后便可進行鋰離子電池電量檢測系統(tǒng)的檢測試驗,定時記錄相關(guān)數(shù)據(jù),對鋰離子電池電量檢測結(jié)果的準確性進行測試。
系統(tǒng)測試的思路可以針對BQ2040內(nèi)的三個重要寄存器:Full Charge Capacity(FCC)、Remaining Capacity(RM)、Discharge Count Register(DCR)。通過每隔一定時間讀取這三個寄存器的數(shù)據(jù),這樣記錄多組數(shù)據(jù)后,可以通過以下幾個主要關(guān)系進行驗證分析系統(tǒng)的準確性及可靠性:

我做的基于單片機的電量檢測系統(tǒng)課程設(shè)計完成了,基本上達到了預(yù)期的目的。當初拿到這個題目的時候都不知道怎么入手,但在老師的指導下,自己找資料、看書,總算完成了。通過此次的畢業(yè)設(shè)計,使我對單片機有了更深一層的了解,從理論和實踐我都得到了很大的提高,所以這次任務(wù)的完成使我學到了很多知識。首先,豐富了自己的知識面,學通了以前沒學通的東西,具體了解了怎么去完成一個電路的設(shè)計。在此次的設(shè)計中,學到了單片機AT89C51的內(nèi)部結(jié)構(gòu)及工作原理,了解了時鐘電路和控制電路的工作原理,還有共陽極數(shù)碼管的工作原理,同時也提高了我的C語言使用能力,并且挺高了自己分析問題和解決問題的能力,有了理論聯(lián)系實際的機會,為以后從事這個方面的工作打好了基礎(chǔ),這也是這次畢業(yè)設(shè)計的最大收獲。
這次的畢業(yè)設(shè)計總的來說還是比較成功的,能夠?qū)崿F(xiàn)電壓顯示,如果單獨查看電壓或電流,可以通過安檢控制查看電壓或電流,但是還是有許多不足之處,不過的確從中學到了很多,也發(fā)現(xiàn)了自己的很多問題,為自己以后的學習、進步打下了不錯的基礎(chǔ)。
致謝

經(jīng)過兩個多月的時間,我在導師廖建文的指導下,完成了整個系統(tǒng)的設(shè)計和制作。在這段時間當中,感受最深的就是解決問題的一些方法、技巧。在整個設(shè)計過程中,我遇到了很多的問題,通過查閱相關(guān)資料、冷靜理性的分析、方案的對比和實驗證明,最終解決了所遇到的問題。

對我而言,知識上的收獲重要,精神上的豐收更加可喜。挫折是一份財富,經(jīng)歷是一份擁有。這次實習必將成為我人生旅途上一個非常美好的回憶!此次課程設(shè)計,學到了很多課內(nèi)學不到的東西,比如獨立思考解決問題,出現(xiàn)差錯的隨機應(yīng)變,和與人合作共同提高,都受益匪淺,今后的制作應(yīng)該更輕松,自己也都能扛的起并高質(zhì)量的完成項目。對于我來說,收獲最大的是自己主動去解決問題,并在試驗中總結(jié)解決方法,學會去分析問題出現(xiàn)的原因,以及應(yīng)該從哪個部分去解決,但無法出現(xiàn)正確結(jié)果是,需耐心的檢查電路,因為大多數(shù)出問題都是因為一兩根線沒接或接錯的問題。
總體來說,通過這次課程設(shè)計學習,讓我對各種電路都有了大概的了解,也學會了常用繪圖軟件的使用,在平時的理論學習中遇到的問題都一一解決,加深了我對專業(yè)的了解,培養(yǎng)了我對學習的興趣,為以后的學習打下了好的開端,我受益匪淺。同時,讓我明白:這些電路還是應(yīng)該自己動手實際操作才會有深刻理解,才會有收獲,所謂“一行勝千言”果然不假。
最后,我要感謝我系安排了此次課程設(shè)計,這為我們以后的畢業(yè)設(shè)計奠定了良好的基礎(chǔ),并更好地復(fù)習和鞏固了以前學過的理論知識?傊,本次課程設(shè)計讓我們受益匪淺!

單片機源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. #define LCD_data  P0       //數(shù)據(jù)口
  6. uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  7. sbit CLK=P1^3;   //時鐘信號
  8. sbit ST=P1^2;    //啟動信號
  9. sbit EOC=P1^1;   //轉(zhuǎn)換結(jié)束信號
  10. sbit AD_OE=P1^0;    //輸出使能
  11. sbit LCD_RS  =  P2^6;      //寄存器選擇輸入
  12. sbit LCD_RW  =  P2^5;      //液晶讀/寫控制
  13. sbit LCD_EN  =  P2^7;      //液晶使能控制
  14. sbit LCD_PSB =  P3^2;      //串/并方式控制
  15. sbit LCD_RST =  P3^7;      //液晶復(fù)位端口
  16. sbit OE = P3^0;
  17. sbit LE = P3^1;
  18. signed char result = 0;
  19. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  20. /*********************************************************/
  21. uchar code  DIS1[] = {"**電壓測量系統(tǒng)**"};
  22. uchar code  DIS2[] = {"**U = --.- (V)**"};
  23. uchar code  DIS3[] = {"**I = --.- (A)**"};
  24. uchar code  DIS4[] = {"**P = --.- (W)**"};
  25. /*********************************************************/

  26. void DelayMS(uint ms)   //延時
  27. {
  28.               uchar i;
  29.               while(ms--)
  30.                             for(i=0;i<120;i++)
  31.                             {;}
  32. }

  33. void Display_Result(uchar d)   //顯示轉(zhuǎn)換結(jié)果
  34. {
  35.               P2=0xf7;  //第4個數(shù)碼管顯示個位數(shù)
  36.               P0=DSY_CODE[d%10];

  37.               DelayMS(5);

  38.               P2=0xfb;   //第3個數(shù)碼管顯示十位數(shù)
  39.               P0=DSY_CODE[d%100/10];

  40.               DelayMS(5);
  41.                                                                                                                                                                                                                                              
  42.               P2=0xfd;  //第2個數(shù)碼管顯示百位數(shù)
  43.               P0=DSY_CODE[d/100];
  44.               DelayMS(5);
  45. }

  46. void delay(int ms)
  47. {
  48.     while(ms--)
  49.               {
  50.       uchar i;
  51.                 for(i=0;i<150;i++)
  52.                  {
  53.                   _nop_();                                            
  54.                             _nop_();
  55.                             _nop_();
  56.                             _nop_();
  57.                  }
  58.               }
  59. }            
  60. /*******************************************************************/
  61. /*                                                                 */
  62. /*  延時函數(shù)                                                       */
  63. /*                                                                 */
  64. /*******************************************************************/
  65. void delay1(int ms)
  66. {
  67.     while(ms--)
  68.               {
  69.       uchar y;
  70.                 for(y=0;y<100;y++) ;
  71.               }
  72. }                                         
  73. /*******************************************************************/
  74. /*                                                                 */
  75. /*檢查LCD忙狀態(tài)                                                    */
  76. /*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數(shù)據(jù)。      */
  77. /*                                                                 */
  78. /*******************************************************************/
  79. bit lcd_busy()
  80. {                        
  81.     bit result;

  82.               LE = 1;
  83.               delay(1);

  84.               LCD_RS = 0;
  85.     LCD_RW = 1;
  86.     LCD_EN = 1;
  87.     delayNOP();
  88.     result = (bit)(P0&0x80);
  89.     LCD_EN = 0;
  90.             
  91.     delay(1);
  92.               LE = 0;

  93.     return(result);
  94. }
  95. /*******************************************************************/
  96. /*                                                                 */
  97. /*寫指令數(shù)據(jù)到LCD                                                  */
  98. /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             */
  99. /*                                                                 */
  100. /*******************************************************************/
  101. void lcd_wcmd(uchar cmd)
  102. {                        
  103.    while(lcd_busy());
  104.     LE = 1;
  105.               delay(1);
  106.             
  107.               LCD_RS = 0;
  108.     LCD_RW = 0;
  109.     LCD_EN = 0;
  110.     _nop_();
  111.     _nop_();
  112.     P0 = cmd;
  113.     delayNOP();
  114.     LCD_EN = 1;
  115.     delayNOP();
  116.     LCD_EN = 0;
  117.             
  118.               delay(1);
  119.               LE = 0;
  120. }
  121. /*******************************************************************/
  122. /*                                                                 */
  123. /*寫顯示數(shù)據(jù)到LCD                                                  */
  124. /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。                               */
  125. /*                                                                 */
  126. /*******************************************************************/
  127. void lcd_wdat(uchar dat)
  128. {                        
  129.    while(lcd_busy());
  130.                
  131.               LE = 1;
  132.               delay(1);
  133.     LCD_RS = 1;
  134.     LCD_RW = 0;
  135.     LCD_EN = 0;
  136.               delay(1);
  137.               LE = 0;

  138.     P0 = dat;
  139.     delayNOP();
  140.               LE = 1;
  141.               delay(1);
  142.     LCD_EN = 1;
  143.     delayNOP();
  144.     LCD_EN = 0;
  145.               delay(1);
  146.               LE = 0;
  147. }
  148. /*******************************************************************/
  149. /*                                                                 */
  150. /*  LCD初始化設(shè)定                                                  */
  151. /*                                                                 */
  152. /*******************************************************************/
  153. void LCD12864_init()
  154. {
  155.     LCD_PSB = 1;         //并口方式

  156.               LCD_RST = 0;                            //液晶復(fù)位
  157.     delay(3);                  
  158.     LCD_RST = 1;     
  159.     delay(3);

  160.     lcd_wcmd(0x34);      //擴充指令操作
  161.     delay(5);
  162.     lcd_wcmd(0x30);      //基本指令操作
  163.     delay(5);
  164.     lcd_wcmd(0x0C);      //顯示開,關(guān)光標
  165.     delay(5);
  166.     lcd_wcmd(0x01);      //清除LCD的顯示內(nèi)容
  167.     delay(5);
  168. }

  169. void T1_INIT(void )
  170. {
  171.               TMOD=0x02;  //T1工作模式2
  172.               TH0=0x14;
  173.               TL0=0x00;
  174.               IE=0x82;
  175.               TR0=1;
  176.               P1=0x3f;  //選擇ADC0809的通道3(0111)(P1.4~P1.6)
  177. }
  178. void Locker_init(void )
  179. {
  180.               OE = 0;
  181.               LE = 1;                           
  182. }
  183. /*********************************************************/
  184. /*                                                       */
  185. /* 設(shè)定顯示位置                                          */
  186. /*                                                       */
  187. /*********************************************************/
  188. void lcd_pos(uchar X,uchar Y)
  189. {                        
  190.    uchar  pos;
  191.    if (X==1)
  192.      {X=0x80;}
  193.    else if (X==2)
  194.      {X=0x90;}
  195.    else if (X==3)
  196.      {X=0x88;}
  197.    else if (X==4)
  198.      {X=0x98;}
  199.    pos = X+Y ;

  200.    lcd_wcmd(pos);     //顯示地址
  201. }
  202. /*********************************************************
  203. *                                                        *
  204. * 清屏函數(shù)                                               *
  205. *                                                        *
  206. *********************************************************/
  207. void  clr_screen()
  208. {
  209.    lcd_wcmd(0x34);      //擴充指令操作
  210.    delay(5);   
  211.    lcd_wcmd(0x30);      //基本指令操作
  212.    delay(5);
  213.    lcd_wcmd(0x01);      //清屏
  214.    delay(5);   
  215. }

  216. void Various(uchar line,uchar num)
  217. {
  218.               uchar a,b,c;
  219.               a = 48+num/100;
  220.               b = 48+num%100/10;
  221.               c = 48+num%10;
  222.             
  223.               switch( line )
  224.               {
  225.                             case 1:line = 0x80;
  226.                                              break;
  227.                             case 2:line = 0x90;
  228.                                              break;
  229.                             case 3:line = 0x88;
  230.                                              break;
  231.                             case 4:line = 0x98;
  232.                                              break;
  233.                             default:break;
  234.               }
  235.             
  236.               lcd_wcmd(line+3);      //寫入垂直坐標值
  237.               lcd_wdat(a);
  238.               lcd_wdat(b);
  239.               lcd_wdat('.');
  240.               lcd_wdat(c);            
  241. }

  242. void UI_Display(void )
  243. {
  244.               uchar i;
  245.             
  246.                  lcd_pos(1,0);             //設(shè)置顯示位置為第一行
  247.               for(i=0;i<16;i++)
  248.      {
  249.        lcd_wdat(DIS1[i]);
  250.        delay(30);
  251.      }

  252.      lcd_pos(2,0);             //設(shè)置顯示位置為第二行
  253.      for(i=0;i<16;i++)
  254.      {
  255.        lcd_wdat(DIS2[i]);
  256.        delay(30);
  257.      }
  258.      lcd_pos(3,0);             //設(shè)置顯示位置為第三行
  259.      for(i=0;i<16;i++)
  260.      {
  261.        lcd_wdat(DIS3[i]);
  262.        delay(30);
  263.      }
  264.      lcd_pos(4,0);             //設(shè)置顯示位置為第四行
  265.      for(i=0;i<16;i++)
  266.      {
  267.        lcd_wdat(DIS4[i]);
  268.        delay(30);
  269.      }
  270. }

  271. void AD_gather(void )
  272. {
  273.               ST=0;ST=1;ST=0; //啟動A/D轉(zhuǎn)換
  274. ……………………

  275. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
基于BQ26500電池測量.doc (871.46 KB, 下載次數(shù): 31)



作者: tb52088    時間: 2021-1-9 16:52
十分不錯的思路!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1