单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

dsPIC单片机buck-boost拓扑双向DC-DC电源变换器设计(源码+论文+PCB)

[复制链接]
跳转到指定楼层
楼主
摘要
为实现电池储能装置的双向DC-DC变换器,本系统以buck-boost拓扑电路为核心,通过DSPICFJ256GP710单片机最小系统控制拓扑的切换,从而进行buck恒流充电和boost恒压放电。充电时效率≥94%,放电时效率≥95.5%,具有过压保护及温度检测等功能。本系统具有效率高、控制简单、稳定性强等优点,满足设计要求。
目录
一、 方案论证与选取
1.1方案的论证
1.2方案的选取
1.3整体设计
2.1总体设计框图            
二、 理论分析与参数计算
2.1 开关场效应管的选择
2.2肖特基二极管的选择
2.3电感参数计算
2.4电容的参数计算
三、 电路与程序设计
3.1硬件部分设计
3.1.1buck-boost主电路模块
3.1.2 boost驱动电路
3.1.3 buck驱动电路
3.1.4 电流采集模块
3.2软件部分设计
3.2.1软件滤波算法
3.2.2软件流程图
四、 测试方案与测试结果
4.1测试仪器(见附件1)
4.2测试步骤及数据
4.2.1充电模式
4.2.2 放电模式
4.3 自由模式
五、 参考文献
六、 附件
6.1附件一 测试仪器
6.2附件二 作品照片
  • 方案论证与选取
1.1方案的论证
方案一:正反激组合式双向DC-DC变换器。它采用正激和反激组合的形式,在变换器的一侧绕组串联,另一侧并联。这种结构的双向变换拓扑解决了电流型一电压型组合式拓扑的开关管电压尖峰问题和启动问题。
方案二:纯硬件buck-boost双向DC-DC变换器。该方案结构简单,电源的实时性调整性比较强。但是不能实现升降压的自动转换,不能轻易实现人机交互,采集显示电路需要外加MCU。
方案三:buck-boost双向DC-DC变换器。用单片机进行控制,以buck恒流给电池充电,boost恒压对电池进行放电。
1.2方案的选取
方案一的电路过于复杂,且该变换器主要适合大功率电路,对于中小功率的电路来说电路损耗过大,且电路需用到变压器和大型散热片,使得整个系统的质量过重,不符合题目要求,所以舍弃。方案二虽然电路简单,但是不能实现升降压的自动转换。方案三利用单片机控制电路的工作模式,使得效率得到提高,符合题目的要求,因此选择此方案。
1.3整体设计

2.1总体设计框图
本系统由buck-boost拓扑电路组成,通过单片机的键盘控制主电路的工作模式,当选中buck模式时,单片机通过控制输出PWM的占空比进行电流调节,从而达到恒流充电;当选中boost模式时,单片机通过控制输出PWM的占空比进行电流调节,从而达到恒压放电。
  • 理论分析与参数计算
2.1 开关场效应管的选择
选择导通电阻小的IRF540作为开关管,其导通电阻仅为77mΩ(VGS=10V, ID=17A)。IRF540击穿电压VDSS为55V ,漏极电流最大值为28A(VGS =10 V, 25°C),允许最大管耗PCM可达50W,完全满足电路要求。
2.2肖特基二极管的选择
选择STC20100肖特基二极管,其导通压降小,通过1 A电流时仅为0.35V,并且恢复时间短。实际使用时为降低导通压降将两个肖特基二极管并联。
2.3电感参数计算
BUCK模式:电感选择应保证在最小电流输出时,电感电流也保持连续。直流电流等于电感电流斜坡峰-峰值dI一半时对应临界连续。Iomin=0.2Ion。又dI=VL*Ton/L,VL近似等于(Vdc-Vo),额定电流Ion=10* Iomin,Ton=Vo/Vdc得:Lp1=5(Vdc-Vo)VoT /Vdc*Ion。取开关频率为30KHz,算得L=400μH。
BOOST模式:根据设计要求可知占空比D=0.4,故Ton=D*T=13.32us,Lp2=Vdc*Ton/Ip=478μH。
综上,电感取两种模式平均值L=439μH,实际绕制的电感值为436μH。选用铂科公司的NPS130060磁环,AL=61nH/N^2,根据L=AL*N^2得出N=85匝。根据1mm^2走3~5A              电流取0.8mm线径。
2.4电容的参数计算
滤波电容的选择必须满足输出纹波的要求。本系统的电容可等效为电阻Ro和电感Lo与其的串联(如图4-2-1)。一般情况下,工作频率在300kHz以下是可以忽略Lo(等效串联电感ESL)。
2.2.4电容等效电路
取纹波电压峰峰值为0.06V,RoCo≈50~80*〖10〗^(-6)ΩF,取平均值65*〖10〗^(-6)ΩF。求得Co=433μF,实际取470μF。
  • 电路与程序设计
