永久磁石同期電機の磁場ベクトル制御:システムシミュレーションからCコード生成まで

目次

概要

システムシミュレーションによる動作検証

モデルアーキテクチャの探索

埋込みアプリケーション統合用コントローラCコードの生成

コントローラモデルの参照動作の指定

PIL実装の作成

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

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

結論

この例では、モータ制御アルゴリズムから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('PMSMSystem');
out_system = sim('PMSMSystem');
pmsmfoc_plotsignals(out_system.logsout);

プロットは、motor_on信号が真(true)になるまでモータが停止状態にあることを示しています。その後、モータはオープンループ方式で回転を開始し、エンコーダのインパルスパルスが既知の位置が検出されたことを示すまで続きます。その後、コントローラは閉ループ操作に切り替わり、モータは定常速度に達します。

モデルアーキテクチャの探索

このセクションでは、データの設定方法、テストベンチからのコントローラの分割方法、スケジューリング方法を含むモデルアーキテクチャを探ります。このアーキテクチャは、システムシミュレーション、アルゴリズムコード生成、PILテストを容易にします。

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

edit('pmsmfoc_data.m')

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

open_system('PMSMSystem/Embedded Processor');

コントローラソフトウェアは、個別のモデルで指定されます。そのモデルでは、Mode_SchedulerサブシステムがStateflow®を使用してMotor_Controlアルゴリズムのさまざまな操作モードをスケジュールします。

open_system('PMSMController');

Motor_Controlサブシステムでは、センサ信号がエンジニアリング単位に変換され、コアコントローラアルゴリズムに渡されます。コントローラアルゴリズムは電圧を計算します。その後、電圧は駆動信号に変換されます。

open_system('PMSMController/Motor_Control');

磁場ベクトルコントローラが主な制御役割を担います。このコントローラは、低速外ループで速度を制御し、高速内ループで電流を制御します。

open_system('PMSMController/Motor_Control/Field_Oriented_Controller');

速度コントローラ外ループは、電流制御ループ時間の倍数で実行されます。これらのサンプル時間を指定する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コードを生成し、視覚的に検証します。

統合を容易にするために、コントローラモデルを単一タスクモードに設定し、生成されたコードを単一の関数呼び出しで呼び出せるようにします。この関数は、低速と高速の両方のレートを処理します。生成されたコントローラ関数は、高速サンプル時間で実行する必要があります。

関数プロトタイプはモデル設定パラメータで指定され、入力ポートと出力ポートがパラメータとして渡されます。コントローラアルゴリズムの関数指定を確認できます。

mdlFcn = RTW.getFunctionSpecification('PMSMController');
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('PMSMController');
### Starting build procedure for: PMSMController
### Successful completion of build procedure for: PMSMController

Build Summary

Top model targets built:

Model           Action                        Rebuild Reason                                    
================================================================================================
PMSMController  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 0m 29.573s

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

コントローラモデルの参照動作の指定

このセクションでは、PILテスト中の動作の検証と実行時間のプロファイリングに役立つ参照出力を指定するためのテスト入力を指定します。

コントローラモデルのローカルコピーを作成し、コントローラ内で異なるモードを実行する一連のテスト入力信号を読み込みます。コントローラモデルを設定して、記録された信号を入力ポートに接続します。次に、コントローラモデルを実行し、出力ポート信号をワークスペースに記録します。

参照動作とテスト環境を指定するコントローラモデルの設定パラメータは、次のように変更されます。コントローラモデルの設計と実稼働コードの生成を指定するモジュールとパラメータは変更されません。ただし、インストールされたコントローラモデルの部分を変更しないように、モデルを保存し、その名前をPMSMControllerLocal.slxに変更します。

