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

標(biāo)題: 基于ATC51的新型數(shù)控直流電源設(shè)計 [打印本頁]

作者: 風(fēng)無依    時間: 2018-5-17 16:09
標(biāo)題: 基于ATC51的新型數(shù)控直流電源設(shè)計
  摘要:針對目前的電源普遍存在輸出恒定、精度較差的問題,設(shè)計了一種基于單片機的新型數(shù)控直流電源。主要分為電源模塊,單片機控制模塊,數(shù)碼管、按鍵模塊和PWM波輸出驅(qū)動模塊這4部分。首先通過鍵盤輸入預(yù)期的電壓值,單片機根據(jù)輸入值輸出不同占空比的PWM波,控制可控穩(wěn)壓芯片LM317的輸出,輸出結(jié)果在數(shù)碼管上顯示。在整個系統(tǒng)中,由專門的電源穩(wěn)壓模塊提供穩(wěn)定電壓以減小誤差。輸出電壓范圍為0.00~15.00V,電流范圍0.1 A,誤差不超過5%,具有使用靈活、精度高、工作穩(wěn)定,成本低的優(yōu)點,適宜推廣使用。

    在各種電子設(shè)備中,電源是一種必不可少的儀器。隨著科技的進步,電子設(shè)備逐漸綜合化,復(fù)雜化,對電源部分使用的靈活性和精度都提出了更高的要求。
    目前所用的電源大多是只有固定電壓輸出(例如常用的有:±5 V、±12 V或±15 V),其缺點是輸出電壓不可人為地改變,輸出精度和穩(wěn)定性都不高;在測量上,傳統(tǒng)的電源一般采用指針式或數(shù)字式來顯示電壓或電流,搭配電位器調(diào)整所要的電壓及電流輸出值。若要調(diào)整精確的電壓輸出,須搭配精確的顯示儀表監(jiān)測;又因電位器的阻值特性非線性,在調(diào)整時,需要花費一定的時間,而且會產(chǎn)生漂移。市場上銷售的數(shù)字可調(diào)電源成本較高,使用也不方便。
    針對這一現(xiàn)象,本文提出了一種基于AT98C51單片機的新型數(shù)控直流電源。
    鍵盤輸入控制輸出電壓值,數(shù)碼管顯示輸出電壓值。輸出電壓范圍0.00~15.00 V,電流范圍0~1 A,輸出電壓的精度為百分位,誤差小于0.5%。具有使用靈活,精度高,工作穩(wěn)定,成本低的優(yōu)點,適宜推廣使用。

1 硬件電路組成及工作原理
1.1 系統(tǒng)硬件結(jié)構(gòu)
    系統(tǒng)硬件結(jié)構(gòu)如圖1所示。系統(tǒng)分為電源模塊,單片機控制模塊,數(shù)碼管、按鍵模塊和PWM波輸出驅(qū)動模塊4部分組成。電源模塊主要由外接不可控電源和二級濾波電路組成PI型濾波電路;單片機控制模塊主要由AT98C51單片機及其外圍電路組成;數(shù)碼管、按鍵模塊包括數(shù)碼管顯示部分和鍵盤輸入部分;PWM波輸出驅(qū)動模塊主要由穩(wěn)壓芯片LM317,三極管及其配套電路組成。本數(shù)控直流電源通過按鍵控制單片機產(chǎn)生PWM信號驅(qū)動級(三極管)的線性放大,來控制穩(wěn)壓芯片LM317的ADJ控制端口,通過調(diào)節(jié)其占空比對電容進行充放電實現(xiàn)能量轉(zhuǎn)換,從而調(diào)節(jié)輸出電壓,最后通過數(shù)碼管顯示。各部分的電源由電源模塊提供的穩(wěn)壓輸出提供。本系統(tǒng)還可以通過串行口實現(xiàn)上位計算機和數(shù)字電源之間的通訊,人機交互圖形用戶界面(GUI)可以是設(shè)計人員按照計算機屏幕上的指示的步驟,通過選擇參數(shù)來對電源電壓,電流閥值與響應(yīng),軟啟動,容限,環(huán)路補償?shù)墓δ艿墓芾砉ぷ鳎部梢酝ㄟ^按鍵來設(shè)定。

1.2 電源模塊
    電源模塊是通過外部輸入20 V的不可控電壓輸入,經(jīng)過穩(wěn)壓管系統(tǒng)提供電源保證。LM78012是12 V的穩(wěn)壓芯片,輸出12 V的穩(wěn)定電壓,提供給輸出驅(qū)動模塊LM317的輸入級。LM7805是5 V的穩(wěn)壓芯片,提供穩(wěn)定的5 V電壓,提供給單片機的電壓輸入端。VD2為二極管串入,起保護作用,防止輸入反極性時燒毀電路芯片。C9,C5,C12n,C6,C7,C3為濾波電容,阻值如圖2所示,組成PI型二階濾波電路,消除電源紋波的干擾影響。

