找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6688|回复: 2
收起左侧

单片机稳压电源仿真程序设计 TLC549+TLC5615芯片实现

[复制链接]
ID:245512 发表于 2017-11-2 22:17 | 显示全部楼层 |阅读模式
基于单片机的稳压电源设计,内含程序和电路仿真。
0.png

4.1 电路分析
稳压电路见图4-1所示。三极管射极电压是稳压电源的输出电压,可以接用电器或负载,这个电压值通过TLC549(A/D,同TLC548)数据转换后,送往单片机处理并显示。调整按键可以改变输入TLC5615(D/A,同TLC5616)的数据。TLC5615的输出电压通过运算放大器与实际输出取样电压比较,控制三极管的电压输出。稳压电路的电压输出接受单片机检测,同时又受单片机的控制。电路在仿真时,各点的电压都连接有电压表显示。
51hei.gif
QQ图片20171103015555.png
图 1 稳压电路
4.2 电路模块
    一、A/D转换部分
        TLC549 对输出电压进行采集,其操作如下:  
(1)cs先为高电平。(cs为片选信号,为1时,输入脉 i/o clock不起作用);
(2)clock = 0
(3)cs = 0; cs置底电平。 同时date_out为高。(=1);
      (4)延时1.4us。(setup time,cs low before first  clock);  
(5)开始转化数据。因为TLC549是8位串行模数转换器。需将8 位数据依次串行输出。期间,clock高低电平转化一次;
(6)8次数据转化之后。cs置1,片选无效。等待17us后读出数据。
    二、D/A转换部分
TLC5615为10位D/A转换电路,其原理TLC5615的PDF文件。输出电压 = (转
换数值/1024)*2*基准电压
    三、显示
采用数码管对A/D转换后的数据进行显示,因为TLC549 是8位A/D,程序中需要对转化的数据进行处理后才能在七段数码管上动态显示。TLC549的检测电压值范围为0~5V,A/D转换后数据位0~255,应该显示0~5,并且包含小数点部分。
四、按键操作部分
四个独立的按键主要是对DA 的输入数据进行操作的,ADD按键,SUB 按键 这些按键在安下一次松开后便进行加1 的操作,若按键超过一定的时间则增加步长,使其数值能够快速增加,这样就不必要达到一个电压时,一直按几百次。SUB按键也是如此。至于那个预读取按键,主要是用于保存你要常用的电压值,这样一来你就可以在使用此电源时,不必要每次都要按键调整,可以通过读取AT24C04的值进行电压预置,保存按键,是用于保存你长使用的电压值,通过此次的电压值保存,使你可以快速达到你所要求的电压值。
4.3 编程思路
    程序分为键盘处理、D/A、A/D和存储四个模块。运用扫描法,对键盘进行扫描,有按键就更改输入TLC5615 的数值,ADD按键是对数据进行加以操做,长按的话使步进值增大,实现快加,SUB按键与ADD按键同,预读取按键用于读取 AT24C04 中预置的数值,保存按键用于保存当前电压值;显示部分主要是对TLC549采集回来的电压进行处理显示,它主要是在定时器0的中断服务程序中显示,100ms刷新显示一次;TLC5615 模块,通过对dA的串行数据输入,使其在输出电压时可控,输出电压后经lm324,三极管,加上负载输出电压,输出电压后,用TLC549芯片100ms采集一次,送数码管显示。
4.5 程序清单

