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

QQ登錄

只需一步,快速開始

搜索
查看: 7156|回復(fù): 2
收起左側(cè)

單片機(jī)穩(wěn)壓電源仿真程序設(shè)計(jì) TLC549+TLC5615芯片實(shí)現(xiàn)

[復(fù)制鏈接]
ID:245512 發(fā)表于 2017-11-2 22:17 | 顯示全部樓層 |閱讀模式
基于單片機(jī)的穩(wěn)壓電源設(shè)計(jì),內(nèi)含程序和電路仿真。
0.png

4.1 電路分析
穩(wěn)壓電路見圖4-1所示。三極管射極電壓是穩(wěn)壓電源的輸出電壓,可以接用電器或負(fù)載,這個(gè)電壓值通過TLC549(A/D,同TLC548)數(shù)據(jù)轉(zhuǎn)換后,送往單片機(jī)處理并顯示。調(diào)整按鍵可以改變輸入TLC5615(D/A,同TLC5616)的數(shù)據(jù)。TLC5615的輸出電壓通過運(yùn)算放大器與實(shí)際輸出取樣電壓比較,控制三極管的電壓輸出。穩(wěn)壓電路的電壓輸出接受單片機(jī)檢測(cè),同時(shí)又受單片機(jī)的控制。電路在仿真時(shí),各點(diǎn)的電壓都連接有電壓表顯示。
51hei.gif
QQ圖片20171103015555.png
圖 1 穩(wěn)壓電路
4.2 電路模塊
    一、A/D轉(zhuǎn)換部分
        TLC549 對(duì)輸出電壓進(jìn)行采集,其操作如下:  
(1)cs先為高電平。(cs為片選信號(hào),為1時(shí),輸入脈 i/o clock不起作用);
(2)clock = 0
(3)cs = 0; cs置底電平。 同時(shí)date_out為高。(=1);
      (4)延時(shí)1.4us。(setup time,cs low before first  clock);  
(5)開始轉(zhuǎn)化數(shù)據(jù)。因?yàn)門LC549是8位串行模數(shù)轉(zhuǎn)換器。需將8 位數(shù)據(jù)依次串行輸出。期間,clock高低電平轉(zhuǎn)化一次;
(6)8次數(shù)據(jù)轉(zhuǎn)化之后。cs置1,片選無效。等待17us后讀出數(shù)據(jù)。
    二、D/A轉(zhuǎn)換部分
TLC5615為10位D/A轉(zhuǎn)換電路,其原理TLC5615的PDF文件。輸出電壓 = (轉(zhuǎn)
換數(shù)值/1024)*2*基準(zhǔn)電壓
    三、顯示
采用數(shù)碼管對(duì)A/D轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行顯示,因?yàn)門LC549 是8位A/D,程序中需要對(duì)轉(zhuǎn)化的數(shù)據(jù)進(jìn)行處理后才能在七段數(shù)碼管上動(dòng)態(tài)顯示。TLC549的檢測(cè)電壓值范圍為0~5V,A/D轉(zhuǎn)換后數(shù)據(jù)位0~255,應(yīng)該顯示0~5,并且包含小數(shù)點(diǎn)部分。
四、按鍵操作部分
四個(gè)獨(dú)立的按鍵主要是對(duì)DA 的輸入數(shù)據(jù)進(jìn)行操作的,ADD按鍵,SUB 按鍵 這些按鍵在安下一次松開后便進(jìn)行加1 的操作,若按鍵超過一定的時(shí)間則增加步長(zhǎng),使其數(shù)值能夠快速增加,這樣就不必要達(dá)到一個(gè)電壓時(shí),一直按幾百次。SUB按鍵也是如此。至于那個(gè)預(yù)讀取按鍵,主要是用于保存你要常用的電壓值,這樣一來你就可以在使用此電源時(shí),不必要每次都要按鍵調(diào)整,可以通過讀取AT24C04的值進(jìn)行電壓預(yù)置,保存按鍵,是用于保存你長(zhǎng)使用的電壓值,通過此次的電壓值保存,使你可以快速達(dá)到你所要求的電壓值。
4.3 編程思路
    程序分為鍵盤處理、D/A、A/D和存儲(chǔ)四個(gè)模塊。運(yùn)用掃描法,對(duì)鍵盤進(jìn)行掃描,有按鍵就更改輸入TLC5615 的數(shù)值,ADD按鍵是對(duì)數(shù)據(jù)進(jìn)行加以操做,長(zhǎng)按的話使步進(jìn)值增大,實(shí)現(xiàn)快加,SUB按鍵與ADD按鍵同,預(yù)讀取按鍵用于讀取。粒裕玻矗茫埃础≈蓄A(yù)置的數(shù)值,保存按鍵用于保存當(dāng)前電壓值;顯示部分主要是對(duì)TLC549采集回來的電壓進(jìn)行處理顯示,它主要是在定時(shí)器0的中斷服務(wù)程序中顯示,100ms刷新顯示一次;TLC5615 模塊,通過對(duì)dA的串行數(shù)據(jù)輸入,使其在輸出電壓時(shí)可控,輸出電壓后經(jīng)lm324,三極管,加上負(fù)載輸出電壓,輸出電壓后,用TLC549芯片100ms采集一次,送數(shù)碼管顯示。
