ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) はじめに
この記事の目的は、モデルベース設計のユーザーが独自のカスタムCライブラリを活用したり、NXPのツールボックスでまだサポートされていないCドライバやコンポーネントを呼び出したりできるようにすることです。これにはMatlab Coderを使用し、モデルがC関数を呼び出すMATLAB関数ブロックのみを含める必要があります。詳細については、Mathworks Help Centerの「Integrate C Code Using the MATLAB Function Block- MATLAB & Simulink」をご覧ください。
BMSシステム
私の意見では、何かを学ぶ最も優れた方法は「実践しながら学ぶ」ことです。このチュートリアルでは、S32KのモデルベースデザインにBMSシステムのサポートを追加します。弊社のツールボックス対応ボードについてはすでにご存知かと思いますので、このBMSシステムについて少しお話ししましょう。
NXPは、車載用および産業用アプリケーション向けに設計された優れたセル・コントローラICを提供しています。詳細については、「MC33772B | 6チャネルのリチウムイオン・バッテリー・セル・コントローラIC | NXP」をご覧ください。このチュートリアルでは、FRDM33772BSPIEVB | MC33772 SPI EVB | NXPボードを使用します。これは、最大6個のバッテリー・セルを扱い、SPI経由で多くのNXPコントローラに接続します。また、いくつかのジャンパを調整することでS32Kファミリとも互換性がありますが、すべての説明は製品ページでご確認いただけます。
したがって、このプロジェクトの目標は、MBDT Simulink モデルからセル電圧を読み取れるようにすることです。
主な手順
カスタム・コードを含めるには、ユーザーは次の手順に従う必要があります。
1. [Settings(設定)]>[Code Generation(コード生成)]>[Custom code(カスタム・コード)]>[Include directories(インクルード・ディレクトリ)]で、Simulinkがディレクトリを含めるディレクトリ・パスを追加します。
2. SimulinkモデルにMatlab関数ブロックを挿入します。これは初期化に使用されます。ここでの目標は、生成されたコード・ファイルにCヘッダを含めることです。これには、coder.const関数を使用して、コーダ定数を宣言する必要があります。coder.updateBuildInfoを使用して、それをビルド情報で更新する必要があります。ここでは、次のテンプレートに従ってヘッダとソースを含める必要があります。
%% Adding header information to the generated code
coder.cinclude('driver.h'); %% Adding source files to MakeFile coder.updateBuildInfo( 'addSourceFiles', 'driver.c' );
この操作は一度だけ実行する必要があります。
3. ユーザーがSimulinkからカスタム関数を呼び出す必要がある場合、Matlab関数ブロックを追加し、必要に応じて入力と出力を宣言する必要があります。Matlab関数コード内で、入力として提供されたパラメータを使用してcoder.ceval関数を呼び出す必要があります。
たとえば、ユーザーがBMS_Init というC関数をパラメータなしで呼び出す必要がある場合、次のコード行でそれを実行できます。
%% Initializing the BMS driver coder.ceval('BMS_Init');
ユーザーが入力パラメータを提供する必要がある場合、直接またはcoder.refを引数として使用して提供するか、その値への参照を渡す必要がある場合はcoder.rrefを使用して提供する必要があります。
function BMS_Init(パラメータ)
if( coder.target( 'Rtw' ) ) coder.ceval('BCC_Init', parameter); coder.ceval('BCC_Init', coder.ref(parameter)); end end
これにより、以下のコードが生成されます。
BCC_Init(true); BCC_Init(&パラメータ);
しかし、コードがより複雑な場合、最も簡単な方法は、ラッパ関数を宣言し、coder.cevalを使用してラッパを呼び出すことです。
BMSサポート
このシナリオは、MBDTでまだサポートされていないコードの一部を使用するという、ほとんどのユーザーの要件に適合します。このICについて、NXPではすでにKIT3377x_DRVドライバと、セル電圧を測定してFreeMasterを使って表示するS32DSの例を提供しています。
S32K144ボード用にS32Kプロジェクトを作成し、MC33772ボードの設定とピンの要件に従って、FreeMasterブロックとLPSPIインスタンスを追加しました。Initialize変数は、BMSの初期化シーケンスを呼び出すためにのみ使用されます。
前の章で説明したように、必要なドライバといくつかのラッパを含むフォルダ「bcc」を宣言しました。また、これらを構成パラメータに挿入しました。
initialize関数には、Matlab呼び出し関数が含まれています。これには、2番目のポイントで説明したすべての手順が含まれています。ここで、7行目からの部分に注目できます。すべてのcincludeコードは、coder.targetが「Rtw」の場合にのみ呼び出されます。ユーザーがelse条件を追加した場合、そのコードはシミュレーション時にのみ呼び出されます。現在、MBD_MCC_Initはドライバからのすべての初期化手順を実行するように設計されたラッパです。この方が簡単でした。
MC33772 は初期化されているため、ユーザーが値を必要とするときはいつでも、モデルに値を提供する Matlab 関数ブロックを追加する必要があります。
このブロックの背後にあるコードが次の画像に添付されています。getCellMeasurementsからの出力値は出力として提供され、get_cellVoltagesの内部でcoder.wref関数を使用してC言語のupdateMeasurementsを呼び出します。
BMSを実行中
コード生成中にいくつかのバグを解決し 、コードを正常にビルドしたら、生成されたコードをボード上で実行できます。次のスクリーンショットは、MC33772によって変換された電圧と可変電流の測定値を示しています。
結論
この記事では、カスタム・コードとMatlab Coderを使用して、Simulinkモデルに必要なCライブラリ/ドライバ/コードを取得する方法を紹介しました。NXPハードウェアを使用した実際のアプリケーションであるバッテリー・マネジメント・システムについて、簡単な手順リストとより詳細なチュートリアルを提供しました。このアプローチは、S32KまたはMPCツールボックスのどちらを使用する場合でも成功します。
後日編集 (1):
ご要望に応じて、モデルベース設計とカスタム・コードを使用して、S32K144ボードでMC3377xB (FRDM3377xBSPIEVB) からの測定を実現するためのモデルとFreeMasterプロジェクトを添付しました。
実行するには、次の手順に従う必要があります。
1. アーカイブをダウンロードして解凍すると、s32k_mc3377x.mdlの横にbccフォルダがあります。
2. SDK(組み込みソフトウェア:MC33771/MC33772 SWドライバ | NXP) MC33771B/MC33772B用BCC SWドライバ・パッケージ(Liteバージョン)をダウンロードします。SDKフォルダのbccから、すべてのファイルをモデルのbccフォルダにコピーします。BCC SDKには、ダウンロード前に必ず読まなければならない合意事項があるため、SDKドライバをアーカイブに追加できません。
3. s32k_mc3377xモデルを開き、BMS_Init関数に移動し、4行目の文字列をモデルのbccロケーション・フォルダの完全なパスに置き換えます。
4. この後、コードが生成され、正常に実行されるはずです。
後で編集(2):
MC3377xBとMPC5744Pをモデルベース設計ツールボックスを介して接続する方法の手順とともに解決策をご希望の場合は、こちらの質問をご覧ください。 MPC5744P & MC33771Bの設定
後日編集 (3):
多くのご要望にお応えして、S32K144とFRDMDUALMC33664をMC33771Cと通信させるためのサンプル・コードを追加しました。添付されたアーカイブをご覧ください。bms_s32k_frdm2_771c_tpl_cc。MC33771CのbccドライバはMC33771Bのbccドライバと異なるため、不足しているファイルをこちらからダウンロードしてください。
ハッピーハッキング!
マリウス 返信:ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) Hello,Marius. @mariuslucianand MC33771 MBDツールボックスはS32K1ツールの下にあります。また、MPC5744とMC33772B間の通信については、2020年の最初の写真でアドバイスを見つけました。 今、MBDTを使用して、2番目の図のようにMPC577BとMC33771Cを接続するSimulinkモデルを構築したいと考えています。現在、対応するツールチェーンが存在するかどうか知りたいです。 ツールがない場合、MPC577BとMC33771Cを接続するモデルを構築するためのデモまたは説明ファイルをご提供いただけるでしょうか?よろしくお願いいたします。 ご返信をお待ちしております。 ありがとうございました! Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) h こんにちは、マリウスさん おっしゃる通り、接続されていないセルは無視する必要があります。たとえば、MC33771Bを使用して8個のセルを読み取り、他のスロットは0として読み取る場合、低電圧障害のようなロジックを構築する際に影響があります。BMDツールボックスを介して、必要なセル電圧(私の場合は8個のセルを直列)のみを読み込んで保存できるような解決策はありますか。 可能であれば、どの設定を、どのブロックで行う必要がありますか。 私はFRMDMC33771BSPIボードとS32K144Q100 mcを使用しています よろしくお願い申し上げます。 Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) Hello @rathi_tg 読み取りレジスタ・ブロックの場合、温度や電圧などのこの種のレジスタを読み取る場合は、事前に変換を開始する必要があります。内部温度と電圧を生で読み取ろうとしましたが、変換を開始してからでないと動作せず、変換が完了するまで待ちました。 whileブロック内に、次のようにIs Convertingブロックを挿入しました。 S32DSのインポートに関しては、再現できませんでした。.XMLプロジェクト・ファイルをインポートし、ブロックは正常にビルドされました。どのバージョンのS32DSを使用していますか? お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi, Ozanです。BMSモデルの例を使用して、freemaster経由でセルの電圧、電流、温度を読み取ることができました。しかし、これらの測定値を使って論理演算を構築したり、これらのデータを恒久的に保存しようとしたりすると、うまくいきませんでした。 最小セル電圧が2.1 Vを下回ると青色のLEDを点灯させ、パック電圧が31 Vを超えると赤色のLEDを点滅させるといったリレーショナル操作を構築しようとしています。この目的のために、関係演算子ブロックと if 条件ブロックの両方を使用しました。しかし、条件が満たされているかどうかに関係なく、LEDは点灯していました。より明確に言うと、電圧レベルが2.1Vを下回っているか上回っている場合は青色LEDが点灯し、パック電圧が31Vを上回っているか下回っている場合は赤色LEDが点滅します。その間、電圧源を通じて電圧レベルを変更し、最小電圧とパック電圧の両方の電圧レベルの変化を観察できます。何が問題で、どうすればこの問題を解決できますか? 永続メモリにデータを書き込もうとすると、別の問題が発生します。Flash configブロックとFlash EEEwriteブロックを使用しましたが、データを保存できず、メモリに関するエラーが発生しました。さまざまなデータ(たとえば、SOC、内部温度、セルの最小電圧と最大電圧)を不揮発性メモリに保存したいと考えています。どのようにこれを実行できますか? よろしくお願いいたします。 論理演算に使用したモデル: 不揮発性メモリのモデル: Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) Hello Marius, マスターとスレーブ通信の省電力モードを統合しようとしていました。 S32k144のコードは、PowerManagment_ISR(NXPの例で提供されているGpioコール・バックによる電力モード)から取られています。 コードをフラッシュすると、指示どおりに正常に動作しますが、スレーブ通信を統合すると、すぐにマスターがスイッチ経由でウェイクアップしなくなり、リセットが必要になります。 第二に、マスター・スレーブ通信の.xmlファイルをDesign Studioにインポートすると、次の内容がメモ帳に出力されます。 The Error is as follows.1> C:\NXP\S32DS_ARM_v2.2\S32DS\build_tools\gcc_v6.3\gcc-6.3-arm32-eabi\arm-none-eabi\newlib\lib\thumb\v7e-m\fpv4-sp\hard\libm.a (The system cannot find the path specified) Design Studio バージョン 2.2 よろしくお願いします。 Gopal Rathi。 Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello rparveez@mtu.edu, NTCサーミスタのNTCパラメータは、BCC構成ブロックで設定されます。入力にNTCセンサーを接続している場合は、ボード上のNTCのはんだを除去してください。そうしないと、2つのNTCが並列に接続されることになります。 初期化時に、NTCSからの値に基づいて、アルゴリズムはルックアップ・テーブルを計算します。fillNtcTableという関数の生成コードをご覧ください。監視中、コードはNTC電圧を取得し、ルックアップ・テーブルに基づいて*Cの値を返します。 [Pack settings(パック設定)]タブのMC3377xB_Configで使用される値は、MC3377xB_Get Valuesブロックで使用されるNTCサーミスタのパラメータを表します。シャント抵抗も同様です。ブロックは、この値を使用して、シャント抵抗値を電流値に変換します。 MC3377xBによって読み取られた生の電圧を変換するためにこの方法を使用せず、独自の方法を使用して、生の値をアルゴリズムが必要とする測定値に変換したい場合には、MC3377xB_Get_Raw_Valuesを使用してください。これは生データを30レジスタのみを返します。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi Marius, セル温度の読み取りについて解説をお願いします。NTC(B25/50、値3380k)を使用しています。室温では、これらの出力は誤った結果となります。FreeMASTERでスケーリングとオフセットを追加する必要がありますか?それともSimulinkで変更する方法はありますか? ありがとうございます Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
nishalemos@gmail.com様、 SimulinkでMC33771CをS32Kに接続するには、上記の記事で説明されているすべての手順を、別のドライバを使用して実行する必要があります。MC33771Cは、この組み込みSW:MC33771C SWドライバ | NXP(Liteバージョン)のページからダウンロードできるソフトウェア・ドライバを使用します。 ドライバをダウンロードした後、ドライバと同じアーカイブからBCC_S32K144_FreeMasterアプリケーションをモデルとして使用できます。そこには、アプリケーションについて説明するBCC_S32K144_FreeMaster.pdfも含まれています。 レシピは同じです。ツールボックスを使用して、通信に使用するSPIインスタンス(1/SPI、2/TPL)を設定する必要があります。MC33771Cのドライバ初期化を初期レジスタ値で呼び出す関数を使用する必要があります(必要なコードはすべてS32DSプロジェクトにあります)。上で説明したUpdateMeasurements関数とまったく同様に、必要なすべてのドライバ関数を呼び出すには、Matlab 関数を使用する必要があります。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
rathi.tg@araiindia.com様、 以下の添付画像にあるように、MC3377xB_Get_ValuesブロックはCellsVoltageを14個のuint32要素の配列として出力し、値はuVで表されます。シングルに変換するには、ゲインを1とし、その結果をFloatとしてFreeMaterに送信します。FreeMasterは、簡単な方程式を適用してデータをボルト単位で表示します。 したがって、Get_Values ブロックから uin32t 形式の uV データを直接取得することができます。 データを single から uin32 に変換する必要がある場合、いくつかの方法があります。ゲインを 1 に設定し、ゲインブロックで出力値のデータ型を選択するか、Simulink のデータ型変換を使用することができます。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello Marius, 上記のツールボックスは、S32K144とMC33771B/2B間の通信を確立します。しかし、現在、私はMC33771Cをスレーブとして使用しています。両方のボード(S32K144とMC33771C)間の通信を確立するためのガイドやコード例を提供していただけるでしょうか。 敬具 Nisha. Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello Marius, Marius様、ありがとうございます。私は両方の方法を試しましたが、マスターとスレーブの間の通信を確立することができました。 今、1つの問題に直面しています。CANで同じ値を観測できるように、single(データ型)を符号なし整数に変換する方法を教えていただけますか。 敬具 Gopal Rathi。 Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、@Rubeenaさん 昨日この投稿の通知を受け取りましたが、これらの問題はすでに解決していると思います。 6つのセル値の場合、Get_RAW_Valuesは実際には30個のレジスタを含む配列を返します。値については、ブロックのヘルプで説明されています。Get_Valuesブロックの場合、すでに一般的な測定単位に変換された値が返されます。このブロックは14個のセル電圧の配列を返しますが、セル番号は部品とアプリケーションによって異なるので、使用していない他の8つの値は無視してください。 ステータス値5はCRCエラーを表しており、おそらくボードとターゲット間の通信に問題があるか、通信が確立されていないことを意味します。 バランシング中にネットが処理しなければならない高電流のために、ピンが一緒に接続されていると考えられます。 測定値が一致しない場合は、接続を再確認してください。次のピンを使って3つのリチウム・イオン電池を接続してみました(4つ目は切れているので無視してください)。 Cell1 Neg – ピン34 Cell1 Pos – ピン30(30のみ接続しましたが、30と29の両方を接続することもできます) Cell2 Neg – ピン30 Cell2 Pos – ピン28 Cell3 Neg – ピン28 Cell3 Pos – ピン26 Cell3 Pos – ピン 2 また、ピン33とピン32を接続して、次の画像の青い部分とまったく同じ接続にしました。最後に、次のような結果が得られました。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi Marius, 新しいBMSツールボックスを試し、MC3377xB構成でMC33772デバイスを選択しました。しかし、Get Valuesブロックは14個の要素を出力します。6にすることは可能ですか? まだFreeMasterでセル電圧を読み取ることができません。以下はウォッチ・ウィンドウです。Get valuesブロックのStatus変数は5を出力します。これはCRCが間違っていることを意味しますか?どうすればこれを修正できますか? 以前のs32kのSimulinkのサンプル・モデルを使用してみましたが、パック電圧のみを読み取ることができました。Cellvoltage[0]は5Vを示していますが、セル0の実際の電圧は3.2Vでした。 MC33772 の以下のバッテリ接続を確認してください。ピン 1-2、19-20、21-22、… が一緒に接続されています。 ありがとうございます Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello rparveez@mtu.edu, 1. FreeMasterプロジェクトを保存し、[Project(プロジェクト)]->[Options(オプション)]->[MAP Files(MAPファイル)]->[Default symbol file(デフォルトのシンボル・ファイル)]から、生成された.elfファイル上のFreeMasterの場所を更新します。 2. はい、BMS用に追加された新しいリリースのすべてのブロックは、動作状態に関する情報を提供するステータス出力を提供します。エラー・コードはブロックのヘルプに詳しく記載されているので、何が問題なのかを簡単に把握できます。 是非試してください。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello rparveez@mtu.edu, こちらのページでお知らせをご覧いただけます。https://community.nxp.com/docs/DOC-347202 また、必要なすべての手順に従って、Matlab アドオンから直接最新バージョンをインストールすることもできます。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi Marius, 1. はい、UM11143に従ってジャンパーを変更しました。 2. 変数名を変更したのですが、モデルをビルドするたびに次のようなメッセージが表示されます。 CellVoltageがまだ0Vのままです。 通信エラーがあるかどうか確認する方法はありますか? ありがとうございます Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Gopal Rathi様、 バッテリー・セル・コントローラ・ボードとの接続は確立されましたか? 本日より、MathworksおよびS32KでMC3377xBのサポートを追加したS32K4.2.0用のMBDTをリリースいたしました。モデルbms_s32k_mc33772b_spi.mdl から使用を開始することができます。MC3377xB Configブロック内のデバイスを変更するだけで、モデルはMC33771Bで動作します。 モデルには、SPIペリフェラルを構成するLPSPI Configブロックがあります。MC3377xB Configブロックは、MC33771Bバッテリー・セル・コントローラを初期化し、ここでわかるように、エラー・ステータス・コードを提供します。FreeMasterに変数を追加して、結果を確認するとよいでしょう。エラー・コードはブロックのヘルプで説明されているため、何が問題なのかを簡単に把握できます。 MC3377xB Get Valuesブロックは、変換を開始し、変換の準備ができるまで待機し、結果をミリアンペア、マイクロボルト、摂氏など、人間が判読できる値で直接提供します。すべてがシングルにキャストされるため、uVからVに変換する必要がある場合は、ゲイン係数を変更するだけで済みます。 これを試してみて、あなたの側でどのように機能するか確認してください。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
こんにちは、マリウスさん ピン設定を行った後、スレーブはもうスリープ状態になりませんでした。しかし、残念ながら、Free Masterで値を確認すると、すべての出力がゼロになっています。 CANモジュールをデータストア「Cell_Voltages」と「Pack_Voltages」に接続してみましたが、値が適切ではありません。 DATA TYPE CONVERTERを使用しました。単一データ型の値をuint8データ型に変換するために必要な特定の変換はありますか? よろしくお願いいたします。 Gopal Rathi Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
m15871781742@163.com様、 MPC5744Pで同じ機能を実現するには、もう少し作業する必要があります。基本的に、添付のカスタム・コード・モデルの移行に加えて、bcc_peripheries.cおよびbcc_wait.cファイルも移行する必要があります。これらのファイルは、今のところS32K用に作成されています。基本的に、送信メソッドと受信メソッドを更新して、当社のツールボックスにも付属するMPC SDKからこれらを呼び出す必要があります。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello rparveez@mtu.edu, あなたの投稿から、基本的に2つの問題があることに気付きました。 1. VCOM LEDに関連するものです。通常、mc33772に1分以上電源が入ると、LEDが点灯します。コントローラと通信していない場合、ボードはスリープ状態になり、VCOM LEDは消灯します。ボードのピンをS32Kコントローラにルーティングするために、ボードのジャンパを変更しましたか?すべての手順はUM11143に記載されています。このドキュメントをお読みいただき、正しいジャンパをはんだ付け/はんだ除去してください。 2. FreeMasterの問題については、CellVoltage配列の名前が変更されたため、リンクが壊れている可能性があります。これを修正するには、[Continue(続行)]を押して、目的に変数の [Variable Watch] をダブルクリックし、変数名を再入力してください。 本日より、MBDT S32K 4.2.0がリリースされました。MC3377xBとSPI/TPLボードのサポートが追加されましたので、ぜひ当社のBMSブロックをご利用ください。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi, 実際のリチウム・イオン・バッテリー・セルをFRDM33772BSPIEVBに接続しています。 コードをコントローラ (S32K144) に正常にアップロードできました。しかし、FreeMASTERで電圧を読み取ることができません。 コードをアップロードした後、FreeMasterに次のメッセージが表示されます また、BCCのVCOM LEDが点灯しないことに気づきました。 どなたか助けていただけますか? ありがとうございます Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello Marius , 上記のコードを使用して正常にビルドしましたが、MC3371Bはスリープ状態になりません。 CANバスの出力を確認するためにCANモジュールを接続しましたが、値は安定しておらず、正確でもありません。 CANで出力を確認するための特定の要件はありますか。 よろしくお願いいたします。 Gopal Rathi Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello philippeperruchoud, よろしくお願いいたします。 よろしくお願いします。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Philippe様、 ご協力に感謝いたします。とても助かりました。ありがとうございました。 よろしくお願いいたします。 Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello oeren5@ford.com.tr, 正しいです。 - CT_n ラインは n セルの正極端子に接続する必要があります。 - CB_XXラインもセルのプラス端子に接続する必要があります。通常、お客様はバッテリー・セルまで電力(セル・バランシング用)とセンス(セル 端子用)を使用しないため、セル・バランシングを行いながらセルを正確に測定できます。そのため、CT_nとCB_XXからセル端子に1本のラインを接続するだけです。 - ICへの供給は2本の追加ラインを介して行われます。これは、ケーブル抵抗を介したIC供給電流によって不正確さが生じるのを避けるために必要です。そのため、VBAT (X1-1/X1-2)とセル14のプラス端子を別のラインで接続する必要があります。同様に、最初のセルのマイナス端子とGND(X1-34)の間には、別のGND接続が必要です。 以下は、バッテリーパックへの接続方法を示す手書きの配線図です。 お役に立てば幸いです。 よろしくお願いいたします。 フィリップ . . . Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi Marius, ご回答いただき、誠にありがとうございました。第2.4.1章 FRDM33771BSPIEVBの設定で言及された必要なハードウェア構成を行ってみます。 もう1つ議論したいポイントは、FRDM33771BSPIEVBへのセル接続です。なぜなら、BATT-14EMULATORではなく、実際の18650リチウム・イオン・セル(14個のセル)を使用するつもりだからです。ユーザー・ガイドを確認すると、セルの接続にはセル・コネクタX1を使用するように書かれていました。しかし、その接続を完全に理解することはできませんでした。 CT_14、CT_13、……CT_1は、セル1からセル14を経由してセルのプラス端子に接続されるコネクタであると想定しました。しかし、VBAT(X1-1とX1-2)、CT_REF、GND(X1-34は最初のセルの負極になるべきでしょうか?)、CB_14、CB_14:13_C、CB_13/CB_12.... CB_1をどこに接続するかわかりませんでした。接続について詳しく説明または案内していただけませんか? よろしくお願いいたします。このコミュニティから多くの有益な情報を得ています。 Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello rathi.tg@araiindia.com, oeren5@ford.com.tr, お約束したとおり、32K144EVB + FRDM33771BSPIEVB + BATT-14EMULATORで動作するモデルを添付しました。基本的に、oeren5@ford.com.trが前回の投稿で言及した変更で十分ですが、現在コードをお持ちの場合(記事の末尾に添付されています)、差分を実行できます。 唯一必要なことは、BMS初期化/MATLAB関数に移動し、4行目をアーカイブ内のbccフォルダのフルパスで置き換えることです。 こちらが、14個のセルのバッテリー値をすべて含むFreeMasterプロジェクトの様子です。 通信を正常に行うために、以下の点をご確認ください。 1. FRDM33771BSPIEVBには、ボード上のハードウェア・ジャンパ設定がいくつか含まれており、通信を正常に動作させるには、これらの設定を変更する必要があります。UM11143マニュアルの「2.4.1 FRDM33771BSPIEVBの設定」の章に記載されているとおり、ボード上ではんだごてを使用して変更を加え(6つのジャンパ)、mC33771のピンを直接S32K144のピン・ヘッダに接続してください。 2. rathi.tg@araiindia.comの返信にある、ボードがアイドル状態になるという通信の問題は、HWかSWのどちらかの通信の障害によるものだと思います。ボードは通信を受け取らず、60秒後にスタンバイ・モードに入ります。 3. 私と同じ設定を使用している場合は、エミュレータの電源が入っていることを確認してください。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello oeren5@ford.com.tr, rathi.tg@araiindia.com, お二人がおっしゃった変更は機能するには十分と思われますが、適切な回答を提供するためには、S32K + MC33771Bのセットアップを調査する必要があります。できるだけ早く、MC33771Bのモデルを生成し、ソースを添付いたします。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello, 私も同じことをしましたが、出力はゼロになり、スレーブ MC33771B はスリープ状態になります。 敬具 Gopal Rathi Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi, 私はOzanです。s32k144evbとFRDM33771BSPIEVBを使用して、BMSデザインを構築しようとしています。最初のステップとして、mc33771の測定値を読み取りたいと思います。mc33772の代わりにmc33771を使用するには、s32_mc33772モデルの例でいくつかの設定変更を行う必要があることを理解しています。mbdt_utils.cで、(組み込みSW:MC33771/MC33772 SWドライバ | NXP)からダウンロードしたファイルで以下の変更を加えました。主な目的は、14セルとSPI通信でmc33771を使用することです。 デバイスとセル番号を適切に設定するために、以下の変更で十分かどうか知りたいと思っています。あるいは、bccドライバ・コード(具体的にはbcc.c、bcc_spi.cなど)に追加の変更を加える必要がありますか。よろしくお願いいたします。 → 以下の部分のコメントを解除します。 // To be used for the MC33771 uint32_t cell7VoltageUV; uint32_t cell8VoltageUV; uint32_t cell9VoltageUV; uint32_t cell10VoltageUV; uint32_t cell11VoltageUV; uint32_t cell12VoltageUV; uint32_t cell13VoltageUV; uint32_t cell14VoltageUV; cell7VoltageUV = BCC_GET_VOLT(measurements[BCC_MSR_CELL_VOLT7]); cell8VoltageUV = BCC_GET_VOLT(measurements[BCC_MSR_CELL_VOLT8]); cell9VoltageUV = BCC_GET_VOLT(measurements[BCC_MSR_CELL_VOLT9]); cell10VoltageUV = BCC_GET_VOLT(measurements[BCC_MSR_CELL_VOLT10]); cell11VoltageUV = BCC_GET_VOLT(measurements[BCC_MSR_CELL_VOLT11]); cell12VoltageUV = BCC_GET_VOLT(measurements[BCC_MSR_CELL_VOLT12]); cell13VoltageUV = BCC_GET_VOLT(measurements[BCC_MSR_CELL_VOLT13]); cell14VoltageUV = BCC_GET_VOLT(measurements[BCC_MSR_CELL_VOLT14]); -> 次のセル電圧を追加します。 cell_Voltages[6] = (float) cell7VoltageUV; cell_Voltages[7] = (float) cell8VoltageUV; cell_Voltages[8] = (float) cell9VoltageUV; cell_Voltages[9] = (float) cell10VoltageUV; cell_Voltages[10] = (float) cell11VoltageUV; cell_Voltages[11] = (float) cell12VoltageUV; cell_Voltages[12] = (float) cell13VoltageUV; -> 最後に、init関数を変更しました。 bcc_status_t MBD_BCC_Init(void) { //Configure the bcc_drv_config_t structure for the MC33772 drvConfig.drvInstance = 0U; drvConfig.commMode = BCC_MODE_SPI; drvConfig.devicesCnt = 1U; drvConfig.device[0] = BCC_DEVICE_MC33771; drvConfig.cellCnt[0] = 14U; Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
HelloMiarius-lucian Andrei ツールボックスに問題があったため、コードを正常にビルドできました。しかし、MC33771Bを使用して通信を確立し、出力パラメータをCAN経由で送信していますが、パラメータの値を取得できません。 s32k144に接続されたFRDMMC3371BSPI(Freedom SPI ボード)は2~3分後にスリープ状態になり、通信の確立がうまくいかなかった可能性があります。 以下の2つのピンは接続していません。これは、FRDMMC3371BSPIに接続されていることが明記されていなかったので、オプションなのだと思います。 MDBTファイルに必要な変更を加えました。S32k144とMC3371B、MC3371C間の通信を確立するために必要な設定方法を教えていただけますか。 敬具 Gopal Rathi Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
rathi.tg@araiindia.com様、 すべてのソースとヘッダが問題なければ、インクルード・ディレクトリにBCCがあるかどうかを確認できます。 S32K1xxシリーズ用のモデルベース設計ツールボックスのバージョンは、R2017b-R2019aの場合、現在4.1.0です。ただし、R2019bやR2020aなどの最新バージョンと完全に互換性があります。最高のエクスペリエンスを得るために、すべてのユーザーに最新のソフトウェア・リリースを使用することをお勧めします。R2016については、今後のリリースで対応を検討します。 Include ディレクトリを追加してみて、これが問題の解決に役立つかどうかを確認してください! お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
HelloMiarius-lucian Andrei 私はcoder.updateBuildInfo( 'addSourceFiles', 'mbdt_utils.c' );を追加しました これはToolboxバージョン「S32K1xx v.2.0.0」です。指定されたパス「bccpath」は書き込み可能です。そうでなければ、すべてのファイルに対してエラーが発生します(私が知る限り)。 私が作ったモデルなので、見落としがあるかもしれません。2019bは入手不可能なので、下位バージョンのMatlabモデルを教えてください。2016bでも良いです。 1. 最初に MC33771B でコードを試しているので、プロジェクトの mdbt ファイルと bcc_Conf に必要な変更を加えました。他に見逃した変更はありますか?お知らせください。 よろしくお願いいたします。 Gopal Rathi Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
rathi.tg@araiindia.com様、 この記事を活用して実際の解決策を検討していただき、ありがとうございます。 最初の点については、スクリーンショットを分析すると、すべてのオブジェクト・ファイルをelfファイルにリンクしようとするときに、プログラムがクラッシュしていることがわかります。これは、ソース・ファイルの1つがまだコンパイルされていない場合に発生します。不足しているリファレンスはmbdt_utils.cの下で定義されています。つまり、このファイルは決してコンパイルされません。BMS_initのMatlab関数で、bccPathが適切に定義されていること、すべてのヘッダがcoder.cinclude関数を使用して挿入されていること、そして最も重要な点として、すべてのソース・ファイルがcoder.updateBuildInfo関数として渡されていることを確認してください。おそらくcoder.updateBuildInfo( 'addSourceFiles', 'mbdt_utils.c' );が欠落している可能性が高いです。このコード行を削除すると、次のような出力が得られました また、スクリーンショットから、古いバージョンのツールボックスと古いコンパイラを使用していることがわかります。使用している S32K Toolbox のバージョンを教えていただけますか? 2番目の点については、これらの要件を調査するための時間を少しいただければ、返信いたします。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Marius-lucian Andrei様 説明に従ってモデルを作成しましたが、プロジェクトのビルド中にエラーが発生しました(ハードウェア (S32K144) にフラッシュしようとすると発生します)。 1. いくつかの質問があります。最初にMC33771Bでコードを試しているので、プロジェクトのmdbtファイルとbcc_Confに必要な変更を加えました。他に見逃した変更はありますか?お知らせください。 2。セルバランスコマンドを送信してセルバランスステータスを取得し、スリープとウェイクアップのコマンドを送信する方法を教えていただけますか。 ここにエラーのスナップショットを添付いたします。 ありがとうございます。よろしくお願いいたします。 Gopal RathiK Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello rathi.tg@araiindia.com, teejaa, ご要望に応じて、モデルベース設計とカスタム・コードを使用してS32K144ボードでMC33772B(FRDM33772BSPIEVB)からの測定を行うためのモデル(アーカイブはチュートリアルの最初のテキストの上の方にあります)とFreeMasterプロジェクトを添付しました。 実行するには、次の手順に従う必要があります。 1. アーカイブをダウンロードして解凍すると、s32k_mc33772.mdlの横にbccフォルダがあります。 2. SDK(組み込みソフトウェア:MC33771/MC33772 SWドライバ | NXP)MC33771B/MC33772B 用の BCC SWドライバ・パッケージ(Liteバージョン)をダウンロードします。SDKフォルダのbccからすべてのファイルをモデルのbccフォルダにコピーします。BCC SDKには、ダウンロード前に必ず読まなければならない合意事項があるため、SDKドライバをアーカイブに追加できません。 3. s32k_mc33772 モデルを開き、BMS_Init 関数に移動し、行 4 の文字列をモデルの bcc ロケーションフォルダーのフルパスに置き換えてください。 4. この後、コードが生成され、正常に実行されるはずです。 ハッピー・ハッキング、 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hello,Marius. MPC5744PとMC33772Bの間で機能的な通信を実現したいのですが、どのようにすればよいでしょうか。何かアドバイスはありますか? ありがとうございます。 SHAO Jianbo Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
mariuslucianandrei 私も彼と同じように、MBDTを完全に使用できるようにC.Codeを移行するための調査をしています。 *.mファイルまたはMATLABのサンプル・プロジェクトがあれば大変ありがたいです。 ありがとう&よろしく、 Narudol T. Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi mariuslucianandrei 上記のステップについて少し混乱しています。MC33771BとMC33771Cの両方のデモコードをご提供いただけますでしょうか。 よろしくお願いいたします。 Gopal Rathi Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
rathi.tg@araiindia.com様、 回答が遅れて申し訳ございません。 実際、それらのファイルはドライバに存在しません。私が作成したもので、MBD_BCC_Init関数のような初期化に使用されるラッパが含まれています。ここで、設定の構造と実際にデータを測定する関数を記入することができます。SDK FreeMasterの例でそれらを見つけることができます。 bcc_status_t updateMeasurements(float *cell_Voltages, float *pack_Voltage, float *pack_Current, float *internal_Temperature) また、その内部では、SDKが提供する初期関数はそのままにし、測定したデータのみを次のように変数に転送しました。 // MBDT Provide all required data in uV cell_Voltages[0] = (float) cell1VoltageUV; cell_Voltages[1] = (float) cell2VoltageUV; cell_Voltages[2] = (float) cell3VoltageUV; cell_Voltages[3] = (float) cell4VoltageUV; cell_Voltages[4] = (float) cell5VoltageUV; cell_Voltages[5] = (float) cell6VoltageUV; *pack_Voltage = (float) stackVoltageUV; *pack_Current = (float) isenseCurrentMA; ここでは、cell_Voltagesが配列であり、ベクトルとして提供されていることに注意してください。 それでは、BCC_MCU_ConfigureLPSPI() 全体をコメントアウトする必要がありますか? いいえ。関数は残す必要があります。#if defined(SPI)の直後の179行目から193行目までのみコメントアウトしました。 また、call_getCellVoltages関数を記述する際には、変数に必要な型とダミー値を用いてCell_Voltagesを初期化してください。また、これをポインタとして提供すれば、単一の配列ですべてのセルを取得することができます。 if( coder.target( 'Rtw' ) ) coder.ceval( 'bccError = updateMeasurements', coder.wref(Cell_Voltages), coder.wref(Pack_Voltage), coder.wref(Pack_Current), coder.wref(Internal_Temperature)); else % We're not generating code Cell_Voltages = single(3.7*ones(1,6)); Pack_Voltage = single(6.0*3.7); Pack_Current = single(1.5); Internal_Temperature = single(22.0); end お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
mariuslucianandrei様 メイン・コードで上述の手順をすべて実行しましたが、エラーが発生しました。 エラーの添付ファイルは以下になります。 第二に、組み込みSW:MC33771/MC33772 SWドライバ | NXPでは、コードにあるような特定のファイル、つまりmbdt_utils.cや.hを提供していません。 そこで、BCC_MCU_ConfigureLPSPI()全体をコメントアウトする必要がありますか? よろしくお願いいたします。 Gopal Rathi。 Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
rathi.tg@araiindia.com様、 S32K用モデルベースデザインツールボックスとこのBMS例にご興味をお持ちいただきありがとうございます! それぞれのポイントに対して回答してみたいと思います。 MATLAB Simulinkを使用して、NXPS32K144とMC3371の間でSPI通信を確立する直接的な方法はありますか。 このカスタム・コード例は、S32K向けS32SDKドライバの上位レイヤであるS32K向けMBDTに基づいており、MBDTと同じパッケージで提供されます。S32K144とMC33772Bの間で機能的な通信を実現するには、同じS32K向けS32SDKドライバ・レイヤーを使用する組み込みSW:MC33771/MC33772 SWドライバ | NXPを使用する必要があります。 これは使いやすいドライバです。なぜなら、呼び出す必要がある関数は、BCC_Init(ドライバを初期化する)とupdateMeasurements(新しい測定パラメータを取得するために定期的に実行する)の2つだけだからです。もちろん、パラメーターの設定に使われるC構造体もいくつかあります。 現時点では、MBDTでこれを行う最も簡単で洗練された方法は、上記で説明したこのカスタム・コード・メソッドを使用することです。このボードをサポートするために、NXPはSWドライバ用ユーザー・マニュアルを提供しています。このマニュアルは組み込みSW:MC33771/MC33772 SWドライバ | NXPで参照でき、SWの実装やパラメータの変更方法についても詳しく説明しています。これをお読みになることを強くお勧めいたします。 上記のチュートリアルでは、MBDTブロックを使用して、ドライバが使用するパラメータにSPI0を初期化し、BCC_MCU_ConfigureLPSPI()によって実行されたbcc_peripheries.cコンポーネントからドライバの初期化をコメントアウトしました。これを選んだ理由は、MBDT SPIブロックがSPI用のピンも初期化するからです。公式の例では、ピンは個別に初期化されます。その他の通信コマンドについては、MCドライバが実行します。 また、上記のコードでは、ボーレートは1Mbpsに設定されていますが、データシートによると、ボーレートは2Mbpsとなっています。同じ点を説明していただけますか。 SPIをSWドライバのFreeMasterの例で使用されているのと同じ周波数で動作するように設定しました。以下に示すように、bcc_peripheries.hで、ボーレートは次のレートに設定されています。 #define BCC_SPI_LPSPI_BAUD 1000000 #define BCC_TPL_TX_LPSPI_BAUD 2000000 しかし、MC33772 ドライバは、TPL の場合、速度は 2Mbps でなければならないと指定しています。これは、最小値が 1.9 で最大値が 2.1 であるためです。一方、SPI の場合、最大周波数は 4.2MHz を超えてはならず、より低い周波数も許容されます。 お役に立てば幸いです。 マリウス Re: ツールボックスで独自のCコードを使用する方法(バッテリー・マネジメント・システムの例) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Hi Marius MATLAB Simulinkを使用してNXPS32K144とMC3371間の SPI 通信を直接確立する方法はありますか。 また、上記のコードでは、ボーレートは1Mbpsに設定されていますが、データシートによると、ボーレートは2Mbpsとなっています。同じ点を説明していただけますか。 敬具 Gopal Rathi。
記事全体を表示