久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 40298|回復: 41
打印 上一主題 下一主題
收起左側

基于單片機的雙向DC-DC恒流開關電源設計(程序+PCB+原理圖)

  [復制鏈接]
跳轉到指定樓層
樓主
本開關電源設計采用STC12C5A60S2單片機發生47KHZ的PWM脈沖信號,經過IR2104控制MOS,從而控制整個BUCK(降壓式變換)電路。單片機內部自帶的10位ADC能通過電壓電流檢測電流實時反饋電流和電壓數值,并由此調整輸出的PWM的占空比,形成電流電壓閉環控制系統。按鍵能設置輸出電流從0.2A到2A,以0.01A遞增,輸出最大10V,液晶能顯示實時輸出電流與電壓。根據測試,滿載的供電效率為88%。按鍵設置的輸出電流的誤差小于0.01A。

目錄
1 前言
1.1課題研究意義
1.2研究現狀及存在問題
1.3研究內容和方式
2系統分析
2.1 系統論述
2.2 Buck工作原理
2.3 Buck波形分析
2.4 Buck穩壓分析
2.5小結
3硬件設計
3.1總統框架
3.2各部分電路的選擇
3.3小結
4軟件設計
4.1電壓電流雙閉環控制算法設計
4.2主程序程序設計
4.3按鍵子程序設計
4.4  ADC中斷程序
4.5  關鍵程序
5系統測試
5.1實物圖片
5.2電壓調整率測試
5.3  負載調整率測試
5.4  電路效率測試
6 總結
6.1結論
6.2創新點
6.3存在問題
致謝
參考文獻
附錄
附  C語言程序源代碼

1 前言

1.1課題研究意義

開關電源顧名思義,開關電源便是使用半導體開關器件(如晶體管、場效應管、可控硅閘流管等),經過控制電路,使半導體開關器件不停地“導通”和“關閉”,讓半導體開關器件對輸入的電壓進行脈沖調制,從而完成直流到交流、直流到直流電壓變換,和輸出電壓可調和自動穩壓。

開關電源一般有三種工作模式:頻率、脈沖寬度固定模式,頻率固定、脈沖寬度可變模式,頻率、脈沖寬度可變模式。前一種工作模式多用于直流交流逆變電源,或直流/直流電壓變換;后面兩種工作模式一般用在開關穩壓電源。另外,開關電源輸出電壓也有三種工作式樣:直接輸出電壓的方式、平均值輸出電壓的方式、幅值輸出電壓的方式。同樣的,前一種工作方式經常用在直流/交流逆變電源,或直流/直流電壓變換;后兩種工作模式經常用于開關穩壓電源[1]。

1.2研究現狀及存在問題

近半個世紀以來,國內外學者對開關電源進行了很多的研究,取得了很多的成果。

1.2.1國外研究現狀

上個世紀的50年代初,美國宇航局為了搭載火箭,開關電源誕生了,這便是開關電源誕生的起源,此開關電源以小型化、輕巧化為目標。在歷史進程中進行了近半個多世紀后,開關電源技術越來越成熟,更因具備了性能穩定、小、發熱較低、輕、轉換效率高等優點慢慢的在取代了傳統電源技術下所制造的不間斷工作電源,并在電子設備等各領域有了廣泛的應用。最終在80年代,率先完成了大部分電子產品的電源換代,同時也完成了全面開關電源普及化。在到來的20世紀90年代,開關電源更是進入了快速發展的黃金時間,家電、電子設備都得到更廣泛的應用。又經歷了幾十年的努力下,現在的開關電源技術都有了技術性的重大突破與發展。更多新技術的發現與開發將當代開關電源又帶上了另一個全新的時期,在高新技術領域的應用更是推動了高新技術產品的發展,其中以其小型化、簡便化的特征尤為突出。

1.2.2國內研究現狀

國內學者有關開關電源的研究,有以下研究狀況:

伴跟著開關電源的誕生,1960年代初期,我國開始對開關穩壓電源進行的設計,研制并加以生產。直到60年代中期才開始慢慢地進入了實用的階段。在對開關電源有了一定認識后,我國在70年代初期便試著開始對無工頻降壓變換器進行深入研究應用在開關穩壓電源上,繼而對其進行設計、研制和生產。最終在1974年,我國第一臺工頻降壓變壓器式的開關電源被研發出來了,輸出電流是5v,工作頻率是10KHz。跟著我國開關電源的向前發展,我國許多研究所、工廠等在近十年發展中也紛紛研制出來了無工頻降壓變換器的開關穩壓電源,這種開關電源的工作頻率大概在20K左右,輸出的功率在1000W以下,但是其型號與用途眾多,都投入電子設備、電視機、通信等領域進行廣泛的使用。跟著時期的發展,因為我國半導體與工藝跟不上時期的潮流,導致了自己生產與研制的開關穩壓電源的關鍵元器件大部分仍要經過國外進口,導致當代開關電源技術與一些先進國家相比仍存有巨大的差距。

1.2.3目前存在的問題

綜上所述,目前國內外學者研究的開關電源普遍存在以下四大方面的問題:

1)多數使用模擬IC控制,控制式樣不夠智能化;

2)不能顯示輸入和輸出的電流電壓狀況;

3)多數開關電源為固定輸出;

4)可調的開關電源只能通過電位器模擬調整,不能直接得到準確的預設電壓。

1.3研究內容和方式

為了設計一種更加智能化的開關電源,必須進行更深入的開關電源機理研究,下文字闡述了具體的研究內容以及研究方法。

1.3.1研究方案

設計出一種基于STC系列51單片機的BUCK型直流降壓開關電源是本課題所要研究的主要內容。本系統需要達到的預期目標是:在系統完成后,系統能預置電壓,其步進的電壓為1V,輸出的電壓的限度為0V~10V,輸出電流為0~1A。同時液晶顯示屏上可以顯示出所預置的電壓,另有實時的輸入輸出電壓,實時的電流,來使得本系統可以讓調整速度加快、提升精準度,同時也能使得電壓和負載的調整率降低,提升系統的效率,不在附加額外的電源板,最后還可以讓輸出的紋波變小等。

1.3.2內容安排

1.              首先了解課題研究的意義,和國內國外相關發展動態。