4.5 程序清單

單片機(jī)源程序如下:
  1. #include <REG51.H>
  2. #include "intrins.h"
  3. #include "AT24C04.h"

  4. #define  uchar unsigned char
  5. #define  uint unsigned int

  6. uchar code  LED[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  7. uchar code Bit_sel[4] = {0x08,0x04,0x02,0x01 }; //各個(gè)數(shù)碼管對(duì)應(yīng)的位選數(shù)據(jù)

  8. sbit DIO = P1^0;                 //數(shù)據(jù)線
  9. sbit CS = P1^1;                         //片選
  10. sbit CLK = P1^2;                //io口時(shí)鐘

  11. sbit SCS = P1^4;
  12. sbit SDATA = P1^5;
  13. sbit SCLK = P1^3;

  14. sbit ADD = P3^0;
  15. sbit SUB = P3^1;
  16. sbit Pre_read = P3^2;
  17. sbit Store = P3^3;

  18. uint qian,bai,shi,ge;  //用于顯示數(shù)碼管的 千,百,十,個(gè) 等四位的顯示
  19. uint val,num;                   //val 是用于輸入DA  的數(shù)據(jù),num是用于判斷是不是長(zhǎng)按的
  20. uint cp;                           //計(jì)數(shù)的變量
  21. uchar key_stat;
  22. uchar add_stat,sub_stat;
  23. uchar st_flag,pre_flag;

  24. void delay(uint x)                 //微妙級(jí)是延時(shí)函數(shù)
  25. {
  26.         while(x--)
  27.                 _nop_();
  28. }

  29. /**********************************************
  30.         函數(shù)名稱:deal
  31.         函數(shù)作用:處理AD的返回值
  32.         函數(shù)參數(shù):無
  33.         函數(shù)返回值:無
  34. **********************************************/                                                                                          
  35. void deal(uint num)          //顯示程序
  36. {        
  37.         qian=num/1000;              //千,百,十,個(gè)處理
  38.         bai=num/100%10;
  39.         shi=num/10%10;
  40.         ge=num%10;
  41. }

  42. /**********************************************
  43.         函數(shù)名稱:TL549_AD()
  44.         函數(shù)作用:返回AD的返回值
  45.         函數(shù)參數(shù):無
  46.         函數(shù)返回值:data_ad
  47. **********************************************/        
  48. uint TL549_AD()                    //TLC549處理
  49. {
  50.         uchar i;
  51.         uint data_ad = 0;
  52.         CS = 1;                                //初始化,啟動(dòng)
  53.         CLK = 0;
  54.         CS = 0;
  55.         _nop_();                    
  56.         for(i = 0;i < 8;i++)        //讀取采集數(shù)據(jù),讀取的是上一次采集數(shù)據(jù)
  57.         {
  58.                 CLK = 1;         
  59.                 if(DIO)data_ad |= 0x01;
  60.                 CLK = 0;  
  61.                 data_ad = data_ad << 1;  
  62.         }         
  63.         CS = 1;
  64.         data_ad = data_ad  * (500/ 256);   
  65.         return(data_ad);
  66. }

  67. /**********************************************
  68.         函數(shù)名稱:TLC5615_DA(uint da)
  69.         函數(shù)作用:TLC5615_DA 將da轉(zhuǎn)換后模擬輸出
  70.         函數(shù)參數(shù):da
  71.         函數(shù)返回值:無
  72. **********************************************/        
  73. void TLC5615_DA(uint da) //        TLC5615 的DA 轉(zhuǎn)換函數(shù)
  74. {
  75.         uchar i;
  76.         da<<=6;

  77.         SCS=0;
  78.         SCLK=0;

  79.         for (i=0;i<12;i++)
  80.         {
  81.                 SDATA=(bit)(da&0x8000);
  82.                 SCLK=1;
  83.                 da<<=1;
  84.                 SCLK=0;
  85.         }

  86.         SCS=1;
  87.         SCLK=0;
  88.         for (i=0;i<12;i++);
  89. }
  90. /**********************************************
  91.         函數(shù)名稱:key_scan()
  92.         函數(shù)作用:處理那些獨(dú)立鍵盤
  93.         函數(shù)參數(shù):無
  94.         函數(shù)返回值:無
  95. **********************************************/        
  96. void key_scan()
  97. {
  98.         if (ADD == 0)                                                   // ADD 按鍵的鍵盤處理函數(shù)
  99.         {
  100.                 delay(10);
  101.                 if (ADD == 0)
  102.                 {
  103.                         add_stat = 1;
  104.                         num ++;
  105.                 }
  106.                 else
  107.                 {
  108.                         add_stat = 0;
  109.                         num = 0;
  110.                 }
  111.                 //此處判斷是不是長(zhǎng)按,長(zhǎng)按的話 使其步進(jìn)值 加大
  112.                 if (ADD == 0 && add_stat == 1 && num >= 300)  
  113.                 {
  114.                         val += 5;
  115.                         num = 0;
  116.                 }
  117.                 if (ADD == 1 && add_stat == 1)
  118.                 {
  119.                         val ++;
  120.                         num = 0;
  121.                         add_stat = 0;
  122.                 }
  123.                 if (val >= 1024)
  124.                 {
  125.                         val = 1023;
  126.                 }
  127.         }

  128.         if (SUB == 0)                                                        //SUB 按鍵的鍵盤處理函數(shù)
  129.         {
  130.                 delay(10);
  131.                 if (SUB == 0)
  132.                 {
  133.                         sub_stat = 1;
  134.                         num ++;
  135.                 }
  136.                 if (SUB == 0 && sub_stat == 1 && num >= 300)
  137.                 {
  138.                         val -= 5;
  139.                         num = 0;
  140.                 }
  141.                 if (SUB == 1 && sub_stat == 1)
  142.                 {
  143.                         val --;
  144.                         num = 0;
  145.                         sub_stat = 0;
  146.                 }
  147.                 if (val <= 0)
  148.                         val = 0;
  149.         }
  150.                                                                         
  151.         if (Pre_read == 0)                                                   //預(yù)讀數(shù)據(jù)的 鍵盤處理函數(shù)
  152.         {
  153.                 delay(100);
  154.                 if (Pre_read == 0)
  155.                 {
  156.                         pre_flag = 1;
  157.                 }
  158.                 if (Pre_read == 1 &&pre_flag == 1 )
  159.                 {
  160.                         pre_flag = 0;
  161.                         val = read_24C04(20);                        //從AT24C04中的地址20 中讀出預(yù)存儲(chǔ)的數(shù)據(jù)
  162.                 }
  163.         }

  164.         if (Store == 0)                                                //保存數(shù)值 按鍵的鍵盤處理函數(shù)
  165.         {
  166.                 delay(100);
  167.                 if (Store == 0)
  168.                 {
  169.                         st_flag = 1;
  170.                 }
  171.                 if (Store == 1 && st_flag == 1)
  172.                 {
  173.                         st_flag        = 0;
  174.                         write_24C04(20,val);                 //向AT24C04中的地址20 寫入存儲(chǔ)的數(shù)據(jù)
  175.                 }
  176.         }
  177. }
  178. /**********************************************
  179.         函數(shù)名稱:timer0_init (void)
  180.         函數(shù)作用:初始化定時(shí)器0,并設(shè)置
  181.         函數(shù)參數(shù):無
  182.         函數(shù)返回值:無
  183. **********************************************/        
  184. void timer0_init (void)                            // timer0中斷初始化函數(shù)
  185. {
  186.         EA = 0;                     
  187.         TMOD = 0x01;            
  188.         TR0 = 0;                     
  189.         TL0 = (65536-5000)%256;                 //設(shè)置計(jì)數(shù)器初值
  190.         TH0 = (65536-5000)/256;                  
  191.         PT0 = 1;                     
  192.         ET0 = 1;                     
  193.         EA = 1;                     
  194.         TR0 = 1;                     
  195. }
  196. /**********************************************
  197.         函數(shù)名稱:main(void)
  198.         函數(shù)作用:main主函數(shù)入口
  199.         函數(shù)參數(shù):無
  200.         函數(shù)返回值:無
  201. **********************************************/                                                        
  202. void main(void)                                 //主程序
  203. {  
  204.         timer0_init();                        //初始化定時(shí)器0
  205.         init_24C04();                        //初始化AT24C04
  206.         while(1)
  207.         {
  208.                 key_scan();                        //調(diào)用鍵盤掃描函數(shù)
  209.                 TLC5615_DA(val);        //處理鍵盤發(fā)送過來的值
  210.         }
  211. }

  212. ……………………

  213. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
項(xiàng)目4-基于單片機(jī)的穩(wěn)壓電源設(shè)計(jì).zip (118.36 KB, 下載次數(shù): 158)



回復(fù)

使用道具 舉報(bào)

ID:325787 發(fā)表于 2018-5-10 11:54 | 顯示全部樓層
樓主能再改動(dòng)一下,加電源輸入模塊  滿足0-15v輸出   四按鍵控制 1V 0.05V的上下調(diào)整嗎
回復(fù)

使用道具 舉報(bào)

ID:444661 發(fā)表于 2018-12-12 10:20 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí)一下。。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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