3.1硬件部分设计
3.1.1buck-boost主电路模块
为了满足电池储能装置的双向DC-DC变换器,实现电池的充放电功能,主电路采用buck-boost拓扑电路,通过buck恒流对电池充电,boost恒压对电池放电。当工作在充电状态下,此时Q2导通,Q3截止,电流流过电感对电池进行充电。当工作在放电状态下,此时Q3导通,Q2截止,电池进行放电。如图3.1.1所示。
3.1.1 buck-boost主电路
3.1.2 boost驱动电路
由霍尔采集电流供给单片机,单片机经过处理后输出PWM,为增加驱动能力,采用推挽结构输出PWM控制主电路mos管的占空比。如图3.1.2所示。
3.1.2 boost驱动电路


3.1.3 buck驱动电路
当单片机输入PWM时,经过大功率光耦T1隔离驱动MOS管。如图3.1.3所示。
3.1.3 buck驱动电路
3.1.4 电流采集模块
系统采用霍尔传感器对电路的电流进行采集,经过电流电压转换,由电阻分压后送入单片机进行A/D转换。如图3.1.4所示。

3.1.4 电流采集电路


3.2软件部分设计
3.2.1软件滤波算法
连续取N个采样值进行算术平均运算 N值较大时:信号平滑度较高,但灵敏度较低 N值较小时:信号平滑度较低,但灵敏度较高 N值的选取:一般流量,N=12;压力:N=4;此算法适用于对一般具有随机干扰的信号进行滤波 这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。
3.2.2软件流程图

3.2.2 软件流程图
  • 测试方案与测试结果
4.1测试仪器(见附件1)
4.2测试步骤及数据
4.2.1充电模式
  • 条件:U2=30V,实现电池恒流充电。要求:I1在1~2A范围可调,步进值不大于0.1A,电流控制精度不低于5%。
表1  I1步进值精度测量
设定值
万用表示数
精度
1
1.005
0.500%
1.1
1.102
0.182%
1.2
1.206
0.500%
1.3
1.305
0.385%
1.4
1.406
0.429%
1.5
1.487
-0.867%
1.6
1.606
0.375%
1.7
1.709
0.529%
1.8
1.805
0.278%
1.9
1.904
0.211%
2.0
2.014
0.700%
  • 条件:I1=2A,调整直流稳压电源输出电压。要求:U2在24~36V范围变化时,充电电流I1的变化率不大于1%。
表2  充电电流I1的电压调整率
U2
I1
电流变化率
24
2.012
0.049%
30.99
2.012
36.09
2.013
  • 条件:I1=2A,U2=30V。要求:变换器的效率η≥90%。
表3  变换器效率
U1
I1
U2
I2
效率
19.69
2.012
29.94
1.393
94.9884%
  • 条件:单片机显示充电电流I1。要求:I1=1~2A范围内测量精度不低于2%。
表4  电流I1测量精度
万用表
单片机
误差百分比
1.012
1
1.200%
1.115
1.1
1.364%
1.213
1.2
1.083%
1.309
1.3
0.692%
1.408
1.4
0.571%
1.512
1.5
0.800%
1.61
1.6
0.625%
1.72
1.71
0.585%
1.815
1.8
0.833%
1.918
1.91
0.419%
2.021
2.06
-1.893%
(5)过充保护:I1=2A时,当U1超过阈值电压后,停止充电。
4.2.2 放电模式
  • 条件:断开S1,接通S2,将装置设定为放电模式,保持U2=30±0.5V。要求:变换器效率η≥95%。