2.              大致的概述設計的開關電源的系統方案。

3.              系統的硬件設計,包括輸出電路,直流斬波電路,PWM發生電路,顯示電路設計等。

4.              系統的軟件設計,對應用的編程軟件進行流程圖講解,對所用方式進行概述所。

5.              系統調試與測試,對做好的機開關電源進行調試與數據測試并對結果進行分析。

6.              最后簡要的總結本系統設計的工作要點和所得收獲。


2系統分析

2.1 系統論述

直流/直流變換是將固有的直流電壓轉換成可調整的電壓,又叫做直流斬波。它有多種拓撲結構,本系統應用的是BUCK(降壓式變換電路)型直流/直流,其特征是輸出的電壓比輸出電壓低。如圖2-1所示。

圖2-1 BUCK電路拓撲
2.2 Buck工作原理

當Mos管或者三級管導通很長很長時間后,所有的元器件均處在一種理想狀態的情況下,此時電容的電壓會等于輸入的電壓。在這樣的條件下,我們使用BUCK變換器的充電和放電這兩個階段來對這個電路進行說明:

2.2.1在電感充電的情況下

當BUCK變壓器處于充電的過程時,將開關閉合,此時三級管處于導通的狀態,可以用一條導線來替代,替代后的等效圖如下。當輸入的電壓經過電感這時刻,二級管因為反接,所以沒起到作用,這里刪去。再加上輸入的是直流,因此電感發生的電感電流是成比率上升的,具體上升多少與電感的大小有關系,電感相當于一個恒定電流源,起傳遞能量作用,電容等于恒定電壓源,在電路里起到濾波的作用。BUCK變換器充電階段等效圖如圖2-2所示。

圖2-2  BUCK變換器充電階段等效圖
2.2.2在電感放電的情況下

當BUCK變壓器處于放電的過程中,開關管子已經斷開,此時的三級管處于截止狀態,這里把它拿掉,等效電路圖如下。在開關斷開的時間里,因為電感的保持電流不變特征,電感上的電感電流不會一下子下降到零,而是把充電完成后所累積的電流值慢慢下降到0。在這個過程中,因為原來的電路已經斷開了,因此電感沿著之前的方向,經過二極管D形成一個新的回路的,即流過電容對電容進行充電,從而保證了負載端獲得連續的不間斷的電流。BUCK變換器放電階段等效圖如圖2-3所示。

圖2-3  BUCK變換器放電階段等效圖

綜上所述,BUCK變換器的升壓過程便是電感能量儲存和釋放的過程。在充電的過程時。電感通過流過它自身的電流不斷儲存能量,在放電的過程時,假如電容容量足夠大,那電容的兩端就可以在放電的過程中保持一個持續不間斷的電流放電,假如這個通斷的過程不斷的被重復,那么就可以夠讓電容兩端的電壓低輸出的電壓,從而完成降壓的目的。

2.3 Buck波形分析

波形如下所示。

導通時Q電流

閉合時C電流

L的電流和輸出電流的關系:


輸出電壓與輸入電壓的關系
2.4 Buck穩壓分析

本設計采用串連型開關電源,其穩壓原理框圖如圖2-4所示。在MOS管導通的時刻,電感L將流過的電流轉換成磁能進行能量儲存,電容C將流過電感L的部分電流轉換成電荷儲存。在MOS管關斷的時刻,電感L發生反向電動勢,輸送給負載R并與續流二極管D組成回路,同時電容C將電荷轉換成電流向負載供電。

經過不斷導通與關斷MOS管,使uo發生脈動電壓,經過LC濾波電路使脈動電壓轉變成較穩定的直流電壓Uo輸送給負載,輸出電壓Uo的電壓值與MOS管在一個周期內導通的時間成正比。當外部因素使輸出電壓或電流發生變化時,經過單片機自帶的10位ADC實時采集輸出的電壓和電流,實時調整開關K導通的占空比,從而組成閉環電壓控制電路,使輸出電壓能達到穩定。

圖2-4開關電源模塊穩壓原理
2.4.1  LC濾波電路參數推導
采用輸入電壓25V,輸出電壓最大為10V,根據推導公式如式(2-1)所示:此中Ton為PWM一個周期內導通時間、Ui為輸入電壓、Uo為輸出電壓、Ud為肖特基二極管的電壓降(約等于0.6V)、Io為一個直流/直流模塊的輸出電流。
                   (2-1)
PWM的占空比為D:
                                   (2-2)
代入數據后得到
                                       (2-3)
              一般而言,開關電源的頻率越高,電感的感量可以越小,效率也可以越高。此單片機能輸出的PWM最高頻率為47KHZ,所以本設計選擇讓單片機輸出47KHZ的PWM。那么f=47Khz導通時間Ton為
               (2-4)
電感量L為:
                                (2-5)
因此將各參數代入式(2-5)得式(2-6):
          (2-6)
              計算得到32uH電感,這里采用5倍以上余量,采用150uH的電感,可降低電感溫度。另外本設計采用銅線和磁芯做成的電感以增大電感的儲能能量提升供電的效率。
              按照串連型開關電源的電容推導公式如式(2-7)所示,此中C為電容容量、Io為一個模塊個輸出電壓、△Up-p為輸出紋波電壓,T為PWM一個周期的時間。
                             (2-7)
              輸出電壓最大為10V,我們設定紋波電壓為0.1V,將各參數代入式(2-7)得式(2-8)結果:
                       (2-8)
              本設計采用2個1000的電容,達到降低紋波電壓的目的。
2.5小結

綜合以上的分析論證,本單片機的開關電源設計采用BCUK拓撲,經過原理分析和認證,最終推導選擇了合適的電容和電感。


3硬件設計
31總統框架

基于單片機的開關電源設計,由STC單片機、變壓器,整流濾波電路,BUCK主回路、降壓穩壓電路、按鍵電路、液晶電路、電壓檢測電路、電流檢測電路等組成。總體設計框圖如3-1圖所示。下面分別論證這些方面的詳細方案選擇。


圖3-1總體設計構架圖
32各部分電路的選擇
3.2.1  單片機

