找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 17518|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)數(shù)控恒流源(電路原理圖講解+程序代碼)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
電路原理圖如下:


該項(xiàng)設(shè)計(jì)的主要目的是設(shè)計(jì)一種數(shù)控穩(wěn)壓電源。它利用單片機(jī)STC89C51作為主控芯片,控制數(shù)字/模擬轉(zhuǎn)換器(TLC5615)的輸出電壓的大小,經(jīng)過運(yùn)算放大器LM358與IRF9Z24N構(gòu)成負(fù)反饋系統(tǒng),從而輸出恒定電壓。最后通過電位器分壓將輸出信號(hào)反饋到運(yùn)算放大器LM358上,使輸出準(zhǔn)確度可以調(diào)節(jié)。此設(shè)計(jì)通過鍵盤電路與單片機(jī)連接,讀入控制數(shù)據(jù),利用軟件進(jìn)行判斷,從而起到控制電源輸出的作用。通過LCD1602(或LED數(shù)碼管)顯示數(shù)控電源的輸出電壓,實(shí)現(xiàn)簡(jiǎn)單的人機(jī)對(duì)話。該項(xiàng)設(shè)計(jì)具有設(shè)計(jì)簡(jiǎn)單,控制靈活,調(diào)節(jié)方便,攜帶方便、成本低等優(yōu)勢(shì),具有較強(qiáng)的實(shí)用性。

下圖是為了了解整個(gè)電路如何工作的,把整個(gè)電路拆開。
二、原理講解:
供電部分:
P2為接線柱,是整個(gè)系統(tǒng)的輸入電壓端口,整個(gè)數(shù)控電源有此輸入能量。D1、D2、D3、D4為四個(gè)二極管(in4007),起整流的作用,C6為濾波電容。整流濾波電路是使供電可以為交流,同時(shí)也可以用直流供電(交流供電不要超過20V,直流不要超過35V)。受電壓限制的主要是后級(jí)運(yùn)放耐壓、TL431耐壓以及7812的耐壓值。7812主要為保護(hù)7805,7805穩(wěn)出5V電壓共單片機(jī)供電使用。但是7805耐壓值是15V,所以前級(jí)要加7812保護(hù)7805。
晶振部分:
C2、C3、Y1(12MHZ)與單片機(jī)端口構(gòu)成震蕩電路,為51單片機(jī)提供時(shí)鐘。
復(fù)位電路:
RST連接單片機(jī)復(fù)位管腳,此電路及有上電復(fù)位功能,又有手動(dòng)復(fù)位功能。C1、R2構(gòu)成上電復(fù)位電路,上電瞬間C1導(dǎo)通,則RST為高電平,單片機(jī)將復(fù)位,電壓穩(wěn)定后C1儲(chǔ)存的電能通過R2對(duì)地釋放掉,單片機(jī)將正常運(yùn)行。同樣K2按下時(shí)RST為高電平,單片機(jī)復(fù)位,彈起來時(shí)RST為低電平,單片機(jī)正常運(yùn)行.
單片機(jī)部分:
單片機(jī)默認(rèn)選用STC89C51,同時(shí)兼容STC89C52、AT89S52、AT89S51、AT89C51等51單片機(jī)。
按鍵部分:
按鍵選用獨(dú)立按鍵,掃描時(shí)間短,使程序更簡(jiǎn)單且掃描時(shí)間更短,從而提高穩(wěn)定性。按鍵彈起時(shí)P20、P21、P22、P23為弱上拉狀態(tài),所以為高電平。按鍵按下時(shí)對(duì)應(yīng)的I/O口為低電平,可以被程序中的掃描函數(shù)檢測(cè)到。

