1. <em id="3qmea"><ol id="3qmea"></ol></em>
    2. <em id="3qmea"></em>

      单片机论坛

       找回密码
       立即注册

      QQ登录

      只需一步快速开始

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

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

      [复制链接]
      跳转到指定楼层
      楼主
      摘要
      为实现电池储能装置的双向DC-DC变换器本系统以buck-boost拓扑电路为核?#27169;?#36890;过DSPICFJ256GP710单片机最小系统控制拓扑的切换从而进行buck恒流充电和boost恒压放电充电时效率94%放电时效率95.5%具有过?#36129;?#25252;及温度检测等功能本系统具有效率高控制简单稳定性强等优点满足设计要求
      目录
      一 方案论证与选取
      1.1方案的论证
      1.2方案的选取
      1.3整体设计
      2.1总体设计框图            
      二 理论分析与?#38382;扑?/font>
      2.1 开关场效应管的选择
      2.2肖特基二极管的选择
      2.3电感?#38382;扑?/font>
      2.4电容的?#38382;扑?/font>
      三 电路与程序设计
      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变换器它采用正激和反激组合的?#38382;?#22312;变换器的一侧绕组串联另一侧并联这种结构的双向变换拓扑解决了电流型一电压型组合式拓扑的开关管电压尖峰问题和启动问题
      方案二纯硬件buck-boost双向DC-DC变换器该方案结构简单电源的实时性调整性比较强但是不能实现升降压的自动转换不能轻?#36164;?#29616;人机?#25442;?#37319;集显示电路需要外加MCU
      方案三:buck-boost双向DC-DC变换器用单片机进行控制以buck恒流给电池充电boost恒压对电池进行放电
      1.2方案的选取
      方案一的电路过于复杂且该变换器主要适合大功率电路对于中小功?#23454;?#30005;路来说电路损耗过大且电路需用到变压器和大型散热片使得整个系统的质量过重不符合题目要求所以舍弃方案二虽然电路简单但是不能实现升降压的自动转换方案三利用单片机控制电?#36820;?#24037;作模式使得效?#23454;?#21040;提高符合题目的要求因?#25628;?#25321;此方案
      1.3整体设计

      2.1总体设计框图
      本系统由buck-boost拓扑电路组成通过单片机的键盘控制主电?#36820;?#24037;作模式当选中buck模式时单片机通过控制输出PWM的占空比进行电流调节从而达到恒流充电当选中boost模式时单片机通过控制输出PWM的占空比进行电流调节从而达到恒压放电
      • 理论分析与?#38382;扑?/font>
      2.1 开关场效应管的选择
      选择导通电阻小的IRF540作为开关管其导通电阻仅为77mVGS=10V, ID=17AIRF540击穿电压VDSS为55V 漏极电流最大值为28AVGS =10 V 25C允许最大管耗PCM可达50W完全满足电路要求
      2.2肖特基二极管的选择
      选择STC20100肖特基二极管其导通压降小通过1 A电流时仅为0.35V并?#19968;?#22797;时间短?#23548;?#20351;用时为降低导通压?#21040;?#20004;个肖特基二极管并联
      2.3电感?#38382;扑?/strong>
      BUCK模式电感选择应保证在最小电流输出时电感电流也保持连续直流电流等于电感电流斜?#36335;?峰值dI一半时对应临界连续Iomin=0.2Ion又dI=VL*Ton/L,VL近?#39057;?#20110;Vdc-Vo额定电流Ion=10* IominTon=Vo/Vdc得Lp1=5(Vdc-Vo)VoT /Vdc*Ion取开关频率为30KHz算得L=400H
      BOOST模式根据设计要求可知占空比D=0.4故Ton=D*T=13.32usLp2=Vdc*Ton/Ip=478H
      综上电感取两种模式平均值L=439H?#23548;?#32469;制的电感值为436H选用铂科公司的NPS130060磁环AL=61nH/N^2根据L=AL*N^2得出N=85?#36873;?#26681;据1mm^2走3~5A              电流取0.8mm线径
      2.4电容的?#38382;扑?/strong>
      滤波电容的选择必须满足输出纹波的要求本系统的电容可等效为电阻Ro和电感Lo与其的串联如图4-2-1一般情况下工作频率在300kHz以下?#24378;?#20197;忽略Lo等效串联电感ESL
      2.2.4电容等效电路
      取纹波电压峰峰值为0.06VRoCo50~80*10^(-6)F取平均值65*10^(-6)F求得Co=433F?#23548;?#21462;470F
      • 电路与程序设计
      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管的占空?#21462;?#22914;图3.1.2所示
      3.1.2 boost驱动电路


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

      3.1.4 电流采集电路


      3.2软件部分设计
      3.2.1软件滤波算法
      连续取N个采样?#21040;?#34892;算术平均运算 N?#21040;?#22823;时信号?#20132;?#24230;?#32454;]?#20294;灵敏度?#31995;?N?#21040;?#23567;时信号?#20132;?#24230;?#31995;停?#20294;灵敏度?#32454;?N值的选取一般流量N=12压力N=4此算法适用于对一般具有随机干扰的信号进?#26032;?#27874; 这样信号的特点是有一个平均值信号在某一数值范围附近上下波动
      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=300.5V要求变换器效率ǡ95%
      表5 boost恒压放电效率
      U1
      I1
      U2
      I2
      效率
      20.81
      1.493
      30.01
      0.994
      96.0109%
      4.3 自由模式
      当接通S1S2断开S3调整直流稳压电源输出电压使Us在32~38范围内变化时双向buck-boost拓扑电路能够自动转换工作模式并保持U2=300.5V
      • 参考文献
      [1] 美马尼克塔拉著王志强等译精通开关电源设计?#26412;?#20154;民邮电      出版社
      [2] 长谷川彰开关式稳压器的设计技术第一版?#26412;?#31185;学出版社1989
      [3] 顾亦磊?#29575;?#26480;吕征宇Boost电?#36820;?#19968;种实?#22336;?#27861;电源技术应用2004
      [4] 李爱文张承惠现代逆变技术及应用?#26412;?#31185;学出版社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
      0500V/030A/05000W
      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进行BUCKPWM调整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进行BUCKPWM调整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)                //过?#36129;?#25252;
      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. 限于本文篇幅 余下代码请从51黑下载附件
      复制代码


      Altium Designer画的原理图和PCB图如下(51hei附件中?#19978;?#36733;工程文件)




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


      评分

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

      查看全部评分

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

      使用道具 举报

      沙发
      黄进盛 发表于 2018-9-20 17:14 | 只看该作者
      好资料在设计电源参考参考
      回复

      使用道具 举报

      板凳
      avgvip 发表于 2018-10-25 21:25 | 只看该作者
      好资料在设计电源参考参考
      回复

      使用道具 举报

      地板
      gemxie 发表于 2018-11-12 15:51 | 只看该作者
      学习了谢谢楼主分享了
      回复

      使用道具 举报

      5#
      slim443 发表于 2018-12-26 18:46 | 只看该作者
      好资料多谢啊
      回复

      使用道具 举报

      6#
      xjdqdy 发表于 2019-4-3 10:33 | 只看该作者
      学习好资料
      回复

      使用道具 举报

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

      本版积分规则

      QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

      Powered by 单片机?#22363;?#32593;

      快速回复 返回顶部 返回列表
      ຣ11ѡ5app

        
        
        1. <em id="3qmea"><ol id="3qmea"></ol></em>
        2. <em id="3qmea"></em>

            
            
            1. <em id="3qmea"><ol id="3qmea"></ol></em>
            2. <em id="3qmea"></em>