找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16529|回复: 9
打印 上一主题 下一主题
收起左侧

双向DC-DC变换器设计 XL4016+XL6019+单片机实现

  [复制链接]
跳转到指定楼层
楼主
ID:515632 发表于 2019-4-18 17:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   本设计主要由双向DC-DC变换电路、测控显示电路、辅助电源三部分构成,其中双向DC-DC变换电路降压部分采用XL4016开关降压型DC-DC转换芯片,最高转换效率可达93%,升压部分采用XL6019开关型升压/降压芯片,具有低纹波,输入范围广,转换效率高的特点。恒流部分采用PWM控制原理,形成一个闭环回路,控制电流恒定,恒压部分完全由硬件控制,单片机辅助控制的方式。以上部分确保系统满足题目要求,实现恒流充电,恒压放电,过压保护功能,并且有着较高的转换效率。
在本次设计中恒压部分完全有硬件控制,硬件自身形成一个闭环控制回路,对电压进行调节使其恒定题目要求的精度范围。单片机通过光耦电路的工作与停止,恒流部分由PWM调节占空比,使其恒流。

一、系统方案
1、双向DC-DC变换电路的论证与选择
    2、测量控制方案和辅助电源的论证与选择
3、 控制方法的论证与选择
二、系统理论分析与计算
三、电路与程序设计
1、电路的设计
(1)系统总体框图
2、程序的设计
(1)程序功能描述与设计思路
(2)程序流程图
    3、程序流程图
四、测试仪器与数据分析
附录1:电路原理图
附录2:源程序

一、系统方案

本设计主要由双向DC-DC变换电路、测控显示电路、辅助电源三部分构成,其中双向DC-DC变换电路降压部分采用XL4016开关降压型DC-DC转换芯片,最高转换效率可达93%,升压部分采用XL6019开关型升压/降压芯片,具有低纹波,输入范围广,转换效率高的特点。恒流部分采用PWM控制原理,形成一个闭环回路,控制电流恒定,恒压部分完全由硬件控制,单片机辅助控制的方式。以上部分确保系统满足题目要求,实现恒流充电,恒压放电,过压保护功能,并且有着较高的转换效率。

    1双向DC-DC变换电路的论证与选择方案1:由降压斩波变换电路(即Buck变换电路)和升压斩波变换电路(即Boost电路)组成双向DC-DC变换电路,分别各使用一个全控型器件VT(IGBT或MOSFET),对输入直流电源进行斩波控制通过调整全控型器件VT的控制信号占空比来调整输出电压。
     方案2:采用XL4016开关型降压芯片和XL6019开关型升压/降压芯片构成升压、降压电路具有低纹波,内助功率MOS,具有较高的输入电压范围,内置过电流保护功能与EN引脚逻辑电平关断功能。

     综合以上两种方案,考虑到时间的限制,选择了比较容易实现的方案2。

2、测量控制方案和辅助电源的论证与选
由于瑞萨单片机开发套件数量有限,所以我们选择了一款相对便宜,速度快,性价比较高的STM32103V8T6作为控制器,显示部分由于收到题目对作品重量的要求,选择了质量轻,分辨率较高的0.96寸OLED屏幕显示。由于市场上所售开关电源模块的,纹波大的因素,所以辅助电源选择了一个较小的9V变压器,进行,整流滤波作为辅助电源。
3、控制方法的论证与选
     方案1采用PWM调节占空比的方法控制降压芯片的控制端,达到控制恒流和控制恒压的目的,采用PWM调节软件较为复杂,而且PWM调节较为缓慢,软件控制难度大。
     方案2恒压部分完全有硬件控制,硬件自身形成一个闭环控制回路,对电压进行调节使其恒定题目要求的精度范围。单片机通过光耦电路的工作与停止,恒流部分由PWM调节占空比,使其恒流。
     综合以上两种方案,选择软件较为简单,硬件较为复杂的方案2。

二、系统理论分析与计算
1、充电电路设计分析
   充电电路也就是一个降压电路,并且要求是一个恒流源,本次竞赛选取XL4016为核心降压芯片,其结构如图所示。
管脚定义如下典型应用电路如下
2.2 放电电路设计分析

XL6019是一款专为升压、升降压设计的单片集成电路,可工作在DC5V到40V输入电压范围,低纹波,内置功率MOS。XL6019内置固定频率振荡器与频率补偿电路,简化了电路设计。PWM控制环路可以调节占空比从0~90%之间线性变化。内置过电流保护功能与EN脚逻辑电平关断功能。典型应用电路如下

