IR2110の独り言

ゲートドライバーICが独り言をつぶやくだけです

CHMPWM生成プログラムをpythonからmatlabに移行した

前置き(いらない)

最近気温がちょっとずつ下がってきて秋の訪れを感じます。

何もしてないのに時間が過ぎていてちょっと怖いです…。

CHMPWM(最適化PWM)とは

大容量インバータなどでPWM周波数をどうしても下げなければいけない場合、どうしても高調波含有量による電動機損失が問題になります。(テンプレ)

この問題を最小限にするため、電流の高調波成分が最小になるようにノッチ角を設定するPWMを高調波電流最小化PWM(CHM: Current Harmonic Minimum)と言います。自己満足です。電流の高調波含有量を最小にすることで、電流リプルによるトルクリプルあるいは電動機の温度上昇を最小限に抑えます。

matlabに便利な関数があると聞いて

僕は前まで適当にpythonでGAアルゴリズム(最近流行りの遺伝的アルゴリズム)を使ってノッチ角を生成していたのですが、matlabにてfmincon関数という便利な最適化関数を使ってノッチ角を生成できそうなので今回はこれを用いてノッチ角を生成してみます。

最小化する評価関数を求める

[図1] ノッチ角3つのPWM波形例

今回は高調波電流 I_{ripple}を最小にすることを考えます。

例としてノッチ角を α_1, α_2, α_3と設定し[図1]のようにPWM波形を生成するとして、 n次の高調波電圧 V_{n}の振幅は、1/4サイクル毎に対称な波形なので \cos項は消えて奇次高調波の \sin項のみになり、

 V_n =  \dfrac {4}{π}[\int_{0}^{α_1}\sin nωt dωt - \int_{α_1}^{α_2}\sin nωt dωt + \int_{α_2}^{α_3}\sin nωt dωt]

 =\dfrac{4}{nπ}\{1+2(-\cos nα_1+\cos nα_2-\cos nα_3)\}

従って高調波電流 I_{ripple}は、 n次の高調波電流実効値を I_{n\mathrm{rms}} n次の高調波電流振幅を I_{n}、電動機一相あたり実効漏れインダクタンスを L ωを基本波角周波数とすると、

 I_{ripple}=\sqrt{\displaystyle \sum_{n=3}^{∞}I_{n\mathrm{rms}}^2}=\sqrt{\displaystyle \sum_{n=3}^{∞}\dfrac{I_{n}^2}{2}}

 =\sqrt{\dfrac{1}{2}\displaystyle\sum_{n=3}^{∞}(\dfrac{V_n}{nωL})^2}

ただし、3倍調波は三相結線では流れないので考慮しません。(この式から外れます。)

実装

fmincon関数に関しては他の記事の方が詳しく説明してくれます!!!!!!!

はい!!!!!!!!!!!!

あとは初期値とかで気をつけてもらえれば問題なく生成できるはずです。

生成できた!やったね

[図2] できた!

さすがmatlabですね、たった108秒ちょいで生成できました。[図2]pythonだと僕の実装力がないせいか5分くらいかかってたのでかなり高速化されています。ちなみにTHD計算のところで結構時間を取られてるみたいでした。fminconの最適化処理はかなり早く済んでいました。今回初期値はかなり適当に設定したのでガバガバです。本来はあらゆる場合の初期値を同時生成し、その中からもっとも良好な波形を選び切り替えるという処理を行って最適PWMを生成します。例として[図3]を参照してください。ノッチ角がカチャカチャ切り替わってるのがお分かりいただけると思います。まあつまり大域的最小解になるよう初期値を常に切り替えてるってことです。

[図3] ノッチ角が切り替わっている

終わり

と言うことで今回はCHMPWMのノッチ角生成をmatlabにやらせてみました。

結果としてpython生成よりかなり処理が早くなったので今後CHMPWMのノッチ角を生成することがあったらmatlabに任せてみようと思います。python苦手です