1.3 單片機控制系統(tǒng)
    本系統(tǒng)采用Atmel公司生產(chǎn)的AT98C51單片機。它是一種低電壓、低功耗、高性能的CMOS 8位單片機,片內(nèi)含8 kB可反復(fù)擦寫的程序存儲器和256 B的數(shù)據(jù)存儲器。單片機及其必要的外圍電路,包括復(fù)位電路和晶振電路如圖3所示。
    本系統(tǒng)使用AT98C51自帶的PWM模塊,通過內(nèi)部定時器,采用脈寬調(diào)制技術(shù)。P1.0~P1.2作為輸入端,輸入3位按鍵控制量,P2.0~P2.7作為輸出端,輸出8位數(shù)碼管信號,由P1.6口輸出不同占空比的方波。這樣將輸入的外界光強的變化轉(zhuǎn)化為輸出的PWM波的占空比的變化。
1.4 數(shù)碼管,按鍵模塊
    數(shù)碼管顯示模塊:LED驅(qū)動顯示用的是共陰極的4位顯示數(shù)碼管(MY5841AH),外帶8位上拉電阻(510 R),提高貫穿電流,用于顯示電源輸出的電壓幅度值,便于人機交互。

    按鍵模塊:用于外界輸入設(shè)定電源初值與調(diào)節(jié)輸出使用。S3為電壓增加按鈕,每按一下輸出電壓值增加0.01 V;S4為電壓減小按鈕,每按一下輸出電壓減小0.01 V;S5為備用按鍵。
1.5 PWM驅(qū)動輸出模塊
    PWM為脈寬調(diào)制技術(shù),不同的占空比來控制目標(biāo)的動態(tài)變化,通常在線性調(diào)節(jié)、輸出調(diào)節(jié)、電壓調(diào)整以及電機控制方面都有很大的應(yīng)用。如圖5所示,此模塊為電源核心模塊。R5為上拉電阻,R1為限流電阻,為三極管基極提供穩(wěn)定的PWM波型,起到穩(wěn)定PWM輸出的作用。風(fēng)將三極管集電極輸出的放大電流轉(zhuǎn)化為電壓,同時與高精度可控穩(wěn)壓芯片LM317的控制端ADJ和電容C10相接。通過對電容C10進行充放電實現(xiàn)能量轉(zhuǎn)換,控制輸出可調(diào)ADJ調(diào)節(jié)端口,即達(dá)到通過調(diào)節(jié)PWM波占空比來控制輸出電壓的目的。

    PWM波占空比的改變,即改變穩(wěn)壓回路的三極管的導(dǎo)通時間及導(dǎo)通狀態(tài)。以占空比從50%~100%的增加來舉例說明。當(dāng)占空比增加,三極管在一個周期內(nèi)導(dǎo)通時間減少,C10充放電頻率加快,放電時間減小,控制端輸入電流增大,輸出電壓增大。本電源設(shè)定占空比范圍即為50%~100%。
    調(diào)節(jié)R6可以調(diào)節(jié)輸入控制電壓最高值的大小與最小值的范圍。C8與C10均作為濾波電容,濾除高噪聲,R8與R4為分壓電阻,用于配合R6來校正輸出值。其大小根據(jù)不同使用要求而定。

