簡単なMPPT制御を組んでみる
パワエレの難しさ、回路設計の難しさ - energy note
BQ25570モジュールと微生物燃料電池 - energy note
これまでどのようにして電力を持ってくるかを色々と検討してきました。
その中の制御でも大事な構成要素の一つがMPPT(Maximum Power Point Tracking)で、ようは発電源(太陽電池や微生物燃料電池など)から最大限にエネルギーを引き出そうという制御です。
ただ逆流防止ダイオードを接続してバッテリーに充電したりそのまま負荷に接続する方法では100%のエネルギーを引き出すことはできません。
ハードとソフトの両方の知識をふんだんに活用する技術ですが、実装できれば効率よくエネルギーを活用できるのではないでしょうか。
MPPTは発電源(言い方が正しいかわかりませんが)のIV特性によって変化する最大電力点を探すアルゴリズムです。
上記2枚の画像が各電源のIV特性でIVカーブと言ったりもします。青色が電流-電圧特性、オレンジ色が電力-電圧特性で横軸が電圧、縦軸左側が電流、右側が電力です。グラフ上の赤丸が最大電力点MPP(Maximum Power Point)となり、この点を目指して電流や電圧を変化させます。
この変化させるアルゴリズムをDCDCコンバータのPWM制御に組み込むことで効率よく電力を変換しようという試みで、実際に太陽光発電システム等のパワーコンディショナなどに使用されています。
※実際にはもっと複雑なIVカーブにも対応しますが、今回は省きます。
今回組んでみたのは電源へ負荷(抵抗等)を接続し、電流を引き出していってその負荷の両端の電圧値と電流値をグラフにしたもので回路図はこちらです。今回はPWM制御せず負荷を変化させる方法で実験します。
MPPTアルゴリズムは特許もたくさん取られていて簡単な検索でも312件(2021年9月11日現在)あり、たくさん研究もされていて論文検索しても色々なアルゴリズムが検証されているようです。
今回は代表的なアルゴリズムである山登り法をM5Stackに実装してみました。
//電流値設定関数 current_set(current); //MPPT待ち時間 delay(mppt_wait_time); //電流・電圧値測定 current_val = get_current(); va = get_voltage(); pa = current_val * va; //今の電力値が高いか if(pa > pb){ //電圧値比較 if(va > vb)current -= set_current_step; else{current += set_current_step;} }else{ //電圧値比較 if(va > vb)current += set_current_step; else{current -= set_current_step;} } //現在値記録 pb = pa; vb = va; //ループさせる
アルゴリズムのフローとコードの中心部です。大まかにこのように組んでみて実験しました。
電流値を変化させる前後の電力値とを比べて、基本的には変化後の電力が高い場合MPPがさらに高い位置にある可能性が高いので電流値を上げる、変化後の電力が低い場合MPPが前にある可能性が高いので電流値を下げます。
測定値をSDに記録したり画面で見たりできますし、こういう実験にもM5Stackは便利ですねw
実際にMPPが約3.7mWの電源を接続した際のグラフです。うまく3.7mW付近で追従できていますね!
ただ上下のブレがあり、ノイズ源や損失になったりしますので、この辺はアルゴリズム次第なので色々遊べる余地があります。
これらグラフはパラメータを調整する前のグラフです。電流値の変化量set_current_stepが小さすぎたり、電流値変更後の待ち時間mppt_wait_timeが小さかったり、ただ電力の上下だけを見たりするとうまく追従できなかったりしました。この辺も最適値などを求めて遊べるところです。電力値がmWじゃなくてWやkWになったらまた変わってきそうです。
研究されているアルゴリズムを見てみると微分していたり、一度IV特性を測ってみる、など色々あって面白そうなんです。
どこまで効率を追い求めるかにもよりますが、とりあえず実装して早くバッテリーに充電して何かしらの電源に使えるよう整備したいと思いますw
<読んだ論文>
Modified Perturb and Observe MPPT Algorithm for Drift Avoidance in Photovoltaic Systems