PLD 3PHASE INDUCTION MOTOR CONTROL
MOTOR
PLD を使った3相誘導モーターコントローラ
わずか36個のフリップフロップで
   3相正弦波波を発生


トランジスタ技術誌1999年5月号掲載

  Xilinx XC9536 ABELバージョン
改良版 XC9572 VHDLバージョンのページ
概要:
3相誘導モ ーターは洗濯機やインバータエアコン、産業機器など幅広く使われています。
これを制御するためには3つの位相のずれた正弦波を発生させモーターのコイルにその電流を流さなければなりません。
この正弦波の大きさと周波数を変化させてトルクと回転数を調整することが出来ます。
家電製品などの誘導モーターの励磁電圧は100〜400V程度と高い電圧のものが多く、この電圧振幅をもつ正弦波を作り
周波数も可変させなければなりません。
その為、家電製品などではマイコンで正弦波と三角波を演算させて正弦波に同期するパルス波(PWM波)を発生させ、
この信号を高耐圧トランジスタなどの高速スイッチング素子を使ってモーターの励磁を行います。

マイコンは忙しい!
これらのマイコンでは高速な割り込み処理が連続しCPUの負担が大きく、他の処理(例えばSWの読み込みや表示など)
が追いつかず設計が難しくなります


全てロジックで作ろう!
PWM波のパルス幅データを定期的に出力する回路を3個作り、それぞれ120度の時間分ずらして出力します。
マイコンの様に各相を割り込み処理で飛び回る処理とは違い非常にあっさりとした回路で出来上がってしまいます。

楽しく作りましょう!
私が紹介させて頂いているハードウエア及びABELあるいはVHDLコードはその業界の方が見られれば笑われてしまうに
違いありませんが試行錯誤してなんとか作り上げることが喜びじゃないでしょうか?
ご意見、共同研究などのお誘いを楽しみにしております。design@miniprobe.com
PLD (プログラマブルド ロジックアレイ)を使う!
Xilinx社の容量が一番小さい XC9536(800ゲート)を
使って右の写真(オリエンタルモーター社)の誘導モーターを接続して実験中の様子です
実験風景

この実験ではCPUの負担を軽くする為に小規模なPLDを使って3相誘導モーターのドライブ専用ICを試作しています。
制御方法は、なるべくLOWコストなPLDで作ることを目標に波形の発生方法を検討した結果、電圧ベクトル制御法
という面白い方法がありましたのでこれをロジック化してみました。(参考 文献1.)

電圧ベクトルの発生
電圧ベクトル制御法は6個のパワースイッチング素子を図1のように6通りのON/OFFをくり返させます。
6相スイッチ図16相スイッチ波形図2

この6回がSin波の1周期となります。 だだし、これだけでは図2のような電流がモーターに流れ一種のステッピングモーターに
似た状態となってなめ らかな回転が出来ません。(6ステップインバータと言います)
そこでパワースイッチング素子を制御して相間電 圧がSIN波となるようにします。
図3にそのPWMを生成する為の状態図を示します。
各相の電流方向図3

HEX0からHEX5(STEP0からSTEP5)まで6通りの状態に変化していきますが、VCCまたはGNDマークは
その状態の時、100% のディユーティでVCC及びGNDに接続される事を意味します。このVCCとGNDマークを
ゼロベクトルと呼びま す。 実際には波形データの生成は図4に示すように表計算ソフトによりSin波形を調整
しながら作ります。
SIN波の分解能は5BITとした為、ゼロから31になりますが、安全の為最大ON幅80%としましたので
ゼロから26となります。
ゼロ相ベクトルを書き込む

ゼロ相ベクトルを書き込む2

ゼロ相ベクトルを書き込む3

W相の完成表

波形の合成
図5に、この表より各相の出力電圧波形を示しますが、とてもSIN波形とは言えませが。
しかし、U−V,V−W, W−Uの各相関電圧波形は図6に示す様様にきれいなSIN波形となります。(不思議ですね)

相間電圧グラフ図5,図6


PLDの構成
PLDの内部構成 図7にPLDの内部構成を示します。
PLDブロック図図7

3Bitカウンタ(HEX)は回転速度調整CLOCKによってカウントされ、6通 りのパワー素子の動作モード
(6ステップインバータ)を発生させます。
さらに3BITカウンタCSTEPにより、その 1つの状態を時間的に5つに分解したPWM波形をつくりSIN波を発生させます。
したがって、SIN波1周期は30ステップの分解能となります。

PWM波は5BITカウンタvecとSIN波の固定データを参照比較する事により発生しています。
この固定データ ですが、図4の表計算で求めました。
U,V,Wのデータはそれぞれ120度ずれた位置に配置されています。