數(shù)碼管顯示部分:
數(shù)碼管顯示采用四位一體共陽數(shù)碼管,這樣使電路更為簡(jiǎn)單,只需四個(gè)9012三極管就可以將其驅(qū)動(dòng)。P24、P25、P26、P27分別作為數(shù)碼管的位選端,控制是否選通哪一位數(shù)碼管。采用PNP型三極管,低電平導(dǎo)通,高電平截止。R20、R30、R40、R50為三極管基極限流電阻,此電阻及能保護(hù)三極管又能保證三極管導(dǎo)通時(shí)處于完全導(dǎo)通狀態(tài)。R51為限流電阻,此電阻的大小直接決定數(shù)碼管的亮暗成都,在此選擇220歐姆、1/4色環(huán)電阻。數(shù)碼管的陰極端直接接單片機(jī)的P0口,而不需上拉電阻。STC89C51的單片機(jī)P0口為漏極開路,所以作為輸出時(shí)必須接上拉電路,而作為輸入時(shí)相當(dāng)于數(shù)碼管作為上拉,所以不再需要上拉電阻,及簡(jiǎn)化了電路又節(jié)省了成本。
數(shù)模轉(zhuǎn)換部分:(此為數(shù)控電壓數(shù)控調(diào)壓關(guān)鍵所在)
數(shù)模轉(zhuǎn)換采用德州儀器的TLC5615,此為一片10位串行單5V電源DAC,直接電壓輸出。單片機(jī)P33、P32、P34分別連接TLC5615的時(shí)鐘端、片選端、數(shù)據(jù)端即可控制它輸出想要的電壓。此時(shí)TLC5615的6腳及參考電壓輸入端需接入2.5V的參考電壓。根據(jù)公式可知,當(dāng)參考電壓為2.5V時(shí),TLC5615將最大輸出5V電壓。
TL5615(DAC)電壓計(jì)算公式

Vout為7腳輸出電壓,Vrefin為6腳參考電壓輸入端,N為單片機(jī)通過1、2、3管腳向TLC5615寫入的數(shù)據(jù),1024是根據(jù)這是一片10位數(shù)模轉(zhuǎn)換而計(jì)算出來的(210=1024),最后乘以二是因?yàn)門LC5615內(nèi)部有2倍的增益放大器。
在給TLC輸入2.5V參考電壓的時(shí)候,我們用了TL431芯片。TL431是可控精密穩(wěn)壓源。它的輸出電壓用兩個(gè)電阻就可以任意的設(shè)置到從Verf(2.5V)到36V范圍內(nèi)的任何值。該器件的典型動(dòng)態(tài)阻抗為0.2Ω,在很多應(yīng)用中用它代替穩(wěn)壓二極管。
同時(shí)用LM358作為跟隨器,減小2.5V基準(zhǔn)電源的阻抗,再送入TLC5615 參考電壓端。
(寫論文時(shí),可以在此講解TL41技術(shù)參數(shù)LM358技術(shù)參數(shù)和原理和跟隨器電路原理)
TLC5615內(nèi)部原理圖:
                         TLC5615邏輯時(shí)序圖:



在給TLC輸入2.5V參考電壓的時(shí)候,我們用了TL431芯片。TL431是可控精密穩(wěn)壓源。它的輸出電壓用兩個(gè)電阻就可以任意的設(shè)置到從Verf(2.5V)到36V范圍內(nèi)的任何值。該器件的典型動(dòng)態(tài)阻抗為0.2Ω,在很多應(yīng)用中用它代替穩(wěn)壓二極管。
同時(shí)用OPA2107作為跟隨器,減小2.5V基準(zhǔn)電源的阻抗,再送入TLC5615 參考電壓端。
(寫論文時(shí),可以在此講解TL41技術(shù)參數(shù)OPA2107技術(shù)參數(shù)和原理和跟隨器電路原理)
MOS放大部分:
將上述TLC5615輸出的可調(diào)電壓送到運(yùn)放LM358的反相端,通過MOS管(F9Z24N)放大。同時(shí)在F9Z24N的輸出端用RW1(10K)電位器分壓,取一定比例的輸出電壓反饋到比較器正相端,構(gòu)成一個(gè)反饋系統(tǒng)。此時(shí)MOS管輸出的PWM波的占空比將根據(jù)負(fù)載和輸入電壓而變化以保證輸出電壓的穩(wěn)定。C5作為輸出濾波電容,濾掉輸出電壓紋波。
根據(jù)反饋系統(tǒng)的穩(wěn)定原理計(jì)算出輸出電壓的公式,如下:
設(shè):Vo為輸出電壓,Vin為L(zhǎng)M358的2腳輸入電壓,RWH為電位器上部分電阻,RWL為電位器下部分電阻,RW為電位器阻值。
Vo=Vin×(RW/RWL);
(寫論文時(shí),可以在此講解F9Z24N技術(shù)參數(shù))
報(bào)警電路:
此電路可以由單片機(jī)控制三極管(8550/9012)的通斷來控制蜂鳴器的報(bào)警。當(dāng)P36為高時(shí),三極管不高通,為低時(shí)三極管導(dǎo)通蜂鳴器響。當(dāng)過流或短路時(shí),單片機(jī)切斷輸出,同時(shí)蜂鳴器報(bào)名。