2.1 充电电路设计分析
充电电路也就是一个降压电路,并且要求是一个恒流源,本次竞赛选取XL4016为核心降压芯片,其结构如图所示。
XL4016降压模块电路图如下所示
2.2 放电电路设计分析

XL6019是一款专为升压、升降压设计的单片集成电路,可工作在DC5V到40V输入电压范围,低纹波,内置功率MOS。XL6019内置固定频率振荡器与频率补偿电路,简化了电路设计。PWM控制环路可以调节占空比从0~90%之间线性变化。内置过电流保护功

能与EN脚逻辑电平关断功能。典型应用电路如下

三、电路与程序设计1电路的设计1系统总体框图













(图3-1)

系统总体框图如图3-1所示,主要由辅助电源、测控电路、双向DC-DC变换电路等组成,辅助电源为测控电路供电,测控电路用于检测和控制双向DC-DC电路,以及电压电流的采集与控制。

  • 降压电路原理
    降压电路采用XL4016型8A,180KHz,40V,PWM降压型直流对直流转换器,最大效率可达96%。输出1.25V到36V可调,8A恒定输出电流能力。
    如下图3-2所示为XL4016降压部分电路图,通过对FB引脚的控制,可有效的实现电流及电压的控制。该转换器外围器件少,低纹波,调节简单,内置短路保护功能。PWM占空比0%到100%连续可调。
(图3-2)

3)升压电路原理图
   升压电路使用XL6019型220KHz、60V、5A开关电流升压/降压型DC-DC转换器。可工作在DC5V到40V输入电压范围,低纹波,内置功率MOS、XL6019内置固定频率振荡器与频率补偿电路,简化了电路设计。PWM控制环路可以调节占空比从0~90%之间线性变化。内置过流保护功能与EN脚逻辑电平关断功能。使用单片机控制EN引脚实现对升压模块开启与关断。
(图3-3)
  • 测控电路电路原理图
    测控电路如图3-4所示,通过电阻分压滤波后,使用单片机ADC采样,得到输入、输出电压,以及电流和2.5V基准电压,使用TL431产生2.5V基准电压用于矫正。恒压恒流控制使用单片机输出PWM,经滤波后使用LM358跟随,增强驱动能力,同时可减小输入控制端的能量消耗。使用比较器比较设定值与输出值,再控制芯片的工作状态。
(图3-4)电源
   为减小高频干扰,辅助电源使用220V到9V普通变压器,经整流滤波后使用7812和HT7333分别输出12V和3.3V电压为LM358和单片机小系统板供电。



2程序的设计1程序功能描述与设计思路

1程序功能描述

根据题目要求,软件部分实现测量显示,切换模式,充电过压保护,控制调节系统。

  • 程序设计思路

     (1)、首先进行,按键,OLED各个内设初始化;

     (2)、进行按键扫描;

(3)、判断模式;

(4)、进行PWM控制电流,让输出为横流模式;

     (5)、扫描按键;

     (6)进行打开光耦,让升压模块工作;


3程序流程图

  1、系统总框图

     Vin/Vout

2、程序流程图
四、测试仪器与数据分析
4.1 测试仪器
5位半数字万用表,4位半万用表

4.2测试数据与分析
(1)U2=30V条件下对电池恒流充电,电流I1在1-2A变化过程中测量值如下表:
按按键次数
1
2
3
4
5
6
7
8
9
10
I1测量值(A)
1
0.99
1.01
1.06
1.07
1.10
1.12
1.14
1.16
1.17
(2)设定I1=2A,使U2在24-36V范围内变化时,测量记录I1的值。数据如下:
U2(V)
24
25
26
27
28
29
30
31
32
36
I1(A)
1.99
1.98
1.98
1.99
1.97
1.98
1.99
1.96
2.01
1.99
(3)设定I1=2A,在U2=30V,测量U1,I2,计算效率。数据如下:
当I1=2A,U2=30V时,测得I2=1.47A,U1=20V,由此计算效率为97%。
(4)放电模式下,保持U2=30V,计算效率,数据如下:
当U2=30V时,I2=1.02A,U1=18.9V,I1=0.63A,由此计算效率为98%。
(5)使US在32-38V范围内变化时U2记录如下:
Us/V
32
33
33
34
35
36
37
U2/V
29.7
29.8
29.8
29.9
29.8
30.3
30.4









以上数据可以说明,本次设计的双向DCDC变换器,各项指标均在题设范围内,是符合要求的。

