Embedded Coder

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

永久磁石同期機のベクトル制御

この例では、モーター制御アルゴリズムから C コードを生成し、コンパイルした動作と実行時間を確認するための基本ワークフローと主要な API に示します。プロセッサインザループ (PIL) シミュレーションを使用して、C コードをモーター ハードウェアとやりとりする組み込みソフトウェアに統合したときに予期したとおりに動作することを確認します。このワークフローでは特定のプロセッサ向けのモーター制御アプリケーションを使用しますが、このワークフローは事実上どのようなアプリケーションおよびプロセッサにも適用できます。

永久磁石同期機のベクトル制御アルゴリズムを使用して、このワークフローを説明します。この制御テクニックは、ハイブリッド電気自動車向けのモーター駆動システム、製造機器、産業オートメーションの共通しています。

概要

この例では、制御アルゴリズム モデルから C コードを生成して検証します。これをモーター ハードウェアとのインターフェイスに必要な追加の組み込みソフトウェアに統合できます。

シミュレーション環境を使用して、閉ループ モーター制御システムの動作をモデル化し、検証します。制御システム動作が仕様に従ったら、コントローラー モデルから C コードを生成します。コードを検査した後、機能的動作と実行時間をプロセッサインザループ (PIL) テストを使用して評価します。

PIL テストを行うため、コントローラー モデルを実行してリファレンス出力を確立するためのテスト信号を選択します。シリアル接続でホスト コンピューター上の Simulink と通信する Texas Instruments™ F28335 プロセッサの PIL 実装の例題を確認します。このサンプルを開始点として、独自のプロセッサ向けに PIL 実装を作成します。コントローラー モデルを PIL モードで実行して実行時間を測定し、組み込みプロセッサ上で実行するコードの実行動作をシミュレーション リファレンス出力に照らして検証します。

組み込みプロセッサへの最終実装では、生成されたコントローラー C コードを、周辺機器や割り込みなど、モーター ハードウェアとのインターフェイスに必要な追加の組み込みソフトウェアと統合します。

メモ:

  • 「シミュレーションによる動作の確認」の節では、システム シミュレーションに SimPowerSystems™ が必要です。その他のタスクでは不要です。

  • Texas Instruments™ F28335 PIL 実装は参考のために示した方法で、事実上どのようなプロセッサにも適用できます。ただし、この実装を直接使用するには、Texas Instruments™ の追加のサポート ファイル、コンパイラ、ツールが必要になります。これらの詳細は、この例の「PIL 実装の作成と Simulink での登録」の節を参照してください。この参考用の PIL 実装では Embedded Coder の Texas Instrument C2000™ 組み込みターゲット機能は不要ですが、C2000™ ユーザーには、supportPackageInstallersupportPackageInstaller を使用して Texas Instruments C2000 サポート パッケージをインストールしてから、例「永久磁石同期機用のマルチレート コントローラーのスケジュール永久磁石同期機用のマルチレート コントローラーのスケジュール」を確認することをお勧めします。

システム シミュレーションによる動作の確認

この節では、コントローラーを閉ループ システム シミュレーションで検証します。

システム モデル テスト ベンチは、テスト入力、組み込みプロセッサ、電力用電子部品、モーター ハードウェア、可視化で構成されています。システム モデルを使用してコントローラーを実行し、予期された動作を調査できます。次のコマンドを使用してモデルを実行して、記録された信号をプロットできます。

open_system('rtwdemo_pmsmfoc_system')
sim('rtwdemo_pmsmfoc_system')
rtwdemo_pmsmfoc_plotsignals(logsout)

プロットは、motor_on 信号が true になるまでモーターが定常状態であることを示します。既知の位置が検出されるまでモーターは開ループで回転します。これはエンコーダー インデックス パルスで示されます。コントローラーは閉ループ動作に遷移し、モーターは定常状態の速度に達します。

モデル アーキテクチャの検査

この節では、データの指定方法、コントローラーがテスト ベンチから区分される方法、コントローラーのスケジュール方法など、モデル アーキテクチャを説明します。このアーキテクチャでは、システム シミュレーション、アルゴリズム コード生成、PIL テストを使用します。