单片机源程序如下:
  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 }; //各个数码管对应的位选数据

  8. sbit DIO = P1^0;                 //数据线
  9. sbit CS = P1^1;                         //片选
  10. sbit CLK = P1^2;                //io口时钟

  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;  //用于显示数码管的 千,百,十,个 等四位的显示
  19. uint val,num;                   //val 是用于输入DA  的数据,num是用于判断是不是长按的
  20. uint cp;                           //计数的变量
  21. uchar key_stat;
  22. uchar add_stat,sub_stat;
  23. uchar st_flag,pre_flag;

  24. void delay(uint x)                 //微妙级是延时函数
  25. {
  26.         while(x--)
  27.                 _nop_();
  28. }

  29. /**********************************************
  30.         函数名称:deal
  31.         函数作用:处理AD的返回值
  32.         函数参数:无
  33.         函数返回值:无
  34. **********************************************/                                                                                          
  35. void deal(uint num)          //显示程序
  36. {        
  37.         qian=num/1000;              //千,百,十,个处理
  38.         bai=num/100%10;
  39.         shi=num/10%10;
  40.         ge=num%10;
  41. }

  42. /**********************************************
  43.         函数名称:TL549_AD()
  44.         函数作用:返回AD的返回值
  45.         函数参数:无
  46.         函数返回值:data_ad
  47. **********************************************/        
  48. uint TL549_AD()                    //TLC549处理
  49. {
  50.         uchar i;
  51.         uint data_ad = 0;
  52.         CS = 1;                                //初始化,启动
  53.         CLK = 0;
  54.         CS = 0;
  55.         _nop_();                    
  56.         for(i = 0;i < 8;i++)        //读取采集数据,读取的是上一次采集数据
  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.         函数名称:TLC5615_DA(uint da)
  69.         函数作用:TLC5615_DA 将da转换后模拟输出
  70.         函数参数:da
  71.         函数返回值:无
  72. **********************************************/        
  73. void TLC5615_DA(uint da) //        TLC5615 的DA 转换函数
  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.         函数名称:key_scan()
  92.         函数作用:处理那些独立键盘
  93.         函数参数:无
  94.         函数返回值:无
  95. **********************************************/        
  96. void key_scan()
  97. {
  98.         if (ADD == 0)                                                   // ADD 按键的键盘处理函数
  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.                 //此处判断是不是长按,长按的话 使其步进值 加大
  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 按键的键盘处理函数
  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)                                                   //预读数据的 键盘处理函数
  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 中读出预存储的数据
  162.                 }
  163.         }

  164.         if (Store == 0)                                                //保存数值 按键的键盘处理函数
  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 写入存储的数据
  175.                 }
  176.         }
  177. }
  178. /**********************************************
  179.         函数名称:timer0_init (void)
  180.         函数作用:初始化定时器0,并设置
  181.         函数参数:无
  182.         函数返回值:无
  183. **********************************************/        
  184. void timer0_init (void)                            // timer0中断初始化函数
  185. {
  186.         EA = 0;                     
  187.         TMOD = 0x01;            
  188.         TR0 = 0;                     
  189.         TL0 = (65536-5000)%256;                 //设置计数器初值
  190.         TH0 = (65536-5000)/256;                  
  191.         PT0 = 1;                     
  192.         ET0 = 1;                     
  193.         EA = 1;                     
  194.         TR0 = 1;                     
  195. }
  196. /**********************************************
  197.         函数名称:main(void)
  198.         函数作用:main主函数入口
  199.         函数参数:无
  200.         函数返回值:无
  201. **********************************************/                                                        
  202. void main(void)                                 //主程序
  203. {  
  204.         timer0_init();                        //初始化定时器0
  205.         init_24C04();                        //初始化AT24C04
  206.         while(1)
  207.         {
  208.                 key_scan();                        //调用键盘扫描函数
  209.                 TLC5615_DA(val);        //处理键盘发送过来的值
  210.         }
  211. }

  212. ……………………

  213. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
项目4-基于单片机的稳压电源设计.zip (118.36 KB, 下载次数: 158)
回复

使用道具 举报

ID:325787 发表于 2018-5-10 11:54 | 显示全部楼层
楼主能再改动一下,加电源输入模块  满足0-15v输出   四按键控制 1V 0.05V的上下调整吗
回复

使用道具 举报

ID:444661 发表于 2018-12-12 10:20 | 显示全部楼层
学习学习一下。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表