單片機(jī)源程序如下:
  1. #include "reg52.h"                        //包含頭文件

  2. //宏定義
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. //按鍵定義
  6. sbit KEY1= P2^0;
  7. sbit KEY2= P2^1;
  8. sbit KEY3= P2^2;
  9. sbit KEY4= P2^3;

  10. //數(shù)碼管位選端定義
  11. sbit W1= P2^4;
  12. sbit W2= P2^5;
  13. sbit W3= P2^6;
  14. sbit W4= P2^7;

  15. //DAC定義
  16. sbit  CS_5615=P1^5;                 //定義片選信號(hào)IO口
  17. sbit CLK_5615=P1^6;                 //定義時(shí)鐘信號(hào)IO口
  18. sbit DAT_5615=P1^7;                 //定義數(shù)據(jù)輸入IO口

  19. //ADC定義
  20. sbit  CS=P3^5;                         //定義片選信號(hào)IO口
  21. sbit CLK=P3^3;                       //定義時(shí)鐘信號(hào)IO口
  22. sbit DIO=P3^4;                                   //定義數(shù)據(jù)輸入IO口

  23. uint  U;
  24. uchar GETU=0;
  25. bit flag=0;

  26. uchar code table[]=
  27. {
  28.         0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7
  29. };        //共陽數(shù)碼管段碼表        沒有小數(shù)點(diǎn) 0~9
  30. uchar code table1[]=
  31. {
  32.         0x7F,0x64,0xBD,0xF5,0xE6,0xF3,0xFB,0x67,0xFF,0xF7,0x5e
  33. };//帶小數(shù)點(diǎn)的編碼            0~9


  34. void delay_ms(uint z)                          //延時(shí)函數(shù)
  35. {
  36.   uint a,b;
  37.   for(a=z;a>0;a--)
  38.    for(b=5;b>0;b--);
  39. }

  40. void  shuma(uint buf)                          //數(shù)碼管顯示程序
  41. {
  42.         uchar a,b,c,d;                                  //定義變量
  43.         a=buf/1000;                                          //將數(shù)據(jù)除以1000得到千位數(shù)據(jù)
  44.         b=buf%1000/100;                                  //取余1000除以100得到百位數(shù)據(jù)
  45.         c=buf%100/10;                                  //得到十位數(shù)據(jù)
  46.         d=buf%10;                                          //得到個(gè)位數(shù)據(jù)

  47.         W1=0;W2=1;W3=1;W4=1;                  //選中第一個(gè)位
  48.         P0=~table[a];                                  //輸入該位要顯示的數(shù)據(jù)
  49.         delay_ms(60);                                  //延時(shí)

  50.         W1=1;W2=0;W3=1;W4=1;                  //選中第二個(gè)位
  51.         P0=~table1[b];                                  //注釋同上
  52.         delay_ms(60);

  53.         W1=1;W2=1;W3=0;W4=1;
  54.         P0=~table[c];
  55.         delay_ms(60);

  56.         W1=1;W2=1;W3=1;W4=0;
  57.         P0=~table1[10];
  58.         delay_ms(60);
  59.         W1=1;W2=1;W3=1;W4=1;
  60. }

  61. void tlc_5615(uint buf)                         //DA輸出
  62. {
  63.         uint a,c;                                         //定義變量
  64.         c=buf;                                             //要輸出的數(shù)據(jù)賦值
  65.     CS_5615=0;                                          //引腳拉低
  66.         for(a=16;a>0;a--)                         //循環(huán)16次
  67.         {
  68.          DAT_5615=c>>15;               //把數(shù)據(jù)串行輸入進(jìn)da芯片(把數(shù)據(jù)右移15位得到最高位數(shù)據(jù),賦值給數(shù)據(jù)腳)
  69.          c=c<<1;                                 //將數(shù)據(jù)左移一位,下次循環(huán)時(shí)就是傳輸?shù)诙粩?shù)據(jù)了
  70.          CLK_5615=1;                         //拉高
  71.          CLK_5615=0;                 //拉低
  72.     }
  73.         CLK_5615=1;
  74.         CLK_5615=0;
  75.         CLK_5615=1;
  76.         CLK_5615=0;
  77.         CS_5615=1;
  78. }

  79. unsigned int  A_D()
  80. {
  81.         unsigned char i,dat;
  82.         CS=1;   //一個(gè)轉(zhuǎn)換周期開始
  83.         CLK=0;  //為第一個(gè)脈沖作準(zhǔn)備
  84.         CS=0;  //CS置0,片選有效
  85.         
  86.         DIO=1;    //DIO置1,規(guī)定的起始信號(hào)  
  87.         CLK=1;   //第一個(gè)脈沖
  88.         CLK=0;   //第一個(gè)脈沖的下降沿,此前DIO必須是高電平
  89.         DIO=1;   //DIO置1, 通道選擇信號(hào)  
  90.         CLK=1;   //第二個(gè)脈沖,第2、3個(gè)脈沖下沉之前,DI必須跟別輸入兩位數(shù)據(jù)用于選擇通道,這里選通道CH0
  91.         CLK=0;   //第二個(gè)脈沖下降沿
  92.         DIO=0;   //DI置0,選擇通道0
  93.         CLK=1;    //第三個(gè)脈沖
  94.         CLK=0;    //第三個(gè)脈沖下降沿
  95.         DIO=1;    //第三個(gè)脈沖下沉之后,輸入端DIO失去作用,應(yīng)置1
  96.         CLK=1;    //第四個(gè)脈沖
  97.         for(i=0;i<8;i++)  //高位在前
  98.         {
  99.                 CLK=1;         //第四個(gè)脈沖
  100.                 CLK=0;
  101.                 dat<<=1;       //將下面儲(chǔ)存的低位數(shù)據(jù)向右移
  102.                 dat|=(unsigned char)DIO;          //將輸出數(shù)據(jù)DIO通過或運(yùn)算儲(chǔ)存在dat最低位
  103.         }                                 
  104.         CS=1;          //片選無效
  105.         return dat;         //將讀出的數(shù)據(jù)返回     
  106. }


  107. //主函數(shù)
  108. void main(void)
  109. {
  110.         U=0;                                           //電壓值顯示0
  111.         while(1)                                   //進(jìn)入循環(huán)
  112.         {
  113.                 tlc_5615(U);                   //輸出電壓值
  114.                 shuma(U/8*10);                   //顯示電壓值
  115.                 if(flag==0)                           //沒有短路
  116.                 {
  117.                         if(KEY1==0)                   //按鍵1按下
  118.                         {
  119.                                 shuma(U/8*10);
  120.                                 shuma(U/8*10);
  121.                                 shuma(U/8*10);
  122.                                 shuma(U/8*10);
  123.                                 shuma(U/8*10);        //此處調(diào)用顯示函數(shù)就是延時(shí)去抖的作用
  124.                                 if(KEY1==0)                //再次判斷按鍵按下
  125.                                 {
  126.                                         if(U<960)        //1V對(duì)應(yīng)的是80  10位ad(10位ad最大數(shù)據(jù)是1024,這里為了取整數(shù),選擇80對(duì)應(yīng)1V,也就是8對(duì)應(yīng)0.1V,因?yàn)殡妷赫{(diào)節(jié)的變化一共有120種)
  127.                                         U=U+8;                //電壓加0.1V
  128.                                 }        
  129.                         }
  130.                         if(KEY2==0)                        //按鍵2按下
  131.                         {
  132.                                 shuma(U/8*10);
  133.                                 shuma(U/8*10);
  134.                                 shuma(U/8*10);
  135.                                 shuma(U/8*10);
  136.                                 shuma(U/8*10);
  137.                                 if(KEY2==0)
  138.                                 {
  139.                                         if(U>=8)   //電壓減
  140.                                         U=U-8;
  141.                                 }        
  142.                         }                        
  143.                         if(KEY3==0)                                //按鍵3按下
  144.                         {
  145.                                 shuma(U/8*10);
  146.                                 shuma(U/8*10);
  147.                                 shuma(U/8*10);
  148.                                 shuma(U/8*10);
  149.                                 shuma(U/8*10);
  150.                                 if(KEY3==0)
  151.                                 {
  152.                                         U=400;                          //輸出5V電壓
  153.                                 }        
  154.                         }        
  155.                         if(KEY4==0)                                   //按鍵4按下
  156.                         {
  157.                                 shuma(U/8*10);
  158.                                 shuma(U/8*10);
  159.                                 shuma(U/8*10);
  160.                                 shuma(U/8*10);
  161.                                 shuma(U/8*10);
  162.                                 if(KEY4==0)
  163.                                 {
  164.                                         U=0;                           //關(guān)閉輸出
  165.                                 }        
  166.                         }
  167.                 }
  168.                 GETU=A_D();                          //讀取ad數(shù)據(jù)
  169.                 if(GETU>=12)   //0.0196V,采樣電阻采集到的電壓數(shù)據(jù)
  170.                 {
  171.                         U=0;                 //關(guān)閉輸出
  172.                         flag=1;                 //短路標(biāo)志位
  173.                 }                                
  174.         }
  175. }
