オンとオフしかないスイッチで、モータに正弦波を届ける ―― PWM インバータを波形で確かめる

  • 制御
  • モータ
  • python
  • シミュレーション
  • インバータ

前回の FOC 編までで、コタツの温度からブラシレスモータの回転まで、PID の話は一通りつながりました。ただ、ひとつだけ理想化したまま先送りにしてきたことがあります。電圧です。

このシリーズではずっと「電圧指令を出せば、そのとおりの電圧がモータにかかる」ことにしてきました。実物の駆動回路が持っているのは、直流の電源と 6 個のスイッチだけです。しかもパワー半導体のスイッチは、全開か全閉かしかできません。中途半端に半開きにすると、電圧と電流が同時にかかって素子が熱で壊れるからです。

オンとオフしかない部品から、どうやって「いま 7.3V ほしい」のような中途半端な電圧を作るのか。今回はシリーズ最後のピースとして、この距離を自作シミュレータで埋めます。いつもどおり、ラプラス変換も伝達関数も使いません。ぜんぶ時間領域の差分(オイラー法)です。

電圧はどこから来るのか

まずは全体の地図から見てみます。コンセントから来るのは 50Hz や 60Hz の交流です。インバータと呼ばれる駆動装置は、これをいったん整流して平滑コンデンサに溜め、直流の電圧源(DC バスと呼びます)を作ります。大きな装置では、この直流を配る太い導体の板がブスバーです。そして DC バスにぶら下がった 6 個のスイッチが、直流から改めて三相の交流を作ってモータに渡します。交流から直流、直流から交流。AC-DC-AC と呼ばれる構成です。

一度直流に落とすのは、電源の周波数と縁を切るためです。50Hz の電源から 50Hz のモータしか回せないのでは困ります。直流まで戻してしまえば、そこから作る交流の周波数も振幅も、こちらの自由になります。前回までの FOC が vd, vq を自由に指令できたのは、この構成が前提だったからです。

今回のシミュレーションで扱うのは、この地図の後半、DC バスから先です。バスは揺れない 24V の定電圧源と仮定します。整流側の物理(コンデンサのリプルや、モータが発電機に回ったときにエネルギーがバスへ戻ってきて電圧が上がる話)も、ブスバーや配線のわずかなインダクタンスがスイッチングの瞬間に電圧を跳ね上げる話も、今回は入れていません。後者は ESD の記事で数えた L·di/dt と同じ物理が、基板の中でなく電力回路で起きる、という話です。

オン時間の割合が電圧になる ―― デューティと、モータの L

スイッチ 2 個を縦に積んだものをレッグと呼びます。上をオンにすれば出力は 24V、下をオンにすれば 0V。この 2 値を高速で行き来させて、オン時間の割合(デューティ)を変えると、出力の平均は 0 から 24V まで自由に作れます。これが PWM(パルス幅変調)です。

シミュレータのレッグはこれだけです。三角波のキャリアとデューティを比べて、上下どちらを入れるかを決めます。

class PWMLeg:
    def step(self, gate_upper, i_out):
        if self.dead_left <= 0.0 and gate_upper != self.on_upper:
            if self.Td <= 0.0:
                self.on_upper = gate_upper
            else:
                self.dead_left = self.Td      # 切り替え開始:まず両方オフ
                self.pending = gate_upper
        if self.dead_left > 0.0:              # デッドタイム中は電流の向きが電圧を決める
            self.dead_left -= self.dt
            if self.dead_left <= 0.0:
                self.on_upper = self.pending
            return self.Vdc if i_out < 0.0 else 0.0
        return self.Vdc if self.on_upper else 0.0

まず約束どおりの平均が出るか、デューティ一定で自己検査をしました。0.25 / 0.50 / 0.75 に対して平均は 6.000 / 12.000 / 18.000V。24V のちょうど 25%、50%、75% です。

では、そのデューティを 50Hz の正弦波で揺らすとどうなるか。レッグ 1 本に、モータの巻線と同じ R=0.5Ω・L=2mH の負荷をつないで見てみます。

上段は0Vと24Vを行き来する矩形波と、その1周期平均が正弦波指令に沿う様子。下段は負荷電流で、1kHzでは鋸歯状の揺れが乗り、10kHzではなめらかな正弦波

上段を見ると、出力そのものは最後まで 0V と 24V の矩形の列のままです。正弦波はどこにも出ていません。それでも下段の電流は、ほぼきれいな正弦波になっています。電流の 50Hz 成分の振幅は、1kHz で刻んでも 10kHz で刻んでも 10.4〜10.5A で同じ。違いは揺れ残り(リプル)だけで、1kHz の 3.04A(pp) が 10kHz では 0.33A(pp) と、刻みを 10 倍にするとほぼ 10 分の 1 になりました。

平均を実行しているのは、制御ソフトではなくモータの巻線 L です。このシリーズで何度も使ってきた「インダクタの電流は急に変われない」という性質が、矩形の列を積分して、平均だけを電流に写し取ってくれます。刻みが速いほど、電流が揺れる暇がなくなる。これが、オンとオフから正弦波が生まれる仕組みです。

