完整的太陽能充電器文檔下載地址(word格式可編輯):
http://www.zg4o1577.cn/bbs/dpj-79109-1.html
下面是部分內容預覽:
----------------------------------------------------------------------------------------
名稱 基于單片機的太陽能充電器的設計
隨著環境保護意識的增強,尋求潔凈能源的現實問題也日益顯現出來。具有清潔可再生的太陽能已經越來越受到人們的關注。本文提出了一個基于單片機的太陽能充電器的設計,它不但能環保節能,還可以在沒有電源充電時對手機進行應急充電。 喜歡外出或游玩的人通常會有手機沒電的經歷,提供充電的地方也不會到處都有,因此會出現手機因沒有電無法正常使用的情況。本次設計介紹一種通過單片機控制的太陽能手機充電器,它能將太陽能通過電路變換成穩定的直流電從而給手機充電,還可以在電池充好電以后有自動停止充電的功能,并且能當作一般的直流電源,讓我們減弱對市電的依靠,從而得到通信的自由。與傳統的充電器對比,太陽能充電器的優勢日益發揮出來。
目錄摘 要 Abstract 目錄 1 緒論 1.1 本課題研究背景及現狀 1.2 課題設計思想 1.3 文檔結構 2 基于單片機的太陽能充電器系統總體方案設計 2.1 設計方案一 2.2 設計方案二 2.3基于單片機的太陽能充電器的設計的總體設計方案 3 基于單片機的太陽能充電器系統的硬件設計 3.1太陽能電池板的選用 3.2 LM7805穩壓電路 3.3 充電主電路的設計 3.4 信號采集處理電路 3.6 單片機AT89C51介紹 3.7 單片機電路 3.7.1單片機復位電路 3.7.2 單片機時鐘電路 3.7.3 單片機A/D轉換電路 3.7.4按鍵電路 3.7.5數碼管顯示電路 3.8鋰電池充電原理 4 基于單片機的太陽能充電器系統的軟件設計 4.1 設計思想 4.2 基于單片機的太陽能充電器系統的整體程序設計 4.3 基于單片機的太陽能充電器系統的子程序的設計 4.3.1電路啟動初始化 4.3.2按鍵采集程序 4.3.3數據采集及模數轉換程序 4.3.4數碼管顯示子程序 4.3.5 充電子程序的設計 4.3.6電源子程序的設計 5 仿真與調試 5.1 充電電路仿真 5.2 電流采樣處理電路仿真 5.3系統做直流電源使用時電路仿真圖 5.4 系統做充電器使用時仿真結果 總結與展望 參考文獻 附錄A 整體電路圖 附錄B 整體程序 致謝
1 緒論
1.1 本課題研究背景及現狀當代社會隨著一些不可再生資源如煤炭,石油等日益減少,使得各國社會經濟越來越受能源問題的約制,因此許多國家開始逐漸的實行“陽光計劃”,開發潔凈的能源如太陽能,用以成為本國經濟發展的新動力。 首先讓我們想到的是太陽能電池,因為它不會消耗水,燃料等物質,并且不會釋放任何對環境有污染的氣體,是直接通過太陽光與材料的相互作用釋放出電能,這種無污染資源對環境的保護有著相當重要的意義[1]。由于無公害的作用,目前世界太陽能電池產業已經出具規模,1995年到2004年的十年內平均年增長率達到30%以上。隨著新型太陽能電池的涌現,以及傳統硅電池的不斷革新,新的概念已經開始在太陽能電池技術中顯現,從某種意義上講,預示著太陽能電池技術的發展趨勢[2]。世界各國對光伏發電也越來越重視,目前全世界已超過一百個國家使用光伏發電系統,其中以歐洲為代表的發達國家為主,占總市場的80.1%,早在09年的時候,世界各國總的光伏新加裝機容量接近800萬千瓦,截至當年低,世界光伏裝機容量總共接近2700萬千瓦[3]。隨著并網光伏發電市場的迅速發展,讓它受到了世界各地的關注。 目前,太陽能電池的應用已經逐漸廣泛得到推廣,眾所周知,沙漠地區由于氣溫特別高,因此最具有大規模開發太陽能的潛力,這使得沙漠等偏遠地區對其的使用更加方便,并且能減低甚至節省昂貴的輸電線路,從長遠發展狀況來看,隨著改善太陽能電池制造技術和新的光 - 電轉換裝置發明,國家環保和清潔能源,光伏發電系統和太陽能發電的巨大需求恢復將繼續利用太陽輻射能比較實用方法,這可以為人類以后能使用太陽能提供了廣闊的開辟前景[4]。 當代社會太陽能手機充電器得到了一定的使用,它具有運用方便,環保,節能,格外使用于應急場合,高效率充電,性價比較高,讓大家無論身處何處,都不會受到手機沒電的困擾[5]。借此太陽能手機充電器的眾多優點,因此提出本課題。 1.2 課題設計思想基于單片機的太陽能充電器的設計是本次探導的課題。首先,由于太陽能電池板的電壓會隨太陽光的強度波動,強烈的太陽光的太陽能電池板的電壓是高的數,當太陽光弱的強度,所述太陽能電池板的輸出電壓低時,從太陽能電池板的輸出到穩定的電壓[6]。本設計采用了穩壓器LM7805 , LM7805輸出端口可以輸出穩定的5V電壓,因為電力可以用于單芯片和其它芯片,其次,作為下一個電源電壓轉換電路。第二,考慮到電池的充電過程的電壓要求各不相同,不能簡單穩定的直流輸出,因此提出了利用DC / DC轉換器電路的,通過控制關斷時間的占空比,以調節輸出電壓。 SCM是控制中心,在控制信號產生電路是由充電過程的一個外部狀態產生的,外部充電電壓的比較信號和充電電流與理想充電過程中,占空比調節。單個微控制器設計用于該目的,所述電壓檢測電路和一個電流檢測電路,并且為了方便用戶知道系統的狀態,設計設置在顯示模塊和指標。 1.3 文檔結構 本文檔第一部分介紹了當前的形勢和太陽能電池和太陽能光伏發電系統,本研究的背景,并提出了設計思路的發展前景;第二部分論述整個系統的設計方案;第三部分介紹了系統的硬件電路設計;第四部分進行了系統軟件設計;第五部分進行了系統仿真分析;第六部分分析了該設計的成果和前景。
基于單片機的太陽能充電器系統總體方案設計
2.1 設計方案一方案一方框圖如圖2.1所示
1.003.jpg (11.92 KB, 下載次數: 146)
下載附件
2017-3-16 01:43 上傳
圖2.1方案一方框圖 該程序使用的DC / DC轉換電路,將太陽能電池板輸出的電壓變換為需要的電壓值給手機電池充電,同時單片機可以控制電路變換,還可采用按鍵設定某些值,有顯示部分,可以設定為顯示電路狀態。可以從該圖中的框圖中可以看出,該程序能夠控制DC / DC變換器電路,顯示模塊,但該程序是沒有實時檢測的外部電路,而不是用DC / DC實時控制根據外部電路的條件轉換電路。 2.2 設計方案二借于方案一存在的缺點,所以在此提出第二種方案,方案二方框圖如下圖2.2。
1.004.jpg (17.21 KB, 下載次數: 159)
下載附件
2017-3-16 01:43 上傳
圖2.2 方案二方框圖 如從圖2可以看出,以彌補設計用于檢測電路的狀態的方案的缺點,并通過模擬轉換到數字的轉換模塊的信號到微控制器。 PWM控制芯片微控制器可以產生施加PWM波轉換電路的控制主要模塊和顯示模塊,但此次方案是將生成PWM部分用芯片替換,這使得電路復雜硬件部分的設計,它是更好地使用軟件允許硬件電路簡單,而且還能充分利用單片機的功能。 2.3基于單片機的太陽能充電器的設計的總體設計方案綜合以上兩種方案提出本次設計的整體設計框圖如下圖2.3所示。
1.005.jpg (16.1 KB, 下載次數: 168)
下載附件
2017-3-16 01:43 上傳
圖2.3 整體設計框圖 相對于前兩種方案,此整體方案顯示的優點,不僅能對充電電路進行檢測,單片機還可以根據充電電路的關鍵電路的信號處理后的分析來檢測的情況進行控制可以選擇系統可以實現功能。顯示電路可以顯示用于實現本方案的電路中,PWM控制信號的工作狀態,從而使硬件電路非常簡單,節省資源,提高系統的性能。
3 基于單片機的太陽能充電器系統的硬件設計3.1太陽能電池板的選用太陽能電池板是通過吸收太陽光,將太陽輻射能通過光電效應或者光化學效應直接或間接轉換成電能的裝置,大部分太陽能電池板的主要材料為“硅”,但因制作成本很大,以致于它還不能被大量廣泛和普遍地使用。硅太陽能電池分為晶體硅電池板,非晶硅電池板等幾種。單晶硅太陽能電池的光電轉換效率為15%左右,最高通常可以達到24%,它是所有種類的太陽能電池中光電轉換效率最高的,但制作成本很大,以致于它還不能被普遍地使用,因為單晶硅通常會用鋼化玻璃和防水樹脂包裝起來,所以會十分耐用,通常能用十幾年,最長可以用25年。多晶硅太陽電池的制作過程與單晶的差不多,可相對而言起光電轉換效率要比單晶降低很多,其效率大概在12%左右 (其中世界上最高的多晶硅轉換效率為14.8%)[7]。但如果我們從制作費用上來講,多晶硅的由于制造簡單,節能節電,因此其生產費用就會降低不少,從而得到了一定的發展。另外,其使用年限沒有單晶硅太陽能電池那么長。如果從性價比來說,自然是單晶硅太陽能電池還略好。接下來我們說下非晶硅太陽電池,它是1976年出現的新型薄膜式太陽電池,其制造過程得到了很多簡化,對硅材料的使用很少,電耗也更低,它突出的優點是在很多情況下都能發電包括弱光時候。但它也有一定的問題,就是光電轉換效率相對而言偏低,就算國際上的先進水平也只大約在10%,不夠穩定,時間越久,其轉換效率會衰減。 根據所需要的不同數目的太陽能電池,其轉換效率是通過光,溫度和結晶型太陽能電池的制造工藝和其他因素的影響,2010年中國平均效率接近為18%,一般的太陽能電池電壓有很多種,其主要用于太陽能發電。 太陽能電池板的太陽能發電系統是其工作的基礎,是充電器的第一部分,其功能是將太陽光轉為電能,如今更多種類型的便攜式數字設備,電壓和電流范圍所需的輸入功率較大的器件,面積較大,必須使用太陽能電池板,這給了攜帶不便。因此,模塊化設計的組合,可根據不同的負載充電需求,太陽能電池板組合起來以實現一組光伏電池在某個期望的輸出功率和輸出電壓。本文通過一些常用的小功率設備例如手機,來講解太陽能充電器設計的過程。 3.2 LM7805穩壓電路由于太陽能電池板的電壓會隨太陽光的強度波動,強烈的太陽光會使太陽能電池板的電壓變高,當太陽光強度變弱時,自然會使電池板輸出電壓變低。為了獲得到穩定的輸出,本設計應用穩壓管LM7805,其輸出口能輸出穩定的所需要電壓(5V),以便能保持穩定的輸出電壓。典型LM7805的應用電路圖如圖3.1所示。
1.006.jpg (22.21 KB, 下載次數: 135)
下載附件
2017-3-16 01:43 上傳
圖3.1 LM7805穩壓電路圖 圖中C4、C7的是用于清除因長期連接時由于電感效應產生的自激振蕩,降低了紋波電壓,在其輸出端接上電容C6、C5的作用是清除電路高頻產生的噪聲,以便提高所用負載的瞬態響應。一般來說電容的耐壓性都會比電源輸入、輸出電壓要強。此外,在穩壓器輸入、輸出端之間加上二極管,可以避免對穩壓器的破壞,從而實現對LM7805的保護。 LM7805輸入電壓在7V至37V之間,其最大工作電流可達1.5A,且擁有電路精簡,電流輸出高,運行工作穩定,即使電壓不穩定,也能使太陽能電池擁有不變的輸出電壓(5V),最后能讓單片機控制的電路正常穩定的運行,并且性價比高,不需要消耗多余的材料。 3.3 充電主電路的設計充電主電路圖如圖3.2所示。
1.007.jpg (20.08 KB, 下載次數: 152)
下載附件
2017-3-16 01:43 上傳
圖3.2電池充電電路圖 DC/DC變換是將直流電能(DC)轉換成另一種固定電壓或電壓可調的直流電能,又可稱成直流斬波[8]。若其輸出電壓較輸入之電源電壓低,則稱為降壓式(Buck )直流斬波器即頻率調制(1)Buck電路,若其輸出電壓較輸入之電源電壓高,則稱為升壓式(Boost)直流斬波器。主電路核心由圖可以看出,主要由三部分組成即電感L1,三極管區和續流二極管D1,其也就形成了一個完整的BUCK降壓DC/DC轉換電路;上圖Q2是具有將PWM信號打開變大,從而到達驅動Q1開關管的功能。 3.4 信號采集處理電路為了使鋰電池能完成安全充電,本設計的電流取樣處理電路圖如下圖3.3所示
1.008.jpg (13.31 KB, 下載次數: 137)
下載附件
2017-3-16 01:43 上傳
圖3.3電流取樣處理電路圖
電池電壓與單片機A/D接口相連,通過A/D轉換和微控制器即單片機,以獲得測量的電壓值得到計算處理。此次充電電流通過0.1Ω的取樣電阻,產生的電壓再使用LM358,將電流取樣電壓放大相應的倍數后輸到單片機A/D接口進行采集。電壓檢測輸出電壓直接進行模數轉換之后被發送到A/D輸入接口的單片機進行處理。 3.5 單片機選型 單片機型號眾多,但大家熟悉了解的就那么幾種類型。我們在學校接觸到的也就是C51系列,C51是51單片機C語言程序設計的簡稱,由于接觸到的單片機以型號為AT開頭的為多,所以選用了型號是AT89C51為此次設計的單片機。 3.6 單片機AT89C51介紹AT89C51是一種帶4K字節FLASH存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機[9]。AT89C2051是一種帶2K字節閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃速存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。AT89C51單片機引腳圖如下圖3.4所示。
1.009.jpg (24.32 KB, 下載次數: 135)
下載附件
2017-3-16 01:43 上傳
圖3.4 單片機引腳圖 以下為其引腳功能及作用 VCC:供電電壓。 GND:接地。 P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P0口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的低八位。在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須接上拉電阻。 P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為低八位地址接收。 P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內部上拉優勢,當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1”后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 P3口也可作為AT89C51的一些特殊功能口,如下表所示: 口管腳 備選功能 P3.0 RXD(串行輸入口) P3.1 TXD(串行輸出口) P3.2 /INT0(外部中斷0) P3.3 /INT1(外部中斷1) P3.4 T0(計時器0外部輸入) P3.5 T1(計時器1外部輸入) P3.6 /WR(外部數據存儲器寫選通) P3.7 /RD(外部數據存儲器讀選通) P3口同時為閃爍編程和編程校驗接收一些控制信號。 RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。 ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的低位字節。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數據存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執行狀態ALE禁止,置位無效。 /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。 /EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。 XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。 XTAL2:來自反向振蕩器的輸出。 3.7 單片機電路
3.7.1單片機復位電路單片機復位電路圖如圖3.5所示。
1.010.jpg (6.81 KB, 下載次數: 142)
下載附件
2017-3-16 01:43 上傳
圖3.5復位電路圖 當系統正常工作時,由于上圖使用的是按鍵復位,當電源給電容充電的過程中,會使電容存儲的電能增加,致使單片機復位端電平減低,這時候得人為的按下鍵,才能使電平變高,單片機收集到信號后就會自動復位。 3.7.2 單片機時鐘電路單片機可作為驅動時鐘定時邏輯電路,在其工作過程中可以看出,所有的工作都是在時鐘信號的控制下進行的,當執行一個指令事,CPU控制器必須發出一系列特定的控制信號。單片機時鐘電路圖如圖3.6所示
1.011.jpg (10.02 KB, 下載次數: 157)
下載附件
2017-3-16 01:43 上傳
圖3.6單片機時鐘電路圖 3.7.3 單片機A/D轉換電路ADC0809是8位的采樣分辨率,以模擬數字轉換的逐次逼近原理。ADC0809由一個8通道模擬開關,地址鎖存器,解碼器, A/D轉換器。內部有一個8通道多路復用器,它能根據信號的地址鎖存譯碼后,門控8模擬輸入信號的A/D轉換。多路開關可選通8個模擬通道,允許8路模擬量分時輸入,共用A/D轉換器轉換。數字鎖存器的A/D轉換完成三態輸出鎖存器,當OE端為高電平,可以從三態輸出鎖存器的數據轉換。A/D轉換的數據要發送數據后,應該傳給單片機進行處理。關鍵的問題是如何確定數據的A/D轉換完成轉移,因為只有確認完成后,可以發送。A/D轉換電路圖如圖3.7所示
1.012.jpg (45.21 KB, 下載次數: 142)
下載附件
2017-3-16 01:43 上傳
圖3.7 A/D電路圖 ADC0809的引腳功能及作用 IN0~IN7:8路模擬量輸入端。 2-1~2-8:8位數字量輸出端。 ADDA、ADDB、ADDC:3位地址輸入線,用于選通8路模擬輸入中的一路。 ALE:地址鎖存允許信號,輸入端,高電平有效。 START: A/D轉換啟動脈沖輸入端,輸入一個正脈沖(至少100ns寬)使其啟動(脈沖上升沿使0809復位,下降沿啟動A/D轉換)。 EOC: A/D轉換結束信號,輸出端,當A/D轉換結束時,此端輸出一個高電平(轉換期間一直為低電平)。 OE:數據輸出允許信號,輸入端,高電平有效。當A/D轉換結束時,此端輸入一個高電平,才能打開輸出三態門,輸出數字量。 CLK:時鐘脈沖輸入端。要求時鐘頻率不高于640KHz。 REF(+)、REF(-):基準電壓。 Vcc:電源(+5V)。 GND:接地。 3.7.4按鍵電路按照鍵盤與單片機的連接方式分為獨立式鍵盤和矩陣式鍵盤[11]。獨立式鍵盤相互獨立,每個按鍵占用一根I/O口線,每根I/O口線上的按鍵工作狀態對其他按鍵的工作狀態不會產生不好作用。這種按鍵軟件程序簡單,但占用I/O口線較多(一根口線只能接一個鍵),適用于鍵盤應用數量較少的系統中。矩陣式鍵盤又稱行列式鍵盤,與獨立式鍵盤對比,單片機口線資源利用率提高了一倍。 按鍵接線圖如圖3.8所示。
1.013.jpg (5.08 KB, 下載次數: 150)
下載附件
2017-3-16 01:43 上傳
圖3.8按鍵電路圖
鍵盤抖動的時間一般為5~10ms,抖動現象會引起CPU對一次鍵操作進行多次處理,從而可能產生錯誤,因而必須設法消除抖動的不良后果。通過去抖動處理,可以得到按鍵閉合與斷開的穩定狀態。為了準確判斷閉合鍵的位置,要對每個按鍵進行編碼。根據矩陣式鍵盤的結構,采用行掃描的鍵位識別方法。使某條列線為低電平,如果這條列線上沒有閉合鍵,則各行線的狀態都為高電平;如果列線上有鍵閉合,則相應的那條行線即變為低電平。于是就可以根據行線號與列線號計算出閉合鍵的鍵碼。掃描時由第一列開始,即由PA口先輸出0FEH,然后由PC口輸入行線狀態,判斷哪一行有鍵閉合,若無鍵閉合,再輸出0FDH檢測下一列各行鍵閉合狀態,由此一直掃描下去。 在這個設計中,按鍵的數量設置為3,它們中的一個作為一個復位按鈕;另一個作為電壓按鍵,這樣的設計提供3V,3.5V,4.0V,4.5V為周期的四個電壓值,可以“電壓選擇”鍵選擇一個電壓輸出;另一個開始充電,裝上一個電池為電池充電,當按下“開始充電”按鈕,系統開始為鋰電池充電。因此,使用一個獨立的密鑰的方法,它可以減少編程的難度。 3.7.5數碼管顯示電路LED數碼管組成的多個發光二極管打包在一起,以形成“8”字狀的裝置中,連接導線已在內部做好,只要能導致它們導出各自的筆劃,公共電極。 數碼管顯示電路圖如圖3.9所示
1.014.jpg (39.71 KB, 下載次數: 155)
下載附件
2017-3-16 01:43 上傳
圖3.9 數碼管顯示電路圖
本設計使用四位LED數碼管數碼管段加小數點為7或8個數碼管,數碼管有兩種陰陽,本設計采用共陰極數碼管,8段LED陰極接地連接在一起,陽極當某一高電平時,二極管被點亮而發光,設計時允許數碼管陽極的某一組合被設置高。 3.8鋰電池充電原理鋰電池充電的工作原理就是指其充放電原理。充電時鋰離子由正極向負極運動而嵌入石墨層中。放電時,鋰離子從石墨晶體內負極表面脫離移向正極。所以,在該電池充放電過程中鋰總是以鋰離子形態出現,而不是以金屬鋰的形態出現。一般而言電池容量指的就是放電容量。可以看到,鋰電池在充放電的過程中,鋰離子是存在于正極 → 負極 → 正極的運動狀態。如果我們把鋰電池形象地比喻為一把搖椅,搖椅的兩端為電池的兩極,而鋰離子就象優秀的運動健將,在搖椅的兩端來回奔跑。 鋰蓄電池的充電特性曲線圖如圖3.10所示:
1.015.jpg (9.66 KB, 下載次數: 153)
下載附件
2017-3-16 01:43 上傳
圖3.10鋰電池充電特性曲線圖 為保證安全充電,對鋰離子電池充電要求首先是在充電時保持電流不變,電池電壓會在充電過程中漸漸升高,當電池端電壓達到4.2V(4.1V),會改變充電狀態,即變化為電壓不變的恒壓充電。電流會依照電芯的飽和程度,隨著充電過程的漸漸降低,當降低到0.01CA時,認為充電終止。大家注意,其中C是以電池標稱容量對照電流的一種表示方法,如電池是1000mAh的容量,1C就是充電電流1000mA,注意是mA而不是mAh,0.01CA就是10mA。當然,規范的表示方式是0.01C5A。
4 基于單片機的太陽能充電器系統的軟件設計
4.1 設計思想
首先主程序由初始化段和循環主體段兩部分組成,在執行循環體時,需要一個個的調用所需的任務模塊,不會直接去執行程序,其中每一個任務為一個子函數,這種機制也叫稱為輪詢機制。舉個例子說明:就是當一個正在被主程序執行的子函數,它會自動確認其執行條件有無可行性,如果可以就執行,反之,就會返回。按鍵處理是以10ms為周期的選擇一次。PWM的控制調節不能過快,最好以200ms為周期,如果太快,會影響到數碼管刷屏,A/D采樣速度也是一樣。 子程序主要由4部分組成,包括初始化程序,PWM波程序,按鍵采集程序,信號采集與轉換程序;如果從系統表現出的功能來看,又可以分成充電子程序、電源子程序,這兩程序都會用到子程序的4個程序。 本次設計使用的PWM波是可以掌控開關管的占空比,它的生成是運用了輸出在低電平和高電平的轉換、延時。即當輸出為低電平時,將輸出信號放大驅動開關管斷開,反之,如果其為高電平時,開關管則會打開。開關管的占空比是通過低電平和高電平的時間的比值(即PWM波的占空比)來控制。 本設計單片機采用AT89C51芯片,由于其內部沒有AD轉換模塊,單片機需外接轉換模塊,本設計采用ADC0809,模擬信號輸入有兩路,一路是電壓信號,一路是電流信號。ADC0809 在對多路輸入的模擬量進行模數轉換時采用分時復用的方法,即AD轉換器對兩路信號輪換采集轉換。輪換周期根據模數轉換時間和控制的情況設定。
4.2 基于單片機的太陽能充電器系統的整體程序設計 本設計由單片機程序控制來實現整體工作,其工作過程主要為:電路啟動初始化,電路功能的選擇,輸出選擇及確定輸出,單片機集合計算輸出PWM信號,定時采集數據及處理調節PWM信號占空比等,程序整體框架圖如下圖4.1所示。
1.016.jpg (17.2 KB, 下載次數: 147)
下載附件
2017-3-16 01:43 上傳
圖4.1 程序整體框架流程圖 4.3 基于單片機的太陽能充電器系統的子程序的設計
4.3.1電路啟動初始化初始化設置初始運行環境為單片機運行,主要完成以下任務:清理片內RAM,每一個微控制器上電,上電復位將導致單片機操作。在復位操作完成后,單芯片寄存器將被設置為不同的值,該值的一個相當大的部分是未知的。在微控制器的復位完成這些未知的值,正式工作后,會產生不能讓程序員掌握的后果,甚至會損壞系統。因此,微控制器運行后,先設置為0,這樣的初始參數設置,方便編程人員掌握,以方便系統的工作。設置系統運行所需的參數,設置定時器和中斷設置。 初始化程序流程圖如下圖4.2所示。
1.017.jpg (15.77 KB, 下載次數: 134)
下載附件
2017-3-16 01:43 上傳
圖4.2 初始化程序流程圖 4.3.2按鍵采集程序鍵盤子程序用于檢測開關,是否在有效的開關狀態來決定是否啟動系統運行。讀線、讀取、連接到該端口,它的值存儲處理后確定相關的緩存。看完端口在其中做了一定的延遲,以排除引起的誤動作鍵晃動。按鍵子程序結構流程圖如圖4.3所示。
1.018.jpg (14.99 KB, 下載次數: 136)
下載附件
2017-3-16 01:43 上傳
圖4.3按鍵子程序結構流程圖 4.3.3數據采集及模數轉換程序數據收集主要是由單片機控制ADC0809來完成,該方案分為數據初始化,發送一個命令到開始轉換,等待轉換結束,接收數據,處理且存儲在緩存中,程序流程如圖4.4所示。
1.019.jpg (14.32 KB, 下載次數: 141)
下載附件
2017-3-16 01:43 上傳
圖4.4 數據采集子程序結構流程圖 4.3.4數碼管顯示子程序開機時,先讓數碼管初始化,通過串口為“0”字形碼輸出使數碼管顯示“O”。然后來確認按鍵是否被按下,如果沒有鍵被按下繼續確認。 顯示子程序時要先初始化串口,以致串口工作會顯示在方式0,以便讀取顯示緩沖區的數據(其用來存儲數據也就是將被顯示出來的數據),然后找到通過字形碼查表相應的方式,再將字形碼寫入串口寄存器SBUF通過串口方式0發送出去顯示。子程序是如何顯示在緩沖區中的數據轉換成相應的字形碼呢?具體方法是,從小型字形碼到每一位十六進制數到大的順序固定區域,以便存儲在表單中顯示出來碼表的記憶。當要顯示的字符,該表的起始地址到數據指針DPTR寄存器為基地,在顯示緩沖區中的數據作為偏移到索引寄存器A,查表“MOVCA,@ A + DPTR“,在取出相應數字的字形碼其是通過累加器A得到的結果。
4.3.5 充電子程序的設計充電過程分兩階段進行,第一階段為預充電,充電電流以0.01CA的小電流進行充電;第二階段,當充電電壓達到3V時轉入第二階段(一般認為三分鐘后電池電壓大于3V),以0.5CA的電流進行恒流充電方式,。電流降到小于0.01CA時,表明電池已充到額定容量,如果繼續充下去,充電電流會慢慢降低到零,電池完全充滿[4]。充電過程中,“充電”指示燈亮;充滿時,“充飽”指示燈亮,“充電”指示燈滅,通過按鍵設置可控制充電時間。充電子程序流程圖如圖4. 5所示。
1.020.jpg (35.76 KB, 下載次數: 151)
下載附件
2017-3-16 01:43 上傳
圖4.5 充電子程序圖 4.3.6電源子程序的設計 與傳統的手機充電器相比,本次設計的太陽能手機充電器最大的優點是不僅能夠為電池直接充電,也可用作一般直流電源。該系統存在并且可以有3V,3.5V,4V,4.5V四種電壓輸出,這可以用來選擇一個按鈕作為輸出電壓。直流輸出可直接給手機充電,或作為電源等小型電子設備,如MP4。輸出電壓可以是一個數字顯示,以及完善一個過流保護作用,以確保能安全使用的電子產品。 電源程序流程圖如圖4.6所示。
1.021.jpg (23.23 KB, 下載次數: 149)
下載附件
2017-3-16 01:43 上傳
1.022.jpg (1.41 KB, 下載次數: 146)
下載附件
2017-3-16 01:43 上傳
圖4.6 電源子程序結構流程圖
5 仿真與調試5.1 充電電路仿真總所周知buck斬波電路中調整輸出電壓值的變化是由控制開關管開通與關斷時間控制, multisim仿真電路如下圖5.1所示
1.023.jpg (29.91 KB, 下載次數: 146)
下載附件
2017-3-16 01:43 上傳
圖5.1電壓檢測仿真圖 5.2 電流采樣處理電路仿真上面提出將電流采樣電壓是采用LM358電路讓其放大到相應倍后再輸送到單片機的A/D接口,輸入的電壓是5V時,輸出時的電壓則為125V,這樣就能看出其電路所具有放大多少倍(計算可得21倍)的功能。如下圖5.2所示
1.024.jpg (18.89 KB, 下載次數: 163)
下載附件
2017-3-16 01:43 上傳
圖5.2電流采樣處理電路仿真圖
5.3系統做直流電源使用時電路仿真圖Protues軟件因為不存在太陽能電池模擬模塊,所以在仿真時我們把穩壓輸出電壓值用直流電源電壓為5V的來更換,當數字到達3時,表示充電已經完成。按復位鍵會顯示0,點開始鍵表示開始充電。整體電路仿真圖如下圖5.4所示
1.025.jpg (30 KB, 下載次數: 176)
下載附件
2017-3-16 01:43 上傳
圖5.3 整體電路仿真圖 5.4 系統做充電器使用時仿真結果充電器在運行過程中它會隨著充電的進行,充電電壓會漸漸升高,指示燈會從0逐漸變成3,此過程可表示充電從開始到結束。仿真結果如下圖5.4、5.5、5.6所示。
1.026.jpg (39.25 KB, 下載次數: 142)
下載附件
2017-3-16 01:43 上傳
圖5.4 充電過程仿真
1.027.jpg (39.46 KB, 下載次數: 170)
下載附件
2017-3-16 01:43 上傳
圖5.5 充電過程仿真
1.028.jpg (39.45 KB, 下載次數: 137)
下載附件
2017-3-16 01:43 上傳
圖5.6 充電過程仿真
總結與展望時光飛逝,離開大學的日子也漸漸向我們走來,隨之而來的設計也即將完成。通過一段時間的努力,我的設計的任務終于結束了。設計是對我們整個大學期間學習的一次總結性的檢驗,通過設計的過程能檢驗我們大學期間的基礎理論學習是否扎實,各種知識間的結合是否靈活,能否嚴格,全面,系統的結合所學的知識解決實際的問題。經過此次設計,我才明白學習是一個長期積累的過程,在以后的工作、生活中都應該不斷的學習,努力提高自己知識和綜合素質。根據本次設計方案,我設計了一個由單片機控制的充電器,在充電過程中我們會看到方形波帶寬會逐漸變寬,并且會顯示出“1”,“2”,“3”數字,在充電完成后波形消失,顯示成一條直線,我設置了一個復位鍵,當我按下鍵時,它會重新充電。 本次設計能初步完成以上功能,但設計不足之處很多。主要表現在以下幾點:第一、本此設計顯示模塊采用了數碼管,不如采用液晶顯示,硬件電路簡單,能省去一些I/O口來實現更多的功能。第二,沒有采用溫度檢測,一般快速充電電流會比較大,在不超過允許充電電流的情況下,電池溫度也會升高,若能加溫度監測模塊,當溫度超過允許值時,終止充電會減少因溫度過高給電池帶來的危害。第三、沒有采用電能存儲裝置,不能存儲電能備天氣狀況不好并且沒有市電的情況使用,若有電能存儲功能,可以將系統閑置時太陽能電池板轉化的電能存儲起來,作為電源給別的用電設備使用,這樣可以即方便又節能環保。能源的日益緊張,太陽能電池板、充放電控制器、蓄電池等構成的產品都有了相對成熟的發展,相信不久之后太陽能手機充電器的應用將會變得普遍[9]。
附錄A 整體電路圖
1.029.jpg (110.74 KB, 下載次數: 185)
下載附件
2017-3-16 01:43 上傳
致謝
在此要感謝周建華對我悉心的指導,感謝給我的幫助。在設計過程中,我通過查閱大量有關資料,與同學交流經驗和自學,不斷問問題,也非常細心仔細的教導我。這使自己學到了不少知識,自然會經歷了不少艱辛,但收獲同樣巨大。在整設計中讓我收獲頗多,不僅培養了我獨立工作的能力,也樹立了對自己一些能力的信心,相信會對今后的學習工作生活有非常重要的幫助。這也提高了動手的能力,使我充分體會到了在創造過程中探索的艱難和成功時的喜悅。總之,此次順利完成,我由衷的感謝大家對我的幫助與支持。
源程序:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit P3_3=P3^3; //開始充電
- sbit P3_4=P3^4; //電壓切換
- sbit PWM=P3^5;
- sbit EOC=P3^1; //定義ADC0808的控制引腳/
- sbit OE=P3^0;
- sbit START=P3^2;
- sbit P3_6=P3^6;
- sbit P3_7=P3^7;
- sbit wela=P2^1;
- sbit dula=P2^0;
- uchar time=0,time1=0;
- uchar period=40;
- uchar high=6,high1=12;
- uchar th0=0;
- uchar tl0=1;
- uchar i=0,j=0;
- uint x,z,n;
- uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //uchar n=0;
- //uchar flag1;
- //unsigned char volatile g_delay_count;
- uchar disp[4]={0,0,0,0}; //顯示數據,保存段碼,四位/
- //================================/
- void delay(uchar z) //100us延時子程序/
- {
-
- while(z--);
- }
- //==============================/
- void display() //定義顯示子函數/ 可以使用鎖存器實現
- {
- for(n=0;n<4;n++)
- {
- P0=0x00;
- dula=1;
- P0 =disp[1]; //顯示第一位小數
- dula=0;
- wela=1;
- P0=0xfb;
- wela=0;
- delay(2);
- P0=0x00;
- dula=1;
- P0=disp[2]; //顯示第二位小數
- dula=0;
- wela=1;
- P0=0xfd;
- wela=0;
- delay(2);
- P0=0x00;
- dula=1;
- P0 =disp[3]; //顯示第三位小數
- dula=0;
- wela=1;
- P0=0xfe;
- wela=0;
-
- delay(2);
- P0=0x00;
- dula=1;
- P0 =disp[0]+0x80;
- dula=0;
- wela=1;
- P0=0xf7;
- wela=0;
-
- delay(2);
- }
- }
- //===============================/
- uint ADC0808() //定義ADC0808讀入數據子函數,并通過函數返回/
- {
- uchar d ;
- uchar value;
- START=1;START=0; //啟動ADC0808,開始A/D轉換/
- while(!EOC); //等待ADC0808,轉換結束,即EOC為高電平/
- OE=1;
- if(time1<high1)
- {d=P1; //讀入數據/
- if(high1==16)
- {
- value=0.4*d;
- }
- else if(high1==20)
- {
- value=0.5*d;
- }
- else if(high1==24)
- {
- value=0.6*d;
- }
- else if(high1==28)
- {
- value=0.7*d;
- }
- else if(high1==32)
- {
- value=0.8*d;
- }
- else if(high1==36)
- {
- value=0.9*d;
- }
- } //允許ADC0808輸出數據 /
- if(time<high)
- {d=P1; //讀入數據/
- if(high==8)
- {
- value=0.2*d;
- }
- else if(high==10)
- {
- value=0.25*d;
- }
- else if(high==12)
- {
- value=0.3*d;
- }
- else if(high==14)
- {
- value=0.35*d;
- }
- else if(high==16)
- {
- value=0.4*d;
- }
- else if(high==18)
- {
- value=0.45*d;
- }
- else if(high==20)
- {
- value=0.5*d;
- }
- else if(high==22)
- {
- value=0.55*d;
- }
- else if(high==24)
- {
- value=0.6*d;
- }
- else if(high==26)
- {
- value=0.65*d;
- }
- else if(high==28)
- {
- value=0.7*d;
- }
- else if(high==30)
- {
- value=0.75*d;
- }
- else if(high==32)
- {
- value=0.75*d;
- }
- else if(high==34)
- {
- value=0.8*d;
- }
- else if(high==36)
- {
- value=0.85*d;
- }
- }
- OE=0; //禁止ADC0808數據輸出/
- return value; //返回A/D轉換數據/
- }
- //=================================/
- void convert(uint x) //定義顯示碼轉換子函數/
- {
- uchar code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定義0~9顯示碼/
- x=x*1.0/255*5000; // 處理數據使其在0~5v范圍內/
- disp[3]=dispcode[x%10]; //第三位小數,最低位/
- disp[2]=dispcode[x/10%10]; //第二位小數/
- disp[1]=dispcode[x/100%10]; //第一位小數/
- disp[0]=dispcode[x/1000]; //整數部分/
- }
- void timer0() interrupt 1 using 1
- {
- TH0=0xff; /*定時器初值重裝載*/
- TL0=0xf6;
- time++;
- if(time==high) /*高電平持續時間結束,變低*/
- { PWM=th0; /*經過反相器反相*/
- }
- else if(time==period) /*周期時間到,變高*/
- { time=0;
- PWM=tl0; /*經過反相器反相*/
- }
- }
- void timer1() interrupt 3 using 3
- {
- TH1=0xff; /*定時器初值重裝載*/
- TL1=0xf6;
- time1++;
- if(time1==high1) /*高電平持續時間結束,變低*/
-
- { PWM=th0; /*經過反相器反相*/
- }
- else if(time1==period) /*周期時間到,變高*/
- { time1=0;
- PWM=tl0; /*經過反相器反相*/
- }
- }
- void main()
- {
- OE=0; //ADC0808初始化/
- START=0;
- EOC=1; //將單片機的引腳(EOC輸入端)置成輸入狀態/
- P3_3=0;
- P3_4=0;
- P3_6=1;
- P3_7=1;
- TMOD=0x11; /*定時器0方式1*/
- TH0=0xff; /*定時器裝載初值,設置脈沖信號的占空比為1/5*/
- TL0=0xf6;
- ET0=1;
- // TR0=1;
- TH1=0xff; /*定時器裝載初值,設置脈沖信號的占空比為1/5*/
- TL1=0xf6;
- ET1=1;
- // TR1=1;
- while(1)
- {
- if(P3_3==1)
- {
- EA=1; /*開CPU中斷*/
- TR0=1;
- TR1=0;
- P3_4=0;
- du: for(i=0;i<14;i++)
- {
- P3_7=1;
- high1=0;
- high=high+2;
- for(j=0;j<5;j++)
- { P3_6=0;
- convert(ADC0808()); //每1s啟動A/D轉換一次,把讀入數據轉換為顯示數據/
- display();
- delay(10); // 調用顯示子函數/
- }
- }
- if(high==34)
- {
- P3_6=1;
- P3_7=0;
- delay(100);
- TR0=0;
- }
- }
-
- if(P3_4==1)
- { TR0=0;
- TR1=1;
- P3_6=1;
- EA=1;
- high1=high1+4;
- if(high1==40)
- high1=16;
- if(P3_3==1)
- {P3_7=1;
- goto du;
- }
- while(P3_4!=0)
- {};
- convert(ADC0808()); //每1s啟動A/D轉換一次,把讀入數據轉換為顯示數據/
- display(); // 調用顯示子函數/
- }
- convert(ADC0808()); //每1s啟動A/D轉換一次,把讀入數據轉換為顯示數據/
- display(); // 調用顯示子函數/
- }
- }
復制代碼
|