本帖最后由 Tiny。P 于 2018-12-20 17:03 编辑 # d4 V6 l" ]7 U- a 在上一个贴子中,我利用了STM32F334做的一个同步降压BUCK数字电源,帖子网址https://www.stmcu.org.cn/module/forum/thread-606783-1-1.html. N0 |9 C* l- ], r$ Z ~- c5 c 本次做的充电器也是利用我们做的另一款BUCK-BOOST升降压变换器,加入三段式充电算法程序。锂电池的充电要求,大家可参阅网络资料,总的说就是预充、恒流充、恒压充三段式充电,这里直接贴出代码:. i2 u: u4 ^ U4 E/ F, T' C float32 CHARGE_VOLTAGE = 0; //充电电压 float32 CHARGE_CURRENT = 0; //充电电流 uint8 dp_ChargeState(void)# j$ z( W' k) l { static volatile uint8 ChargeSta = CHARGE_IDLE;- N1 K7 s+ ^5 O# w5 U static uint32 precharge_time = 0; static uint32 charge_time = 0;5 m% U ~ q6 ?3 u3 B6 O! I5 h static uint16 iflat_db = 0; switch(ChargeSta) { case CHARGE_IDLE:) x! G( b9 o5 N+ @ CHARGE_CURRENT = (float32)CHARGING_IFLOAT;0 b+ v4 j5 F Z9 n z CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE;4 U; w0 l( X9 P7 {4 }+ J iflat_db = ( Iout >= CHARGING_ISTOP ) ? iflat_db+1 : 0; T) c& C4 Y, t; o' u if(iflat_db > 10)0 z+ L i9 ^$ }( t$ E; t { ChargeSta = CHARGE_PRECHARGE; iflat_db = 0; precharge_time = 0;8 x* e) J$ |1 o: n" g$ d5 o } break;% A1 A; c3 i2 P5 p* J( [& a& ` case CHARGE_FAULT: CHARGE_CURRENT = (float32)CHARGING_ISTOP;8 j \' z( x( Q0 }# p+ S CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE; flat_db = 0; break;2 Q! I! k ~( }% W case CHARGE_DONE:/ H1 ~: R/ e: [9 O3 o& G CHARGE_CURRENT = (float32)CHARGING_ISTOP;6 d6 d O) h& m& f% _ CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE; if( Vout<0.9f*FLOATING_VOLTAGE )ChargeSta = CHARGE_IDLE; break;, t5 m4 F1 N% A, l/ T# m case CHARGE_PRECHARGE:. c7 p: U9 v7 P5 B% k CHARGE_CURRENT = (float32)PRECHARGE_ILIM;& B' U. V8 b4 d/ A; m! T CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE; iflat_db = (Vout > CUTOFF_VOLTAGE) ? iflat_db+1 : 0; if(iflat_db > 10)ChargeSta = CHARGE_CHARGING;! E7 ]3 G! a. k6 _# G# | if(precharge_time > PRECHARGE_TIME)ChargeSta = CHARGE_FAULT; precharge_time++;, [' y8 N" o0 x" c$ R T break; case CHARGE_CHARGING:, P5 ?. }& \/ H$ f t% v; [ CHARGE_CURRENT = (float32)CHARGING_ILIM;4 N/ Y/ |3 S# O+ V. B, E' d8 [; _0 z CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE;: s# d' S8 G, G. ]. ]# j5 H" A iflat_db = (Vout > FLOATING_VOLTAGE && Iout < CHARGING_ISTOP) ? iflat_db+1 : 0; if(iflat_db > 10)ChargeSta = CHARGE_FLOAT;/ f) z0 s3 u3 y; E if(charge_time > CHARGE_TIME || Vout < CUTOFF_VOLTAGE)ChargeSta = CHARGE_FAULT; charge_time++;! d$ D: H" g/ g: d break; case CHARGE_FLOAT: CHARGE_CURRENT = (float32)CHARGING_IFLOAT; CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE; F7 S) y8 ~- A iflat_db = (Iout < CHARGING_ISTOP) ? iflat_db+1 : 0;" `: H, B- I' t8 P3 W if(iflat_db > FLOATING_TIME)ChargeSta = CHARGE_DONE;# h4 z; M F0 z3 L if(charge_time > CHARGE_TIME)ChargeSta = CHARGE_FAULT; charge_time++;5 W4 b) Q) u U break; 0 I3 ~, F6 \) p: T. u }//switch(..)& o6 R5 Y4 |0 h2 X+ d7 X5 ~" p" u return ChargeSta;1 h" Q8 L$ ^5 u% R9 u } ! v. V$ j z% n5 A m 为满足用户给电池(或超级电容)充电需求,在双向Buck-Boost升降压电源板的基础上增加了电池的充电算法(三段式充电),本实验是对超级电容进行充电的测试示例。用户只需根据自己的电池型号进行修改如下参数(主函数内)即可,需注意的是电池的充电电流均要在板子最大输出电流之内。本实验所用超级电容参数:本实验充电对象是由12个单体电压为2.7V,电容为350F组成的额定电压为32.4V,容量为29F的超级电容组。 , }) b: k: c* i0 T U |- `4 e5 b电容组充电的各参数设置情况如下图所示: 参数设置 超级电容组 % n1 @, t- [3 B# _ 实验台 本实验充电波形如下图所示(主要为检测三段式充电的控制策略的可行性,实际上超级电容的充电不一定非要实现三段式充电): 第一阶段为预充阶段,充电电流设为1A,电容电压由2V充至5V。 第二阶段为充电阶段,充电电流设为3A,电容电压由5V充至所设置的27.6V。 第三阶段为浮充阶段,充电电流逐渐降低,使得电容电压可以最终稳定在所设置的28V左右。 * Q* a+ T) J) C- l. i5 K6 } 充电过程电压电流值(绿色为电流,蓝色为电压) =========================================================================================== 数字电源交流1群: 474805564 数字电源交流2群: 183376789 0 Q; J" m/ E, u: j/ ~! g |
谢谢分享~ |
好东西,多多交流 |
优秀 |
好东西,顶顶顶+ P+ k! [/ H) V( M8 D" [# M |
基于STM32F334的数字电源
STM32F3DISCOVERY + UCGUI3.90A的移植(源码+视频)
基于STM32F303双电机FOC驱动: 无感原理图/BOM表/代码等开源...
【基于STM32F3的电机控制】_给力外围之 OPAMP
在 STM32 F0、 F2、 F3、 F4 和 L1 系列MCU 中使用硬件实时时钟 (RTC)
基于STM32F334的BUCK同步降压数字电源设计
ST FOC4.3 库关于 STM32F30x 系列 ICS采样代码的修改
STM32F334 上的 ADC 管脚和 DAC 管脚复用问题
如何使用USART或LPUART将STM32F0/F3/L0/L4微控制器从低功耗模式唤醒
在 STM32 F0、 F2、 F3、 F4 和 L1 系列 MCU 中使用硬件实时时钟 (RTC)