三相にして FOC を載せる ―― 残るのはリプル

レッグを 3 本並べれば三相です。ひとつだけ気をつける点があって、モータの巻線はスター結線の中性点でつながっており、その中性点はどこにも接地されていません。だから各相にかかる電圧は、レッグの出力そのものではなく、そこから中性点の電位(3 レッグの平均)を引いたものになります。言い換えると、3 相にまったく同じ電圧を足しても、中性点ごと持ち上がるだけで、巻線にかかる相電圧には現れません。この「3 相共通ぶんは見えない」という性質は、あとでもう一度出てきます。

この三相インバータの上に、前回の FOC をそっくり載せ替えました。モータも前回と同じです(R=0.5Ω、L=2mH、λ=0.03Wb、極対数 3)。制御はキャリアの山ごとに 1 回、つまりスイッチング周波数と同じレートで回します。電流のサンプルもキャリアの山で取ります。スイッチの切り替わりから最も遠い瞬間なので、リプルのほぼ真ん中、つまり平均に近い値が読める定石のタイミングです。

左は iq ステップ応答で、理想電圧の応答とPWMの応答がほぼ重なる。右は定常部の拡大で、2.5kHzでは大きな三角波状のリプル、10kHzでは小さなリプルが理想値のまわりに残る

iq を 0 から 6A へステップさせると、平均の応答は理想電圧のときとほぼ同じでした(2% 整定で理想 6.60ms に対し、PWM 10kHz で 6.43ms)。FOC から見ると、下がスイッチの列に入れ替わった影響はほとんど見えません。違いは右のズームで、理想電圧ならほぼ平らな定常値のまわりに、スイッチング周波数の三角波が残ります。

このリプルがスイッチング周波数でどう縮むかも測りました。

f_sw iq リプル (pp)
2.5 kHz 504.8 mA
5 kHz 256.0 mA
10 kHz 133.0 mA
20 kHz 80.6 mA

周波数を倍にするとほぼ半分、という素直な減り方です。20kHz で半分に届いていないのは、制御更新の階段や測定の窓、時間刻みといった、スイッチングとは別の床が見え始めるためと考えられます(理想電圧でも 10.7mA のリプルは残ります)。

ただ、やみくもに速く刻むわけにもいきません。ひとつは次の節のデッドタイムで、食われる電圧が刻みの回数に比例して増えること。もうひとつはスイッチング損失で、切り替えのたびに素子が発熱します。損失は今回の理想スイッチのモデルでは出せないので、ここでは「リプルと発熱の綱引きで f_sw が決まる」という一般論に留めます。

ひとつ失敗談があります。この実験は最初、回転数 100 rad/s で組んでいました。走らせてみると iq がいつまでも 6A に届きません。逆起電力が 0.03 × 300 = 9V、抵抗ぶんが 3V、軸間の干渉も足すと、必要な電圧が 12.5V ほどになり、後述する 12V の上限を超えていたのです。前回「最高速の天井は電圧の上限で決まる」と書いたその天井に、実験の動作点選びで自分がぶつかりました。回転数を 50 rad/s に下げて解決しています。

上下同時オンは許されない ―― デッドタイム

レッグの上下が一瞬でも同時にオンになると、24V のバスがスイッチ 2 個だけで短絡されます。これを防ぐため、実物のインバータは切り替えのたびに「両方オフ」の時間を挟みます。デッドタイムです。長さは素子によりますが、µs 前後の桁です。

見落としやすいのは、両方オフのあいだの出力電圧がどう決まるかです。巻線の電流は急に止まれないので、どちらかのダイオードを通って流れ続けます。電流がレッグから出ていく向きなら下のダイオードが導通して出力は 0V に、入ってくる向きなら上のダイオードが導通して 24V に張り付きます。つまりこの間だけ、電圧を決めるのは指令ではなく電流の向きです。ずれの平均の大きさは Vdc·Td·f_sw で見積もれて(向きは電流の向きで反転します)、24V・4µs・10kHz なら約 0.96V。指令が数 V しかない低速域では、無視できない比率になります。

どのくらい歪むのか、まず電流ループを切って、回転子の角度に同期した振幅一定の三相電圧をそのまま指令するオープンループで見ます。低速の 20 rad/s、指令振幅は 4.5V です。

上段はオープンループの相電流波形。デッドタイム0では振幅5.3Aのきれいな正弦波が、4µsでは振幅2.6Aに痩せ、ゼロクロス付近に平坦部が現れる。下段はFOCループを閉じた場合で、同じ4µsでも振幅2Aのほぼきれいな正弦波に戻る

