
本帖最后由 Tiny。P 于 2018-12-20 17:03 编辑 8 B, [# ]( W" V7 D& `) W& W; S6 d 在上一个贴子中,我利用了STM32F334做的一个同步降压BUCK数字电源,帖子网址https://www.stmcu.org.cn/module/forum/thread-606783-1-1.html 本次做的充电器也是利用我们做的另一款BUCK-BOOST升降压变换器,加入三段式充电算法程序。锂电池的充电要求,大家可参阅网络资料,总的说就是预充、恒流充、恒压充三段式充电,这里直接贴出代码:7 P I0 k( _0 a" @8 ^2 Z# g% I+ T float32 CHARGE_VOLTAGE = 0; //充电电压! N2 u" D2 U$ V' O4 z! T float32 CHARGE_CURRENT = 0; //充电电流& J9 [6 y4 D5 H& E- f% k uint8 dp_ChargeState(void) {7 e8 ~& F- t6 b; { static volatile uint8 ChargeSta = CHARGE_IDLE;, t7 ^+ I8 S0 p) N5 ~ static uint32 precharge_time = 0;! x5 B* ]) j8 r, H5 X9 K0 d9 b: G static uint32 charge_time = 0; static uint16 iflat_db = 0; & e, n1 l/ d& O$ c; T7 \4 U" m switch(ChargeSta)' T9 q# z: I c {) `5 R* o, @9 [. m case CHARGE_IDLE:( a* p" ?5 |, a" w$ s0 D CHARGE_CURRENT = (float32)CHARGING_IFLOAT; CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE;4 n9 l) ]+ m% g. |6 n9 \ iflat_db = ( Iout >= CHARGING_ISTOP ) ? iflat_db+1 : 0; if(iflat_db > 10) {( a( L* f$ T$ X, m8 q( K5 c( J ChargeSta = CHARGE_PRECHARGE;8 s5 E' P" {9 x4 [ iflat_db = 0;# ^8 ~1 C5 U& ^+ u% U& q l# L precharge_time = 0;- s% ^: b7 R; Y! \6 ~' ] } break; case CHARGE_FAULT:8 x" m. X- d- V1 f2 D CHARGE_CURRENT = (float32)CHARGING_ISTOP; CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE;5 C, z2 Q8 I( I2 P. i flat_db = 0;+ ^9 m: {& |( Q" o7 S/ P- I break;; V. x1 Y& J; k1 s l, E case CHARGE_DONE:% {% I" Z+ ?* [ CHARGE_CURRENT = (float32)CHARGING_ISTOP;* O( h: ~7 y3 o; ] CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE;0 T$ l( L& i9 J if( Vout<0.9f*FLOATING_VOLTAGE )ChargeSta = CHARGE_IDLE; break; case CHARGE_PRECHARGE:% `% l: Y# u( B* F5 x- ~. q1 Q' f CHARGE_CURRENT = (float32)PRECHARGE_ILIM; CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE;. e* n5 x8 x+ I% I5 C7 f iflat_db = (Vout > CUTOFF_VOLTAGE) ? iflat_db+1 : 0; if(iflat_db > 10)ChargeSta = CHARGE_CHARGING;2 }& [8 D. }' _0 \4 F4 U if(precharge_time > PRECHARGE_TIME)ChargeSta = CHARGE_FAULT; precharge_time++;+ X1 |% W: [3 W7 w0 I break; case CHARGE_CHARGING:2 J9 r3 }5 H/ x CHARGE_CURRENT = (float32)CHARGING_ILIM; CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE;0 v. p7 l2 J& `, E% | iflat_db = (Vout > FLOATING_VOLTAGE && Iout < CHARGING_ISTOP) ? iflat_db+1 : 0;1 V" @! N+ {% u if(iflat_db > 10)ChargeSta = CHARGE_FLOAT; if(charge_time > CHARGE_TIME || Vout < CUTOFF_VOLTAGE)ChargeSta = CHARGE_FAULT;2 R) l: u4 J. b0 l4 Q: D charge_time++; break;' m7 O+ U* {0 [, Y- n5 u! ~ case CHARGE_FLOAT:8 _: x0 ^4 |* N' J- m1 T CHARGE_CURRENT = (float32)CHARGING_IFLOAT;( Z: i# X6 z3 m6 z CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE;9 A! V% Z% u( g% x+ M5 E! D iflat_db = (Iout < CHARGING_ISTOP) ? iflat_db+1 : 0;7 T5 Y1 Y b0 l9 ?5 F( L if(iflat_db > FLOATING_TIME)ChargeSta = CHARGE_DONE; if(charge_time > CHARGE_TIME)ChargeSta = CHARGE_FAULT; charge_time++;5 Z# ~, n* Q9 C# W break; }//switch(..), s0 l0 y& o+ @ return ChargeSta; }$ Y7 v2 \" K$ P$ Z7 L 为满足用户给电池(或超级电容)充电需求,在双向Buck-Boost升降压电源板的基础上增加了电池的充电算法(三段式充电),本实验是对超级电容进行充电的测试示例。用户只需根据自己的电池型号进行修改如下参数(主函数内)即可,需注意的是电池的充电电流均要在板子最大输出电流之内。本实验所用超级电容参数:本实验充电对象是由12个单体电压为2.7V,电容为350F组成的额定电压为32.4V,容量为29F的超级电容组。 $ R" A6 f7 X% R& z2 m6 {电容组充电的各参数设置情况如下图所示: ![]() 参数设置 ![]() 超级电容组 ![]() 实验台 本实验充电波形如下图所示(主要为检测三段式充电的控制策略的可行性,实际上超级电容的充电不一定非要实现三段式充电): - N5 m9 P- H7 r+ Q. i7 R第一阶段为预充阶段,充电电流设为1A,电容电压由2V充至5V。 第二阶段为充电阶段,充电电流设为3A,电容电压由5V充至所设置的27.6V。 第三阶段为浮充阶段,充电电流逐渐降低,使得电容电压可以最终稳定在所设置的28V左右。 ![]() 充电过程电压电流值(绿色为电流,蓝色为电压) =========================================================================================== ; c2 z ?: Z; _7 i) g3 k h& q# \数字电源交流1群: 474805564 数字电源交流2群: 183376789 |
谢谢分享~ |
好东西,多多交流![]() |
优秀![]() ![]() |
好东西,顶顶顶$ Q+ F; w9 g. C- u9 }" s |