マイコンが思ったように動かないので、電圧測定→80%の値計算ってところを省いてしまって、目標電圧を順次変更するような方法でプログラムを作り、太陽電池特性評価をしてみた。
P-VとI-V特性だが、5V前後で最大電力点を迎えているのが分かる。
1秒ごとに目標電圧を変更しながらオシロスコープの測定値を読み取りなので、誤差は大きいがまあ良いだろう。
開放電圧が6.6V程度なので、最大電力点がやはり80%程度にはあるようだ。ちなみに、屋外で開放電圧測定するともっと電圧が高いが今回は屋内で試験。寒いもんね、外。
今回の測定で気がついたが、電圧の目標値になるように制御するのはうまく言っているようだ。オシロで電圧測定すると、太陽電池の電圧がステップ的に上がっていくような挙動になっている。
なので、電圧制御のルーチンはたぶん今のままで問題ない。ちなみに、電圧は30Hzくらいで波打ってるけど、まあ良いんじゃないかとおもう。
電流、電力特性は制御の上では余り参考にならないがデータがあるので載せる。
回路図はこんな感じ。
太陽電池は最大電力点が6Vで電流333mAの2Wタイプ。
開放電圧7V程なので、レギュレータで3.3Vに落としてマイコンの電源に使う。
マイコンで2SC2655 (50V 2A)をスイッチング。1Ω抵抗を並列にして0.33Ωとし、オシロスコープで電流測定する。
開放電圧測定の際に、太陽電池と並列に入れたコンデンサが電圧上がりきるまでの時間を決めるので、コンデンサの容量は余り大きくしないほうが良さそう。
電流を相当小さく見積もって、100uFのコンデンサ電圧を5Vから7Vに10mAで充電すると仮定。2V×100uF=200uC, 200uC/10mA = 200uC/10000uA = 1/50 = 20ms
スイッチング休止時間は20msもあれば十分でしょう。
アルゴリズム。これうまくいってないw
開放電圧は2秒に一回読み取る。2秒の間は20msごとにduty比を変更していく。duty比は1ループにつき1ずつしか変化しないので急激な変動はしないだろう。
最初の一回の大きなループはうまくいく感じなんだけど、そこから運転電圧がどんどん下がっていってしまって、最後には電圧下がりすぎでマイコンリセットかかる。
スイッチング部分に問題があるかと思ったけど、目標電圧を固定した状態でのスイッチングは問題なく動く。
ということで、開放電圧読み取りの部分が何かおかしいんじゃないかと思っている。
太陽電池の等価回路作ってシミュレーションしてみた。
最大電力点は本当に安定的に開放電圧の一定割合の所に居るのだろうかと。
机上計算なら、太陽用意しなくて良いので夜中でも出来る。
【結論】
開放電圧の0.8倍程度という簡単なアルゴリズムでイイ線いく。
回路は以下の通り
SolarShuntは以下のモデルを使ったが、結構いい加減なことしてますぜ。
.model SolorShunt D(Is=2.52n Rs=.001 N=15.0 Cjo=4000p M=.1 tt=20u Iave=2 Vpk=75 mfg=sunny EG=1.1)
電力と電圧の特性。短絡電流を20mAから360mAまで変化させてます。ここから、開放電圧、最大電力点の電圧を読み取ります。
次に、開放電圧と最大電力点電圧の関係。
最後に確認したかった、最大電力点電圧/開放電圧特性
発電量が小さい時に少々高いところに行くようだが、今回の太陽電池は2W程度なので、発電量が小さい所での発電量は期待してないから良いんじゃないかと思う次第。
マイコンのPWMを使った場合、PWMのDuty比を決めるレジスタにどんな値を放り込んだら良いのかを計算したのが次
まあ、とりあえず何とか出来そうな感じ。
ちなみに、0~レジスタ設定値の間でトランジスタON、レジスタ設定値~255の間でトランジスタOFFの動作です。レジスタ値128でDuty比0.5となります。
0-255へのカウントアップは4.8MHz予定(スイッチングは約20kHz)。コイルは100uH予定。
太陽電池は温度が上がると開放電圧上昇するが、それでもV_MP=0.8V_OCが成り立ちそうです。
DC-DCコンバータを作るうえでいつもコイルをどう選ぼうか悩ましい。
ちゃんと選んだことはないような気がするので、ちゃんと計算してみよう。
条件:太陽電池は2W (ピーク電力は6V 0.33Aのとき)、充電対象は鉛蓄電池(13V程度を見こむ)
コイルのインダクタンスをL[H]、コイルに流れる電流をI[A]とすると、コイルに蓄積されるエネルギーは1/2 LI^2なのでこれをスイッチング周波数繰り返してエネルギーを運ぶ。
スイッチング周波数をf[Hz]とすると、毎秒コイルが輸送するエネルギーは1/2 fLI^2 [W]
2Wの太陽電池から電力を吸出そうとすると、上記の1/2 fLI^2が2[W]にならないといけない。いま、マイコン側の都合でスイッチング周波数を約20kHzとすると・・・
fLI^2 = 4
20e3 * LI^2 = 4
LI^2 = 2e-4
仮にL=100uHとすると、I^2 = 1.4[A]となります。よってコイルのピーク電流は1.4A程度を見こむ必要があります。
上記の20kHzの間に1.4Aまで電流が増えるようなコイルじゃないとそもそもエネルギーが輸送できない。特にインダクタンスが大きいと十分に電流が増大しないのでエネルギー輸送ができない。かといってコイルが小さいと電流が大きくなりすぎてしまう。コイルが飽和しなければ大丈夫だが。
次にスイッチング周期が50usで、昇圧比が2程度なので、duty比1/2程度での運用になる可能性がある。電源電圧E[V]の電源をコイルに繋いだとき、コイルに流れる電流はI=Et/Lと直線的に増えていくので、
50us×duty = 25us、t=25usになる。ほかはE=6[V] L=100[uH]なので、
I=6*25e-6/100e-6 = 1.5[A]とちょうど良い感じ。
絵に描いてみる。電流不連続モードの場合、ピーク電流は平均電流の2倍程度でよさそうだが・・・
昇圧比がすごく大きいときは、トランジスタoffになったとたんに電流が立ち下がるはずなので、
最大限を考えると、duty比1/2でもピーク電流が平均電流の4倍ほどになる。。
最近マイコンに少々慣れてきたので実用的な工作をしようかと思う次第。車がアイドリングストップするので、駐車している間に太陽電池から鉛電池へと充電してやろうとおもうわけです。はい。
真のMPPTは太陽電池の電圧と流れる電流を測定し、取り出せる電力が最大になるように制御をするのだが、ハイサイドの電流センサが面倒くさいから、電圧ベースで制御してやろうと思う。
太陽電池は開放電圧の80%程度の電圧(トラ技によると77%ほど)で使ってやるとまあ大体最大電力ポイントになるようだ。アルゴリズムはシンプル。
太陽電圧の開放電圧を測定→開放電圧の80%になるようにPWMのDutyを制御(Duty比が安定する程度にここでサイクルを回す)→一定時間待つ→初めに戻る
80%の計算だが、浮動小数点は演算が重いので、整数での演算とする。以下のような感じ。
目標値=ADC値 - ADC値÷5
外にも演算方法いろいろあるとおもうけど。4倍して5で割るとかね。78%狙うなら39倍して50で割るなど。整数演算16ビットに収まればまあいいでしょう。
ADCをして目標値との乖離を測定し、乖離があればPWMのDuty比を変更していく。
夜暗くなったときなどに動作に支障を来たさないようにリセットICを入れる必要があるな。
ちょっと週末がんばってみようかな。