デッドタイムなしでは振幅 5.27A・THD 0.4% のきれいな正弦波だった相電流が、4µs 入れると振幅 2.62A・THD 12.9% まで痩せて、ゼロクロスのたびに電流が張り付く平坦部が現れます。電流がゼロをまたごうとする瞬間は、ずれの向きも反転して電流を押し戻すためです。さらに動作点を浅くしていくと、もっと極端なことが起きます。指令の正味が 1V ほど(振幅 2.8V)の条件で試したら、4µs のデッドタイムだけで基本波が 0.013A、実質ゼロまで消えました。スクリプトの vf_amp を 2.8 にすれば再現できます。

同じ 4µs のまま FOC の電流ループを閉じたのが下段です。振幅は指令どおりの 2A に戻り、THD も 2.5% まで下がりました。電圧に余裕があるこの条件では、積分の溜まりが、目減りした電圧ぶんを自動で上乗せしてくれるからです。ただしゼロクロスの小さなくぼみは残っています。ループの帯域より速く符号が反転する瞬間だけは、補正が間に合いません。基本編から何度か出てきた構図です。制御ループは下の階層の誤差をかなり吸収してくれますが、消してくれるわけではありません。実務でデッドタイム補償という分野がわざわざあるのは、この残りを指令側で先回りして埋めるためです(今回はやっていません)。

電圧の天井を 15% 持ち上げる ―― コモンモード注入

最後に、前回から持ち越した宿題です。FOC 編で「最高速の天井は、逆起電力が電圧の上限に届くところで決まる」と書きました。では 24V のバスから出せる相電圧の上限は、いくらなのでしょうか。

デューティは 0 から 1 までしか動けません。相電圧の指令を素直に正弦波のままデューティに直すと、振幅の上限はバスの半分、24/2 = 12V です。ところが先ほどの「3 相共通ぶんはモータに見えない」を思い出すと、まだ余白があります。3 相の指令の最大値と最小値の真ん中を、いつも 0.5 に寄せ続けるオフセットを 3 相共通で足すのです。モータに届く相電圧は変わらないまま、デューティの上下の余白が均され、正弦波のままでは入り切らなかった振幅まで押し込めます。上限は 24/√3 ≒ 13.86V、約 15% の持ち上げです。空間ベクトル変調(SVPWM)と呼ばれる方式も、電圧利用率の点では同じところに着地します。

無負荷で目一杯の速度指令(170 rad/s)を与えて、天井を測りました。

左は速度応答で、正弦波のままでは133rad/s、min-max注入では153rad/sで頭打ちになり、それぞれ理論値の点線と一致する。右は1レッグのデューティ波形で、正弦波のままは0と1で潰れ、注入ありは鞍型になって0..1に収まる

正弦波のままでは 132.8 rad/s、注入ありでは 153.4 rad/s で頭打ちになりました。それぞれ 12V と 13.86V を λ·P で割った理論値(133 と 154 rad/s)にきれいに乗っています。同じバス、同じモータ、同じ FOC で、デューティの作り方だけで最高速が 15% 伸びたことになります。

仕組みは右の図に出ています。注入ありのデューティは正弦波ではなく、てっぺんが割れた鞍のような形をしています。それでも 3 相共通ぶんは中性点ごと動くだけなので、モータに届く相電圧は正弦波のまま。巻線から見れば、元の正弦波と何も変わっていません。

省いていること

  • スイッチとダイオードは理想です。オン抵抗・順方向降下・スイッチング損失を入れていないので、発熱と効率、つまり f_sw を上げる本当の代償は今回の数値からは出せません。
  • DC バスは揺れない定電圧源です。整流側のリプル、負荷急変や回生によるバス電圧の変動は扱っていません。
  • ブスバーや配線の寄生インダクタンスによるサージも入れていません(物理は L·di/dt。ESD の記事と同じです)。
  • デッドタイム補償はしていません。歪みを見せるところまでです。
  • 電圧のかさ上げは min-max 注入で行いました。SVPWM とは電圧利用率が同等というだけで、実装は別物です。
  • コモンモード電圧は、このモデルでは中性点が動くだけで無害ですが、実機では対地の電圧や EMI、軸受を流れる電流に効きます。今回は巻線から見える範囲だけを扱いました。
  • 電流サンプルはキャリアの山に同期した理想サンプリングです。ADC の遅れやセンサのノイズはありません。
  • 時間刻みはオイラー法の 0.5µs です。数値は傾向と桁感を見るためのもので、実機の校正値ではありません。

おわりに

コタツの温度を P で押すところから始めて、カスケード、ゲインの決め方、回る座標、そして今回のスイッチまで来ました。「指令を出せば電圧がかかる」と仮定していた最後の距離が埋まって、目標値から実際の電圧まで、全部が自作の差分方程式でつながったことになります。PID の連作はここでひと区切りです。

積み残しもはっきりしました。スイッチの損失と発熱、天井のさらに先へ行く弱め界磁、デッドタイム補償。どれも今回の器の続きに載る話なので、いずれ手を動かして確かめたいと思います。

シミュレータ一式は、そのまま動く形で公開しています。

この記事は Zenn に初出したものを加筆・補足したものです ── Zenn の元記事を見る