データは6つのデータのブロックになっていますが、その中で連続した26と0のブロックであるゼロベクトルは、
図 3のVCC及びGNDに相当し、固定データとして扱いません。
残る4つのデータですが、表中の太字の2つのブ ロックの値を反転させる事により残り2つのデータを発生出来ます。
結局、固定データは表中太字部分の10 個(2つのブロック)のみとなり回路規模を小さくする事が出来ました。

6相PWMの発生 U,V,W、3つのPWM信号は6個のパワー素子をドライブする為にそれぞれを反転したU,V,Wを
作り出しま す。
ただし、パワー素子にはTonおよびToffによる動作の遅れがある為、U,V,Wを反転しただけでは上側と下側のパワー素子が
同時ONを避ける為、遅延回路を設けています。
この回路はPLDの外部にCRによる積分回路を追加して回路を簡素化しています。

試作基板試作基板

PWM波発生回路 LOGIC回路はザイリンクス社のXC9536で
ゲート数が800ゲートのものを使用しました。


試験回路

回路図ダウンロード 3pinv.bmp (3pinv.zip)




回転数制御,トルク制御
このPLDにはモーターの回転速度を指示する為のCLOCKと
出力電圧を可変してトルク制御する為のCLOCKが必要です。
各、CLOCKは74HU04による簡単なアナログ発振器で作製しました。

モータードライバ
PLDから出力されたPWM波は200Vクラスのモーターをドライブしますので今回はIR社のIR2110による
ドライバーを通して パワーMOSFETをドライブしています。
IR2110はCMOSロジックレベルの信号で負荷容量の大きなパワーMOSFETをドライブする為のICで
入出 力の絶縁耐圧は500Vです。

また、このICは上側(ハイサイド)のパワーMOSFETの制御信号用の電源を作る為のブートストラップ回路が 簡単に
構成出来、電源回路をシンプルなものにする事が出来ます。
モーター用電源回路は、商用電源(AC100V)を全波整流してDC140Vを作りました。
実験には安全の為にスライダックを通しています。
International Rechifier DATA SHEET

PLDへの回路書き込み
XC9500シリーズは配置配線データを内部のフラッシュROMに記憶させるので、その為のデータ書き込み回路を搭載しています。
といっても回路的には4本の信号線とコネクタのみで、ザイリンクス社のJTAGプログラマ ParallelCableIIIと呼ばれる
書き込み装置を通しパソコンからデータを回路情報をダウンロードします。

過電流保護制御
モーター過電流制御 モーターに過大な電流が流れた時、瞬時にFETを停止させ回路を保護する為に外部シャント抵抗器による
電流検出を行いフィルタを通してPLD内のラッチ回路が働きます。
この時、PWM出力はスリーステート状態となり外部抵抗によりLoレベルに保たれ全てのパワー素子はOFFとなります。
またドライバーICのSD(シャットダウン)端子もHiとなり保護動作を行います。

ソフトウエア
開発環境
使用したPLDの開発TOOLソフトウエアはザイリンクス社のFoundation Ver1.4で付属のABEL言語で作成しました。
DEBUGは付属のALDEC社のシミュレータで行いこの後XC9536にインプリメントします。
これにより 生成されたデータはパソコンのプリンタ用コネクタからXilinx社の専用のJTAGプログラマ Parallel Cable 3を通し、
基板 上のPLDに書き込みます。

XC9500シリーズは低速な処理部分(セル)は消費電力を下げるように指定出来るので、この実験では全て低消費電力モードで
行いました。
また未使用ピン全てをグランドピンに指定する事が出来、この様な大きなノイズを発生する回路での誤動作を防止しています。

さらに出力回路はスルーレートを高速あるいは低速に設定出来るため今回の実験では不必要な帯域のノイズの発生を少なくする
目的で低速モードとしました。

ソフトウエア、資料に関してはCQ出版社
トランジスタ技術誌のダウンロードページ"1999年5月号 3相誘導モータのドライブ専用PLDの試作"を参照下さい。

