本帖最后由 gjhk001 于 2019-12-30 14:50 编辑  
 
1. 方案概述  
1.1. 概述数字电源并不是简单的指在系统中应用了数字器件,如单片机及DSP等,而是指整个系统的控制应用数字器件的计算能力和离散控制方法来完成,随着电力电子的发展,电源越来越趋向数字化与智能化发展。本设计采用STM32F334作为控制器的同步降压变换器的数字电源,可以实现降压控制,也可以实现升压控制,能量双向流动。数字控制不只能让电源更简单,还可以让电源实现四遥功能。四遥:遥测、遥信、遥控及遥调。 本设计将介绍同步降压的数字控制方案硬件和软件的设计说明,并附相关电路原理图及参考代码。 1.2. 系统主要结构如图-1所示,BUCK同步降压系统由辅助电路、控制电路、驱动电路、BUCK电路、信号调理电路构成。具体硬件的介绍及说明见第2章节内容。  
图-1 基于STM32F334微控制器的BUCK同步降压的数字控制方案结构图 本设计应用了STM32F334的PWM模块发出对称的PWM波驱动BUCK电路;通过ADC模块采集直流母线电压,输出电压、输出电流及远端测量,特别说明的是远端测量,认为在电池充放电应用是有效的,因为其可以解决电缆电线的压降问题;预留一个串口通信接口,可以实现与上位机,操作面板等设备通信。 1.3. 主要功能和指标- 输入电压:10~64V,输出电压:5~60V;
 - 最大电流:5A;
 - 最大功率:240w;
 - 高效率设计,支持的最大效率超过95%;
 - 250 KHz开关频率支持更小的无源组件,从而减小电路板面积并延长寿命;
 - 三个满足各种应用场合的控制模式:1) 输出电压控制 2) MPPT 控制(输入电流控制)3) 反向电压控制。
 - 保护机制:过压保护,欠压保护,过流保护。
 
 
  1.4. 应用对象适合于太阳能微转换器、数字电源和电池充放电、直流UPS应用 2. 方案硬件设计 
2.1. 功率电路 
 
如图-2所示,同步BUCK由经典的BUCK变换而来,具体是使用mos替换二极管实现。输入端与输出端都采用LC滤波,使得输入输出电流连续,便于滤波。输出端的-极采用采用电阻实现电流采样,并经过放大电路放大之后送入MCU的ADC口,具体将在第2.3节介绍。 
 
图-2 BUCK同步降压电路原理图 2.2. 驱动电路如图-3所示,MOS管驱动电路采用TI的半桥驱动芯片UCC27211。该器件内部集成自举电容充电用二极管,耐压120V,驱动电流达4A。特别注意,该器件内部不带死区时间功能,为避免上下桥臂同时导通,死区时间必须在MCU上实现。  
图-3 MOS管驱动电路 2.3. 信号调理电路信号调理电路包含输入电压检测,输出电压检测,远端电压测量,输出电流检测等,这些功能都是基于TLV2374运算放大器实现并且采用差分形式。 1)输入电压检测 如图-4所示,输入电压检测直接采用电阻分压实现。 表达式: Vin   =   ADC_V_IN * 31              (式1)  
 
图-4 输入电压检测电路  
2)输出电压检测 如图-5所示,输出电压检测电路基于TLV2374的差分电路实现,由于主电路的输出端的低端电流采样会对电压检测形成干扰,并且差分电路具有很高的共模信号抑制,有利于猜到准确的信号。 表达式: Vout   =   ADC_V_OUT * 30              (式2)  
 
图-5 输出电压检测电路 3)远端电压检测 如图-6所示,远端电压检测电路基于TLV2374的差分电路实现,远端电压测量对于电池充放电是有效的,可以避免由于导线压降产生的影响。用法:直接接入电池两端,请注意正负极。 表达式: Vext   =   ADC_EXT_SENSN * 30              (式3)  
 
图-6 远端电压检测电路 4)输出电流检测 如图-7所示,输出电流检测电路基于TLV2374的差分放大电路实现,在主电路中采样电阻采用10mΩ,要使MCU能够识别该信号,必须经过放大到一定值。由因为本应用要实现双向DCDC功能,这就使得电流有正负,但是MCU无法采集负信号,这里得认为将电压提高,保证电流在负值时,ADC_I_OUT输出还是为正。所以,采用1:1电阻分压,然后经过一个跟随器(提高驱动能力)输出一个1.65V的参考电压,如图-8所示。到这里,该检测电路就可实现正负点流的采样。 表达式: Iout   =   (ADC_I_OUT - 1.65) / 0.20           (式3)  
 
图-7 输出电流检测电路  
 
图-8 参考电压1.65V产生电路  
 
2.4. 控制电路 
 
 
图-9 控制电路 如图-9所示,控制电路采用STM32F334微控制器,有下载接口,串口通信等接口以及运行指示LED灯。STM32资源分配如表1所示。  
表1 STM32资源分配  
2.5. 辅助电源电路如图-10所示图-10 辅助电源电路产生12V、3.3V两种电压等级。XL7005A将输入端降压到12V,SPX3819-M-3.3将12V稳压到3.3V。  
 
 
图-10 辅助电源电路  
3. 方案主要算法介绍 
3.1. PID算法PID算法是一个很经典的自动控制算法,经过几十年的认证,在我们生活发挥了重大作用。PID的资料已经太多了,此处不再讲述其原理,直接给出C代码,若想了解其根本原理,请自行学习。  
PID算法用到的数据: typedef struct  _PID{    pid_float32        SetPoint;                //输入:给定值         pid_float32        Feedback;                //输入:反馈值  
        pid_float64        T;                //采样时间         pid_float64        Kp;                //比例常数         pid_float64        Ti;                //积分时间         pid_float64        Td;                //微分时间  
        pid_float32        a0;                //系数1:a0 = Kp(1 + T/Ti + Td/T)         pid_float32        a1;                //系数2: a1 = Kp(1 + 2Td/T)         pid_float32        a2;                //系数3:a2 = Kp*Td/T  
        pid_float32        Ek;       //当前误差         pid_float32        Ek_1;     //前一次误差         pid_float32        Ek_2;     //第二次误差  
        pid_float32        Output;                        //输出值         pid_float32        Last_Output;        //上一次输出值         pid_float32        Increment;                //增量值  
        pid_float32        OutMax;                        //输出限制最大值         pid_float32        OutMin;                        //输出限制最小值  
} PID_TypeDef;  
 
PID的数据初始化程序: void PID_init ( PID_TypeDef *p) {     
        p->a0                = p->Kp*(1 + 1.0*p->T/p->Ti + 1.0*p->Td/p->T);         p->a1                = p->Kp*(1 + 2.0*p->Td/p->T);         p->a2                = 1.0*p->Kp*p->Td/p->T; }  
 
增量式PID算法: pid_float32 PID_Calc( PID_TypeDef *p, pid_float32 feedback, pid_float32 ref) {         p->Ek        = ref - feedback;                //?????ó??  
        p->Increment                = (  p->a0*p->Ek        - p->a1*p->Ek_1 + p->a2*p->Ek_2 );        //PID????  
        p->Output = p->Last_Output + p->Increment;  
        if(p->Output > p->OutMax)p->Output   =        p->OutMax;         if(p->Output < p->OutMin)p->Output   =        p->OutMin;         p->Ek_2           = p->Ek_1;         p->Ek_1           = p->Ek;                        p->Last_Output    = p->Output;         return p->Output; }  
附件:  |