復(fù)制代碼

以上程序51hei提供下載:
C程序注釋.zip (43.94 KB, 下載次數(shù): 150)
原理圖.pdf (222.22 KB, 下載次數(shù): 140)
重點(diǎn):電路原理講解.doc (791.5 KB, 下載次數(shù): 135)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂6 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1 發(fā)表于 2019-7-25 18:39 | 只看該作者
本帖需要重新編輯補(bǔ)全圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報(bào)

板凳
ID:544367 發(fā)表于 2019-7-26 09:10 | 只看該作者
admin 發(fā)表于 2019-7-25 18:39
本帖需要重新編輯補(bǔ)全圖片即可獲得100+黑幣(帖子下方有編輯按鈕)

我是截圖不能粘貼,所以上傳了一個(gè)Word文檔,里面有詳解
回復(fù)

使用道具 舉報(bào)

地板
ID:591254 發(fā)表于 2019-7-31 09:39 | 只看該作者
芯片選擇stc89c52的不行嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:449126 發(fā)表于 2019-12-16 21:32 | 只看該作者
你這個(gè)是個(gè)恒壓源吧,不是恒流源
回復(fù)

使用道具 舉報(bào)

6#
ID:101394 發(fā)表于 2020-2-15 09:02 | 只看該作者
下載來研究一下
回復(fù)