データ定義ファイルはシミュレーションとコード生成に必要な MATLAB データを作成します。このデータ ファイルは、自動的にシステム テスト ベンチ モデルの PreLoadFcn コールバック内で実行されます。

edit('rtwdemo_pmsmfoc_data.m')

システム テスト ベンチ モデル内で、組み込みプロセッサは周辺機器とコントローラー ソフトウェアの組み合わせとしてモデル化されます。

open_system('rtwdemo_pmsmfoc_system/Embedded Processor')

コントローラー ソフトウェアは分離したモデルとして指定されます。このモデル内で、Mode_Scheduler サブシステムは Stateflow を使用して Motor_Control アルゴリズムの各種動作モードをスケジュールします。

open_system('rtwdemo_pmsmfoc')

Motor_Control サブシステム内で、センサー信号はエンジニアリング ユニットに変換され、コア コントローラー アルゴリズムに渡されます。コントローラー アルゴリズムは電圧を計算します。電圧はドライバー信号に変換されます。

open_system('rtwdemo_pmsmfoc/Motor_Control')

第一制御則は、ベクトル制御コントローラーです。コントローラーには、速度を制御する遅いレートの外部ループと、電流を制御する速いレートの内部ループがあります。

open_system('rtwdemo_pmsmfoc/Motor_Control/Field_Oriented_Controller')

Velocity Controller 外部ループは、Current Control ループ時間の倍数として実行されます。これらのサンプル時間を指定する MATLAB 変数を表示できます。

fprintf('High rate sample time = %f seconds\n', ctrlConst.TsHi)
fprintf('Low rate sample time  = %f seconds\n', ctrlConst.TsLo)
High rate sample time = 0.000040 seconds
Low rate sample time  = 0.005000 seconds

コントローラー アルゴリズムの最高レートは 25 kHz です。

fprintf('High rate frequency = %5.0f Hz\n', 1/ctrlConst.TsHi)
High rate frequency = 25000 Hz

組み込みアプリケーションに統合するコントローラー C コードの生成

この節では、コントローラーの C コード関数を生成して、可視化して検査します。

統合を簡単にするため、コントローラー モデルをシングルタスク モードで設定し、生成されたコードを 1 つの関数呼び出しで呼び出せるようにします。この関数は、遅いレートと速いレートを処理します。 生成されたコントローラー関数は、速いレートのサンプル時間で実行されなければなりません。

関数プロトタイプはモデル コンフィギュレーション パラメーターで指定され、入力ポートおよび出力ポートは引数として渡されます。コントローラー アルゴリズムの関数仕様を表示できます。

mdlFcn = RTW.getFunctionSpecification('rtwdemo_pmsmfoc');
disp(mdlFcn.getPreview('init'))
disp(mdlFcn.getPreview('step'))
Controller_Init ( )
error = Controller ( motor_on, command_type, current_request, * sensors, * pwm_compare )

生成されたコードのグローバル構造体を使用して、ベクトル制御コントローラーの比例ゲインおよび積分ゲインにアクセスできます。このグローバル構造体はデータ定義ファイルで指定されます。

disp(ctrlParams.Value)
disp(ctrlParams.CoderInfo)
                            Current_P: 10
                            Current_I: 10000
                           Velocity_P: 0.0050
                           Velocity_I: 0.0150
                           Position_P: 0.1000
                           Position_I: 0.6000
                  StartupAcceleration: 1
                       StartupCurrent: 0.2000
                   RampToStopVelocity: 20
             AdcZeroOffsetDriverUnits: 2.2523e+03
                 AdcDriverUnitsToAmps: 0.0049
    EncoderToMechanicalZeroOffsetRads: 0
                        PmsmPolePairs: 4

Simulink.CoderInfo
    StorageClass: 'ExportedGlobal'
           Alias: ''
       Alignment: -1

モデルから次のようにして C コードを生成します。

rtwbuild('rtwdemo_pmsmfoc')
### Starting build procedure for model: rtwdemo_pmsmfoc
### Successful completion of build procedure for model: rtwdemo_pmsmfoc