1




附录1:电路原理图

单片机源程序如下:

  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include <I2c.h>
  4. unsigned char ReadADC(unsigned char Chl); //AD采样,有返回值
  5. void DAC(unsigned char Data);            //DA输出
  6. void delay(unsigned char j);            //
  7. unsigned int datpro(void);             //电压采样数据处理
  8. void led(int g,int a);                //数码管显示
  9. void out_AD_led();                   //输出采样电压1
  10. void DA_out();                      //DA输出控制
  11. sbit key_1 = P3^4;
  12. sbit key_2= P3^5;
  13. sbit duan=P2^6;
  14. sbit wei=P2^7;
  15. sbit in0 = P3^2;

  16. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d ,0x07,0x7f,0x6f,0x00};
  17. unsigned char num=102;  //DA数模输出变量初始值
  18. int main()
  19. {
  20.               while(1)
  21.                             {            
  22.                                          
  23.                                           DA_out();
  24.                                           DAC(num);
  25.                                           out_AD_led();
  26.                             }
  27. }
  28. void out_AD_led()                          //
  29. {
  30.               led(1,datpro()/1000);
  31.               led(2,datpro()%1000/100);
  32.               led(3,datpro()%100/10);
  33. }
  34. unsigned char ReadADC(unsigned char Ch)  // 读取AD模数转换的值,有返回值
  35. {
  36.                             unsigned char Data;
  37.                             Start();        //写入芯片地址
  38.                             Send(AddWr);
  39.                             Ack();
  40.                             Send(0x40|Ch);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
  41.                                               //Ch的值分别为0、1、2、3,分别代表1-4通道
  42.                             Ack();
  43.                             Start();
  44.                             Send(AddRd);    //读入地址
  45.                             Ack();
  46.                             Data=Read();    //读数据
  47.                             Scl=0;
  48.                             NoAck();
  49.                             Stop();
  50.                             return Data;   //返回值
  51. }
  52. unsigned int datpro(void)                //

  53. {
  54.               unsigned int dianyah,dianyal;
  55.               unsigned int dianya=0;
  56.               unsigned char x;
  57.               for(x=0;x<6;x++)
  58.               {   
  59.                             dianya=ReadADC(1)+dianya;//输入通道选择通道
  60.               }
  61.               dianya=dianya/6;
  62.               dianyah=dianya&0xf0;
  63.               dianyah=dianyah>>4;
  64.               dianyal=dianya&0x0f;
  65.               dianya=dianyal*20+dianyah*310;
  66.               return(dianya);
  67. }

  68. void DA_out()                          //
  69. {
  70.               if(key_1 == 0)
  71.                             {  
  72.                                           delay(10);
  73.                                           while(key_1 == 0);
  74.                                           num=num - 1;
  75.                             }                                                            
  76.               if(key_2==0)
  77.                             {  
  78.                                           delay(10);
  79.                                           while(key_2==0);
  80.                                           num=num + 1;
  81.                             }
  82. }
  83. void DAC(unsigned char Data)          //
  84. {
  85.               Start();
  86.               Send(AddWr); //写入芯片地址
  87.               Ack();
  88.               Send(0x40);  //写入控制位,使能DAC输出
  89.               Ack();
  90.               Send(Data);  //写数据
  91.               Ack();
  92.               Stop();
  93. }
  94. void led(int g,int a)              //
  95. {
  96.               if(g==1)
  97.               {
  98.                             P0 = 0Xfe ;
  99.                             wei = 1;
  100.                             wei = 0;
  101.                             P0 = table[a];
  102.                             duan = 1;
  103.                             delay(2);
  104.                             duan = 0;
  105.               }
  106.                             if(g==2)
  107.               {
  108.                             P0 = 0Xfd ;
  109.                             wei = 1;
  110.                             wei = 0;
  111.                             P0 = table[a]|0x80;
  112.                             duan = 1;
  113.                             delay(2);
  114.                             duan = 0;
  115.               }
  116.                             if(g==3)
  117.               {
  118.                             P0 = 0Xfb ;
  119.                             wei = 1;
  120.                             wei = 0;
  121.                             P0 = table[a];
  122.                             duan = 1;
  123.                             delay(2);
  124.                             duan = 0;

  125.               }
  126.                             P0 = 0Xf7 ;
  127.                             wei = 1;
  128.                             wei = 0;
  129.                             P0 = 0x3e;
  130.                             duan = 1;
  131.                             duan = 0;
  132. }
  133. void delay(unsigned char j)       //
  134. {
  135.               unsigned int i;
  136.               for(;j>0;j--)
  137.               for(i=0;i<125;i++);
  138. }


  139. #include <intrins.h>
  140. #define AddWr 0x90    //写数据地址
  141. #define AddRd 0x91   //读数据地址


  142. sbit RST=P2^4;      //关掉时钟芯片输出
  143. sbit Sda=P2^0;     //定义总线连接端口
  144. sbit Scl=P2^1;    //时钟信号


  145. void Start(void)  //启动IIC总线
  146.   {
  147.    Sda=1;
  148.    _nop_();
  149.    Scl=1;
  150.    _nop_();
  151.    Sda=0;
  152.    _nop_();
  153.    Scl=0;
  154.   }

  155. void Stop(void) //停止IIC总线
  156.   {
  157.    Sda=0;
  158.    _nop_();
  159.    Scl=1;
  160.    _nop_();
  161.    Sda=1;
  162.    _nop_();
  163.    Scl=0;
  164.    }

  165.    void Ack(void)//应答IIC总线
  166.    {
  167.     Sda=0;
  168.               _nop_();
  169.               Scl=1;
  170.               _nop_();
  171.               Scl=0;
  172.               _nop_();
  173.               }

  174. void NoAck(void)  // 非应答IIC总线
  175.               {
  176.               Sda=1;
  177.               _nop_();
  178.               Scl=1;
  179.               _nop_();
  180.               Scl=0;
  181.               _nop_();
  182.               }

  183. void Send(unsigned char Data) //发送一个字节
  184.               {
  185.                 unsigned char BitCounter=8;
  186.                 unsigned char temp;
  187.                 do
  188.                   {
  189.                             temp=Data;
  190.                             Scl=0;
  191.                             _nop_();
  192.                             if((temp&0x80)==0x80)
  193.                                 Sda=1;
  194.                             else
  195.                                 Sda=0;

  196.                                           Scl=1;
  197.                                           temp=Data<<1;
  198.                                           Data=temp;
  199.                                           BitCounter--;
  200.                               }
  201.                 while(BitCounter);
  202.                     Scl=0;
  203.                 }
  204.             
  205. unsigned char Read(void) // 读入一个字节并返回
  206.               {
  207.                  unsigned char temp=0;
  208.                  unsigned char temp1=0;
  209.                  unsigned char BitCounter=8;

  210.                  Sda=1;
  211.                  do
  212.                    {
  213.                               Scl=0;
  214.           _nop_();
  215.                               Scl=1;
  216.                               _nop_();
  217.                               if(Sda)
  218.                                  temp=temp|0x01;
  219.                               else
  220.                                  temp=temp&0xfe;

  221.                               if(BitCounter-1)
  222.                                  {
  223.                                             temp1=temp<<1;
  224.                                             temp=temp1;
  225.                                             }
  226.                                             BitCounter--;
  227.                                           }
  228.                             while(BitCounter);
  229.                             return(temp);
  230.               }