使用道具 舉報(bào)

7#
ID:688987 發(fā)表于 2020-3-17 09:00 | 只看該作者
這個(gè)樓主全面嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:731970 發(fā)表于 2020-6-6 17:45 | 只看該作者
采樣電阻選擇那么大,這樣出來的恒流源電流會(huì)很小啊
回復(fù)

使用道具 舉報(bào)

9#
ID:323651 發(fā)表于 2020-6-7 09:46 | 只看該作者
學(xué)習(xí)下,謝謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:763621 發(fā)表于 2020-6-7 10:31 | 只看該作者

學(xué)習(xí)下,謝謝分享
回復(fù)

使用道具 舉報(bào)

11#
ID:765652 發(fā)表于 2020-6-9 21:21 | 只看該作者
請(qǐng)問沒有仿真文件和原理圖文件嗎
回復(fù)

使用道具 舉報(bào)

12#
ID:56960 發(fā)表于 2020-7-8 13:47 | 只看該作者
路過頂起,這個(gè)可以制作來玩玩,電源是經(jīng)常用到的
回復(fù)

使用道具 舉報(bào)

13#
ID:95778 發(fā)表于 2021-1-3 00:03 | 只看該作者
其實(shí)實(shí)際LM358驅(qū)動(dòng) MOSFET并不理想 發(fā)熱十分嚴(yán)重,理論上358 反相輸入 輸出的是 矩形波 但是用示波器測(cè)試是一個(gè)類似于正弦波,用12V供電時(shí)  358輸出的 電壓大概是3-6V 由于MOSFET不是工作在開關(guān)狀態(tài)導(dǎo)致發(fā)熱嚴(yán)重.
回復(fù)

使用道具 舉報(bào)

14#
ID:817341 發(fā)表于 2025-4-24 08:59 | 只看該作者
123456@QQ 發(fā)表于 2019-7-31 09:39
芯片選擇stc89c52的不行嗎

應(yīng)該行
回復(fù)

使用道具 舉報(bào)

15#
ID:106977 發(fā)表于 2025-5-14 12:39 | 只看該作者
利用DAC0832的電路特性,與任一51CPU就可構(gòu)成8位數(shù)控恒流源!需要電流大就擴(kuò)展功放管!電路簡(jiǎn)單但效率高。軟件就是控制DAC0832輸出的幾條語句。取樣電阻不需要精確,因?yàn)橥ㄟ^反饋電阻調(diào)整補(bǔ)償即可!
回復(fù)

使用道具 舉報(bào)

16#
ID:404454 發(fā)表于 2025-5-20 23:37 | 只看該作者
多謝樓主通過這例子說明用單片機(jī)控制做個(gè)可調(diào)電源的思路,給我個(gè)這文章的文檔吧?
回復(fù)

使用道具 舉報(bào)

17#
ID:673647 發(fā)表于 2025-5-21 07:37 | 只看該作者
學(xué)習(xí)一下,謝謝分享!
回復(fù)

使用道具 舉報(bào)

18#
ID:371895 發(fā)表于 2025-5-21 11:39 來自觸屏版 | 只看該作者
擎天微電子 發(fā)表于 2021-1-3 00:03
其實(shí)實(shí)際LM358驅(qū)動(dòng) MOSFET并不理想 發(fā)熱十分嚴(yán)重,理論上358 反相輸入 輸出的是 矩形波 但是用示波器測(cè)試是 ...

還真有這個(gè)問題,那要怎么改啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表