本帖最后由 Tiny。P 于 2018-12-20 17:03 编辑 5 G# W9 ^6 C2 Q3 D, ? 在上一个贴子中,我利用了STM32F334做的一个同步降压BUCK数字电源,帖子网址https://www.stmcu.org.cn/module/forum/thread-606783-1-1.html c6 g' V1 `- K6 q l 本次做的充电器也是利用我们做的另一款BUCK-BOOST升降压变换器,加入三段式充电算法程序。锂电池的充电要求,大家可参阅网络资料,总的说就是预充、恒流充、恒压充三段式充电,这里直接贴出代码:: G8 J q" O& b0 k* z% F + y4 o0 J1 O9 s" T8 e% _ float32 CHARGE_VOLTAGE = 0; //充电电压2 k2 i( r4 m. z9 v* O0 N% s: r float32 CHARGE_CURRENT = 0; //充电电流1 h# T( P$ {. _" |* e9 R uint8 dp_ChargeState(void) {( L6 T& B! h1 o/ v4 l' e static volatile uint8 ChargeSta = CHARGE_IDLE;1 d$ }. y0 S8 {6 h; V static uint32 precharge_time = 0;: G8 m2 u1 w9 v+ C, b$ q' e static uint32 charge_time = 0; static uint16 iflat_db = 0; $ a$ c0 k. m/ x switch(ChargeSta) { case CHARGE_IDLE:, J/ g& t p6 u7 z/ F+ l7 M9 O CHARGE_CURRENT = (float32)CHARGING_IFLOAT; CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE; iflat_db = ( Iout >= CHARGING_ISTOP ) ? iflat_db+1 : 0; if(iflat_db > 10) {3 {# m7 ?# Z& e, b6 I. u( \7 a, _ ChargeSta = CHARGE_PRECHARGE; iflat_db = 0; precharge_time = 0; } break;# Q, p6 }& }+ b/ G& w case CHARGE_FAULT: CHARGE_CURRENT = (float32)CHARGING_ISTOP;2 \8 ` i# I$ Z, E+ u$ @ CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE; flat_db = 0;0 V; h2 T# L' r/ a2 C1 d. O break;9 j/ X1 n h0 ?: C" l. g case CHARGE_DONE:) b7 Y( E6 Y1 p. {) n. a$ B3 i$ y. | CHARGE_CURRENT = (float32)CHARGING_ISTOP;/ c, y0 Z, y- s0 Q+ U" ^% y CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE; if( Vout<0.9f*FLOATING_VOLTAGE )ChargeSta = CHARGE_IDLE;. f/ V$ d5 b4 z6 v6 D break;4 B: F' s! b0 c3 I) R0 N case CHARGE_PRECHARGE:% b! d' U( ^6 e, _2 `; o- I CHARGE_CURRENT = (float32)PRECHARGE_ILIM;1 O7 }( U+ i4 ~0 Z" {5 R- D, P CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE; iflat_db = (Vout > CUTOFF_VOLTAGE) ? iflat_db+1 : 0;3 ]4 H; E/ ~. S if(iflat_db > 10)ChargeSta = CHARGE_CHARGING;2 k0 L! s9 b( z( `4 M' }( c3 T6 `1 |; m if(precharge_time > PRECHARGE_TIME)ChargeSta = CHARGE_FAULT;7 Y/ |4 j. D3 ?6 b! B8 P% }& L3 J precharge_time++; break;4 V1 u7 X, V- @ case CHARGE_CHARGING:& ^ {1 t( D! v CHARGE_CURRENT = (float32)CHARGING_ILIM;. F/ z" m3 y0 p" H1 M( G CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE; iflat_db = (Vout > FLOATING_VOLTAGE && Iout < CHARGING_ISTOP) ? iflat_db+1 : 0; Y1 c( k4 y. b+ [+ [; c( t if(iflat_db > 10)ChargeSta = CHARGE_FLOAT; if(charge_time > CHARGE_TIME || Vout < CUTOFF_VOLTAGE)ChargeSta = CHARGE_FAULT; charge_time++; break;1 n# C+ F0 [0 T, c) l case CHARGE_FLOAT: CHARGE_CURRENT = (float32)CHARGING_IFLOAT;1 s3 J6 |1 N7 |7 e5 E CHARGE_VOLTAGE = (float32)FLOATING_VOLTAGE; iflat_db = (Iout < CHARGING_ISTOP) ? iflat_db+1 : 0;$ n! C1 ~+ ]" K& C if(iflat_db > FLOATING_TIME)ChargeSta = CHARGE_DONE;3 s9 u2 Z; H2 u# N% m5 j5 B if(charge_time > CHARGE_TIME)ChargeSta = CHARGE_FAULT; charge_time++; break; }//switch(..) return ChargeSta; } i. v7 Z- f. d2 n4 a/ v 为满足用户给电池(或超级电容)充电需求,在双向Buck-Boost升降压电源板的基础上增加了电池的充电算法(三段式充电),本实验是对超级电容进行充电的测试示例。用户只需根据自己的电池型号进行修改如下参数(主函数内)即可,需注意的是电池的充电电流均要在板子最大输出电流之内。本实验所用超级电容参数:本实验充电对象是由12个单体电压为2.7V,电容为350F组成的额定电压为32.4V,容量为29F的超级电容组。 4 V8 X; B% D3 z( D& Y3 P7 X电容组充电的各参数设置情况如下图所示: 参数设置 超级电容组 1 M1 j. h8 z- s B 实验台 本实验充电波形如下图所示(主要为检测三段式充电的控制策略的可行性,实际上超级电容的充电不一定非要实现三段式充电): 1 _# @- o2 b4 d- y- U第一阶段为预充阶段,充电电流设为1A,电容电压由2V充至5V。 第二阶段为充电阶段,充电电流设为3A,电容电压由5V充至所设置的27.6V。 第三阶段为浮充阶段,充电电流逐渐降低,使得电容电压可以最终稳定在所设置的28V左右。 5 c% G5 D/ G) u- M- T& Y 充电过程电压电流值(绿色为电流,蓝色为电压) =========================================================================================== 数字电源交流1群: 474805564 数字电源交流2群: 183376789 7 w- U, L: z a- c, {% w |
谢谢分享~ |
好东西,多多交流 |
优秀 |
好东西,顶顶顶* u' v4 E; {3 j$ p5 \7 s |
基于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)