STC12C5A60S2單片機,在指令代碼的方面可以完全兼容傳統8051,同時它的速度比傳統的8051單片機要快8-12倍,體現了其高速度的一面。這系列單片機其里面有專用的集成復位電路,另有8路高速的10位ADC轉換,同時還兼有2路的PWM等,它的功能之強大遠超傳統的8051系列。

圖3-2 STC12C5A60S2單片機實物圖
3.2.2  IR2104半橋驅動電路


IR2104是一種高性能的半橋驅動芯片,該芯片內部是采用被動式泵荷升壓原理。上電時,電源流過快恢復二極管D向電容C充電,C上的端電壓很快升至接近Vcc,這時假如下管導通,C負級被拉低,形成充電回路,會很快充電至接近Vcc,當PWM波形翻轉時,芯片輸出反向電平,下管截止,上管導通,C負極電位被抬高到接近電源電壓,水漲船高,C正極電位這時已超過Vcc電源電壓。因有D的存在,該電壓不會向電源倒流,C此時開始向芯片里面的高壓側懸浮驅動電路供電,C上的端電壓被充至高于電源高壓的Vcc,只要上下管一直輪流導通和截止,C就會不斷向高壓側懸浮驅動電路供電,使上管打開的時刻,高壓側懸浮驅動電路電壓一直大于上管的S極。采用該芯片降低了整體電路的設計難道,只要電容C選擇恰當,該電路運行穩定。IR2104應用電路圖如3-3所示。

圖3-3 IR2104應用電路圖
3.2.3  電路供電電源的選擇

線性降壓芯片7805。這個穩壓IC需要的外圍元件很少,IC內部還有過流、過熱及調整管的保護措施,不但價廉且輸出電壓很穩定。78系列的穩壓集成塊要考慮輸出與輸入壓差帶來的功率損耗,所以一般輸入輸出之間壓差要大于2V。其應用電路圖如圖3-4所示。

圖3-4  7805應用電路
3.2.4  電流檢測電路

方案一:霍爾電流傳感器。電流流過霍爾傳感器的線圈發生磁場,磁場隨電流的大小變化而變化,磁場匯集在磁環內,霍爾元件輸出跟著磁場變化的電壓信號。經過檢測電壓值,能得到電流的大小。

方案二:電阻分壓檢測電路。經過在輸出回路中串連采樣電阻,將經過電阻的電流轉換成兩端的電壓,經過檢測電壓值從而獲得電流值。該檢測方式電路和程序控制都比較簡潔。

要完成對輸出電壓和電流的閉環控制,務必對輸出電流和電壓進行采樣反饋。本設計采用如下圖所示的電流電壓檢測電路。為了便于MCU采集,分壓電阻發生的電壓經過由LM358組成的同相比例放大器放大后,輸入到MCU的ADC端口。

LM358內部集成的是雙運放,單電源和雙電源都能使其工作。

圖3-5 Lm358引腳圖及引腳功能
要完成對輸出電壓和電流的閉環控制,務必對輸出電流經過運放放大后進行采樣反饋。本設計采用如圖3-6所示的電流檢測電路。

圖3-6 電流檢測電路

輸出最大電流為2A。本設計采用電阻分壓的式樣對輸出的電壓進行實時檢測,因為采樣電壓直接輸送給單片機10位ADC進行檢測,單片機供電電源為5V,所以其內部自帶的檢測的最高電壓也為5V, 這個電路中,LM358由5V電壓供電,最大輸出電壓和供電電源電壓之前有1.2V壓差,所以能輸出最大電壓為:

                    (3-1)
2A電流經過0.02Ω電阻得到的電壓為
                    (3-2)
該電壓要經過放大后才能更容易被單片機檢測到,在這個應用中運放的放大倍數應該小于
                       (3-3)
這里選擇R12和R10為33K和1K,放大倍數為
                       (3-4)
因為> , 符合設計要求。
即當電流為2A時,運放輸出電壓為:
                    (3-5)
3.2.5  電壓檢測電路
輸入電壓最大為10V,而單片機的采樣電壓最高位5V,故電壓采樣電阻比例應該小于
                           (3-6)
這里取R1和R5是47K 和10K,
                       (3-7)
因為1<2,所以滿足條件。
當10V輸出時,單片機檢測到的電壓是,
                    (3-8)
電壓分壓檢測電路如圖3-7所示。
圖3-7 電壓檢測電路
3.2.6  按鍵電路

目前單按鍵這種模式的鍵盤使用方便,響應的快并且接口還簡潔。綜合以上本系統采用的是非編碼式鍵盤。本系統設計應用了3 個按鍵,按照軟件來定義它的功能,鍵盤與單片機的P2.3、P2.2、P2.1鍵盤是若干按鍵的集合,是向系統提供操作人員干預命令的接口設備。

S1為開關按鍵,按一下即有輸出,按第二下即輸出停止,如此循環

S2為輸出電流增加。

S3為輸出電壓減少。

如圖3-8所示

                       
圖3-8 按鍵電路
3.2.7  液晶顯示模塊

系統采樣1602液晶顯示。液晶驅動電流較小,能顯示較大信息量,無需增外設電路。

能顯示多行數據,方便用戶進行更多的操作。

能顯示輸入輸出的實時電壓,輸出的實時電流,預設的輸出電壓。如圖3-9所示

圖3-9 1602液晶顯示
33小結

綜上所述,本開關電源設計采用STC12C5A60S2單片機發生47KHZ的PWM脈沖信號,經過IR2104控制MOS,從而控制整個BUCK(降壓式變換)電路。單片機內部自帶的10位ADC能通過電壓電流檢測電流實時反饋電流和電壓數值,并由此調整輸出的PWM的占空比,形成電流電壓閉環控制系統。按鍵能設置輸出電流從0.2A到2A,以0.01A遞增,輸出最大10V,液晶能顯示實時輸出電流與電壓。總體電路圖如3-10所示。

圖3-10 總體電路圖

4軟件設計

51的語言主要有匯編和C兩種。匯編雖然運行快,但是編程繁瑣,移植性差;C具備良好的可讀性和移植性。本系統采用C語言編寫程序,Keil C51作為集成開發環境。

41電壓電流雙閉環控制算法設計
              由于題目要求輸出電壓在10V以內,輸出電流應該在0.2~2A以內,所以應該具有如下C-V曲線特性,在電流和電壓的雙閉環控制中。