生成されたレポートを使用して生成された C コード ファイルを検証し、正しいステップおよび初期化関数が生成されていることを確認します。また、パラメーター構造体がグローバル変数として作成されていることを確認します。

コントローラー モデルのリファレンス動作の確立

この節では、テスト入力とリファレンス出力を確立して、動作を検証し、PIL テスト中の実行時間をプロファイルします。コントローラー モデルのローカル コピーを作成し、コントローラー内で異なるモードを実行する一連のテスト入力信号を読み込みます。コントローラー モデルをこれらの記録された信号を入力ポートに負荷するように設定し、コントローラー モデルを実行して、出力ポート信号をワークスペースに記録します。

リファレンス動作とテスト環境の確立に使用されたコントローラー モデルのコンフィギュレーション パラメーターは、以下で示すように変更されます。コントローラー モデルの設計の指定と量産コードの生成のために使用されたブロックおよびパラメーターは、変化しません。 ただし、インストールしたコントローラー モデルを一切変更しないようにするため、モデルを保存して名前を rtwdemo_pmsmfoc_local.slx に変更します。

save_system('rtwdemo_pmsmfoc','rtwdemo_pmsmfoc_local.slx')
close_system('rtwdemo_pmsmfoc_system.mdl',0);
close_system('rtwdemo_pmsmfoc.mdl',0);

実行時間をプロファイルするため、コントローラー内の該当するパスを実行する一連のテスト入力を選択します。このテスト入力とリファレンス出力を獲得する 1 つの方法は、システム シミュレーション モデルからログに記録することです。

in.motor_on      = logsout.getElement('motor_on').Values;
in.command_type  = logsout.getElement('command_type').Values;
in.command_value = logsout.getElement('command_value').Values;
in.sensors       = logsout.getElement('sensors').Values;
display(in)
in = 

         motor_on: [1x1 timeseries]
     command_type: [1x1 timeseries]
    command_value: [1x1 timeseries]
          sensors: [1x1 struct]

これらの信号を入力ポートに付加して、コントローラー モデルにインポートして、システム モデルとは独立して直接実行されるようにすることができます。このアプローチの利点は、コントローラー モデルをスタンドアロンのコンポーネントとしてテストと検証を行い、再利用とその他のシステム モデルまたは閉ループ テスト ベンチとの統合を可能にできることです。コントローラー モデルをテスト用に詳細化または準備するには、コンフィギュレーション パラメーターを変更して入力信号とログ信号を MATLAB ワークスペースに記録します。これらの変更はモデルの [コンフィギュレーション パラメーター] ダイアログでグラフィカルに行ったり、以下に示すようにプログラムで行うことができます。

set_param('rtwdemo_pmsmfoc_local',...
    'LoadExternalInput', 'on',...
    'ExternalInput', 'in.motor_on, in.command_type, in.command_value, in.sensors',...
    'StopTime','0.06',...
    'ZeroInternalMemoryAtStartup','on',...
    'SimulationMode', 'normal')
save_system('rtwdemo_pmsmfoc_local.slx')

コントローラー モデルを実行して、PWM Compare 出力ポートと関連付けられた信号をプロットできるようになります。

sim('rtwdemo_pmsmfoc_local')
controller_mode = logsout.getElement('controller_mode').Values;
pwm_compare_ref = logsout.getElement('pwm_compare').Values;
rtwdemo_pmsmfoc_plotpwmcompare(controller_mode, pwm_compare_ref)

ログに記録された出力を、PIL テストのリファレンス動作として使用します。

プロットには、各タイム ステップでのコントローラーのモードについての情報が注釈として付けられます。このモード情報は、実行プロファイル情報を解釈する際に役に立ちます。

PIL 実装の作成

この節では、PIL 実装の例題を使用して学びます。Embedded Coder の必要なヘルプ ドキュメンテーションを確認することから始めます。次に、PIL 実装の例をローカル ディレクトリにコピーして、Simulink で登録します。PIL 実装の開発に使用したアプローチを確認して、関連するファイルを調査して追加の情報を得ます。Spectrum Digital Inc. eZdsp F28335 ボードと Code Composer v4 およびシリアル接続を使用している場合、この PIL 実装がコントローラー モデルと直接動作するように構成できます。別のプロセッサを使用している場合は、この PIL 実装を開始点として使用して、独自の実装を作成できます。