ABELソースコード ダウンロード ABEL.TXT
module INV3P
Title '3phase induction motor control'
////////////////////////////////////////////////////////////
// 3相電圧ベクトル制御 インバータ コントローラ
// PLD : Xilinx XC9536 PC-44
// MiniProbe
// Kazuhiro Omura
// 開発ツール : Foundation 1.4 XABEL
// コンパイル及びインプリメント時の注意
// 1.Foundation 1.4でのABELコンパイラは日本語対応と
//   なっていない為、コンパイル時は日本語の注釈を外す事。
// 2.インプリメントツールのオプションで以下の設定を行う事。
// a.オプチマイザをセル面積優先に設定する事。
//  b.全セル低消費電力モードを設定する事。
//  c.未使用のピンを全てGNDピンに設定する事。
////////////////////////////////////////////////////////////
Declarations
carrer PIN 5; //回転数クロック入力
vf PIN 6; //出力電圧クロック入力
U pin 38 istype 'com'; //U相ベクトル電圧出力
V pin 36 istype 'com'; //V相   ”
W pin 34 istype 'com'; //W相   ”
vectorx node  istype 'com'; //PWM幅 ベクトルx
vectory node  istype 'com'; // ”  ベクトルy
vectorz node  istype 'com'; //  ”ゼロベクトルz
ivectorx node istype 'com'; //  ”反転ベクトルx
ivectory node istype 'com'; //  ”反転ベクトルy
UP pin 18 istype 'com'; //U相上アーム出力
UN pin 20 istype 'com'; //U相下アーム出力
UDL pin 37; //U相ディレイ入力
VP pin 22 istype 'com'; //V相上アーム出力
VN pin 24 istype 'com'; //V相下アーム出力
VDL pin 35; //V相ディレイ入力
WP pin 26 istype 'com'; //W相上アーム出力
WN pin 28 istype 'com'; //W相下アーム出力
WDL pin 33; //W相ディレイ入力

PWM pin 44 ; //Hi:6相出力停止(Hi-Z) Lo:運転
OCIN pin 42; //過電流信号入力 ↑で停止
OCOUT pin 40 istype 'com'; //過電流停止信号出力
OCLATCH node istype 'reg'; //過電流信号ラッチ

cstep2..cstep0 node istype 'reg'; //最少刻み状態 カウンタ
hex2..hex0 node istype 'reg'; //6ステップ状態 カウンタ
vec4..vec0 node istype 'reg'; //ベクトル発生用カウンタ
vecshot1..vecshot0 node istype 'reg'; //ベクトルカウンタ リセット回路
vecshotout node istype 'com'; //ベクトルカウンタ リセット出力

cstep = [cstep2..cstep0];
hex = [hex2..hex0];
vec = [vec4..vec0];
vecshot = [vecshot1..vecshot0];

//////////////////////////////////////////////////////////////////////////////
Equations
cstep.clk = carrer ; //モーターの回転スピードはcstep及び
hex.clk = carrer; //hexのクロック(carrer)で可変する
vec.clk = vf; //出力電圧調整はvecへクロック(vf)を
vecshot.clk = vf; //与え可変する

cstep := (cstep + 1) & (cstep <= 3); //1周期30ステップの分解能なので
when (cstep == 4) then //最少刻みカウンタcstepが5ステップ
hex := (hex + 1) & (hex <= 4); //数えるごとに6ステップインバータhex
else hex := hex; //の状態がインクリメントされる。

//ベクトルの発生
when (vec < 30) then //出力電圧調整カウンタvecが
{vec := vec + 1;} //何らかの原因で30を越えて
else when (vecshotout == 1) then //しまった時、PWM ON幅を
{vec := 0;} //これ以上にしない。
else {vec := vec;} //又、次のステップに移った時、
//vecカウンタをリセットさせる。

//カウンタvecをリセットさせる為のoneshot回路
vecshotout = (vecshot0 & !vecshot1); //carrerクロックの立ちあがり
vecshot1 := vecshot0; //でvecをリセットする為の微分
vecshot0 := carrer; //回路。

//最少刻みカウンタの状態によりvectorxとvectory及び、それらを反転した
//ivectorxとivectoryにベクトル(ON幅)をSETする。
when (cstep == 0) then
{vectorx = (vec <= 3); vectory = (vec <= 24);
ivectorx = (!vec >= 3); ivectory = (!vec >= 24);}

when (cstep == 1) then
{vectorx = (vec <= 8); vectory = (vec <= 25);
ivectorx = (!vec >= 8); ivectory = (!vec >= 25);}

when (cstep == 2) then
{vectorx = (vec <= 13); vectory = (vec <= 26);
ivectorx = (!vec >= 13); ivectory = (!vec >= 26);}

when (cstep == 3) then
{vectorx = (vec <= 17); vectory = (vec <= 25);
ivectorx = (!vec >= 17); ivectory = (!vec >= 25);}

when (cstep == 4) then
{vectorx = (vec <= 21); vectory = (vec <= 24);
ivectorx = (!vec >= 21); ivectory = (!vec >= 24);}

//ゼロベクトル vectorzにベクトル(ON幅26(固定値))をSETする。
vectorz = (vec <= 26);

