2362756_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2362756_ja-JP

2362756_ja-JP

SWOCTRLレジスタの更新に失敗しました。アプリケーションはBLDCモータ制御です。

以前は、SWOCTRLを更新するために以下の設定を使用していました。この設定では、SYNCHOMは0に設定されています。整流は1時間から1日間継続して動作するのですが、その間にBLDCモーターが停止する時間帯が必ず発生するという問題に直面しました。デバッグの結果、OUTMASKは更新されるものの、SWOCTRLは古い値のままであることがわかりました。
何が問題だったのか、ご説明いただけますか?

我々の理解では、OUTMASKが更新される際にクロックが境界に達し、SWOCTRLが取り残された可能性があるが、それでも次のクロック境界でSWOCTRLも更新されるはずなのに更新されなかった理由が説明できない。

// Configuration for Register Value Update
const ftm_user_config_t  flexTimer_pwm_InitConfig =
    {
        {
            true,   // Software trigger state
            false,  // Hardware trigger 1 state
            false,  // Hardware trigger 2 state
            false,  // Hardware trigger 3 state
            true, // Max loading point state
            false, // Min loading point state
            FTM_SYSTEM_CLOCK, // Update mode for INVCTRL register
            FTM_SYSTEM_CLOCK, // Update mode for SWOCTRL register
            FTM_SYSTEM_CLOCK, // Update mode for OUTMASK register
            FTM_SYSTEM_CLOCK, // Update mode for CNTIN register
            true, // Automatic clear of the trigger
            FTM_WAIT_LOADING_POINTS, //  Synchronization point
        },
        FTM_MODE_EDGE_ALIGNED_PWM, //!< Mode of operation for FTM
        FTM_CLOCK_DIVID_BY_128, // FTM clock prescaler
        FTM_CLOCK_SOURCE_SYSTEMCLK,   // FTM clock source
        FTM_BDM_MODE_00, // FTM debug mode
        false, // Interrupt state
        true // Initialization trigger
    };

// ISR for BLDC commutaiton
uint8_t private_hal_mc_actuate_set_pwm_mask(uint8_t ui8OutMask, uint16_t ui16SwCtrl)
  {
      FTM_DRV_MaskOutputChannels(3/*INST_FLEXTIMER_PWM3*/, ui8OutMask, false);
      FTM3->SWOCTRL = ui16SwCtrl;
  	return 1;
  }
Re: SWOCTRL register update failure. Application is BLDC motor Control

こんにちは、 @Qazi さん

どのS32K1xx派生モデルを使用していますか?
SYNCONFレジスタが意図せず上書きされていないか確認していただけますか?
また、拡張同期機能を使用していない理由は何ですか?
リファレンスマニュアル(第47.8項「初期化手順」を参照)によると、拡張同期の使用が推奨されています。


BR、ダニエル


Re: SWOCTRL register update failure. Application is BLDC motor Control

こんにちは、 @danielmartynek さん
私が拡張PWM同期を使用していなかった理由は、私自身の情報不足でした。現在、私はPWM強化同期機能を備えたソフトウェアトリガーオプションを使用していますが、問題なく動作しています。
私はS32k148を使用しています。私がここでこの質問をしている理由は、推奨事項は理解しているものの、実際に起こっていたことが技術的に意味をなさないため、何が起こっていたのかが理解できないからです。メモリリークなどをチェックして、レジスタが上書きされていないことを確認しましたが、上書きされていませんでした。
私が発見した唯一のパターンは、OUTMASKの値は更新されたが、SWOCTRLの値は更新されなかったということだった。
つまり、無効な値があったわけではなく、前回のエンコーダーパルスで設定された値があったということです。
そして、おかしなことに、ここで述べた関数のすぐ外に、SWOCTRL レジスタに設定した値が入っていないかどうかを確認する IF 条件があったのですが、それが一度も実行されませんでした。つまり、シャドウバッファに値が設定されているように見えたのですが、メインレジスタが値を取得してしまい、その後シャドウレジスタには古い値が残ってしまったようです。
私の方から他に何か情報が必要な場合は、遠慮なくお申し付けください。
ありがとう、
カジ

Re: SWOCTRL register update failure. Application is BLDC motor Control

こんにちは、 @Qazi さん

入手可能な情報に基づいてこの現象を説明できない上、同様の報告事例も見当たらないため、設計チームにこの件をエスカレーションする必要があります。

いくつか明確にしておきたい点があります。

レジスタへの書き込み順序を変更してみましたか?なぜ一方のレジスタの更新にはドライバAPIが使用されるのに、もう一方のレジスタへの書き込みは直接行われるのでしょうか?

ソフトウェアチェックに関するご説明を、より詳しく理解したいです。私の理解では、レジスタに書き込み、条件内で直ちに読み戻します(RM、セクション3.4.1「書き込み後の読み出しシーケンスとメモリ操作の必須シリアル化」)。読み出し操作は、最近書き込まれた値を返します。
しかし、「その後、シャドウレジスタには古い値が保持されていた」という記述が具体的に何を意味するのかは明確ではありません。もう少し詳しく説明していただけますか?


ありがとうございました。

BR、ダニエル





Re: SWOCTRL register update failure. Application is BLDC motor Controlこんにちは、 @Daniel さん
ご返信いただき、改めてありがとうございました。返信が遅くなり申し訳ありませんでした。
問題点が見つかったと思います。SWOCTRLがISRルーチンとは別に記述されている箇所があった。そして、ISRがSWOCTRLの書き込み時に具体的に呼び出された場合、それはアトミック操作ではないため、値は古い値に設定されます。

改めて、お時間をいただき本当にありがとうございました。
タグ(1)
評価なし
バージョン履歴
最終更新日:
木曜日
更新者: