ブラシレスモーターで使う正弦波をSVMに変換するとき

ブラシレスモーターを駆動する際に、矩形波駆動が一番やりやすくとっつきやすいですが
漢であればロマンを追い求めなければならないので、いずれ正弦波駆動にたどりつくはずです。

正弦波駆動では、マイコンなどからPWMを用いて緩やかな電圧を出力するもので
これを用いるとガックガクした錆び付いたギヤみたいな回転しかしないモーターが
比較的ギリギリ他人が見ても怒らないレベルでなめらかに駆動させることができるようになります。

じゃあ正弦波をそのままPWMに変換してブチ込んだらいいんでしょ?
と思ってやってみると、たしかにすんなりとモーターは回ります。
回りますが、実はこの状態だと電圧が有効利用できていないみたいです。



正弦波をそのままPWMとして出力した場合、線間電圧は入力電圧のおよそ86%となり
14%程度をロスしてしまいます。

この86%っていうのは、何の数字かというと振幅が0から1のサイン波の軸を0°とした場合
120°ずつずれた3つの相への電圧出力を計算すると

vU = 0.5 * sin(0°) = 0
vV = 0.5 * sin(120°) = 0.4330127019
vW = 0.5 * sin(240°) = -0.4330127019…

入力電圧を1とした場合、最大値でもコイルにかかる電圧は0.8660254038…となるので
効率が86%というように言われています。

そしてこれを最大で利用しようと考えたのがSVM(空間ベクトル変調)で
スイッチングの出力をベクトル図におきかえて云々・・・・すると
86%止まりだったPWM出力を100%近くまで上げることができるようになります。
(詳細:http://www.ibaraki-ct.ac.jp/ee/staff/sung/18sannsou.html

そして実際にサイン波のテーブルを変換する方法としては、

  1. UVW三相のサイン波のテーブルから、最大値と最小値の平均を求める
  2. U相の本来のサイン派の出力値から、1.で求めた平均値を引いたものを求める
  3. V相の本来のサイン派の出力値から、1.で求めた平均値を引いたものを求める
  4. W相の本来のサイン派の出力値から、1.で求めた平均値を引いたものを求める

つまり、これを255を最大値としたテーブルに格納しようとするプログラムを書くと、

svm = new unsigned char[360];
float sinU, sinV, sinW;
float val_min, val_max;
float rad;
float vAvg;
unsigned int i;
for(i=0; i<360; i++){
	//角度をラジアンに
	rad = i / RADIANS;
	//サイン波の生成
	sinU = 127 * Math.sin(rad - DEG120_RAD);
	sinV = 127 * Math.sin(rad);
	sinW = 127 * Math.sin(rad + DEG120_RAD);
	//最大値と最小値を求める
	val_min = (sinU < sinV)? sinU : sinV;
	val_min = (val_min <= sinW)? val_min : sinW;
	val_max = (sinU >= sinV)? sinU : sinV;
	val_max = (val_max >= sinW)? val_max : sinW;
	//平均値を求める
	vAvg = (val_max + val_min) / 2.0f;
	//0から255の強弱で表したSVMテーブル(四捨五入)
	svm[i] = (unsigned char)((sinU - vAvg) + 127.0f + 0.5f);
}

こうなる。

グラフで表すと、

sinwaves.png

上側が普通のサイン波で、下側がSVM。

なんかへんなかんじのグラフだけど、一応これで86%の壁を超えた出力になるみたい。

しかし、角度推定ができないと86%の壁を超えた電圧がコイルに無理を与えて余計に発熱するので

センサレスベクトル制御とかに組み込んでみないとちょっと意味のないかんじかなーと実験してみて思った。


2 comments to this article

  1. 名無し

    on 2019年11月9日 at 5:39 PM - 返信

    とてもわかりやすく、勉強になります。
    最近BLDCモータの制御を勉強し始めた者です。
    センサ付きモータで正弦波制御までは出来たのですが、
    ただただ正弦波を与えればいいと思っておりましたので、今回の記事はとても参考になりました。
    ありがとうございます。
    BLDCモータは奥が深いですね・・・。「センサレスベクトル制御」なんて中身がどうなっているのか想像もつきません・・・。

  2. Level52

    on 2019年12月1日 at 11:10 AM - 返信

    返答おくれてしまいました。
    コメントいただきありがとうございます。
    ブラシレスモーターは本当に奥が深く、個人では捌ききれる情報があまり多くないため
    本当に時間をかけてコツコツ実験して・・・という感じになりますね。
    いまのところ最高効率を出せるモーターはブラシレスモーターになるので
    この技術の極致に触ることができれば、「さいきょおのエンジニア」といっても過言ではないのかと考えています。
    「センサレスベクトル制御」・・・^q^

コメントを残す