表5 boost恒压放电效率
U1
I1
U2
I2
效率
20.81
1.493
30.01
0.994
96.0109%
4.3 自由模式
当接通S1、S2,断开S3,调整直流稳压电源输出电压,使Us在32~38范围内变化时,双向buck-boost拓扑电路能够自动转换工作模式并保持U2=30±0.5V。
  • 参考文献
[1] (美)马尼克塔拉著,王志强等译,精通开关电源设计,北京:人民邮电      出版社
[2] 长谷川彰,开关式稳压器的设计技术(第一版),北京科学出版社,1989
[3] 顾亦磊,陈世杰,吕征宇,Boost电路的一种实现方法,电源技术应用,2004
[4] 李爱文,张承惠,现代逆变技术及应用,北京科学出版社,2000
[5] 华成英,童诗白,模拟电子技术基础(第四版),高等教育出版社,2006

6.1附件一 测试仪器
序 号
名称、型号及规格
主要技术指标
数 量
备 注
1
数字万用表vc980+
直流电压:200mV/2V/20V/200 V /1000V——±(0.05%+3)
直流电流:200uA/2mA/20mA/ 200mA/20A——±(0.5%+4)
交流电压:200mV/2V/20V/200 V/750V——±(0.8%+25)
交流电流:200mA/20A——   ±(1.5%+25)
4

2
Tektronix双通道数字存储示波器
200MHz 2GS/S
1

3
Lecroy waveRunner 104mxi数字示波器
1GHz Oscilloscope 10GS/S
1
力科
4
IT8516B可编程直流电子负载
500V/120A/2400W
1
ITECH
5
IT6164S直流可编程电源
60V*20A
1
ITECH
6
高精度实验室电源PS 8000 3U
0…500V/0…30A/0…5000W
1
EA
7
红外测温仪
输出<1mW,波长630-670nm
1

8
HP34411A六位半数字万用表

1
安捷伦
6.2附件二 作品照片