save_system('PMSMController','PMSMControllerLocal.slx')
close_system('PMSMSystem',0);
close_system('PMSMController',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;
disp(in)
         motor_on: [1×1 timeseries]
     command_type: [1×1 timeseries]
    command_value: [1×1 timeseries]
          sensors: [1×1 struct]

信号を入力ポートに追加し、信号をコントローラモデルにインポートして、システムモデル内で直接独立して実行できるようにできます。この方法の利点は、コントローラモデルを再利用可能な独立コンポーネントとしてテストおよび検証し、他のシステムモデルまたは閉ループテストベンチとの統合を容易にできることです。テスト用のコントローラモデルを詳細に説明または準備するには、その設定パラメータを変更して入力信号を追加し、MATLABワークスペースにログ信号を記録します。この変更は「構成パラメータ」ダイアログボックスで行うか、プログラムで次のように行います。

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

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

out = sim('PMSMControllerLocal');
controller_mode = out.logsout.getElement('controller_mode').Values;
pwm_compare_ref = out.logsout.getElement('pwm_compare').Values;
pmsmfoc_plotpwmcompare(controller_mode, pwm_compare_ref)

記録された出力はPILテストの参照動作として使用されます。

プロットには、各タイムステップに関するコントローラモード情報を説明する注釈が付けられています。このモード情報は、実行プロファイリング情報を解釈する際に非常に役立ちます。

PIL実装の作成

このセクションでは、例示的なPIL実装を学び使用します。まず、Embedded Coderが提供する前提条件ヘルプドキュメントを確認します。次に、例示的なPIL実装をローカルフォルダーにコピーし、Simulinkにその実装を登録します。PIL実装の開発方法を確認し、関連ファイルを探索してさらに洞察を得ます。Spectrum Digital Inc.のCode Composer v4を搭載したeZdsp F28335ボードとシリアル接続を使用している場合、コントローラモデルと連携するようにPIL実装を構成できます。別のプロセッサを使用している場合、PIL実装を実装の出発点として使用できます。

「Create PIL Target Connectivity Configuration for Simulink」では、カスタムPIL実装の作成の基本について説明します。PILテスト中にSimulink(ホスト側)と埋込みプロセッサ(ターゲット側)間の通信を行うために、rtiostream APIの概念に慣れてください。Embedded Coderは、SimulinkがサポートするすべてのプラットフォームでデフォルトのTCP/IP実装のホスト側ドライバ(Windows®専用のシリアル通信サポート版も含む)を提供していることに注意してください。ビルドファイルを使用して生成されたコードをコンパイルします。「Customize Template Makefiles」を参照してください。PIL実装を作成するには、ターゲット側通信ドライバの作成、生成されたコードをコンパイルするためのビルドファイルの作成、コンパイルされた実行可能ファイルのダウンロードと実行の自動化など、埋込み環境でいくつかのタスクを実行する必要があります。

この方法で作成されたPIL実装は、Spectrum Digital Inc.のeZdsp F28335ボードで使用できます。この実装には、次のターゲット接続APIコンポーネントが含まれています。

  • ホスト側通信 - ホスト側接続ドライバはシリアル通信を使用するように構成されています。
  • ターゲット側通信 - ターゲット側通信には、rtiostream関数とタイマーアクセス関数の手書きシリアル実装が必要です。
  • コンパイルプロセス - ビルドファイルベースの方法を使用して実行可能アプリケーションをコンパイルします。
  • ブートローダ - Code Composer Studio™ v4 (CCSv4)のデバッグサーバースクリプト(DSS)ユーティリティを使用して、実行可能ファイルをダウンロードして実行します。

PIL実装は3つの段階で反復開発されます。PIL実装を開発する際には、同様の方法を使用できます。

第1段階:CCSv4を使用したシリアル通信アプリケーションの作成

  • CCSv4をインストールし、F28335 eZdspボードに接続できることを確認します。
  • シリアルデータの送受信用の埋込みアプリケーションを作成します。
  • 開発コンピュータと埋込みアプリケーション間のシリアル通信をテストします。
  • ビルドファイルを使用してアプリケーションをコンパイルするために、コンパイラ、リンカー、パッカーが使用するコマンドとオプションを特定します。
  • DSSユーティリティを使用して、Windowsコマンドプロンプトからアプリケーションをダウンロードして実行します。

第2段階:MATLABを使用した埋込みシリアルrtiostreamの実装とテスト

  • シリアルアプリケーションを拡張して、データをエコーするrtiostream API関数を実装します。rtIOStreamOpenを作成して、シリアルポートの構成を含む一般的なボード初期化を実行します。
  • rtiostream_wrapper関数を使用して、埋込みプロセッサからMATLABへのシリアルデータの送受信を検証します。
  • システムコマンドを使用してDSSユーティリティを呼び出し、MATLABからアプリケーションをダウンロードして実行します。

第3段階:Simulinkを使用した接続構成の実装とテスト

  • ホスト側シリアル通信を構成する接続構成クラスを作成し、コンパイルプロセスにターゲット側コードファイル(rtiostreamアプリケーション内)を含める必要があることを指定し、プロファイリングデータの収集に使用されるタイマーへのアクセス方法を指定し、埋込みアプリケーションを起動するためにDSSユーティリティを呼び出すことを統合します。
  • コンパイラ、リンカー、パッカーのコマンドとオプションを指定するツール設定ビルドファイル(target_tools.mk)を作成します。このビルドファイルは、テンプレートビルドファイル(target_tools.mk)に含まれます。
  • target_tools.mkを含むテンプレートビルドファイル(ec_target.tmf)を作成します。
  • インストールに依存する可能性のあるパラメータを特定し、それらをMATLABプリセットとして保存します。
  • PIL実装がいつ有効であるかを指定するSimulinkカスタムファイルを作成します。

PIL実装に関連付けられたファイルはEmbedded Coderに含まれていますが、MATLABパス上にはありません。これらのファイルを参照するには、それらをローカルフォルダーにコピーできます。フォルダーをMATLABパスに追加し、Simulinkカスタマイズをリフレッシュすることで、PIL実装を登録できます。

addpath(genpath(fullfile('.','examplePilF28335')))
sl_refresh_customizations

MATLABプリセットを使用して、パス情報とホストシリアルCOMポート番号を指定します。PIL実装を直接使用する場合は、構成に応じてこれらのプリセットを指定する必要があります。

setpref('examplePilF28335','examplePilF28335Dir', fullfile('.','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('.','examplePilF28335','f28335_ezdsp.ccxml'));
setpref('examplePilF28335','baudRate',            115200);
setpref('examplePilF28335','cpuClockRateMHz',     150);
setpref('examplePilF28335','boardConfigPLL',      10);
setpref('examplePilF28335','COMPort',             'COM4');

TI_F28xxx_SysSWDirプリセットは、Texas InstrumentsがC2000 Experimenter Kit Application Software (sprc675.zip)で提供するフォルダーを指します。これらのファイルはEmbedded Coderに含まれていません。

これでPIL実装を使用できるようになりました。

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

PIL実装を登録するためのカスタムファイルを確認し、PIL実装を使用するようにモデルの設定パラメータを設定し、コントローラ出力と実行プロファイリングデータの記録を有効にします。

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

edit(fullfile('.','examplePilF28335','sl_customization.m'));

このファイルは、PIL実装を使用するために必要なハードウェアデバイスとテンプレートビルドファイルの設定を指定していることに注意してください。モデルの設定パラメータを変更してこれらの設定に一致させることができます。「構成パラメータ」ダイアログボックスで変更するか、プログラムで次のように変更します。

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

PILシミュレーションの場合、コード実行プロファイリングを有効にして、実行時間測定を変数executionProfileに記録します。

set_param('PMSMControllerLocal',...
    'CodeExecutionProfiling', 'on',...
    'CodeExecutionProfileVariable','executionProfile',...
    'CodeProfilingSaveOptions','AllData');
save_system('PMSMControllerLocal.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('PMSMControllerLocal')
% pwm_compare_pil = out.logsout.getElement('pwm_compare').Values;
% pmsmfoc_plotpwmcompare_pil(controller_mode, pwm_compare_pil, executionProfile)

前の図はコントローラPWMの出力です。PILシミュレーション出力は、「コントローラモデルの参照動作の指定」セクションに示されている通常モードのシミュレーション出力と同じであることに注意してください。数値的同等性を確認するには、PILシミュレーション出力から通常モードのシミュレーション出力を減算できます。

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

次の図は、各シミュレーションタイムステップでコントローラモデルの実行に要した時間です。「Stand By」状態に必要な時間が最も少ないです。実行時間に周期的な小さなピークが存在します。これは、コントローラがマルチレート、単一タスク型であるためです。周期的なピークは、同じタスク内で基本レートと5ミリ秒レートのコードを同時に実行するために必要な時間に対応します。

コントローラは埋込みプロセッサで25 kHzの速度で実行する必要があるため、そのアルゴリズムは実行を完了するために40マイクロ秒以内(最終アプリケーションでも実行される可能性のある他のコードのための追加マージン要件を差し引く)である必要があります。プロファイリング結果は、アルゴリズムが埋込み環境の構成に割り当てられた時間内で実行されることを示しています。

これで、生成されたコードが数値的に同等の結果を提供し、テストケースの実行タイミング要件を満たしていることが検証されました。

close_system('PMSMControllerLocal',0);
close_system('power_utile',0);

このPIL実装で使用されるMATLABプリセットは、MATLABセッション間で永続的に保持されます。プリセットを削除するには、次のコマンドを実行します。

rmpref('examplePilF28335');
rmexamplePilF28335hooks();

結論

この例では、永久磁石同期電機の磁場ベクトル制御アルゴリズムを使用して、システムレベルのシミュレーションとアルゴリズムコード生成を使用してコントローラアルゴリズムの機能的動作を探索する方法を示します。この例は、埋込みプロセッサのターゲット統合、機能テスト、実行プロファイリングの一般的な方法も示しています。アルゴリズムの動作が正しいことが確認されたら、コントローラモデルからコードを生成し、ターゲットプロセッサでコードをテストしてプロファイリングできます。さらなるテストのために、検証されたアルゴリズムコードとモータハードウェアと連携する埋込みソフトウェアを統合できます。

タグ: 磁場ベクトル制御 永久磁石同期電機 PILテスト 埋込みシステム Cコード生成

5月23日 11:42 投稿