当社では、ADC変換をトリガーするために中央揃えのPWMを使用したeFlexPWMを使用しており、PWMデューティサイクルレジスタを半サイクルごと、つまり当社の場合SMn_VAL1 = 0のときに再ロードして更新したいと考えています。これを実現するには、まず最初にSMn_CTRL[HALF] = 1、SMn_CTRL[FULL] = 0、SMn_CTRL[LDMOD] = 0(その他にもいくつか)を設定しておくべきだったと思います。次に、各周期ごとに、関連する SMn_VALm レジスタに新しいデューティ サイクル値を入力し、最後に MCTRL[LDOK] = 1 を設定します。カウンタがSMn_VAL1と等しくなったときに、PWMは新しい値で更新されます。
さて、問題点に移りましょう。
S32構成ツールで「Pwm/PwmGeneral」の下にある「PwmDutyCycleUpdatedEndperiod」と「PwmPeriodUpdatedEndperiod」を選択すると、「Pwm/PwmChannelConfigSet/FlexPwm Modules」の下にある「Half Cycle Reload」を選択できず、エラーが発生します。
「問題: PwmGeneral/PwmDutyCycleUpdatedEndperiod または PwmGeneral/PwmPeriodUpdatedEndperiod が有効になっている場合は、ノード HalfCycleRelad のチェックを外してください。」
レベル: エラー"...
「フルサイクルリロード」を選択すれば、問題なく動作します。予想どおり、SMn_CTRL[HALF] = 0、SMn_CTRL[FULL] = 1、SMn_CTRL[LDMOD] = 0 が得られました。選択肢に「UpdatedEndperiod」とあるので、ある程度は予想通りですが、「ハーフサイクルリロード」はどのように設定すればよいのでしょうか?
「PwmDutyCycleUpdatedEndperiod」と「PwmPeriodUpdatedEndperiod」の選択を解除すると、「Full Cycle Reload」または「Half Cycle Reload」の任意の組み合わせを選択できますが、その結果、生成されたコードで SMn_CTRL[LDMOD] が 1 に設定されます。これは、MCTRL[LDOK]が1に設定されるとPWMが直接更新される、つまり一種の即時ソフトウェア更新が行われることを意味し、それは私が望んでいることではありません。これはまた、「フルサイクルリロード」と「ハーフサイクルリロード」の選択肢には実際には意味がないことを示しているように思われる。
おそらく何か見落としている点があると思うのですが、どなたかこの方法を教えていただけると大変助かります。
MBDTを以下の用途で使用しています。
S32設定ツール バージョン1.8
RTD 7.0.0
よろしくお願いいたします。
こんにちは、 @RNJさん
まず、状況説明から始めましょう。既にご存じのとおり、ハードウェアペリフェラルへのアクセスと制御を行うためのMBDTブロックは、 NXP RTD MCAL AUTOSARレイヤーの上に構築されています。これは、Simulinkのペリフェラルブロック(ADC、PWMなど)を通じて公開されるすべての機能が、AUTOSAR MCAL仕様に準拠する必要があることを意味します。
RTDパッケージは2つの層で構成されています。
ローレイヤードライバで利用可能な設定の一部がAUTOSAR規格に準拠していない場合、MCALレイヤーはそれらを公開しません。同様に、S32構成ツールはAUTOSARに準拠していない設定をブロックします。つまり、ハードウェア上で何らかのペリフェラル設定や構成が利用可能な場合、それが準拠していないと判断すれば、AUTOSAR MCALレイヤーはそれを「キャンセル」する可能性がある。
最初にお問い合わせいただいた件に戻りますが、私はAUTOSARの専門家ではありませんが、少し調べてみたところ、AUTOSAR PWMドライバには以下の要件があることが分かりました。
正直なところ理由は分かりませんが、AUTOSARのPWMドライバはハーフサイクルリロードをサポートしていないようです。
PwmDutyCycleUpdatedEndperiodまたはPwmPeriodUpdatedEndperiodを選択した場合、AUTOSAR では更新はPWM 周期の終了時にのみ行われる必要があります。これは、eFlexPWMにおけるフルサイクルリロードのみに直接対応します。ハーフサイクルリロードはAUTOSARのセマンティクスに矛盾するため、S32CTはそれをブロックします。
また、RTDの中身も確認して、それがC言語のコードにどのように変換されるのかを正確に把握しました。S32CTは 、{modelName} _Config ディレクトリ内の generate フォルダ内に構成構造とファイルを生成します。FlexPWM構成構造では、リロードは、以下の図に示すように、S32CTのPwm/PwmChannelConfigSet/FlexPwmモジュール内でユーザーが設定する内容に応じて設定されます。
ただし、PwmDutyCycleUpdatedEndperiod と PwmPeriodUpdatedEndperiod は、PWM RTD ドライバで直接使用される AUTOSAR レベルのマクロです。たとえば、Pwm_SetDutyCycle 関数は、内部で Pwm_Ipw_FlexPwm_SetDutyCycle を呼び出します。そして、 PWM_DUTYCYCLE_UPDATED_ENDPERIOD をチェックし、それに応じて LDOK ビットを設定します。次の図を参照してください。
上記で強調表示されている関数は、最後の関数引数に基づいて、モジュールレジスタに実効デューティサイクル値をロードします。FALSEは次回のPWMリロードを意味し、TRUEは即時更新を意味します。
結論として、S32CTはAUTOSAR PWMドライバのルールを遵守している。「PwmDutyCycleUpdatedEndperiod」または「PwmPeriodUpdatedEndperiod」を選択した場合、AUTOSARの仕様では、更新はPWM周期の終了時にのみ行われることが求められます。
このドライバの制限を克服するには、カスタムコードブロックを使用して、モデル内の SMn_CTRL[LDMOD] レジスタを直接上書きする方法があります。しかし、それがうまくいくかどうかは確信が持てません。それはテストされなければならない。しかし、Pwm_SetDutyCycle関数のPwmDutyCycleUpdatedEndperiodマクロチェックを回避するには、カスタムコードブロックを使用してデューティサイクル値をSMnVALxレジスタに直接書き込む必要があります。
お役に立てば幸いです!
よろしくお願いいたします!
ステファン。
はい、stefancinipeanuさん、ご回答ありがとうございます!
返信が遅くなり申し訳ありません。かなり忙しくしておりました。
あなたの回答は、私の観察を裏付けるものとなりました。
「PwmDutyCycleUpdatedEndperiod」、「PwmPeriodUpdatedEndperiod」、「Full Cycle Reload」を選択してコードを生成する場合、mbdt_board_init.c の「Pwm_Init(&Pwm_Config_MBDT)」をそのままにします。その機能を実行した後、コードを使用して SMn_CTRL[HALF] を 1 に、SMn_CTRL[FULL] を 0 に変更します。
これは、AUTOSAR MCALに準拠していないものの、ハーフサイクルリロードを実現するための有効な回避策となり得るでしょうか?
「ハーフサイクルリロード」を選択しても、少なくとも「PwmDutyCycleUpdatedEndperiod」や「PwmPeriodUpdatedEndperiod」を選択していない場合にこれが実行されることを警告するメッセージが表示されないため、少し紛らわしいです。
AUTOSAR MCALに準拠しない方法で設定ツールを使用する方法も必要かもしれません。その場合、警告を表示するなどの対策を講じるべきでしょう。
私たちの場合は、AUTOSAR規格に従う必要は(今のところ)なく、MBDTを使用したいと考えています。
改めて、ありがとうございました。