カスタム PIL 実装の基礎は、「ターゲットの接続性設定の作成ターゲットの接続性設定の作成」に記載されています。PIL テスト中に Simulink (ホスト側) と組み込みプロセッサ (ターゲット側) との通信を利用するには、rtiostream API 使用の基本概念に習熟する必要があります。Embedded Coder™ は、既定の TCP/IP 実装のホスト側ドライバー (Simulink でサポートされるすべてのプラットフォーム用) と、シリアル通信用の Windows 専用バージョンのドライバーを提供することに注意してください。生成されたコードのビルドは、「テンプレート makefile のカスタマイズテンプレート makefile のカスタマイズ」で説明するように makefile を使用して行います。PIL 実装を作成するには、ターゲット側通信ドライバーの作成、生成されたコードをビルドするための makefile の作成、ビルドした実行可能ファイルのダウンロードと実行の自動化など、組み込み環境でいくつかのタスクを実行する必要があります。

上記のアプローチを使用して、PIL 実装が Spectrum Digital Inc. eZdsp F28335 ボード用に作成されました。以下は、この実装で使用されたターゲット接続性 API コンポーネントの概要です。

  • ホスト側通信 - ホスト側の接続ドライバーは、シリアル通信を使用するように設定されます。

  • ターゲット側通信 - ターゲット側通信は、手動の rtiostream 関数実装と、タイマー アクセス関数を使用して達成されます。

  • ビルド プロセス - makefile ベースのアプローチを使用して、実行可能なアプリケーションを作成します。

  • ランチャー - 実行可能ファイルのダウンロードと実行は、Code Composer Studio™ v4 (CCSv4) の Debug Server Scripting (DSS) ユーティリティを使用して行われます。

PIL 実行は 3 段階で再帰的に開発されています。以下は、これらのステージの説明と、各ステージで実行されるタスクです。独自の PIL 実装を開発する際は、同様のアプローチに従うと便利です。

ステージ 1:CCSv4 でシリアル通信アプリケーションを作成する

  • CCSv4 をインストールして、F28335 eZdsp ボードと接続できることを確認します。

  • シリアル データを送受信する組み込みアプリケーションを作成します。

  • ホスト コンピューターと組み込みアプリケーション間でシリアル通信をテストします。

  • コンパイラ、リンカー、アーカイブのコマンドとオプションを特定して、makefile を使用してアプリケーションをビルドします。

  • DSS ユーティリティを使用して、Windows コマンド プロンプトからアプリケーションをダウンロードして実行します。

ステージ 2:組み込みシリアル rtiostream を実装してテストし、MATLAB で自動化を開始する

  • シリアル アプリケーションを拡張して、データのエコーに rtiostream API 関数を実装します。rtIOStreamOpen を作成して、シリアル ポートの設定などの汎用ボード初期化を実行します。

  • 関数 rtiostream_wrapper を使用して、MATLAB から組み込みプロセッサとのシリアル データの送受信を検証します。

  • DSS ユーティリティを呼び出すシステム コマンドを使用して、MATLAB からアプリケーションをダウンロードして実行します。

ステージ 3:Simulink との接続性コンフィギュレーションを実装してテストする

  • 接続性コンフィギュレーションクラスを作成して、ホスト側シリアル通信を構成し、rtiostream アプリケーションがビルド プロセスで含まれるターゲット側コード ファイルを指定し、プロファイリング データの収集に使用されるタイマーへのアクセス方法を指定し、組み込みアプリケーションを起動する DSS ユーティリティの呼び出しを統合します。

  • コンパイラ、リンカー、アーカイブのコマンドとオプションを指定する、ツール仕様 makefile (target_tools.mk) を作成します。この makefile はテンプレート makefile (target_tools.mk) に含まれています。

  • target_tools.mk を含むテンプレート makefile (ec_target.tmf) を作成します。

  • インストールに依存するパラメーターを特定して、MATLAB 設定として保存します。

  • PIL 実装が有効な場合を指定する Simulink カスタマイズ ファイルを作成します。