//6ステップインバータhexの状態に従い各相にベクトル(vectorx、vectory、
//ivectorx、ivectory、vectorz)をわり当てる。
//(ゼロベクトルは電流の流れ込みvectorzと、電流のはき出し"0"の2種類がある)
when (hex == 0) then
{U = vectorx; V = 0; W = vectory;}
when (hex == 1) then
{U = vectorz; V = ivectory; W = ivectorx;}
when (hex == 2) then
{U = vectory; V = vectorx; W = 0;}
when (hex == 3) then
{U = ivectorx; V = vectorz; W = ivectory;}
when (hex == 4) then
{U = 0; V = vectory; W = vectorx;}
when (hex ==5) then
{U = ivectory; V = ivectorx; W = vectorz;}

//U,V,W信号から6相信号出力を作り、過電流時にはこの出力を
//スリーステート状態にする。
//UDL,VDL,WDLはU,V,W信号を外部CRで遅らせた信号を入力する。。
UP = U & UDL; UP.OE = !PWM & !OCOUT;
UN = !(U # UDL); UN.OE = !PWM & !OCOUT;
VP = V &VDL; VP.OE = !PWM & !OCOUT;
VN = !(V # VDL); VN.OE = !PWM & !OCOUT;
WP = W & WDL; WP.OE = !PWM & !OCOUT;
WN = !(W # WDL); WN.OE = !PWM & !OCOUT;

//過電流信号ラッチ回路 過電流信号OCINが立ち上がるとレジスタOCLACHがラッチ
//され、PWM出力を停止させる。 (解除は再電源投入)
OCLATCH.clk = OCIN;
OCLATCH := 1;
OCOUT = OCLATCH;

end INV3P

PWM波のチェック
U-V間PWM波形







XC9536のPWM出力 U相-V相の波形
2V/div



試運転
入力電圧AC100Vで、回転速度の可変、トルク調整CLOCKの調整により出力電圧の可変も出来る事がわかり ました。
モーターの負荷装置が無いので詳細な特性は得る事が出来ませんでしたが無負荷時の相間電流波形を示します。

当初1周期30 ステップのSIN波では、分解能が荒すぎ、制御出来ないかと思いましたが、ローターはなめらかに回転しまし た。
今回、回転速度と出力電圧調整はLOGIC ICによる簡単な発振回路によりマニュアルで実験しましたが、これをマイコンで行う事は
簡単でありもっと複雑な制御をする事も可能だと思います。


モーター電流波形


使用したPLD(XC9536)は800ゲートとファミリの中では
一番小さな規模のものに収まり名古屋大須のパーツショップで400円代で
入手出来ました。


作成したPLDはセルの使用率が88%で、ほぼ一杯となりましたが、XC9572(1600ゲート)などを
使用すればSIN波の分解能も簡単に向上出来そうです。

改良版PLD XC9572
今回のPLDXC9536では容量の都合からハイサイドとローサイドドライブ出力切り替え時のの短絡を防止するためのデッドタイム回路を
入れることが出来ず、外部のCR回路としていましたが容量をもう1段階UPしたXC9572を使用することでこれらの外部回路が不要と
なりました。 改良版PLDについてはこちらをご欄下さい。

使用したABEL言語はマイコンのプログラムと比べ、複雑な割り込み処理などを意識せずに記述することが出来、
開発時間の短縮になりました。

さらに、FLASH ROM構造で基板に実装したままでJTAGを使ったISP(インシステムプログラミング)により
1万回以上の再書き込みが可能であるなどDEBUGを楽に進める事が可能です。

シミュレーション
Xilinx Fandationに付属のALDEC社のシミュレータ
シミュレータ画面

Xilinx社の書き込みTOOL


PLD書き込み器


RS232ポートへ接続して書き込み及びDEBUGを行える
シリアルインターフェイス(写真上)

パラレルポートへ接続して書き込みが行える
パラレルインターフェイス(写真下)








[回路及びソフトウェア利用規程]

使用者がこれらの回路及びソフトウェア利用する場合、下記の条件を必ずお守り下さい。

著作権
 著作権は全てMiniprobeが保持します。
改造
 改造はご自由に行って下さい。Miniprobeに対し届けも必要ございませが、私本人の技術向上のため内容をご連絡頂けると助かります。
再配布
 再配布はご自由に行って下さい。
免責
 Miniprobeは使用者に対し、回路及びソフトウェアの動作責任を負いません。
 またこれらの回路及びソフトウェアに起因して生じた、いかなる損害に対しても賠償、責任は負いません。

本規定は予告なく変更、施行されます。

参考文献
1) 見城尚志,「モーターのABC」,講談社
2) 「プログラマブル.ロジック データブック」 XILINX社
3) 「ISPアプリケーションガイド」 XILINX社
4) 「ABELによるASICの設計技法」 CQ出版社

RETURN HOME ご意見,アドバイスなどありましたらdesign@miniprobe.com にお願い致します