
本帖最后由 Tiny。P 于 2018-12-20 17:03 编辑 + _9 J8 F' ] h L. M& L % q$ X; l2 I9 J: [6 S2 g 在上一个贴子中,我利用了STM32F334做的一个同步降压BUCK数字电源,帖子网址https://www.stmcu.org.cn/module/forum/thread-606783-1-1.html 本次做的充电器也是利用我们做的另一款BUCK-BOOST升降压变换器,加入三段式充电算法程序。锂电池的充电要求,大家可参阅网络资料,总的说就是预充、恒流充、恒压充三段式充电,这里直接贴出代码:& j6 d% H: d( ^5 ^ float32 CHARGE_VOLTAGE = 0; //充电电压( y& }7 C+ K' e( _ float32 CHARGE_CURRENT = 0; //充电电流+ [/ O' O2 Y2 b/ z% O5 c6 O9 g + |* X0 v9 [0 g# I* Q( F& g D: H! j uint8 dp_ChargeState(void) { static volatile uint8 ChargeSta = CHARGE_IDLE; static uint32 precharge_time = 0;$ s/ x5 r' T, @7 g- P# O static uint32 charge_time = 0;" b# t9 t2 z/ j: Y4 ? static uint16 iflat_db = 0; switch(ChargeSta)2 i* e3 u1 a" q0 l& ?) h {4 l. J( h1 }* v1 f) o case CHARGE_IDLE:5 N5 i# r3 w) b& S CHARGE_CURRENT = (float32)CHARGING_IFLOAT;8 h5 |& Z1 ^! z, i5 [4 O' M6 Y3 x CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE; iflat_db = ( Iout >= CHARGING_ISTOP ) ? iflat_db+1 : 0;2 K E% W" R: c if(iflat_db > 10) {" l4 n1 s. N5 {3 \" U% _, e ChargeSta = CHARGE_PRECHARGE; iflat_db = 0; precharge_time = 0;/ A, _5 J- _5 o } break; V& U9 |" {/ u6 a% S% I case CHARGE_FAULT:- ]* m$ l+ e+ i4 Q8 g4 Y+ R2 i; n CHARGE_CURRENT = (float32)CHARGING_ISTOP; CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE; flat_db = 0; break;! B) j2 w8 h0 C case CHARGE_DONE:+ e1 x) Y8 y4 a: j CHARGE_CURRENT = (float32)CHARGING_ISTOP;6 B( }$ k. O# K; Y7 p) j$ p2 f CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE;& M( h6 C: G8 w0 T( f( B if( Vout<0.9f*FLOATING_VOLTAGE )ChargeSta = CHARGE_IDLE; break;# S/ b7 L* K# g, L& U% Q case CHARGE_PRECHARGE:* }& ~# d) |( J9 m* { @; V CHARGE_CURRENT = (float32)PRECHARGE_ILIM; CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE; iflat_db = (Vout > CUTOFF_VOLTAGE) ? iflat_db+1 : 0; if(iflat_db > 10)ChargeSta = CHARGE_CHARGING; if(precharge_time > PRECHARGE_TIME)ChargeSta = CHARGE_FAULT;- V* o0 B8 p3 o2 M6 Z precharge_time++; break;6 r* S: D2 A; A; }3 j7 h7 [. k case CHARGE_CHARGING: CHARGE_CURRENT = (float32)CHARGING_ILIM;% U, f- _ ~- b$ c, E CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE; iflat_db = (Vout > FLOATING_VOLTAGE && Iout < CHARGING_ISTOP) ? iflat_db+1 : 0;; P: Q- i9 j/ _* \5 w' r if(iflat_db > 10)ChargeSta = CHARGE_FLOAT; if(charge_time > CHARGE_TIME || Vout < CUTOFF_VOLTAGE)ChargeSta = CHARGE_FAULT;7 R _/ Z. |0 f3 i/ h% c charge_time++; break; case CHARGE_FLOAT:' K5 I! Y. b: c j6 Q6 d5 j- o CHARGE_CURRENT = (float32)CHARGING_IFLOAT; \6 Z' s5 k+ s# ~ CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE; iflat_db = (Iout < CHARGING_ISTOP) ? iflat_db+1 : 0; if(iflat_db > FLOATING_TIME)ChargeSta = CHARGE_DONE; if(charge_time > CHARGE_TIME)ChargeSta = CHARGE_FAULT; charge_time++; break; 3 j5 d5 z) O& K7 ~" I6 ] }//switch(..)8 F& L+ C" {& p; l$ j return ChargeSta; }3 S+ g6 F, _' R, m) w C5 X( h8 U 为满足用户给电池(或超级电容)充电需求,在双向Buck-Boost升降压电源板的基础上增加了电池的充电算法(三段式充电),本实验是对超级电容进行充电的测试示例。用户只需根据自己的电池型号进行修改如下参数(主函数内)即可,需注意的是电池的充电电流均要在板子最大输出电流之内。本实验所用超级电容参数:本实验充电对象是由12个单体电压为2.7V,电容为350F组成的额定电压为32.4V,容量为29F的超级电容组。 ! L3 s9 W0 E, |/ u5 n# p* k& h电容组充电的各参数设置情况如下图所示: ![]() 参数设置 ![]() 超级电容组 ![]() 实验台 本实验充电波形如下图所示(主要为检测三段式充电的控制策略的可行性,实际上超级电容的充电不一定非要实现三段式充电): ) c1 U7 _% n$ g* o第一阶段为预充阶段,充电电流设为1A,电容电压由2V充至5V。 第二阶段为充电阶段,充电电流设为3A,电容电压由5V充至所设置的27.6V。 第三阶段为浮充阶段,充电电流逐渐降低,使得电容电压可以最终稳定在所设置的28V左右。 ; f4 F5 ^+ ~0 l: I' ` ![]() 充电过程电压电流值(绿色为电流,蓝色为电压) =========================================================================================== 数字电源交流1群: 474805564 数字电源交流2群: 183376789 v5 L0 q' d+ S: V- \" `; ]6 g9 N% v |
谢谢分享~ |
好东西,多多交流![]() |
优秀![]() ![]() |
好东西,顶顶顶 |