DSPICFJ256GP710单片机源程序如下:
  1. #include "p33FJ256GP710.h"
  2. #include<math.h>
  3. #include "Delay.h"
  4. #include "InitCPU.h"
  5. #include "LCD12864.h"
  6. #include "ADC.h"
  7. #include "KEY.h"
  8. #include "PWM.h"
  9. #include "DS18B20.h"
  10. #define uint unsigned int
  11. #define uchar unsigned char
  12. #define ulint unsigned long int

  13. #define KeyPort PORTE
  14. /*********变量定义***********/
  15. unsigned char KEY_Receive =0;                        //按键扫描结果存储
  16. unsigned int cls=0;                                        //清屏指示
  17. unsigned char switchover =0;                        //换屏
  18. unsigned int Duty_one =0,Duty_two=0;        //占空比寄存器
  19. unsigned int I_Set_One =15000;        //1模块和2模块设定电流值(调光)
  20. unsigned int count =0,start=0,start1=0;   //
  21. unsigned char test =0;                                        //按键加减寄存器(test =1加;test=2减)
  22. unsigned char BUCK=0,BOOST=0;                                        //采集100次标志位
  23. /********************状态标志位************************/
  24. unsigned  char Menu =1;                                                                //主菜单标志位
  25. unsigned char Menu_A =0;                                                        //一级菜单A(状态A)
  26. unsigned char Menu_B =0;
  27. unsigned char Menu_C =0;                                //一级菜单B(状态B)
  28. unsigned char Cursor =1;                                                        //光标状态标志位
  29. unsigned char stateA =0;                                                        //A状态标志位(区分正常模式还是过流保护)
  30. unsigned char stateB =0;                                                        //B状态标志位
  31. unsigned char stateC =0;

  32. float RE_Ui=0,RE_Uo=0,RE_Ii=0,RE_Io=0;
  33. float RE_Ui_all=0,RE_Uo_all=0,RE_Ii_all=0,RE_Io_all=0;
  34. float Ui_ave=0,Uo_ave=0,Ii_ave=0,Io_ave=0;
  35. float Ui=0,Uo=0,Ii=0,Io=0;
  36. float GETTEMP;
  37. float POWER_factor=0;

  38. unsigned char KeyScan();
  39. void main()
  40. {/*****初始化*****/
  41.         InitCPU();        
  42.         InitLCD();
  43.         Init_ADC();
  44.         Init_PWM();        
  45.         Init_DS18B20();
  46.         _TRISF2=0;//蜂鸣器输出
  47.         _TRISD1=0;
  48.         _TRISD2=0;
  49.         Clear_lcd();
  50.         DelayMs(10);
  51.     DISPLAY_stri(0 ,0 , "模式选择: ");
  52.     DISPLAY_stri(0,1,"->1.充电模块");        
  53.     DISPLAY_stri(0,2,"  2.放电模块");        
  54.     DISPLAY_stri(0,3,"  3.自动模块");
  55.         writ_com(0x0F);        
  56.         writ_com(0x90);        
  57.         while(1)
  58.         {     
  59.              KEY_Receive=KeyScan();
  60.                 switch ( KEY_Receive )
  61.                 {
  62.                         case 1:                 //光标向下移动(+)
  63.                         {                        
  64.                                         test =1;                                //按键寄存器,加
  65.                                         if(Menu==1)
  66.                                         {        test=0;
  67.                                                 Cursor ++;
  68.                                                 Cursor=Cursor>=4?1:Cursor;        
  69.                                                 if( Cursor ==1 )
  70.                                                 {
  71.                           DISPLAY_stri(0 ,1 , "->1.充电模块");        
  72.                           DISPLAY_stri(0 ,2 , "  2.放电模块");
  73.                           DISPLAY_stri(0 ,3 , "  3.自动模块");
  74.                                                   writ_com(0x90);                //光标显示在第一行
  75.                                                 }        
  76.                                                 if( Cursor ==2 )
  77.                                                 {DISPLAY_stri(0 ,1 , "  1.充电模块");        
  78.                          DISPLAY_stri(0 ,2 , "->2.放电模块");
  79.                          DISPLAY_stri(0 ,3 , "  3.自动模块");
  80.                                                  writ_com(0x88);                //光标显示在第二行
  81.                                                 }        
  82.                        if( Cursor ==3 )
  83.                                                 {DISPLAY_stri(0 ,1 , "  1.充电模块");        
  84.                          DISPLAY_stri(0 ,2 , "  2.放电模块");
  85.                          DISPLAY_stri(0 ,3 , "->3.自动模块");
  86.                          writ_com(0x98);//光标显示在第二行
  87.                                              }  
  88.                                         }
  89.                                         break;        
  90.                         }
  91.                         case 2:
  92.                         {
  93.                                 //菜单光标,显示2行
  94.                                         test =2;                                 //按键寄存器,减
  95.                                         if( Menu ==1)
  96.                                         {          test=0;
  97.                                                 Cursor --;
  98.                                                 Cursor=Cursor==0?3:Cursor;        
  99.                                                 if( Cursor ==1 )
  100.                                                 {
  101.                                                  DISPLAY_stri(0 ,1 , "->1.充电模块");
  102.                          DISPLAY_stri(0 ,2 , "  2.放电模块");
  103.                          DISPLAY_stri(0 ,3 , "  3.自动模块");
  104.                                                  writ_com(0x90);                //光标显示在第一行
  105.                                                 }        
  106.                                                 if( Cursor ==2 )
  107.                                                 {   
  108.                                                          DISPLAY_stri(0 ,1 , "  1.充电模块");
  109.                              DISPLAY_stri(0 ,2 , "->2.放电模块");
  110.                              DISPLAY_stri(0 ,3 , "  3.自动模块");
  111.                                                          writ_com(0x88);                //光标显示在第二行
  112.                                                 }        
  113.                       if( Cursor ==3 )
  114.                                                 {     DISPLAY_stri(0 ,1 , "  1.充电模块");
  115.                               DISPLAY_stri(0 ,2 , "  2.放电模块");
  116.                               DISPLAY_stri(0 ,3 , "->3.自动模块");
  117.                                                           writ_com(0x98);                //光标显示在第二行////////////////
  118.                                                 }                                                                                                                                       
  119.                                         }
  120.                                         break;                        
  121.                         }
  122.                         case 3:                //(确定键,进入子状态(执行状态)
  123.                         {   
  124.                                         switchover =~switchover;
  125.                                         cls=1;                                                                        
  126.                                         if( ( Menu * Cursor ) ==1 )  //BUCK模式
  127.                                         {        
  128.                                                 _TRISD1=0;
  129.                                                 _TRISD2=0;                                       
  130.                                                 Menu_A =1;
  131.                                                 Menu_B =0;
  132.                                                 Menu_C =0;
  133.                                                 Menu =0;

  134.                                                 stateA=1;
  135.                                                 stateB=0;
  136.                                                 stateC=0;
  137.                                                 OC3CONbits.OCM=0B110;
  138.                                                 OC2CONbits.OCM=0B110;
  139.                                                 Duty_one=10;                         //PWM设置one进行BUCK——PWM调整,two关断
  140.                                                 Duty_two=0;

  141.                                                 T2CONbits.TON=1;
  142.                                                 writ_com(0x0C);                        //关闭游标和游标位置
  143.                                                  Clear_lcd();
  144.                                         }
  145.                                         if(  ( Menu * Cursor ) ==2 )//BOOST模式
  146.                                         {
  147.                                                 _TRISD2=0;
  148.                                                 _TRISD1=0;
  149.                                                 Menu_A =0;
  150.                                                 Menu_B =1;
  151.                                                 Menu_C =0;
  152.                                                 Menu =0;
  153.                                 
  154.                                                 stateA=0;
  155.                                                 stateB=1;
  156.                                                 stateC=0;
  157.                                                 OC3CONbits.OCM=0B110;
  158.                                                 OC2CONbits.OCM=0B110;
  159.                                                 Duty_one=0;                         ////PWM设置two进行BUCK——PWM调整,one关断
  160.                                                 Duty_two=10;

  161.                                                 T2CONbits.TON=1;
  162.                                                 writ_com(0x0C);                        //关闭游标和游标位置
  163.                                                  Clear_lcd();
  164.                                         }        
  165.                            if( ( Menu * Cursor ) ==3 )//自动模式
  166.                                         {
  167.                                                 _TRISD2=0;
  168.                                                 _TRISD1=0;
  169.                                                 Menu_A =0;
  170.                                                 Menu_B =0;
  171.                                                 Menu_C =1;
  172.                                                 Menu =0;

  173.                                                 stateA=0;
  174.                                                 stateB=0;
  175.                                                 stateC=1;
  176.                                                 OC3CONbits.OCM=0B000;
  177.                                                 OC2CONbits.OCM=0B000;
  178.                                                 BUCK=0;
  179.                                                 BOOST=0;
  180.                                                 Duty_one=0;                         //PWM设置,刚开始用BUCK
  181.                                                 Duty_two=0;

  182.                                                 T2CONbits.TON=0;
  183.                                                 writ_com(0x0C);                        //关闭游标和游标位置
  184.                                                  Clear_lcd();
  185.                                         }
  186.                                         break;                                
  187.                         }
  188.                         case 4:
  189.                         {
  190.                                         if( Menu_A ==1 )        
  191.                                         {                                       
  192.                                                 Menu_A =0;
  193.                                                 Menu_B =0;
  194.                                                 Menu_C =0;
  195.                                                 Menu =1;
  196.                                                 Cursor =1;
  197.                                                 stateA=0;
  198.                                                 stateB=0;
  199.                                                 stateC=0;
  200.                                                 start=0;
  201.                                                 OC3RS=0;        
  202.                                                 OC2RS=0;
  203.                                                 OC3CONbits.OCM=0B000;
  204.                                                 OC2CONbits.OCM=0B000;
  205.                                                 _LATD2=0;
  206.                                                 _LATD1=0;
  207.                                                 _LATF2=0;
  208.                                                 T2CONbits.TON=0;
  209.                                                 I_Set_One=15000;
  210.                                                 Clear_lcd();
  211.                                                 DelayMs(10);
  212.                                             DISPLAY_stri(0 ,0 , "模式选择: ");
  213.                                                 DISPLAY_stri(0 ,1 , "->1.充电模块");        
  214.                                                 DISPLAY_stri(0 ,2 , "  2.放电模块");
  215.                         DISPLAY_stri(0 ,3 , "  3.自动模块");        
  216.                                                 writ_com(0x90);
  217.                                                 writ_com(0x0F);                                       
  218.                                         }
  219.                                         if( Menu_B ==1 )
  220.                                         {                                       
  221.                                                 Menu_A =0;
  222.                                                 Menu_B =0;
  223.                                                 Menu_C =0;
  224.                                                 Menu =1;
  225.                                                 Cursor =1;
  226.                                                 stateA=0;
  227.                                                 stateB=0;
  228.                                                 stateC=0;
  229.                                                 OC3RS=0;
  230.                                                 OC2RS=0;
  231.                                                 start1=0;
  232.                                                 OC3CONbits.OCM=0B000;
  233.                                                 OC2CONbits.OCM=0B000;
  234.                                                 _LATD2=0;
  235.                                                 _LATD1=0;
  236.                                                 T2CONbits.TON=0;
  237.                                                 Clear_lcd();
  238.                                                 DelayMs(10);
  239.                                         DISPLAY_stri(0 ,0 , "模式选择: ");
  240.                                                 DISPLAY_stri(0 ,1 , "->1.充电模块");        
  241.                                                 DISPLAY_stri(0 ,2 , "  2.放电模块");
  242.                         DISPLAY_stri(0 ,3 , "  3.自动模块");        
  243.                                                 writ_com(0x90);
  244.                                                 writ_com(0x0F);
  245.                                         }
  246.                           if( Menu_C ==1 )
  247.                                         {                                       
  248.                         Menu_A =0;
  249.                                                 Menu_B =0;
  250.                                                 Menu_C =0;
  251.                                                 Menu=1;
  252.                                                 Cursor=1;
  253.                                                 stateA=0;
  254.                                                 stateB=0;
  255.                                                 stateC=0;
  256.                                                 OC3RS=0;
  257.                                                 OC2RS=0;
  258.                                                 _LATD2=0;
  259.                                                 _LATD1=0;
  260.                                                 OC3CONbits.OCM=0B000;
  261.                                                 OC2CONbits.OCM=0B000;
  262.                                                 T2CONbits.TON=0;
  263.                                                 Clear_lcd();
  264.                                                 DelayMs(10);
  265.                                               DISPLAY_stri(0 ,0 , "模式选择: ");
  266.                                                 DISPLAY_stri(0 ,1 , "->1.充电模块");        
  267.                                                 DISPLAY_stri(0 ,2 , "  2.放电模块");
  268.                         DISPLAY_stri(0 ,3 , "  3.自动模块");        
  269.                                                 writ_com(0x90);
  270.                                                 writ_com(0x0F);
  271.                                         }
  272.                                         break;                                
  273.                         }
  274.                         default :break;
  275.                 }
  276.                 switch (stateA)//充电模式
  277.                 {
  278.                         case 1:        //采集电压电流
  279.                                         RE_Ui=filter(0);        
  280.                                         RE_Ii=filter(1);
  281.                                         RE_Uo=filter(2);
  282.                                         RE_Io=filter(3);
  283.                                         Ui=(RE_Ui/1.023)*38.74;
  284.                                         Ii=((RE_Ii/1023)*2980-2082)*10000/418;
  285.                                         Uo=(RE_Uo/1.023)*25.33;               
  286.                                         Io=((RE_Io/1023)*2980-2063)*10000/417;
  287.                                        
  288.                                 //        POWER_factor=Ui
  289.                                         start++;        
  290.                                 
  291.                                         I_Set_One=test==1?I_Set_One+1000:I_Set_One;
  292.                                         I_Set_One=test==2?I_Set_One-1000:I_Set_One;
  293.                                         I_Set_One=I_Set_One>20000?10000:I_Set_One;
  294.                                         I_Set_One=I_Set_One<10000?20000:I_Set_One;
  295.                                         test=0;        
  296.                                         if(Io>=I_Set_One)
  297.                                         {
  298.                                         Duty_one=Duty_one<=10?700:Duty_one-1;
  299.                                         }
  300.                                         else
  301.                                         {
  302.                                         Duty_one=Duty_one>=1300?700:Duty_one+1;
  303.                                         }
  304.                                 
  305.                                         if(Uo>=24000)                //过压保护
  306.                                         {
  307.                                                 DelayMs(2000);
  308.                                                 if(Uo>=24000)
  309.                                                 {
  310.                                                 _LATF2=1;
  311.                                                 T2CONbits.TON=0;
  312.                                                 OC3CONbits.OCM=0B000;
  313.                                                 OC2CONbits.OCM=0B000;
  314.                                                 _LATD2=0;
  315.                                                 _LATD1=0;
  316.                                                 }
  317.                                         }
  318.                                         if(switchover)                //翻页显示
  319.                                         {
  320.                                         if(cls==1)
  321.                                         {
  322.                                         Clear_lcd();
  323.                                         DelayMs(10);
  324.                                         }
  325.                                         cls=0;
  326.                                         DISPLAY_stri(0,0,"输入Ui:");
  327.                                         DISPLAY_stri(4,0,ADC_deal_U(Ui));
  328.                                         DISPLAY_stri(0,1,"输入Ii:");
  329.                                         DISPLAY_stri(4,1,ADC_deal_I_1(Ii));
  330.                                         DISPLAY_stri(0,2,"输出Uo:");
  331.                                         DISPLAY_stri(4,2,ADC_deal_U(Uo));
  332.                                         DISPLAY_stri(0,3,"输出Io:");
  333.                                         if(start==50)
  334.                                         {start=0;
  335.                                         GETTEMP=GETTEMP_DS18B20();
  336.                                         DISPLAY_stri(4,3,ADC_deal_I_1(Io));
  337.                                         }
  338.                                         }
  339.                                         if(!switchover)
  340.                                         {
  341.                                         if(cls==1)
  342.                                         {
  343.                                         Clear_lcd();
  344.                                         DelayMs(10);
  345.                                         }
  346.                                         cls=0;
  347.                                         DISPLAY_stri(0,1,"I_set : ");
  348.                                         DISPLAY_stri(4,1,ADC_deal_I_1(I_Set_One));
  349.                                         DISPLAY_stri(0,0,"T:  ");
  350.                                         DISPLAY_stri(4,0,ADC_deal_U(GETTEMP*100));
  351.                                         DISPLAY_stri(0,2,"I_fact:");
  352.                                         if(start==50)
  353.                                         {
  354.                                         start=0;
  355.                                         GETTEMP=GETTEMP_DS18B20();
  356.                                         DISPLAY_stri(4,2,ADC_deal_I_1(Io));
  357.                                         }
  358.                                         }
  359.                                         stateA=1;               
  360.                                         break;
  361.                          default :break;
  362.                 }

  363.                 switch (stateB)//放电模式
  364.                 {
  365.                         case 1:        //采集电压电流
  366.                                         RE_Ui=filter(0);        
  367.                                         RE_Ii=filter(1);
  368.                                         RE_Uo=filter(2);
  369.                                         RE_Io=filter(3);
  370.                                         Ui=(RE_Ui/1.023)*38.74;
  371.                                         Ii=(2082-(RE_Ii/1023)*2980)*10000/418;
  372.                                         Uo=(RE_Uo/1.023)*25.33;               
  373.                                         Io=(2079-(RE_Io/1023)*2980)*10000/417;
  374.                                 //        GETTEMP=GETTEMP_DS18B20();               
  375.                                         if(Ui>=30000)                //恒压
  376.                                         {
  377.                                         Duty_two=Duty_two<10?700:Duty_two-1;
  378.                                         }
  379.                                         else
  380.                                         {
  381.                                         Duty_two=Duty_two>1300?700:Duty_two+1;
  382.                                         }
  383.                                         start1++;        
  384.                                         DISPLAY_stri(0,0,"输入Ui:");
  385.                                         if(start1==50)
  386.                                         {
  387.                                         start1=0;
  388.                                         DISPLAY_stri(4,0,ADC_deal_U(Ui));
  389.                                         }
  390.                                         DISPLAY_stri(0,1,"输入Ii:");
  391.                                         DISPLAY_stri(4,1,ADC_deal_I_1(Ii));
  392.                                         DISPLAY_stri(0,2,"输出Uo:");
  393.                                         DISPLAY_stri(4,2,ADC_deal_U(Uo));
  394.                                         DISPLAY_stri(0,3,"输出Io:");
  395.                                         DISPLAY_stri(4,3,ADC_deal_I_1(Io));
  396.                                         stateB=1;               
  397.                                         break;
  398.                          default :break;
  399.                 }
  400.             
  401.                 switch (stateC)//自动模式
  402.                 {
  403.                         case 1:        
  404.                                         RE_Ui=filter(0);        
  405.                                         RE_Uo=filter(2);
  406.                                         Ui=(RE_Ui/1.023)*38.74;
  407.                                         Uo=(RE_Uo/1.023)*25.33;               
  408.                                        
  409.                                         if((Ui>30300)&(BUCK!=1))                //BUCK模式  大于30.3        选定BUCK状态
  410.                                         {
  411.                                         BUCK=1;
  412.                                         BOOST=0;
  413.                                         OC3CONbits.OCM=0B110;  //BUCK开
  414.                                         OC2CONbits.OCM=0B000;        //BOOST关
  415.                                         Duty_one=10;
  416.                                         T2CONbits.TON=1;        
  417.                                         }
  418.                                         if((Ui<29700)&(BOOST!=1))                //BOOST模式  小于29.7        选定BOOST状态
  419.                                         {
  420.                                         BUCK=0;
  421.                                         BOOST=1;
  422.                                         OC3CONbits.OCM=0B000;  //BUCK关
  423.                                         OC2CONbits.OCM=0B110;        //BOOST开
  424.                                         Duty_two=10;
  425.                                         T2CONbits.TON=1;        
  426.                                         }
  427.                                         if(BUCK==1)
  428.                                         {
  429.                                                 if(Ui>=30000)                //恒压
  430.                                                 {
  431.                                                 Duty_one=Duty_one>1300?10:Duty_one+1;
  432.                                                 }
  433.                                                 else
  434.                                                 {
  435.                                                 Duty_one--;
  436.                                                 if(Duty_one==4)
  437.                                                 {
  438.                                                         //Duty_one=0;
  439.                                                         //Duty_two=6;
  440.                                                         T2CONbits.TON=0;
  441.                                                         OC3CONbits.OCM=0B000;  //BUCK关
  442.                                                         OC2CONbits.OCM=0B110;        //BOOST开
  443.                                                         Duty_one=0;
  444.                                                         Duty_two=6;
  445.                                                         T2CONbits.TON=1;
  446.                                                         BOOST=1;
  447.                                                         BUCK=0;
  448.                                                 }        
  449.                                                 }        
  450.                                         }
  451.                                         if(BOOST==1)
  452.                                         {
  453.                                                 if(Ui>=30000)                //恒压
  454.                                                 {
  455.                                                 Duty_two--;
  456.                                                 if(Duty_two==4)
  457.                                                 {
  458.                                                         T2CONbits.TON=0;
  459.                                                         Duty_two=0;
  460.                                                         Duty_one=6;
  461.                                                         OC3CONbits.OCM=0B110;  //BUCK开
  462.                                                         OC2CONbits.OCM=0B000;        //BOOST关
  463.                                                         T2CONbits.TON=1;
  464.                                                         BOOST=0;
  465.                                                         BUCK=1;
  466.                                                 }        
  467.                                                 
  468.                                                 }
  469.                                                 else
  470.                                                 {
  471.                                                 Duty_two=Duty_two>1300?10:Duty_two+1;
  472. ……………………

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


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)




所有资料51hei提供下载(含完整的Word格式设计论文):
DCDC电源方案.rar (7.51 MB, 下载次数: 12)


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛

Powered by 单片机教程网

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