终于把MPPT调成功了,还是C语言编程能力不足啊,找了几天才找出问题,不过现在也不是很确定是完全正确还是碰巧波形能够跟需要结果相似。在这里呢就还是先介绍一下,然后劳请各位大侠们指正。首先随便搭了一个Boost电路的测试模型,用的是前面介绍过的PSIM9.0自带的光伏板模型,以下就是模型电路图 6 y. p2 o& B* q6 g4 A- k* m, V+ p- w
MPPT测试模型
+ ~- J" r2 R1 g- a1 ~6 K$ P ( T. b, i9 s; e: M! P其中MPPT是一个DLL模块,进行MPPT计算并产生PWM波的,最下面一个DLL模块就拿来测试一下效率,是输出功率与最大功率的比。 5 \: P) R! c6 n) ?9 N对于DLL模块的使用,非常简单,首先打开VC++6.0,然后新建一个Win32 Dynamic-Link Library工程,再新建一个C文件,就可以编程了。编好之后在组建里面选择全部重建,完了之后就可以在你所建的工程文件夹Debug里面找到相应的dll文件了,最后在DLL模块里面选择用该dll文件就可以了。5 ^6 m. @4 [6 @' a* a( T2 |0 P
对于编程来讲,首先在c文件里面包含如下语句:* j) V* Q5 d9 V
#include <stdio.h> / {$ F! [/ u8 m: \) `9 ^#include <math.h> 8 L& l' D& F5 S" u" T4 }8 _0 M__declspec(dllexport) void simuser (double t, double delt, double *in, double *out)1 R: g E' D% `- I7 F. w/ m
{ 8 e, `$ J4 d9 C}$ f3 |! R4 D$ v
那么在括号内就可以根据自己的需要编写程序了,t是指时间,delt是仿真步长,这两个都在你的仿真电路的时钟控制里面设置,编程不用管。3 \+ `6 o' v) L0 Z9 |
in和out分别对应输入输出,用的时候直接用用数组形式赋值,比如a=in[0],out[0]=b;就行了,DLL模块有小圆圈的一头从上往下依次是in[0],[1],[2]……out[0],[1],[2]…… ( ]9 }0 g2 r. q- c那么我编写的MPPT程序如下:3 E f; b0 c: ^
" Y5 f4 F; |2 {- V4 u. L7 y
Vi=in[0];1 M/ d# E/ h1 {6 L( Q
2 ^& F8 M* b4 U" X( \, G' q$ m; ]
Ii=in[1];6 Z9 e: y6 H$ h! B" i4 A
( h" S# F* S/ U0 `! p$ E4 S/ J
Pi=Vi*Ii; ^1 B& Z' B9 m1 J5 J! p G) Y t! `# J
dv=Vi-Vl; //采样电压电流,获得电压,功率增量 . u/ a* o% g. ]) Z3 {8 g3 | 2 k, Z+ H+ u2 }) G" A' pdp=Pi-Pl;- ^- o( |! J* r, I# T
1 t4 D; f! y8 c) R
if (dp==0)8 h+ J; x: J6 l7 B
8 w# Y# x8 t/ T9 E
{' V& A# S0 P9 f: ]
4 a; S: l+ ~, D+ y( e) lerr=0;# D0 P" l* t5 U4 X4 Y
0 N: f1 t" }/ t9 M% D! H- A6 T
} 3 [" U$ M- J9 I& s( y& U, M " ?- Z H. D4 relse 5 ?. e8 f$ ]2 M5 j9 q; [ , n. Q! ?- G' T+ K6 ?$ I6 M# _{; c2 m* C! P: f" ]4 o2 @
8 d0 S; M7 p0 H$ R
if (dp>0) $ r; b- N* y- G5 F" V9 a- S ' B$ u( E! r! T4 S{ 7 Z# F e2 b A8 X c5 |: `( W- `% U; V
if (dv>0)/ S0 i& s2 N( k# b. F0 q8 m
, k1 O6 e' N' k' Q* a{err=0.1;} ; O! h" G q- V5 q! e; ?( }% \; E 1 n) s" t" Z) y5 [5 pelse //MPPT . G' @& u: @6 e& ^% D 8 e+ U) f5 y7 D" W{err=-0.1;} ; B: w( {- Y% |6 h$ q/ ^8 E1 R" w. e : `6 W: j1 j' K9 A}' W2 E& m8 x5 E
" K/ m4 o% y P2 Y/ f
else8 P- n( p! e/ R
! i! L& g. q! w$ H2 s
{ " N3 C( j6 |* g% e3 j/ V" z ' U% X5 r2 [6 R4 [' v' O' Rif (dv>0)* E3 ^' \# p c( h" ?
. J2 c6 g& [/ ?2 i{err=-0.1;}2 }: ?$ s, \/ y0 U& o0 L: z. w
# w1 o7 c/ L, l: J
else 7 E- M! A: z) h; k2 P" s/ l* w+ D& Y" c. |/ P9 S( Q7 Z
{err=0.1;}! H9 B J a8 B. `, h
/ K d- x4 x: o+ v6 F7 H
} $ ]- e' c' _ o- ?' j1 s2 {% a3 e0 J; L8 H5 o# [3 S
}6 U3 ~, L' E6 ]# m# r3 M
) @% t3 U9 E, E+ L. }) Y1 ]& A
我用的是最简单的PO法,然后设每次Vref=Vin+0.1或者-0.1,所以上面err就是一次计算完了之后的误差值,送入下面的增量型PI控制 . g; u7 @7 d6 [* b' g% x dVout=20*(err-errf)+err; , l7 D3 n" ~" E6 z) A, r' y- i/ \ 8 f m7 c/ H) v; q+ w- Iif (fabs(dVout)>4.1) 5 _! K0 L4 \8 a R9 m7 i! Y) y i4 f2 P. ^5 r7 T, E+ S2 G: n0 j* U$ k
{3 _6 v2 d9 r6 d9 [
5 j- Y0 R9 }3 W1 `9 p4 A
if ((dVout)>0)( ^2 y) m. } Q7 p7 w1 J) w1 l1 e
2 R& d! }0 z- A' A0 w
{dVout=4.1;}5 q) Y6 g2 J6 S
! A. c% D+ t( `! | E2 L# z; m
else; ~( ?4 r; n4 u, K/ f
" ^. {9 b: E* H! d+ Q z{dVout=-4.1;}; ] [0 m- T6 f* r. T
; K$ o4 g" J) l, ?+ @6 j
} $ c- R5 [7 P1 w % I3 e" A( z+ W- iVtemp=Vout+dVout; //PI. {0 ?* ]$ K' Z( c
- F0 J; U: g! c/ }7 I$ q$ Q) E3 Y3 F3 _) {6 I3 F
6 T1 ~8 G) \4 A+ E+ T0 M
if (Vtemp>10) ) J( {1 i; o9 |6 h
8 S6 N( Q% s$ J) _ j
{Vtemp=10;} $ _. H* L0 w* |5 k2 V# N5 y% Z 8 i. q- [9 i- `) v( V: Celse T2 L8 Z; e" D
1 D! z* _8 P- \ _; F7 P& }' v
{& v. h4 b/ Z" U# V0 Q+ s