2 系統(tǒng)軟件設(shè)計
    系統(tǒng)的主要任務(wù)是根據(jù)按鍵的輸入值,通過單片機控制輸出PWM波占空比的改變,控制三極管的導(dǎo)通時間和導(dǎo)通狀態(tài),進而達(dá)到控制可控穩(wěn)壓芯片LM317輸出電壓的目的。系統(tǒng)軟件設(shè)計的重點在于單片機的編程。系統(tǒng)主程序流程如圖6所示。

    單片機編程主要包括初始化程序,鍵盤處理程序,外部中斷程序和PWM波輸出程序等。初始化包括硬件的初始化和定時器的初始化;鍵盤處理程序主要包括鍵盤掃描和防抖動;外部中斷程序起保護電路的作用;產(chǎn)生PWM波采用中斷延時配合循環(huán)指令。
    系統(tǒng)工作流程為:單片機上電復(fù)位,初始化系統(tǒng)內(nèi)部定時器寄存器,固定輸出的PWM管腳,系統(tǒng)按鍵值,通過內(nèi)部定時器定時產(chǎn)生定器最小的中斷時間,通過按鍵掃描程序檢測需要輸出的電壓值和變量累加到達(dá)輸出不同要求的占空比的方波,以控制穩(wěn)壓芯片控制管腳,并通過LED顯示掃描程序顯示實際輸出電壓值。
    其中有以下兩點需要注意:
    1)鍵盤在定時中斷服務(wù)程序中讀取,用中斷間隔時間實現(xiàn)鍵盤去抖動,不必編寫另外的延時程序,提高CPU的效率。鍵盤值存入數(shù)據(jù)緩沖區(qū),在主程序中讀數(shù)據(jù)緩沖區(qū)的內(nèi)容。
    2)外部中斷為高優(yōu)先級中斷,編制子程序?qū)崿F(xiàn)電源過流,短路保護時,要充分考慮到電源啟動瞬間會產(chǎn)生數(shù)倍于額定電流的沖擊電流,大約會持續(xù)3~5 ms,應(yīng)在軟件上采取措施,避免短路和電源開啟的誤判。確定電源過流、短路后,切斷電源輸出。間隔一段時間后,試接通電源開關(guān),當(dāng)發(fā)現(xiàn)過流、短路信號已消除,則恢復(fù)電源的輸出,否則電源開關(guān)仍然保持?jǐn)嚅_。
    核心程序代碼:
    中斷函數(shù)產(chǎn)生PWM程序
   

3 測試數(shù)據(jù)分析
    在實驗室環(huán)境下,對該電源進行功能測試和誤差分析。在輸出范圍1~15 V內(nèi)共測試16組數(shù)據(jù),平均間隔值為1 V。首先通過鍵盤輸入預(yù)期值,同時記錄輸出顯示值,再進行記錄對比。數(shù)據(jù)如表1所示。由表1可見,在測試范圍內(nèi)輸出誤差在5%之內(nèi),在中間段誤差相對較大。


4 結(jié)束語
    本文設(shè)計了一種基于ATC51的新型高精度數(shù)控直流電源以解決傳統(tǒng)數(shù)控直流電源價格昂貴,誤差較大的問題。本電源通過鍵盤輸入值控制單片機輸出不同占空比的PWM波,進而控制可控穩(wěn)壓芯片LM317的輸出。在整個系統(tǒng)中,由專門的電源穩(wěn)壓模塊提供穩(wěn)定電壓以減小誤差。輸出電壓范圍為0.00~15.00 V,電流范圍0~1 A,誤差不超過5%,具有使用靈活,精度高,工作穩(wěn)定,成本低的優(yōu)點,適宜推廣使用。