使得輸出電流在2A范圍內,電壓在10V范圍內;
控制模式如下:

電流
電壓
PWM
條件
>2A
>10V
++
<=10V
--
<=2A
>10V
--
<=10V
--


軟件設計包括:主程序設計,按鍵子程序設計,ADC中斷程序設計

42主程序程序設計

主程序主要處理對時間要求不敏感的數據,例如按鍵檢測,和顯示電壓電流狀況,

此中顯示這些數據時刻采用數字平均濾波算法,采集50個數據,繼而取平均值,使得到的數據更加接近真實狀況,使得顯示出來的電壓和電流不會亂跳,抗干擾能量得很大的提升。

43按鍵子程序設計

按鍵子程序中,按加鍵的話,增加輸出電壓預設;按減鍵的話,降低輸出電壓預設;按開關鍵的話,能控制IR2104的工作與否,從而控制整個BUCK的工作與否。

44  ADC中斷程序

ADC中斷程序中,因為有輸入電壓,輸出電壓,輸出電流這3個數據要監測,所以采用通道輪流詢問的辦法完成。

于此同時,要完成電流電壓檢測的雙閉環的話,要在ADC程序中加入PWM處理程序,使得當輸出負載變動,引起檢測到的輸出電壓ADC值變動,PWM需要實時響應這個變化,所以在ADC程序中,要加入PWM的重裝數據的語句。

4.5  關鍵程序

void ADC_interrupt()interrupt 5                            //ADC轉換完后ADC_FLAG由硬件自動置位,

{                                                      

              uint ADC_value;                                                        //ADC轉換結果              10位

              ADC_CONTR&=!ADC_FLAG;                                             //clear ADCflag

              ADC_value=(ADC_RES<<2)+ADC_RESL;                                                           //              ADC_value=(ADC_RES<<2)+ADC_RESL;

              switch(channel)

              {

                            case 0:              Battery_voltage=ADC_value;            

                                                        channel=1;                                                                     

                                                        break;

                            case 1:              Boost_Buck_current=ADC_value;

                                                        if(!lock)

                                                        {                                                      

              if((Boost_voltage<370)&&(Boost_Buck_current<(OUT_Current<<1))) //((Boost_voltage<Boost_temp)&&

                                                                      {

                                                                                    PWM_temp--;

                                                                                    if(PWM_temp<10)  PWM_temp=10;

                                                                      }            

                                                                      else                                                                     

                                                                      {

                                                                                    PWM_temp++;

                                                                                                  if(PWM_temp>250)  PWM_temp=250;            

                                                                      }

                                                                      CCAP1H = CCAP1L =PWM_temp;

                                                        }

                                                        channel=2;                           

                                                        break;                                                      

                            case 2:Boost_voltage=ADC_value;

                                                        channel=0;

                                                        break;            

                            default:break;

              }

              ADC_CONTR=0xE8|channel;

              ADC_ready=1;                           

}

STC12C5A60S2單片機內部自帶的10位ADC能通過電壓電流檢測電流實時反饋電流和電壓數值,并由此調整輸出的PWM的占空比,形成電流電壓雙閉環控制系統。按鍵能設置輸出電流從0.2A到2A,以0.01A遞增,輸出最大10V,液晶能顯示實時輸出電流與電壓。

5系統測試51實物圖片

實物由萬用板手工焊接,板子的正面(a)和背面(b)如圖5-1所示。


  (a)板子正面                         (b)板子背面
圖5-1 總體電路圖
52電壓調整率測試
電壓調整率,來源于電源在滿載時,其輸出電壓因該電源的供電電壓波動引起的變化,是穩壓性能優劣的重要指標。
5.2.1  測試儀器
需要測試電源的電壓調整率,需要直流可調壓供電電源,要萬用表和負載。
可調壓電源:本實驗采用兆信30/5A數顯線性電源。如圖5-1所示。
萬用表:深圳勝利VC980+數字萬用表,數量為4個。
負載:負載為100W 50Ω的環形滑動變阻器。
                           圖5-2  可調壓電源
5.2.2  測試方式
測試示意圖

測量電路點如圖5-3所示(3、4、5、6、7為測量點):

圖5-3測量電路

測試步驟

第一步:在3、4點間用電壓表測輸出電壓,在3、4點串入電流表在5、6點間用電壓表測輸出電壓,在5、7點串入電流表;

第二步:在1、2點源接入市電;

第三步:調整可調變壓器電阻,使電源滿載輸出;

第四步:調整穩壓電源電壓,使電壓為12V,記錄輸入與輸出電壓;

第五步:逐步增大電源電壓,每隔一段做一次的記錄,直到輸出電壓的上限19V。

5.2.3  測試結果
輸出輸入電壓測試結果如下表所示:

表5-1 輸出輸入電壓記錄表

U2(V)

12.96

13.01

14.04

15.05

16.04

17.01

18.01

19.01

Uo(V)

10.01

9.98

10.06

9.94

10.02
10.06
10.03
10.07

(測試條件為輸出電壓10V,輸出電流為1.00A)

電壓調整率推導:

               (5-1)

5.3  負載調整率測試
負載調整率:電源負載的變化會引起電源輸出的變化,負載增加,輸出降低,相反負載減少,輸出升高。好的電源負載變化引起的輸出變化較小,通常指標為3%--5%。
負載調整率是衡量電源好壞的指標。好的電源輸出接負載時電壓降較小。
5.3.1  測試儀器
需要測試電源的負載調整率,需要帶隔離低壓電源、
萬用表、負載和示波器。
可調壓電源:本實驗采用兆信30/5A數顯線性電源。
萬用表:深圳勝利VC980+數字萬用表,數量為4個。
負載:負載為100W 50Ω的環形滑動變阻器。
示波器:單片機輸出的載波頻率為40KHZ,實
驗采用Siglent雙通道200M示波器,如圖5-4所示。         圖5-4 Siglent雙通示波器
5.3.2  測試方式
測試示意圖

測量電路如圖5-3所示。

測試步驟

第一步:在3、4點間用電壓表測輸出電壓,在3、4點串入電流表在5、6點間用電壓表測輸出電壓,在5、7點串入電流表;

