PSIMの自動コード生成機能を用いてPWM信号を生成する
本投稿はPSIMのビデオチュートリアル
Get Started with Embedded Code Generation Using the F2837x Target
を日本語化したものです。
概要
本チュートリアルでは、PSIMの自動コード生成機能を用いて、PWM信号を生成するコードを生成し、そのコードをマイクロコントローラ上で動作させる方法を紹介します。
また生成波形をオシロスコープで確認する方法を紹介します。
PSIMからの自動コード生成機能とCCSを用いたマイクロコントローラへの実装手順につきましては、事前にPSIM SimCoderプロジェクトをCCSにインポートする方法をご確認ください。
事前準備
下記を購入しました。
- マイクロコントローラ TMS320F28069M
元のビデオチュートリアルはF2837xを使用していますが、本記事ではF28069Mを使用します。
- USBタイプのオシロスコープ PicoScope 2205A
PSIMモデルの確認
PSIMにはコード生成に対応した各種サンプルモデルがプリインストールされています。
今回は下記フォルダのサンプルを使用します。
C:\Altair\Altair_PSIM_2023.1\examples\Code Generation\F2806x Target\1-ph PWM
- 1-ph PWM with dc input.psimsch
を作業フォルダにコピーしてご利用ください。
PSIMで 1-ph PWM with dc input.psimschを開きます。
F2806x用の1相PWM生成ブロックが配置されています。
PSIMのシミュレーションを実行すると、SimViewにて生成されるPWM信号などを確認できます。
下記は、PWM_A、PWM_Bと指令値Vinをプロットしました。
キャリア波の振幅が0~1で、指令値Vin=0.6なので、デューティー比0.6のPWM波形がPWM_Aとして出力されています。反転したものがPWM_Bとして出力されています。
PSIMのコード生成
Simulation ControlにてCPUバージョンをご購入のマイクロコントローラに合わせてください。
また、InstaSPIN対応のマイクロコントローラの場合は、チェックを付けます。InstaSPIN機能の使用有無にかかわらず、対応マイクロコントローラの場合はチェックを付けてください。
シミュレートのコード生成をクリックしてコードを生成します。
ハードウェアの接続
マイクロコントローラを付属のUSBケーブルを用いてPCと接続します。
PCにPicoScopeのソフトウェアをインストールし、PicoScopeをOCにUSBで接続します。
PicoScope2205Aにはプローブが2本付属しているので、AとBのポートに接続します。
次にプローブをマイコンに接続します。
まずは、PSIM回路のPWMブロックの設定を確認します。PWM SourceがPWM 1に設定されています。
マイコンのquick start guideを確認し、PWM 1がが出力されるピン(PWM1AとPWM1B)を確認します。
プローブAをPWM1Aに、プローブBをPWM1Bに接続しました。
また、プローブAにグラウンド用のケーブルをつなぎ、マイコンのGNDにグラウンドしました。
PicoScope1つに対し、1つグラウンドする必要があります。プローブBのグラウンドは必要ありません。
CCSTUDIOによるマイクロコントローラへのコードの書き込み
Code Composer Studioを起動します。
Project -> Import Legacy CCSv3.3 Projectsより、PSIMで生成されたプロジェクトを読み込みます。
また、Target Configurationにて今回使用するマイクロコントローラの設定が設定されていることを確認します。
Projectの右クリックよりPropertiesを開き、GeneralのProductsにてXDAISをRemoveします。
Debugをクリックすると、コードがマイクロコントローラへ転送され、Resumeをクリックすると、マイクロコントローラ上でコードが実行され、PWM信号が生成されます。
PicoScopeの画面でPWM信号を確認できます。
各プローブA,Bのレンジやスコープのレンジを調整し、下記のように表示させます。
信号は右から左へ流れていきますが、トリガーを用いることで、画面上に固定させて表示させることができます。
PWM信号波形の確認
PicoScopeのグラフの左下端にルーラーがあります。これをスクロールさせ、波形のエッジ位置に合わせることで、ルーラー間の時間を測定できます。
まずは、プローブAのPWM_Aの波形のみ表示し、エッジ立上がり間の時間を測定します。約100 μsecでした。
これは、PWMブロックのSampling Frequency = 10Kに対応します。
10K Hz = 1/10 e-3 sec = 1e-4 sec = 100 μsec
次にPWM_Aの立上がりエッジから立下りエッジまでの時間を測定します。約56 μsecでした。
現在、PWMへの指令値を0.6としていますので、デューティー比0.6のPWM信号が生成しているはずです。そのため、立上がりエッジから立下りエッジまでの時間は100 μsec x 0.6 = 60 μsecとなるべきです。
実際にはDead Timeというものがあり(4 μsec)、その値を差し引いた値に対応します。56 μsec = 60 μsec - 4 μsec。
では、そのDeat Timeを見てみます。
プローブBのPWM_Bの波形も表示し、両波形の谷の時間を測定します。約4 μsecです。これがDeat Timeです。
PWMブロックのDead Time = 4 μsecに対応します。
ちなみに、Dead Timeを10 μsecに変更し、コード化、コードの実行を行うと、両波形の谷の時間が10 μsecに変化します。
指令値の変更
現在のモデル・コードは指令値が0.6で固定されており、生成されるPWM信号のデューティー比も0.6に固定されています。デューティー比を変更するために、わざわざモデル・コードを修正するのは面倒ですので、マイクロコントローラへの入力信号でデューティー比が変更できるようモデル・コードを修正します。
F2806X用のSCI ConfigurationとSCI inputを配置、接続し、SCI inputブロックの名前と初期値を設定しました。
再度コード化し、コードの実行を行います。
PSIMより、DSPオシロスコープを開くと、入力変数設定として、Vinが追加されています。
この値を変更することで、即座にPWM信号のデューティー比を変更できます。
Vin=0.8とすると、デューティー比0.8のPWM信号が生成します(80-4=76 μsec)。
Vin=0.2とすると、デューティー比0.2のPWM信号が生成します(20-4=16 μsec)。
モータードライブへの準備
永久磁石同期モータ(PMSM)では、ローターの回転角に対応したPWM信号を生成することで、ローターを回転させています。
ここでは、回路を修正してサイン波を入力電圧とした場合のPWM信号を生成しています。
次のような回路を準備しました。振幅0.8のサイン波を指令値としてPWM信号を生成しています。
キャリア波はPeak-to-Peak Value=2、Offset Value=-1として、-1~1の振幅としました。
(-0.8+1)/2=0.1 ~ (0.8+1)/2=0.9のデューティー比のPWM信号が生成されるはずです。
ファイル:1-ph PWM with dc input_motor_control_demo.psimsch
振幅0.8のサイン波を入力電圧に対し、デューティー比が0.5から始まり、0.9まで増加し、0.1へ減少していることがわかります。
再度コード化し、コードの実行を行うと、マイクロコントローラ上でデューティー比が変化するPWM信号が生成されていることがわかります。
永久磁石同期モータ(PMSM)は3種類の位相のずれたPWM信号を用いてコントロールされます。
使用製品:Altair PSIM