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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
電路原理圖如下:


該項設計的主要目的是設計一種數控穩壓電源。它利用單片機STC89C51作為主控芯片,控制數字/模擬轉換器(TLC5615)的輸出電壓的大小,經過運算放大器LM358與IRF9Z24N構成負反饋系統,從而輸出恒定電壓。最后通過電位器分壓將輸出信號反饋到運算放大器LM358上,使輸出準確度可以調節。此設計通過鍵盤電路與單片機連接,讀入控制數據,利用軟件進行判斷,從而起到控制電源輸出的作用。通過LCD1602(或LED數碼管)顯示數控電源的輸出電壓,實現簡單的人機對話。該項設計具有設計簡單,控制靈活,調節方便,攜帶方便、成本低等優勢,具有較強的實用性。

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

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

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



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

單片機源程序如下:
  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. //數碼管位選端定義
  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;                 //定義片選信號IO口
  17. sbit CLK_5615=P1^6;                 //定義時鐘信號IO口
  18. sbit DAT_5615=P1^7;                 //定義數據輸入IO口

  19. //ADC定義
  20. sbit  CS=P3^5;                         //定義片選信號IO口
  21. sbit CLK=P3^3;                       //定義時鐘信號IO口
  22. sbit DIO=P3^4;                                   //定義數據輸入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. };        //共陽數碼管段碼表        沒有小數點 0~9
  30. uchar code table1[]=
  31. {
  32.         0x7F,0x64,0xBD,0xF5,0xE6,0xF3,0xFB,0x67,0xFF,0xF7,0x5e
  33. };//帶小數點的編碼            0~9


  34. void delay_ms(uint z)                          //延時函數
  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)                          //數碼管顯示程序
  41. {
  42.         uchar a,b,c,d;                                  //定義變量
  43.         a=buf/1000;                                          //將數據除以1000得到千位數據
  44.         b=buf%1000/100;                                  //取余1000除以100得到百位數據
  45.         c=buf%100/10;                                  //得到十位數據
  46.         d=buf%10;                                          //得到個位數據

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

  50.         W1=1;W2=0;W3=1;W4=1;                  //選中第二個位
  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;                                             //要輸出的數據賦值
  65.     CS_5615=0;                                          //引腳拉低
  66.         for(a=16;a>0;a--)                         //循環16次
  67.         {
  68.          DAT_5615=c>>15;               //把數據串行輸入進da芯片(把數據右移15位得到最高位數據,賦值給數據腳)
  69.          c=c<<1;                                 //將數據左移一位,下次循環時就是傳輸第二位數據了
  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;   //一個轉換周期開始
  83.         CLK=0;  //為第一個脈沖作準備
  84.         CS=0;  //CS置0,片選有效
  85.         
  86.         DIO=1;    //DIO置1,規定的起始信號  
  87.         CLK=1;   //第一個脈沖
  88.         CLK=0;   //第一個脈沖的下降沿,此前DIO必須是高電平
  89.         DIO=1;   //DIO置1, 通道選擇信號  
  90.         CLK=1;   //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0
  91.         CLK=0;   //第二個脈沖下降沿
  92.         DIO=0;   //DI置0,選擇通道0
  93.         CLK=1;    //第三個脈沖
  94.         CLK=0;    //第三個脈沖下降沿
  95.         DIO=1;    //第三個脈沖下沉之后,輸入端DIO失去作用,應置1
  96.         CLK=1;    //第四個脈沖
  97.         for(i=0;i<8;i++)  //高位在前
  98.         {
  99.                 CLK=1;         //第四個脈沖
  100.                 CLK=0;
  101.                 dat<<=1;       //將下面儲存的低位數據向右移
  102.                 dat|=(unsigned char)DIO;          //將輸出數據DIO通過或運算儲存在dat最低位
  103.         }                                 
  104.         CS=1;          //片選無效
  105.         return dat;         //將讀出的數據返回     
  106. }


  107. //主函數
  108. void main(void)
  109. {
  110.         U=0;                                           //電壓值顯示0
  111.         while(1)                                   //進入循環
  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);        //此處調用顯示函數就是延時去抖的作用
  124.                                 if(KEY1==0)                //再次判斷按鍵按下
  125.                                 {
  126.                                         if(U<960)        //1V對應的是80  10位ad(10位ad最大數據是1024,這里為了取整數,選擇80對應1V,也就是8對應0.1V,因為電壓調節的變化一共有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;                           //關閉輸出
  165.                                 }        
  166.                         }
  167.                 }
  168.                 GETU=A_D();                          //讀取ad數據
  169.                 if(GETU>=12)   //0.0196V,采樣電阻采集到的電壓數據
  170.                 {
  171.                         U=0;                 //關閉輸出
  172.                         flag=1;                 //短路標志位
  173.                 }                                
  174.         }
  175. }
復制代碼

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

9#
ID:323651 發表于 2020-6-7 09:46 | 只看該作者
學習下,謝謝分享
回復

使用道具 舉報

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

學習下,謝謝分享
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

13#
ID:95778 發表于 2021-1-3 00:03 | 只看該作者
其實實際LM358驅動 MOSFET并不理想 發熱十分嚴重,理論上358 反相輸入 輸出的是 矩形波 但是用示波器測試是一個類似于正弦波,用12V供電時  358輸出的 電壓大概是3-6V 由于MOSFET不是工作在開關狀態導致發熱嚴重.
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕免费中文 | 亚洲精品在线免费 | 亚洲高清久久 | av影音在线 | av片在线观看 | 久久av网站 | 天天舔天天 | 69福利影院 | 超级碰在线 | 国产精品久久久久久久久免费丝袜 | 玖玖视频 | 91国内精品久久 | 一区二区三区免费观看 | 日韩在线高清 | 欧美一级片在线看 | 欧美一区二区三区在线视频 | 伊人色综合久久天天五月婷 | 91社区在线观看高清 | 欧美一区二区在线 | 欧美激情视频一区二区三区在线播放 | 男女视频在线观看免费 | 精品视频在线一区 | 在线免费观看成年人视频 | 99精品亚洲国产精品久久不卡 | 啪啪综合网 | 国产在线精品一区二区三区 | 亚洲精品久久嫩草网站秘色 | a精品视频 | 国产成人精品一区二区在线 | 国产在线视频一区二区 | 午夜成人免费视频 | 在线观看a视频 | 国产一区二区三区在线 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 久久国产亚洲 | 欧美一级片在线 | 国产精品亚洲成在人线 | 99re视频在线 | 国产特级毛片aaaaaa喷潮 | 欧美日韩在线一区 | 日韩看片 |