このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
永久磁石同期機のベクトル制御
この例では、モーター制御アルゴリズムから C コードを生成し、コンパイルした動作と実行時間を確認するための基本ワークフローと主要な API に示します。プロセッサインザループ (PIL) シミュレーションを使用して、C コードをモーター ハードウェアとやりとりする組み込みソフトウェアに統合したときに予期したとおりに動作することを確認します。このワークフローでは特定のプロセッサ向けのモーター制御アプリケーションを使用しますが、このワークフローは他のアプリケーションおよびプロセッサにも適用できます。
永久磁石同期機のベクトル制御アルゴリズムを使用して、このワークフローを説明します。この制御テクニックは、ハイブリッド電気自動車向けのモーター駆動システム、製造機器、産業オートメーションの共通しています。
概要
この例では、制御アルゴリズム モデルから C コードを生成して検証します。これをモーター ハードウェアとのインターフェイスに必要な追加の組み込みソフトウェアに統合できます。
シミュレーション環境を使用して、閉ループ モーター制御システムの動作をモデル化し、検証します。制御システム動作が仕様に従ったら、コントローラー モデルから C コードを生成します。コードを検査した後、機能的動作と実行時間をプロセッサインザループ (PIL) テストを使用して評価します。
PIL テストを行うため、コントローラー モデルを実行してリファレンス出力を確立するためのテスト信号を選択します。シリアル接続でホスト コンピューター上の Simulink® と通信する Texas Instruments™ F28335 プロセッサの PIL 実装の例題を確認します。このサンプルを開始点として、独自のプロセッサ向けに PIL 実装を作成します。コントローラー モデルを PIL モードで実行して実行時間を測定し、組み込みプロセッサ上で実行するコードの実行動作をシミュレーション リファレンス出力に照らして検証します。
組み込みプロセッサへの最終実装では、生成されたコントローラー C コードを、周辺装置や割り込みなど、モーター ハードウェアとのインターフェイスに必要な追加の組み込みソフトウェアと統合します。
メモ:
「システム シミュレーションによる動作の確認」のセクションでは、システム シミュレーションに Simscape™ Electrical™ が必要です。その他のタスクでは不要です。
Texas Instruments F28335 PIL 実装は参考のために示した方法で、事実上どのようなプロセッサにも適用できます。ただし、この実装を直接使用するには、Texas Instruments の追加のサポート ファイル、コンパイラ、ツールが必要になります。これらの詳細については、この例の「PIL 実装の作成と Simulink での登録」のセクションを参照してください。この参考用の PIL 実装に Embedded Coder® の Texas Instruments C2000™ 組み込みターゲット機能は不要ですが、C2000 ユーザーにはアドオン エクスプローラーを使用して Texas Instruments C2000 サポート パッケージをインストールすることをお勧めします。
システム シミュレーションによる動作の確認
この節では、コントローラーを閉ループ システム シミュレーションで検証します。
システム モデル テスト ベンチは、テスト入力、組み込みプロセッサ、電力用電子部品、モーター ハードウェア、可視化で構成されています。システム モデルを使用してコントローラーを実行し、予期された動作を調査できます。次のコマンドを使用してモデルを実行して、記録された信号をプロットできます。
open_system('rtwdemo_pmsmfoc_system') out_system = sim('rtwdemo_pmsmfoc_system') rtwdemo_pmsmfoc_plotsignals(out_system.logsout)
out_system = Simulink.SimulationOutput: logsout: [1x1 Simulink.SimulationData.Dataset] SimulationMetadata: [1x1 Simulink.SimulationMetadata] ErrorMessage: [0x0 char]
プロットは、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.2522e+03 AdcDriverUnitsToAmps: 0.0049 EncoderToMechanicalZeroOffsetRads: 0 PmsmPolePairs: 4 Simulink.CoderInfo StorageClass: 'ExportedGlobal' Identifier: '' Alignment: -1
モデルから次のようにして C コードを生成します。
slbuild('rtwdemo_pmsmfoc')
### Starting build procedure for: rtwdemo_pmsmfoc ### Successful completion of build procedure for: rtwdemo_pmsmfoc Build Summary Top model targets built: Model Action Rebuild Reason ================================================================================================= rtwdemo_pmsmfoc Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 1m 12.342s
生成されたレポートを使用して生成された C コード ファイルを検証し、正しいステップおよび初期化関数が生成されていることを確認します。また、パラメーター構造体がグローバル変数として作成されていることを確認します。
コントローラー モデルのリファレンス動作の確立
この節では、テスト入力とリファレンス出力を確立して、動作を検証し、PIL テスト中の実行時間をプロファイルします。コントローラー モデルのローカル コピーを作成し、コントローラー内で異なるモードを実行する一連のテスト入力信号を読み込みます。コントローラー モデルをこれらの記録された信号を入力ポートに負荷するように設定し、コントローラー モデルを実行して、出力ポート信号をワークスペースに記録します。
リファレンス動作とテスト環境の確立に使用されたコントローラー モデルのコンフィギュレーション パラメーターは、以下で示すように変更されます。コントローラー モデルの設計の指定と量産コードの生成のために使用されたブロックおよびパラメーターは、変化しません。ただし、インストールしたコントローラー モデルを一切変更しないようにするため、モデルを保存して名前を rtwdemo_pmsmfoc_local.slx
に変更します。
save_system('rtwdemo_pmsmfoc','rtwdemo_pmsmfoc_local.slx') close_system('rtwdemo_pmsmfoc_system',0); close_system('rtwdemo_pmsmfoc',0);
実行時間をプロファイルするため、コントローラー内の該当するパスを実行する一連のテスト入力を選択します。このテスト入力とリファレンス出力を獲得する 1 つの方法は、システム シミュレーション モデルからログに記録することです。
in.motor_on = out_system.logsout.getElement('motor_on').Values; in.command_type = out_system.logsout.getElement('command_type').Values; in.command_value = out_system.logsout.getElement('command_value').Values; in.sensors = out_system.logsout.getElement('sensors').Values; display(in)
in = struct with fields: motor_on: [1×1 timeseries] command_type: [1×1 timeseries] command_value: [1×1 timeseries] sensors: [1×1 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 出力ポートと関連付けられた信号をプロットできるようになります。
out = sim('rtwdemo_pmsmfoc_local') controller_mode = out.logsout.getElement('controller_mode').Values; pwm_compare_ref = out.logsout.getElement('pwm_compare').Values; rtwdemo_pmsmfoc_plotpwmcompare(controller_mode, pwm_compare_ref)
out = Simulink.SimulationOutput: logsout: [1x1 Simulink.SimulationData.Dataset] SimulationMetadata: [1x1 Simulink.SimulationMetadata] ErrorMessage: [0x0 char]
ログに記録された出力を、PIL テストのリファレンス動作として使用します。
プロットには、各タイム ステップでのコントローラーのモードについての情報が注釈として付けられます。このモード情報は、実行プロファイル情報を解釈する際に役に立ちます。
PIL 実装の作成
この節では、PIL 実装の例題を使用して学びます。Embedded Coder の必要なヘルプ ドキュメンテーションを確認することから始めます。次に、PIL 実装の例をローカル ディレクトリにコピーして、Simulink で登録します。PIL 実装の開発に使用したアプローチを確認して、関連するファイルを調査して追加の情報を得ます。Spectrum Digital Inc. eZdsp F28335 ボードと Code Composer v4 およびシリアル接続を使用している場合、この PIL 実装がコントローラー モデルと直接動作するように構成できます。別のプロセッサを使用している場合は、この PIL 実装を開始点として使用して、独自の実装を作成できます。
カスタム PIL 実装の作成の基礎は、Create PIL Target Connectivity Configuration for Simulinkに記載されています。PIL テスト中に Simulink (ホスト側) と組み込みプロセッサ (ターゲット側) との通信を利用するには、rtiostream API の使用の基本概念に習熟する必要があります。Embedded Coder は、既定の TCP/IP 実装のホスト側ドライバー (Simulink でサポートされるすべてのプラットフォーム用) と、シリアル通信用の Windows® 専用バージョンのドライバーを提供することに注意してください。生成されたコードのビルドは、テンプレート 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 % out = sim('rtwdemo_pmsmfoc_local') % pwm_compare_pil = out.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 マイクロ秒内で実行を完了しなければなりません (その他のコードが要求する追加の時間を差し引きます。最終アプリケーションでも実行される場合があります)。プロファイル結果は、アルゴリズムは組み込み環境のこのコンフィギュレーションに割り当てられた時間内に実行されることを示します。
生成されたコードは検証され、数値が等しい結果が得られ、このテスト ケースの実行タイミング要件を満たします。
close_system('rtwdemo_pmsmfoc_local',0); close_system('power_utile',0);
PIL 実装に使用された MATLAB 基本設定は MATLAB セッション間で維持されます。これらの基本設定を削除するには、次のコマンドを実行します。
rmpref('examplePilF28335');
rmexamplePilF28335hooks();
まとめ
この例では、永久磁石同期機のベクトル制御アルゴリズムを使用してシステム レベルのシミュレーションとアルゴリズム コード生成を示し、コントローラー アルゴリズムの機能的動作を説明しました。また、任意の組み込みプロセッサのターゲット統合、機能テスト、実行プロファイルの一般的なアプローチを説明しました。アルゴリズムの動作が正しくなったら、コードがコントローラー モデルから生成され、ターゲット プロセッサでテストされ、プロファイルされます。アルゴリズム コードが検証され、今後のテストのため、モーター ハードウェアとインターフェイスする組み込みソフトウェアと統合できるようになります。
関連するトピック
- SIL シミュレーションおよび PIL シミュレーション
- SIL アプローチまたは PIL アプローチの選択
- Create PIL Target Connectivity Configuration for Simulink
- Configure and Run SIL Simulation
- Create Execution-Time Profile for Generated Code
- MATLAB Project for FOC of PMSM with Quadrature Encoder (Motor Control Blockset)
- Algorithm-Export Workflows for Custom Hardware (Motor Control Blockset)