この PIL 実装に関連付けられたファイルは Embedded Coder に付属していますが、MATLAB パスにはありません。これらのファイルを確認するため、これをローカル ディレクトリにコピーできます。このディレクトリを MATLAB パスに追加して Simulink カスタマイズを更新することで、この PIL 実装を登録できます。

%copyfile(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335'),'examplePilF28335','f')
addpath(genpath(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335')))
sl_refresh_customizations

MATLAB 設定を使用して、パス情報とホスト シリアル COM ポート番号を指定します。この PIL 実装を直接使用している場合、これらの設定をコンフィギュレーションに適切に指定しなければなりません。

TI_F28xxx_SysSWDir 設定は Texas Instruments™ が指定する C2000™ Experimenter Kit Application Software (sprc675.zip) 内のディレクトリを参照することに注意してください。これらのファイルは Embedded Coder には付属していません。

setpref('examplePilF28335','examplePilF28335Dir', fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335'));
setpref('examplePilF28335','CCSRootDir',          'C:\Program Files\Texas Instruments\ccsv4');
setpref('examplePilF28335','TI_F28xxx_SysSWDir',  'C:\Program Files\Texas Instruments\TI_F28xxx_SysSW');
setpref('examplePilF28335','targetConfigFile',    fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335','f28335_ezdsp.ccxml'));
setpref('examplePilF28335','baudRate',            115200);
setpref('examplePilF28335','cpuClockRateMHz',     150);
setpref('examplePilF28335','boardConfigPLL',      10);
setpref('examplePilF28335','COMPort',             'COM4');

PIL 実装を使用する準備ができました。

PIL テスト向けのコントローラー モデルの準備

この節では、PIL 実装を使用するためのコントローラー モデルを構成します。PIL 実装の登録に使用したカスタマイズ ファイルを確認して、PIL 実装を使用するようにモデルのコンフィギュレーション パラメーターを設定し、コントローラー出力と実行プロファイル データのログ記録を有効にします。

PIL モードでシミュレーションを開始するとき、Simulink は登録された PIL 実装が有効であるかどうかを確認します。カスタマイズ ファイルは、有効な PIL 実装に対応するコンフィギュレーション パラメーターを指定します。次のコマンドを呼び出して、この実装のカスタマイズ ファイルを確認できます。

edit(fullfile(matlabroot,'toolbox','rtw','rtwdemos','examplePilF28335','sl_customization.m'));

このファイルは、この PIL 実装を使用するために必要なハードウェア デバイスとテンプレート makefile の設定を指定することに注意してください。コントローラー モデルのコンフィギュレーション パラメーターを、これらの設定に一致するように変更できます。これらの変更はモデルの [コンフィギュレーション パラメーター] ダイアログでグラフィカルに行ったり、以下に示すようにプログラムで行うことができます。

set_param('rtwdemo_pmsmfoc_local',...
       'ProdHWDeviceType', 'Texas Instruments->C2000',...
       'TemplateMakefile', 'ec_target.tmf',...
       'GenCodeOnly', 'off',...
       'SimulationMode', 'processor-in-the-loop (pil)')

シミュレーション出力値を変数 pilOut として記録し、実行プロファイル情報を変数 executionProfile として記録して、PIL テスト中に実行プロファイル情報の収集を指定できます。これらの変更はモデルの [コンフィギュレーション パラメーター] ダイアログでグラフィカルに行ったり、以下に示すようにプログラムで行うことができます。

set_param('rtwdemo_pmsmfoc_local',...
    'CodeExecutionProfiling', 'on',...
    'CodeExecutionProfileVariable','executionProfile',...
    'CodeProfilingSaveOptions','AllData');
save_system('rtwdemo_pmsmfoc_local.slx')

コントローラー モデルを PIL モードで実行できるようになりました。

生成したコードの動作と実行時間のテスト

この節では、コントローラー モデルを PIL モードで実行して、動作と実行プロファイルの結果を確認します。コンパイルされたコントローラー コードの動作がリファレンス シミュレーション動作と一致することを検証し、コードの実行がタイミング要件を満たすことを確認します。

モデルを実行して PIL シミュレーションの結果をプロットできます。モデルをはじめて開始するとき、Embedded Coder はアルゴリズムのコードを生成し、アルゴリズム コードをシリアル通信インターフェイス コードとリンクし、組み込みアプリケーションをビルドして、アプリケーションをボードにダウンロードし、ターゲット上のシミュレーションを開始します。以降の PIL シミュレーション中は、コードはモデルが変更されたときのみ再生成されることに注意してください。シリアル通信インターフェイスに関連するオーバーヘッドにより、PIL シミュレーションはノーマル モードのモデルより低速で実行されることがあります。

以下の MATLAB コマンドは、ハードウェアとの接続が必要で、前述の組み込み開発ツールを使用するため、意図的にコメントアウトされています。ハードウェアが接続され、組み込み開発ツールがインストールされている場合は、コメントを解除してこれらの行を実行してモデルを実行し、結果をプロットして、動作がノーマル モードで実行したシミュレーションと数値が等しいことを確認します。それ以外の場合は、この節の先を確認しながら PIL 実行分析オプションを理解します。

% UNCOMMENT THE BELOW LINES TO RUN THE SIMULATION AND PLOT THE RESULTS
% if exist('slprj','dir'), rmdir('slprj','s'); end
% sim('rtwdemo_pmsmfoc_local')
% pwm_compare_pil = logsout.getElement('pwm_compare').Values;
% rtwdemo_pmsmfoc_plotpwmcompare_pil(controller_mode, pwm_compare_pil, executionProfile)

上部プロットはコントローラーの出力、PWM Compare です。PIL モードでの出力は、「コントローラー モデルのリファレンス動作の確立」の節で示したノーマル モードでのシミュレーションの出力と似ています。ノーマル モードの出力を PIL モード シミュレーションの出力から差し引いて、数値が等しいことを確認します。

% UNCOMMENT THE BELOW LINE TO VERIFY NUMERICAL EQUIVALENCE OF THE OUTPUTS
% pilErrorWithRespectToReference = sum(abs(pwm_compare_pil.Data - pwm_compare_pil.Data))
pilErrorWithRespectToReference =
   0     0     0

下部プロットは、各シミュレーション タイム ステップでのコントローラー モデルの実行時間の量です。"スタンバイ" 状態は最も時間がかかりません。コントローラーがマルチレートでシングル タスクであるため、実行時間中に小さい周期的なスパイクが発生します。周期的なスパイクは、ベース レートと 5 ミリ秒レートのコードを同じタスクで実行するために必要な時間に対応します。

コントローラーは組み込みプロセッサで 25 kHz で実行されなければならないため、アルゴリズムは 40 マイクロ秒内で実行を完了しなければなりません (その他のコードが要求する追加の時間を差し引きます。最終アプリケーションでも実行される場合があります)。プロファイル結果は、アルゴリズムは組み込み環境のこのコンフィギュレーションに割り当てられた時間内に実行されることを示します。

生成されたコードは検証され、数値が等しい結果が得られ、このテスト ケースの実行タイミング要件を満たします。

PIL 実装に使用された MATLAB 設定は MATLAB セッション間で維持されます。この設定を削除するには、以下のコードを実行します。

rmpref('examplePilF28335');
rmexamplePilF28335hooks();

まとめ

この例では、永久磁石同期機のベクトル制御アルゴリズムを使用してシステム レベルのシミュレーションとアルゴリズム コード生成を示し、コントローラー アルゴリズムの機能的動作を説明しました。また、任意の組み込みプロセッサのターゲット統合、機能テスト、実行プロファイルの一般的なアプローチを説明しました。アルゴリズムの動作が正しくなったら、コードがコントローラー モデルから生成され、ターゲット プロセッサでテストされ、プロファイルされます。アルゴリズム コードが検証され、今後のテストのため、モーター ハードウェアとインターフェイスする組み込みソフトウェアと統合できるようになります。