單片機源程序如下:
  1. #include <reg52.h>                        //通用52單片機頭文件
  2. #define uchar unsigned char                                 
  3. sbit RESET=P3^3;                   //DA轉(zhuǎn)換數(shù)值復(fù)位端口位定義
  4. sbit keyup=P3^4;                   //步進加端口位定義
  5. sbit keydown=P3^5;                   //步進減端口位定義
  6. sbit LEDwei1=P2^7;                   //低位數(shù)碼管位選
  7. sbit LEDwei2=P2^6;                   //高位數(shù)碼管位選
  8. #define duan P0            //段選宏定義  
  9. void delay(int);                   //延時函數(shù)聲明
  10. void display(uchar);           //顯示函數(shù)聲明
  11. uchar code LEDcode[]={0xc0,0xf9,0xa4,0xb0,0x99,
  12.                                       0x92,0x82,0xF8,0x80,0x90,0x8e};       //共陽數(shù)碼管0-9和F(為段選所用)
  13. uchar code byte[]={ 0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,        0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
  14.                                        
  15.                                         0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,        0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
  16.                                        
  17.                                         0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,        0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
  18.                                        
  19.                                         0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,        0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
  20.                                        
  21.                                         0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,        0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
  22.                                        
  23.                                         0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,        0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
  24.                                        
  25.                                         0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,        0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
  26.                                        
  27.                                         0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,        0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe,
  28.                                        
  29.                                         };//DA轉(zhuǎn)換數(shù)據(jù)

  30. uchar code table[]={0x11,0x12,15,16,17,18,20,21,22,23, 24,25,27,28,29,30,31,32,34,35,
  31.                                         36,37,38,39,41,42,43,44,45,47, 48,49,50,51,52,53,55,56,57,58,
  32.                                         59,61,62,63,64,65,66,68,69,70, 71,72,73,75,76,77,78,79,80,82,
  33.                                         83,84,85,86,87,89,90,91,92,93, 94,96,97,98,99};        //用于顯示電壓值的數(shù)組

  34. void main()
  35. {
  36.         uchar num=0;         
  37.         while(1)
  38.         {
  39.                          if(keyup==0)                 //步進加端口為低電平,
  40.                         {        
  41.                                 delay(10);                  //稍作延時,消抖,
  42.                                 if(keyup==0)          //步進加端口依然為低電平,說明的確是被按下,
  43.                                 {        
  44.                                         if(num==128)  //執(zhí)行電壓DA轉(zhuǎn)換數(shù)值步進增加一
  45.                                         num=0;
  46.                                         else
  47.                                         num++;
  48.                                 }
  49.                                 while(keyup==0);        //防止按死語句
  50.                          }
  51.                  if(keydown==0)                                 //步進減端口為低電平,
  52.                          {
  53.                                  delay(10);                         //稍作延時,消抖,
  54.                                 if(keydown==0)                 //步進減端口依然為低電平,說明的確是被按下,
  55.                                 {        
  56.                                         if(num==0)                  //執(zhí)行電壓DA轉(zhuǎn)換數(shù)值步進減一
  57.                                         num=128;
  58.                                         else
  59.                                         num--;
  60.                                 }
  61.                                 while(keydown==0);          //防止按死語句
  62.                          }
  63.                  if(RESET==0)                                  // 復(fù)位端口為低電平
  64.                          {
  65.                                  delay(10);                          //稍作延時,消抖,
  66.                                 if(RESET==0)                  //復(fù)位端口依然為低電平,說明的確是被按下,
  67.                                 {        
  68.                                         num=0;                          //執(zhí)行復(fù)位操作
  69.                                 }
  70.                                 while(RESET==0);           //防止按死語句
  71.                          }
  72.         
  73.                  P1=byte[num];           //給DA一個數(shù)值,轉(zhuǎn)化成相應(yīng)的電壓值
  74.                  delay(10);
  75.                  display(num);           //調(diào)用顯示函數(shù)顯示電壓值
  76.          }
  77. }

  78. void delay(int x)                   //12M晶振,約1ms延時函數(shù)
  79. {
  80.         int i;
  81.         for(;x>0;x--)
  82.         for(i=0;i<123;i++)
  83.                 ;
  84. }
  85. void display(uchar num)              //顯示函數(shù)
  86. {        uchar temp;
  87.         temp=table[num];
  88.         if(num<75)                //電壓值小于10V的可以直接在數(shù)碼管上顯示出來
  89.         {
  90.              duan=LEDcode[temp/10]&0x7f;        //顯示個位,并加顯小數(shù)點
  91.                  LEDwei1=1;
  92.                  delay(5);
  93.                  LEDwei1=0;
  94.                  duan=LEDcode[temp%10];;          //顯示小數(shù)點后一位
  95.                  LEDwei2=1;
  96.                  delay(5);
  97.                  LEDwei2=0;
  98.         }
  99.         else               //電壓值大于10V的在數(shù)碼管上顯示字母"FF"
  100.         {                                          
  101.                  duan=LEDcode[10];            //顯示高位
  102.                  LEDwei1=1;
  103.                  delay(5);
  104.                  LEDwei1=0;
  105.                  duan=LEDcode[10];            //顯示低位
  106.                  LEDwei2=1;
  107.                  delay(5);
  108.                  LEDwei2=0;
  109.         }
  110. }                                            
復(fù)制代碼

所有資料51hei提供下載:
wenya.zip (27.04 KB, 下載次數(shù): 28)







歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 成人av免费 | 国产精品亚洲一区二区三区在线观看 | 亚洲精品丝袜日韩 | 久久人体视频 | 四虎影| 成人免费高清 | 欧美日韩综合精品 | 欧美一区免费 | 皇色视频在线 | 午夜小影院 | 999视频 | 色在线视频网站 | 久久久久久久久国产成人免费 | 精品一区二区三区在线观看 | 综合国产第二页 | 一区欧美 | 91免费在线 | 99久久国产综合精品麻豆 | 日韩二| 亚洲激情一区二区三区 | 久久久精| 欧美二区在线 | 黄色三级毛片 | 欧美淫片| 久久久久久综合 | 中文字幕 在线观看 | 国产乱码一区 | 91资源在线 | 在线视频一区二区三区 | 精品一区二区三区中文字幕 | 午夜小视频在线观看 | 久久精品视频网站 | 久草热在线 | 欧美一区二区三区在线播放 | 91电影 | 高清国产午夜精品久久久久久 | 日韩综合在线 | 女人av| 亚洲视频中文字幕 | 欧美综合一区 | 国产无套一区二区三区久久 |