第二步:在1、2點間接上市電;

第三步:測試單片機輸出的PWM波形、mos管腳的驅動波形。

第四步:輸入電壓為額定值10V,輸出電流取最小值,記錄最小負載量的輸出電壓;

第五步:調整負載為50%滿載,記錄對應的輸出電壓;

第六步:調整負載為滿載,記錄對應的輸出電壓;

測試數據記錄如表5-2。

表5-2 不同負載下輸出電壓記錄表

輸出電流(A)

1.00

0.53

0.04

輸出電壓(V)

9.995

10.001

9.959

負載調整率推導:

     

5.3.3  測試結果

把示波器的其中一個探針接到單片機的PWM輸出口,地接到另外一個端口,得到的測試波形如5-5、 把探針放在上下mos管腳G極的驅動波形波形如圖5-6所示。

      

圖5-5 單片機輸出的PWM波形            圖5-6 上下mos管腳G極的驅動波形

5.4  電路效率測試
5.4.1  
測試儀器
需要測試電源的帶載性能及效率,需要萬用表和負載。
可調壓電源:本實驗采用兆信30/5A數顯線性電源。
萬用表:數字萬用表。
負載:負載為30W 50Ω的環形滑動變阻器。
示波器:單片機輸出的載波頻率為47KHZ。
5.4.2  測試方式:
測試示意圖

測量電路如圖5-3所示。

測試步驟

第一步:在3、4點間用電壓表測輸出電壓,在3、4點串入電流表在5、6點間用電壓表測輸出電壓,在5、7點串入電流表;

第二步:在1、2點間接入市電;

第三步:輸入電壓為額定值18V,

第四步:調整負載由大至小記錄對應的輸出電壓、輸入電流、輸出電壓、輸出電流;

第五步:返回第四步,直到輸出電流達到自保護的狀態。

5.4.3  測試結果
測試額定功率下的供電效率,測試結果如表3所示。


表5-3供電效率測試數據
供電電壓/V
供電電流/A
總輸出電壓/V
總輸出電流/A
實際效率
12.2
1.01
10.02
1.00
0.81
12.2
0.95
9.01
1.03
0.80
12.2
0.85
8.05
1.02
0.79
12.2
0.78
7.07
1.04
0.77
12.2
0.67
6.02
1.02
0.75
12.2
0.56
4.98
1.01
0.74
12.2
0.48
3.97
1.00
0.68
12.2
0.38
3.00
1.04
0.67
12.2
0.25
2.01
1.02
0.66
12.2
0.13
1.02
1.00
0.63
12.2
0.01
0.04
1.01
0.64

由以上數據得到:滿載輸出情況下,供電效率為81%。

輸出噪聲紋波電壓峰-峰值的測試,把示波器的測試輸出電壓波形如圖5-6所示。

                                                                                                    圖5-6 輸出電壓波形


由以上數據得到:該電源的電壓調整率為0.069%,負載調整率為3.164%,滿載輸出情況下,供電效率為81%,當輸出電流大于2A時,保護電路啟動。輸出電壓為0。輸出紋波峰峰值為290Mv。實際電路的調試圖如圖5-7所示。

圖5-7實際電路的調試圖


   6 總結
61結論

經過研究國內外關于開關電源的方式,本開關電源設計采用STC12C5A60S2單片機發生47KHZ的PWM脈沖信號,經過IR2104控制MOS,從而控制整個BUCK(降壓式變換)電路。單片機內部自帶的10位ADC能通過電壓電流檢測電流實時反饋電流和電壓數值,并由此調整輸出的PWM的占空比,形成電流電壓閉環控制系統。按鍵能設置輸出電流從0.2A到2A,以0.01A遞增,輸出最大10V,液晶能顯示實時輸出電流與電壓。根據測試,滿載的供電效率為88%。按鍵設置的輸出電流的誤差小于0.01A。

因此,本文所研究的基于單片機的開關電源設計滿足了當初的設計預想,達到了較好的效果。

62創新點

論文主要的創新點有以下三點:

1)使得開關電源硬件更加智能化,直接用單片機控制;

2)能顯示輸入和輸出的電流電壓狀況,實時監測電源的運作;

3)能經過按鍵數字化地設置預設輸出電壓,能得到精確的設定電壓。

63存在問題

因為時間與能量有限,本文所設計的控制系統另有待于進一步的改進:

比如,

  • 比如可以加大電感L,使得輸出紋波進一步降低;
  • 采用PCB板制作實物,使得其穩定性進一步提升,等等
致謝

本論文的全部工作得到了指導老師的悉心指導和親切關懷,同時也衷心感謝學校的所有老師在這四年來對我的學習、工作、生活上給予的無私幫助和無微不至的關懷。我的論文選題和論文寫作都是在導師的指導下完成的,他崇高的師德和高深的學術造詣給我在我身上留下了深深的烙印,對我的學術訓練和研究能量的培養會讓我受用終身。

在我大學生涯中,得到了專業課老師在電子技術上給予的悉心指導,特此感謝。

在完成該課題的時刻,得到舍友們,同班同學們和學長們的幫助,在此深表感謝。

感謝惠州學院的老師們同學們,在學習工作的時,從他們身上我學習到了不少開發項目的方式和新的開發技術。

謝謝所有幫助和關心我的老師和同學。