复制代码

完整的Word格式文档51黑下载地址:
双向DC-DC变换器.doc (509 KB, 下载次数: 123)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:473159 发表于 2019-4-19 02:14 | 只看该作者
芯龙芯片有过流吗?好像比较贵啊,支持国产
回复

使用道具 举报

板凳
ID:439144 发表于 2019-5-13 12:52 | 只看该作者
电路原理图看不清
回复

使用道具 举报

地板
ID:312535 发表于 2019-7-22 14:37 | 只看该作者
这个图片好模糊啊
回复

使用道具 举报

5#
ID:472364 发表于 2019-10-14 17:57 | 只看该作者

电路原理图看不清
回复

使用道具 举报

6#
ID:592475 发表于 2020-1-25 10:41 | 只看该作者
#在这里快速回复# 电路原理图看不清
回复

使用道具 举报

7#
ID:325624 发表于 2020-1-27 17:09 | 只看该作者
这个用来参考制作可调电源非常不错,赞一个?
回复

使用道具 举报

8#
ID:689942 发表于 2020-2-4 15:29 来自手机 | 只看该作者
protues上找不到XL6019啊,请问怎么办
回复

使用道具 举报

9#
ID:97678 发表于 2023-5-26 14:21 | 只看该作者
请教一下: XL4003 芯片可以设计 输出 正负电源?
回复

使用道具 举报

10#
ID:56054 发表于 2023-11-30 16:58 | 只看该作者
没有实际意义的资料,单片机PWM部份和LM358部份电路都没有
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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