摘要:針對目前的電源普遍存在輸出恒定、精度較差的問題,設計了一種基于單片機的新型數控直流電源。主要分為電源模塊,單片機控制模塊,數碼管、按鍵模塊和PWM波輸出驅動模塊這4部分。首先通過鍵盤輸入預期的電壓值,單片機根據輸入值輸出不同占空比的PWM波,控制可控穩壓芯片LM317的輸出,輸出結果在數碼管上顯示。在整個系統中,由專門的電源穩壓模塊提供穩定電壓以減小誤差。輸出電壓范圍為0.00~15.00V,電流范圍0.1 A,誤差不超過5%,具有使用靈活、精度高、工作穩定,成本低的優點,適宜推廣使用。
在各種電子設備中,電源是一種必不可少的儀器。隨著科技的進步,電子設備逐漸綜合化,復雜化,對電源部分使用的靈活性和精度都提出了更高的要求。
目前所用的電源大多是只有固定電壓輸出(例如常用的有:±5 V、±12 V或±15 V),其缺點是輸出電壓不可人為地改變,輸出精度和穩定性都不高;在測量上,傳統的電源一般采用指針式或數字式來顯示電壓或電流,搭配電位器調整所要的電壓及電流輸出值。若要調整精確的電壓輸出,須搭配精確的顯示儀表監測;又因電位器的阻值特性非線性,在調整時,需要花費一定的時間,而且會產生漂移。市場上銷售的數字可調電源成本較高,使用也不方便。
針對這一現象,本文提出了一種基于AT98C51單片機的新型數控直流電源。
鍵盤輸入控制輸出電壓值,數碼管顯示輸出電壓值。輸出電壓范圍0.00~15.00 V,電流范圍0~1 A,輸出電壓的精度為百分位,誤差小于0.5%。具有使用靈活,精度高,工作穩定,成本低的優點,適宜推廣使用。
1 硬件電路組成及工作原理
1.1 系統硬件結構
系統硬件結構如圖1所示。系統分為電源模塊,單片機控制模塊,數碼管、按鍵模塊和PWM波輸出驅動模塊4部分組成。電源模塊主要由外接不可控電源和二級濾波電路組成PI型濾波電路;單片機控制模塊主要由AT98C51單片機及其外圍電路組成;數碼管、按鍵模塊包括數碼管顯示部分和鍵盤輸入部分;PWM波輸出驅動模塊主要由穩壓芯片LM317,三極管及其配套電路組成。本數控直流電源通過按鍵控制單片機產生PWM信號驅動級(三極管)的線性放大,來控制穩壓芯片LM317的ADJ控制端口,通過調節其占空比對電容進行充放電實現能量轉換,從而調節輸出電壓,最后通過數碼管顯示。各部分的電源由電源模塊提供的穩壓輸出提供。本系統還可以通過串行口實現上位計算機和數字電源之間的通訊,人機交互圖形用戶界面(GUI)可以是設計人員按照計算機屏幕上的指示的步驟,通過選擇參數來對電源電壓,電流閥值與響應,軟啟動,容限,環路補償的功能的管理工作,也可以通過按鍵來設定。
010U630H-0.jpg (11.5 KB, 下載次數: 28)
下載附件
2018-5-17 17:56 上傳
1.2 電源模塊
電源模塊是通過外部輸入20 V的不可控電壓輸入,經過穩壓管系統提供電源保證。LM78012是12 V的穩壓芯片,輸出12 V的穩定電壓,提供給輸出驅動模塊LM317的輸入級。LM7805是5 V的穩壓芯片,提供穩定的5 V電壓,提供給單片機的電壓輸入端。VD2為二極管串入,起保護作用,防止輸入反極性時燒毀電路芯片。C9,C5,C12n,C6,C7,C3為濾波電容,阻值如圖2所示,組成PI型二階濾波電路,消除電源紋波的干擾影響。
010U63W4-1.jpg (53.64 KB, 下載次數: 37)
下載附件
2018-5-17 17:56 上傳
1.3 單片機控制系統
本系統采用Atmel公司生產的AT98C51單片機。它是一種低電壓、低功耗、高性能的CMOS 8位單片機,片內含8 kB可反復擦寫的程序存儲器和256 B的數據存儲器。單片機及其必要的外圍電路,包括復位電路和晶振電路如圖3所示。
本系統使用AT98C51自帶的PWM模塊,通過內部定時器,采用脈寬調制技術。P1.0~P1.2作為輸入端,輸入3位按鍵控制量,P2.0~P2.7作為輸出端,輸出8位數碼管信號,由P1.6口輸出不同占空比的方波。這樣將輸入的外界光強的變化轉化為輸出的PWM波的占空比的變化。
1.4 數碼管,按鍵模塊
數碼管顯示模塊:LED驅動顯示用的是共陰極的4位顯示數碼管(MY5841AH),外帶8位上拉電阻(510 R),提高貫穿電流,用于顯示電源輸出的電壓幅度值,便于人機交互。
010U622K-2.jpg (50.43 KB, 下載次數: 26)
下載附件
2018-5-17 17:56 上傳
按鍵模塊:用于外界輸入設定電源初值與調節輸出使用。S3為電壓增加按鈕,每按一下輸出電壓值增加0.01 V;S4為電壓減小按鈕,每按一下輸出電壓減小0.01 V;S5為備用按鍵。
1.5 PWM驅動輸出模塊
PWM為脈寬調制技術,不同的占空比來控制目標的動態變化,通常在線性調節、輸出調節、電壓調整以及電機控制方面都有很大的應用。如圖5所示,此模塊為電源核心模塊。R5為上拉電阻,R1為限流電阻,為三極管基極提供穩定的PWM波型,起到穩定PWM輸出的作用。風將三極管集電極輸出的放大電流轉化為電壓,同時與高精度可控穩壓芯片LM317的控制端ADJ和電容C10相接。通過對電容C10進行充放電實現能量轉換,控制輸出可調ADJ調節端口,即達到通過調節PWM波占空比來控制輸出電壓的目的。
010UA5E-3.jpg (16.74 KB, 下載次數: 24)
下載附件
2018-5-17 17:56 上傳
PWM波占空比的改變,即改變穩壓回路的三極管的導通時間及導通狀態。以占空比從50%~100%的增加來舉例說明。當占空比增加,三極管在一個周期內導通時間減少,C10充放電頻率加快,放電時間減小,控制端輸入電流增大,輸出電壓增大。本電源設定占空比范圍即為50%~100%。
調節R6可以調節輸入控制電壓最高值的大小與最小值的范圍。C8與C10均作為濾波電容,濾除高噪聲,R8與R4為分壓電阻,用于配合R6來校正輸出值。其大小根據不同使用要求而定。
2 系統軟件設計
系統的主要任務是根據按鍵的輸入值,通過單片機控制輸出PWM波占空比的改變,控制三極管的導通時間和導通狀態,進而達到控制可控穩壓芯片LM317輸出電壓的目的。系統軟件設計的重點在于單片機的編程。系統主程序流程如圖6所示。
010UC105-4.jpg (20.32 KB, 下載次數: 25)
下載附件
2018-5-17 17:56 上傳
單片機編程主要包括初始化程序,鍵盤處理程序,外部中斷程序和PWM波輸出程序等。初始化包括硬件的初始化和定時器的初始化;鍵盤處理程序主要包括鍵盤掃描和防抖動;外部中斷程序起保護電路的作用;產生PWM波采用中斷延時配合循環指令。
系統工作流程為:單片機上電復位,初始化系統內部定時器寄存器,固定輸出的PWM管腳,系統按鍵值,通過內部定時器定時產生定器最小的中斷時間,通過按鍵掃描程序檢測需要輸出的電壓值和變量累加到達輸出不同要求的占空比的方波,以控制穩壓芯片控制管腳,并通過LED顯示掃描程序顯示實際輸出電壓值。
其中有以下兩點需要注意:
1)鍵盤在定時中斷服務程序中讀取,用中斷間隔時間實現鍵盤去抖動,不必編寫另外的延時程序,提高CPU的效率。鍵盤值存入數據緩沖區,在主程序中讀數據緩沖區的內容。
2)外部中斷為高優先級中斷,編制子程序實現電源過流,短路保護時,要充分考慮到電源啟動瞬間會產生數倍于額定電流的沖擊電流,大約會持續3~5 ms,應在軟件上采取措施,避免短路和電源開啟的誤判。確定電源過流、短路后,切斷電源輸出。間隔一段時間后,試接通電源開關,當發現過流、短路信號已消除,則恢復電源的輸出,否則電源開關仍然保持斷開。
核心程序代碼:
中斷函數產生PWM程序
010UB1R-5.jpg (25.48 KB, 下載次數: 38)
下載附件
2018-5-17 17:56 上傳
3 測試數據分析
在實驗室環境下,對該電源進行功能測試和誤差分析。在輸出范圍1~15 V內共測試16組數據,平均間隔值為1 V。首先通過鍵盤輸入預期值,同時記錄輸出顯示值,再進行記錄對比。數據如表1所示。由表1可見,在測試范圍內輸出誤差在5%之內,在中間段誤差相對較大。
010U61961-6.jpg (21.5 KB, 下載次數: 26)
下載附件
2018-5-17 17:56 上傳
4 結束語
本文設計了一種基于ATC51的新型高精度數控直流電源以解決傳統數控直流電源價格昂貴,誤差較大的問題。本電源通過鍵盤輸入值控制單片機輸出不同占空比的PWM波,進而控制可控穩壓芯片LM317的輸出。在整個系統中,由專門的電源穩壓模塊提供穩定電壓以減小誤差。輸出電壓范圍為0.00~15.00 V,電流范圍0~1 A,誤差不超過5%,具有使用靈活,精度高,工作穩定,成本低的優點,適宜推廣使用。
單片機源程序如下:
- #include <reg52.h> //通用52單片機頭文件
- #define uchar unsigned char
- sbit RESET=P3^3; //DA轉換數值復位端口位定義
- sbit keyup=P3^4; //步進加端口位定義
- sbit keydown=P3^5; //步進減端口位定義
- sbit LEDwei1=P2^7; //低位數碼管位選
- sbit LEDwei2=P2^6; //高位數碼管位選
- #define duan P0 //段選宏定義
- void delay(int); //延時函數聲明
- void display(uchar); //顯示函數聲明
- uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,
- 0x92,0x82,0xF8,0x80,0x90,0x8e}; //共陽數碼管0-9和F(為段選所用)
- uchar code byte[]={ 0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e, 0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
-
- 0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e, 0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
-
- 0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e, 0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
-
- 0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e, 0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
-
- 0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e, 0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
-
- 0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae, 0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
-
- 0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce, 0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
-
- 0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee, 0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe,
-
- };//DA轉換數據
- uchar code table[]={0x11,0x12,15,16,17,18,20,21,22,23, 24,25,27,28,29,30,31,32,34,35,
- 36,37,38,39,41,42,43,44,45,47, 48,49,50,51,52,53,55,56,57,58,
- 59,61,62,63,64,65,66,68,69,70, 71,72,73,75,76,77,78,79,80,82,
- 83,84,85,86,87,89,90,91,92,93, 94,96,97,98,99}; //用于顯示電壓值的數組
- void main()
- {
- uchar num=0;
- while(1)
- {
- if(keyup==0) //步進加端口為低電平,
- {
- delay(10); //稍作延時,消抖,
- if(keyup==0) //步進加端口依然為低電平,說明的確是被按下,
- {
- if(num==128) //執行電壓DA轉換數值步進增加一
- num=0;
- else
- num++;
- }
- while(keyup==0); //防止按死語句
- }
- if(keydown==0) //步進減端口為低電平,
- {
- delay(10); //稍作延時,消抖,
- if(keydown==0) //步進減端口依然為低電平,說明的確是被按下,
- {
- if(num==0) //執行電壓DA轉換數值步進減一
- num=128;
- else
- num--;
- }
- while(keydown==0); //防止按死語句
- }
- if(RESET==0) // 復位端口為低電平
- {
- delay(10); //稍作延時,消抖,
- if(RESET==0) //復位端口依然為低電平,說明的確是被按下,
- {
- num=0; //執行復位操作
- }
- while(RESET==0); //防止按死語句
- }
-
- P1=byte[num]; //給DA一個數值,轉化成相應的電壓值
- delay(10);
- display(num); //調用顯示函數顯示電壓值
- }
- }
- void delay(int x) //12M晶振,約1ms延時函數
- {
- int i;
- for(;x>0;x--)
- for(i=0;i<123;i++)
- ;
- }
- void display(uchar num) //顯示函數
- { uchar temp;
- temp=table[num];
- if(num<75) //電壓值小于10V的可以直接在數碼管上顯示出來
- {
- duan=LEDcode[temp/10]&0x7f; //顯示個位,并加顯小數點
- LEDwei1=1;
- delay(5);
- LEDwei1=0;
- duan=LEDcode[temp%10];; //顯示小數點后一位
- LEDwei2=1;
- delay(5);
- LEDwei2=0;
- }
- else //電壓值大于10V的在數碼管上顯示字母"FF"
- {
- duan=LEDcode[10]; //顯示高位
- LEDwei1=1;
- delay(5);
- LEDwei1=0;
- duan=LEDcode[10]; //顯示低位
- LEDwei2=1;
- delay(5);
- LEDwei2=0;
- }
- }
復制代碼
所有資料51hei提供下載:
wenya.zip
(27.04 KB, 下載次數: 28)
2018-5-17 16:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|