單片機源程序如下:


  1. /*************手工焊板BUCK-BOOST******/
  2. #include <STC12C5A60S2.H>
  3. #include <intrins.h>              /*use _nop_() function*/
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define ADC_FLAG      0X10

  7. /*****************************************
  8. 端口功能設定
  9. *****************************************/
  10. sbit PWM_1                =        P1^4;       //PWM1_Boost/Buck
  11. sbit SD_1                  =        P1^3;       //SD1_Boost_Buck
  12. sbit Key_1                =        P2^1;       //Key_1
  13. sbit Key_2                =        P2^2;       //Key_2
  14. sbit Key_3                =        P2^3;       //Key_3

  15. uint ADC_value;
  16. uchar PWM_temp=2;
  17. uchar last_key;                                //按鍵變量
  18. uchar channel=0;                        //第一通道
  19. uchar Caes=0;                                        //菜單
  20. uint  OUT_Current=300;
  21. uint  Battery_voltage;                //輸入電壓        
  22. uint  Boost_voltage;                 //Boost電壓                 
  23. uint  Boost_Buck_current;        //Buck_Boost電流8位
  24. uint  O_current;//輸出電流
  25. uint  A_value=90;
  26. bit lock=0;                           //PWM輸出鎖定
  27. bit ADC_ready=0;                   //ADC完畢
  28. bit K=0;
  29. bit Charge=0;
  30. void delay();
  31. void Key_0_();
  32. void Key_1_();
  33. void Key_2_();
  34. void Key_3_();
  35. void init_pca();
  36. void init_timer();
  37. /**********************************************************
  38. 函數說明: 延時程序
  39. **********************************************************/
  40. void delay(uchar t)
  41. {
  42.         uint j;
  43.         uchar i;
  44.         for(i=0;i<t;i++)
  45.                 for(j=0;j<1000;j++);
  46. }
  47. /**********************************************************
  48. 函數說明: PWM初始化
  49. **********************************************************/
  50. void init_pwm()
  51. {
  52.   CCON = 0;
  53.         CL = 0;
  54.         CH = 0;
  55.         CMOD = 0X08; //0X08:43KHZ // 0X02,22KHZ // 0X0A,10KHZ //
  56.         CCAPM1        =0x42;//8位PWM輸出,無中斷
  57.         CCAP1L         =CCAP1H =250;//初始化spwm輸出的占空比
  58.         CR=1;
  59. }
  60. /**********************************************************
  61. 函數說明: 中斷 始化函數
  62. **********************************************************/
  63. void InitADC()
  64. {
  65.         P1M1=0x47;
  66.         P1M0=0x00;
  67.         P1ASF=0X47;                    //選擇ADC通道0126
  68.         ADC_RES=0;
  69.         ADC_CONTR=0X88;                   //1110 0000           E8 開電源,最高速
  70.         EA=1;
  71.         EADC=1;
  72. }
  73. /**************************************
  74. 1602液晶
  75. **************************************/
  76. sbit RS = P2^5;               
  77. sbit RW = P2^6;
  78. sbit E  = P2^7;
  79. /**************************************
  80. 短延時
  81. **************************************/
  82. void delay5ms()   
  83. {
  84.     uchar i,v,k;
  85.     for(i=1;i>0;i--)
  86.         for(v=168;v>0;v--)
  87.             for(k=22;k>0;k--);
  88. }
  89. /**************************************
  90. 寫指令
  91. **************************************/
  92. void lcd_Write_com(uchar com)         
  93. {
  94.         RS=0;                        //定義指令寄存器
  95.         RW=0;                                  //寫允許
  96.         P0=com;                                          //寫指令
  97.         delay5ms();        E=1;                //片選端上拉
  98.         delay5ms();        E=0;                //下降沿鎖存
  99. }
  100. /**************************************
  101. 寫數據
  102. **************************************/
  103. void lcd_write_date(uchar date)        
  104. {
  105.         RS=1;                                        //定義數據寄存器
  106.         RW=0;                                        //寫允許
  107.         P0=date;                                //寫數據
  108.         delay5ms();        E=1;                //片選端上拉
  109.         delay5ms();        E=0;                //下降沿鎖存
  110. }
  111. /**************************************
  112. 顯示程序
  113. **************************************/
  114. void dis_lcd1602(uchar x,uchar y,uchar dat)
  115. {
  116.         uchar add;
  117.         if(y==1)         add=(0x80+x);
  118.         if(y==2)         add=(0xc0+x);
  119.         lcd_Write_com(add);                //寫指令
  120.         lcd_write_date(dat);        //寫數據
  121. }  
  122. /**************************************
  123. 液晶初始化
  124. **************************************/
  125. void lcd1602_init()
  126. {
  127.         lcd_Write_com(0x38);        //設置8位格式,2行,5*7
  128.         lcd_Write_com(0x01);        //清屏
  129.         lcd_Write_com(0x0c);        //整體顯示,關光標,不閃爍
  130.         lcd_Write_com(0x06);        //設定輸入方式,增量不移位
  131.         lcd_Write_com(0x80);        //初始坐標
  132. }
  133. /**************************************
  134. 液晶顯示漢字程序
  135. **************************************/
  136. void hz_lcdDis(uchar x,uchar y,uchar *p) //漢字顯示
  137. {
  138.    uchar i=0,temp;
  139.    if(x)temp = 0x40;   else temp = 0;
  140.    for(i=y;*p!='\0';i++,p++)
  141.    {
  142.                 lcd_Write_com(i|0x80+temp);
  143.                 lcd_write_date(*p);
  144.                 delay5ms();                          
  145.    }
  146. }
  147. /**************************************
  148. 液晶顯示數字程序
  149. **************************************/
  150. void  num_lcdDis(uchar X,uchar Y,uint num,uchar n)        
  151. {
  152.         uint i=0,temp,hang;   
  153.         n +=1;
  154.            if(X)hang = 0x40;else hang = 0;
  155.            for(i=(n-1);i>0;i--)
  156.     {           
  157.                   lcd_Write_com((i+Y-1)|0x80+hang);          //從個位開始顯示
  158.                   temp = num%10+0x30;
  159.                   lcd_write_date(temp);        
  160.                  delay5ms();
  161.                   num/=10;                                         
  162.         }        
  163. }
  164. /**********************************************************
  165. 函數說明: 平均濾波函數
  166. **********************************************************/
  167. #define N 50
  168. uint Filter(uint adc_data)
  169. {
  170.         uint value=0;
  171.         uchar count,count_ADC;
  172.         for(count=0;count<N;count++)
  173.         {
  174.                 for(count_ADC=0;count_ADC<3;count_ADC++)
  175.                 {
  176.                         while(!ADC_ready){}
  177.                         ADC_ready=0;
  178.                 }
  179.                 value+=adc_data;         
  180.         }
  181.         return (value);
  182. }
  183. /**********************************************************
  184. 函數說明:按鍵延時防抖動
  185. P3^5       Key_1
  186. P3^6       Key_2
  187. P3^7       Key_3

  188. **********************************************************/
  189. void key_scan()
  190. {
  191.         uchar temp;
  192.         temp = P2&0x0F;
  193.         if(temp != 0x0F)
  194.         {
  195.                 delay(10);
  196.                 temp = P2&0x0F;
  197.                 if(temp!= 0x0F)
  198.                 {
  199.                         switch(temp)
  200.                         {
  201.                                 case 0x0E: Key_0_();        break;        //20
  202.                                 case 0x0D: Key_1_();        break;        //21
  203.                                 case 0x0B: Key_2_();        break;        //22
  204.                                 case 0x07: Key_3_();        break;        //23
  205.                                 default:break;
  206.                         }
  207.                 }
  208.         }
  209. //        last_key = temp;
  210. }

  211. /**********************************************************
  212. 函數說明: 按鍵程序
  213. **********************************************************/
  214. void Key_0_()
  215. {
  216.   Charge=~Charge;
  217.         if(Charge)         {SD_1=1;        hz_lcdDis(0,8,"d");}        
  218.         else              {SD_1=0;  hz_lcdDis(0,8,"c");}        

  219. }
  220. void Key_1_()
  221. {
  222.         if(K)        {SD_1=0;        lock=1;                CCAP1L         =CCAP1H =128;        hz_lcdDis(0,8,"g");        }
  223.         else         {SD_1=1;        lock=0;        hz_lcdDis(0,8,"k");        }
  224.         K=~K;
  225. }
  226. void Key_2_()
  227. {
  228.         OUT_Current=OUT_Current+15;
  229.         if(OUT_Current>600)OUT_Current=600;        
  230. }
  231. void Key_3_()
  232. {
  233.         OUT_Current=OUT_Current-15;        
  234.         if(OUT_Current<150)OUT_Current=150;
  235. }
  236. /**********************************************************
  237. 函數說明: 主函數
  238. **********************************************************/
  239. void main(void)
  240. {
  241.         uint U1,U2,I1,S;
  242.         SD_1=0;
  243.         lcd1602_init();
  244.         hz_lcdDis(0,4,"Welcome!");
  245.         init_pwm();
  246.         InitADC();
  247.         delay(250);        
  248. //        delay(250);
  249.         EA=1;//開總中斷
  250.         lcd_Write_com(0x01);        //清屏
  251. //        SD_1=1;
  252.         hz_lcdDis(0,0,"IN=  . V S= .  A");
  253.         hz_lcdDis(1,0,"OU=  . V I= .  A");
  254.         while(1)//主循環
  255.         {               
  256.                 U1=Filter(Boost_voltage)/92;        //輸入電壓  1:10采樣電阻                 93,
  257.                 U2=Filter(Battery_voltage)/92;    //輸出電壓  1:10采樣電阻        93
  258.                 I1=Filter(O_current)/150;       //輸出電流  
  259. //                if(I1>1)                I1=I1-1;//輸出電流顯示校準
  260.                 if(U2>242)               
  261.                         {SD_1=0;        lock=1;                CCAP1L         =CCAP1H =128;        hz_lcdDis(0,8,"P");        }
  262.                 num_lcdDis(0,3,U1/10,2);
  263.                 num_lcdDis(0,6,U1%10,1);        
  264.                 num_lcdDis(1,3,U2/10,2);
  265.                 num_lcdDis(1,6,U2%10,1);
  266.                 S=OUT_Current/3;
  267.                 num_lcdDis(0,11,S/100,1);
  268.                 num_lcdDis(0,13,S%100,2);
  269.                 num_lcdDis(1,11,I1/100,1);
  270.                 num_lcdDis(1,13,I1%100,2);               
  271. //                if((u2-u1)<40)         hz_lcdDis(0,10,"Error!");
  272. //                else                          hz_lcdDis(0,10,"OK    ");
  273.                 key_scan();
  274.         }
  275. }
  276. /****************************************************************
  277. 函數說明: ADC中斷
  278. 實現功能:執行ADC采集并做電壓和電流的調整。
  279. ****************************************************************/
  280. void ADC_interrupt()interrupt 5                 //ADC轉換完后ADC_FLAG由硬件自動置位,須由軟件清零
  281. {                                
  282.         uint ADC_value;                                //ADC轉換結果        10位
  283.         ADC_CONTR&=!ADC_FLAG;                           //clear ADCflag
  284.         ADC_value=(ADC_RES<<2)+ADC_RESL;                                   //        ADC_value=(ADC_RES<<2)+ADC_RESL;
  285.         switch(channel)
  286.         {
  287.                 case 0:        Boost_voltage=ADC_value;        
  288.                                 channel=1;                                       
  289.                                 break;
  290.                 case 1:        Boost_Buck_current=ADC_value;
  291.                                 if(!Charge)
  292.                                 {
  293.                                         if(!lock)
  294.                                         {                                
  295.                                                 if((Battery_voltage<480)&&(Boost_Buck_current<OUT_Current)) //442
  296.                                                 {
  297.                                                         PWM_temp--;
  298. ……………………

  299. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼



所有資料51hei提供下載:

雙向DC-DC.rar (4.9 MB, 下載次數: 855)




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏44 分享淘帖 頂4 踩
回復

使用道具 舉報

沙發
ID:477203 發表于 2019-2-16 17:56 | 只看該作者
好東西,就沖這個加入51黑電子滴!感恩LZ。
回復

使用道具 舉報

板凳
ID:483629 發表于 2019-3-31 11:56 | 只看該作者
先謝大佬,認真看看學習
回復

使用道具 舉報

地板
ID:343874 發表于 2019-4-26 21:15 | 只看該作者
之前在proteus里仿真過buck電路,電壓出來的數值怎么都不對。過來觀摩一下樓主是怎么做的。
回復

使用道具 舉報

5#
ID:506691 發表于 2019-5-6 19:56 | 只看該作者
感謝大佬,跑來觀摩
回復

使用道具 舉報

6#
ID:542003 發表于 2019-5-19 15:16 | 只看該作者
大佬,這個怎么下載?
回復

使用道具 舉報

7#
ID:542003 發表于 2019-5-19 18:24 | 只看該作者
大佬!這個電路是拓撲結構的
回復

使用道具 舉報

8#
ID:527411 發表于 2019-5-21 11:58 | 只看該作者
謝謝分享!
回復

使用道具 舉報

9#
ID:369443 發表于 2019-5-22 21:03 | 只看該作者
感謝大佬
回復

使用道具 舉報

10#
ID:481706 發表于 2019-6-7 17:21 | 只看該作者
厲害,學習了
回復

使用道具 舉報

11#
ID:284221 發表于 2019-6-14 06:01 | 只看該作者
好東西收藏了 ,謝謝分享
回復

使用道具 舉報

12#
ID:76408 發表于 2019-7-20 11:01 | 只看該作者
謝謝樓主我下載了,
回復

使用道具 舉報

13#
ID:544367 發表于 2019-7-25 16:51 | 只看該作者
感謝大佬
回復

使用道具 舉報

14#
ID:588322 發表于 2019-7-29 11:10 | 只看該作者
好資料,正在研究這塊
回復

使用道具 舉報

15#
ID:588322 發表于 2019-7-29 11:16 | 只看該作者
學習了,感謝大佬
回復

使用道具 舉報

16#
ID:116108 發表于 2019-9-11 10:59 | 只看該作者
好東西,學習一下
回復

使用道具 舉報

17#
ID:283449 發表于 2019-11-30 21:14 | 只看該作者
觀摩大神作品
!!!
回復

使用道具 舉報

18#
ID:655159 發表于 2019-12-7 23:27 來自手機 | 只看該作者
想問樓主電流采樣部分可以直接換成INA282么,,感覺功能一樣,,可是仿真好像不對
回復

使用道具 舉報

19#
ID:116662 發表于 2020-4-4 20:24 | 只看該作者
高手師傅,多謝分享
回復

使用道具 舉報

20#
ID:453741 發表于 2020-5-2 23:58 | 只看該作者
好東西,感謝每一位有開源思想的硬件人,是你們推動了行業的快速發展。感恩
回復

使用道具 舉報

21#
ID:223038 發表于 2020-5-10 22:10 | 只看該作者
學習一下,很棒的資料
回復

使用道具 舉報

22#
ID:750512 發表于 2020-5-13 09:55 | 只看該作者
不錯,相當強大。
回復

使用道具 舉報

23#
ID:377382 發表于 2020-5-22 01:06 | 只看該作者
好東西感恩LZ。
回復

使用道具 舉報

24#
ID:784779 發表于 2020-6-20 20:06 | 只看該作者
keil 里管腳咋配置啊
回復

使用道具 舉報

25#
ID:712493 發表于 2020-6-22 09:51 | 只看該作者
β>β0 這個怎么理解
回復

使用道具 舉報

26#
ID:517951 發表于 2020-11-15 17:22 | 只看該作者
很詳細不錯電源資料,值得學習。51hei有你更精彩!!
回復

使用道具 舉報

27#
ID:697270 發表于 2020-11-16 16:51 | 只看該作者
先謝大佬,認真看看學習
回復

使用道具 舉報

28#
ID:848824 發表于 2020-12-16 06:32 來自手機 | 只看該作者
高手啊!小白看不懂
回復

使用道具 舉報

29#
ID:357153 發表于 2020-12-28 13:40 | 只看該作者
感謝樓主的分享。收藏、值得學習
回復

使用道具 舉報

30#
ID:128989 發表于 2021-4-3 23:27 | 只看該作者
這個是雙向DCDC?
回復

使用道具 舉報

31#
ID:1012868 發表于 2022-3-24 20:56 | 只看該作者
謝謝樓主 發的帖子真的很有用 學到很多作為新手小白
回復

使用道具 舉報

32#
ID:985506 發表于 2022-5-10 09:53 | 只看該作者
資料很齊全,為大家做貢獻了
回復

使用道具 舉報

33#
ID:1027587 發表于 2022-5-19 18:28 | 只看該作者
盡管暫時看不懂,但資料齊全,感謝樓主
回復

使用道具 舉報

34#
ID:1043205 發表于 2022-9-4 17:14 來自手機 | 只看該作者
樓主 問一下為什么要用ir2014  能詳細說說嗎?
回復

使用道具 舉報

35#
ID:92810 發表于 2022-9-9 11:50 | 只看該作者
謝謝樓主分享了,很強啊!!
回復

使用道具 舉報

36#
ID:997263 發表于 2022-12-14 17:53 | 只看該作者
好文章
回復

使用道具 舉報

37#
ID:507641 發表于 2023-3-11 16:30 | 只看該作者
電壓調整率   負載調整率  怎么不對的???
回復

使用道具 舉報

38#
ID:985506 發表于 2023-3-12 15:32 | 只看該作者
感謝資料分享!MOSFET驅動沒有給負壓,是否有影響關斷時間?
回復

使用道具 舉報

39#
ID:1089511 發表于 2023-7-27 15:15 | 只看該作者
有完整原理圖嗎
回復

使用道具 舉報

40#
ID:644431 發表于 2024-1-3 22:22 | 只看該作者
這個好像是單向電源吧
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产三级国产aⅴ无密码 | 99久久精品免费看国产四区 | 欧美福利| 天天操夜夜操 | 激情网站在线观看 | 欧美一级在线观看 | www.婷婷 | 天天影视网天天综合色在线播放 | 中文字幕成人av | 国产精品嫩草影院精东 | 日韩午夜电影在线观看 | 欧美在线一二三 | 中文字幕一区二区三区四区五区 | 激情五月婷婷 | 亚洲一区二区三区在线播放 | 中文字幕电影在线观看 | 成人影| 国产精品久久久久久久久婷婷 | 亚洲激情在线视频 | 丝袜天堂 | 国产精品视频综合 | 久久国产精品偷 | 久热精品免费 | 久久久久久久电影 | 欧美日韩亚洲系列 | 九九亚洲| 欧美成视频在线观看 | 亚洲永久精品国产 | 成人精品免费视频 | 国产精品欧美大片 | 亚洲三级av | 国产日韩欧美激情 | 亚洲高清一区二区三区 | 日韩在线精品 | 色综合一区二区三区 | 久久久久久久一区 | 精品视频在线观看 | 亚洲网站在线播放 | 视频一区二区中文字幕 | 中文字幕亚洲视频 | 久久亚 |