你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F334做的数字CC/CV(恒压恒流)充电器

[复制链接]
何。小P 发布时间:2018-12-20 17:00
本帖最后由 Tiny。P 于 2018-12-20 17:03 编辑 8 B, [# ]( W" V7 D& `) W& W; S6 d

& q  g' G$ B; q* ?9 ~: b在上一个贴子中,我利用了STM32F334做的一个同步降压BUCK数字电源,帖子网址https://www.stmcu.org.cn/module/forum/thread-606783-1-1.html
+ X' Q/ l6 T/ D5 g9 P, l% C本次做的充电器也是利用我们做的另一款BUCK-BOOST升降压变换器,加入三段式充电算法程序。锂电池的充电要求,大家可参阅网络资料,总的说就是预充、恒流充、恒压充三段式充电,这里直接贴出代码:7 P  I0 k( _0 a" @8 ^2 Z# g% I+ T

  R: Z( o6 U' \2 T5 [4 {float32 CHARGE_VOLTAGE    = 0; //充电电压! N2 u" D2 U$ V' O4 z! T
float32 CHARGE_CURRENT    = 0; //充电电流& J9 [6 y4 D5 H& E- f% k

1 C) _  f1 j" J; _2 I- Ruint8 dp_ChargeState(void)
" g8 u0 F$ @1 l7 n6 B{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;
7 x1 S! a  ^1 s% j$ u- l        static uint16 iflat_db                    = 0;
6 X3 R' ^5 D( f6 f5 ^' `        & 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;
" M2 e  ~& {8 \* _% z( i' D+ b                   CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE;4 n9 l) ]+ m% g. |6 n9 \
                    iflat_db = ( Iout >= CHARGING_ISTOP ) ? iflat_db+1 : 0;
4 Y% C9 i9 L6 B- `, q9 r+ J                    if(iflat_db > 10)
: _9 [* l( i  |5 X$ g" v. c6 M6 f                    {( 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 ~' ]
                      }
9 f: {" s2 B! C             break;
; s) w) ]; W' P9 y" b, ]  [+ Z2 s             case CHARGE_FAULT:8 x" m. X- d- V1 f2 D
                    CHARGE_CURRENT = (float32)CHARGING_ISTOP;
- W) Z4 _$ h9 ?3 n/ I2 t                    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;
; L4 k7 a5 t5 |. U% D$ M6 }6 h             break;
; W$ Y# O3 S3 E# p0 p3 T% g             case CHARGE_PRECHARGE:% `% l: Y# u( B* F5 x- ~. q1 Q' f
                    CHARGE_CURRENT = (float32)PRECHARGE_ILIM;
2 Q# [5 K9 Z' l; L                    CHARGE_VOLTAGE = (float32)CHARGING_VOLTAGE;. e* n5 x8 x+ I% I5 C7 f
                    iflat_db    = (Vout > CUTOFF_VOLTAGE) ? iflat_db+1 : 0;
9 w; p1 [7 U3 G4 {) `                    if(iflat_db > 10)ChargeSta   = CHARGE_CHARGING;2 }& [8 D. }' _0 \4 F4 U
                    if(precharge_time > PRECHARGE_TIME)ChargeSta   = CHARGE_FAULT;
: L" ~7 V" x- q                    precharge_time++;+ X1 |% W: [3 W7 w0 I
              break;
8 |7 s. h/ k  C( e              case CHARGE_CHARGING:2 J9 r3 }5 H/ x
                     CHARGE_CURRENT = (float32)CHARGING_ILIM;
# Z% b* k( G* l* Z6 P                     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;
3 `0 V7 y+ R/ a0 A0 H5 ?. i' z" V                     if(charge_time > CHARGE_TIME || Vout < CUTOFF_VOLTAGE)ChargeSta = CHARGE_FAULT;2 R) l: u4 J. b0 l4 Q: D
                     charge_time++;
$ f2 v! B0 o/ ?; z4 O$ L              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;
( m" D. {& g9 j- u/ ~0 H                     if(charge_time > CHARGE_TIME)ChargeSta = CHARGE_FAULT;
9 Q- G  [7 f* V$ B( M2 O6 N                     charge_time++;5 Z# ~, n* Q9 C# W
              break;        
% N( ~7 K# M3 t$ L- T  ?        }//switch(..), s0 l0 y& o+ @
        return ChargeSta;
( g! ^& Y$ T/ ^- T: ^1 B' H! d+ }9 n) @}$ Y7 v2 \" K$ P$ Z7 L

# z' Q$ m$ L3 D2 y! v
满足用户电池(超级电容)充电需求,双向Buck-Boost升降压电源板的基础上增加了电池的充电算法(三段式充电),本实验超级电容进行充电的测试示例。用户只需根据自己的电池型号进行修改如下参数(主函数即可,注意的是电池的充电电流均要在板子最大输出电流之内本实验所用超级电容参数:本实验充电对象是12单体电2.7V电容为350F组成的额电压为32.4V容量为29F超级电容组。
$ R" A6 f7 X% R& z2 m6 {
电容组充电的各参数设置情况如下图所示
图片1.jpg

1 {; V; j; h- r- g& D0 p* q
参数设置
图片4.jpg
超级电容组

8 f* w" [' M- U$ F% v: H
QQ图片20181220164318.jpg
0 T9 B! `, C* g5 n0 f5 a
实验台
本实验充电波形如下图所示(主要检测三段式充电的控制策略的可行性,实际上超级电容的充电不一定非要实现三段式充电):
- N5 m9 P- H7 r+ Q. i7 R
第一阶段预充阶段,充电电流设为1A电容电压2V充至5V
第二阶段为充电阶段,充电电流设为3A电容电压由5V充至所设置27.6V
第三阶段为浮充阶段,充电电流逐渐降低,使得电容电压可以最终稳定在设置28V左右

. |: I1 Y! W! c) A
图片5.jpg
充电过程电压电流值(绿色为电流,蓝色为电压)
===========================================================================================
; c2 z  ?: Z; _7 i) g3 k  h& q# \
数字电源交流1群: 474805564
数字电源交流2群: 183376789

. b9 w; @) {" W
收藏 4 评论4 发布时间:2018-12-20 17:00

举报

4个回答
STMCU-管管 回答时间:2018-12-21 09:25:29
谢谢分享~
Kevin_G 回答时间:2018-12-21 11:32:33
好东西,多多交流
cao840517959 回答时间:2019-1-7 22:01:31
优秀
haha1291 回答时间:2019-12-26 16:30:23
好东西,顶顶顶$ Q+ F; w9 g. C- u9 }" s

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版