双向DCDC变换器汇总.docx
《双向DCDC变换器汇总.docx》由会员分享,可在线阅读,更多相关《双向DCDC变换器汇总.docx(19页珍藏版)》请在冰豆网上搜索。
![双向DCDC变换器汇总.docx](https://file1.bdocx.com/fileroot1/2022-11/27/ff86d052-eccc-4bfe-a8bc-527a231bc88a/ff86d052-eccc-4bfe-a8bc-527a231bc88a1.gif)
双向DCDC变换器汇总
2015年全国大学生电子设计竞赛
双向DC-DC变换器(A题)
学号:
1440720117
吕刚
2015年12月30日
摘要
本设计主要由双向DC-DC变换电路、测控显示电路、辅助电源三部分构成,其中双向DC-DC变换电路降压部分采用XL4016开关降压型DC-DC转换芯片,最高转换效率可达93%,升压部分采用XL6019开关型升压/降压芯片,具有低纹波,输入范围广,转换效率高的特点。
恒流部分采用PWM控制原理,形成一个闭环回路,控制电流恒定,恒压部分完全由硬件控制,单片机辅助控制的方式。
以上部分确保系统满足题目要求,实现恒流充电,恒压放电,过压保护功能,并且有着较高的转换效率。
在本次设计中恒压部分完全有硬件控制,硬件自身形成一个闭环控制回路,对电压进行调节使其恒定题目要求的精度范围。
单片机通过光耦电路的工作与停止,恒流部分由PWM调节占空比,使其恒流。
关键字电池充放电升压降压XL4016XL6019STM32
目录
一、系统方案1
1、双向DC-DC变换电路的论证与选择1
2、测量控制方案和辅助电源的论证与选择1
3、控制方法的论证与选择1
二、系统理论分析与计算2
三、电路与程序设计3
1、电路的设计3
(1)系统总体框图3
2、程序的设计5
(1)程序功能描述与设计思路5
(2)程序流程图6
3、程序流程图7
四、测试仪器与数据分析7
附录1:
电路原理图9
附录2:
源程序10
双向DC-DC变换器(A题)
【本科组】
一、系统方案
本设计主要由双向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电路,以及电压电流的采集与控制。
(2)降压电路原理
降压电路采用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)
(4)测控电路电路原理图
测控电路如图3-4所示,通过电阻分压滤波后,使用单片机ADC采样,得到输入、输出电压,以及电流和2.5V基准电压,使用TL431产生2.5V基准电压用于矫正。
恒压恒流控制使用单片机输出PWM,经滤波后使用LM358跟随,增强驱动能力,同时可减小输入控制端的能量消耗。
使用比较器比较设定值与输出值,再控制芯片的工作状态。
(图3-4)
电源
为减小高频干扰,辅助电源使用220V到9V普通变压器,经整流滤波后使用7812和HT7333分别输出12V和3.3V电压为LM358和单片机小系统板供电。
2、程序的设计
(1)程序功能描述与设计思路
1、程序功能描述
根据题目要求,软件部分实现测量显示,切换模式,充电过压保护,控制调节系统。
2、程序设计思路
(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:
电路原理图
附录2:
源程序
#include
#include
#include
unsignedcharReadADC(unsignedcharChl);//AD采样,有返回值
voidDAC(unsignedcharData);//DA输出
voiddelay(unsignedcharj);//
unsignedintdatpro(void);//电压采样数据处理
voidled(intg,inta);//数码管显示
voidout_AD_led();//输出采样电压1
voidDA_out();//DA输出控制
sbitkey_1=P3^4;
sbitkey_2=P3^5;
sbitduan=P2^6;
sbitwei=P2^7;
sbitin0=P3^2;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsignedcharnum=102;//DA数模输出变量初始值
intmain()
{
while
(1)
{
DA_out();
DAC(num);
out_AD_led();
}
}
voidout_AD_led()//
{
led(1,datpro()/1000);
led(2,datpro()%1000/100);
led(3,datpro()%100/10);
}
unsignedcharReadADC(unsignedcharCh)//读取AD模数转换的值,有返回值
{
unsignedcharData;
Start();//写入芯片地址
Send(AddWr);
Ack();
Send(0x40|Ch);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
//Ch的值分别为0、1、2、3,分别代表1-4通道
Ack();
Start();
Send(AddRd);//读入地址
Ack();
Data=Read();//读数据
Scl=0;
NoAck();
Stop();
returnData;//返回值
}
unsignedintdatpro(void)//
{
unsignedintdianyah,dianyal;
unsignedintdianya=0;
unsignedcharx;
for(x=0;x<6;x++)
{
dianya=ReadADC
(1)+dianya;//输入通道选择通道
}
dianya=dianya/6;
dianyah=dianya&0xf0;
dianyah=dianyah>>4;
dianyal=dianya&0x0f;
dianya=dianyal*20+dianyah*310;
return(dianya);
}
voidDA_out()//
{
if(key_1==0)
{
delay(10);
while(key_1==0);
num=num-1;
}
if(key_2==0)
{
delay(10);
while(key_2==0);
num=num+1;
}
}
voidDAC(unsignedcharData)//
{
Start();
Send(AddWr);//写入芯片地址
Ack();
Send(0x40);//写入控制位,使能DAC输出
Ack();
Send(Data);//写数据
Ack();
Stop();
}
voidled(intg,inta)//
{
if(g==1)
{
P0=0Xfe;
wei=1;
wei=0;
P0=table[a];
duan=1;
delay
(2);
duan=0;
}
if(g==2)
{
P0=0Xfd;
wei=1;
wei=0;
P0=table[a]|0x80;
duan=1;
delay
(2);
duan=0;
}
if(g==3)
{
P0=0Xfb;
wei=1;
wei=0;
P0=table[a];
duan=1;
delay
(2);
duan=0;
}
P0=0Xf7;
wei=1;
wei=0;
P0=0x3e;
duan=1;
duan=0;
}
voiddelay(unsignedcharj)//
{
unsignedinti;
for(;j>0;j--)
for(i=0;i<125;i++);
}
#include
#defineAddWr0x90//写数据地址
#defineAddRd0x91//读数据地址
sbitRST=P2^4;//关掉时钟芯片输出
sbitSda=P2^0;//定义总线连接端口
sbitScl=P2^1;//时钟信号
voidStart(void)//启动IIC总线
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
voidStop(void)//停止IIC总线
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
voidAck(void)//应答IIC总线
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
voidNoAck(void)//非应答IIC总线
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
voidSend(unsignedcharData)//发送一个字节
{
unsignedcharBitCounter=8;
unsignedchartemp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
unsignedcharRead(void)//读入一个字节并返回
{
unsignedchartemp=0;
unsignedchartemp1=0;
unsignedcharBitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}