以前は、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;
}こんにちは、 @Qazi さん。
どのS32K1xx派生モデルを使用していますか?
SYNCONFレジスタが意図せず上書きされていないか確認していただけますか?
また、拡張同期機能を使用していない理由は何ですか?
リファレンスマニュアル(第47.8項「初期化手順」を参照)によると、拡張同期の使用が推奨されています。
BR、ダニエル
こんにちは、 @danielmartynek さん、
私が拡張PWM同期を使用していなかった理由は、私自身の情報不足でした。現在、私はPWM強化同期機能を備えたソフトウェアトリガーオプションを使用していますが、問題なく動作しています。
私はS32k148を使用しています。私がここでこの質問をしている理由は、推奨事項は理解しているものの、実際に起こっていたことが技術的に意味をなさないため、何が起こっていたのかが理解できないからです。メモリリークなどをチェックして、レジスタが上書きされていないことを確認しましたが、上書きされていませんでした。
私が発見した唯一のパターンは、OUTMASKの値は更新されたが、SWOCTRLの値は更新されなかったということだった。
つまり、無効な値があったわけではなく、前回のエンコーダーパルスで設定された値があったということです。
そして、おかしなことに、ここで述べた関数のすぐ外に、SWOCTRL レジスタに設定した値が入っていないかどうかを確認する IF 条件があったのですが、それが一度も実行されませんでした。つまり、シャドウバッファに値が設定されているように見えたのですが、メインレジスタが値を取得してしまい、その後シャドウレジスタには古い値が残ってしまったようです。
私の方から他に何か情報が必要な場合は、遠慮なくお申し付けください。
ありがとう、
カジ
こんにちは、 @Qazi さん。
入手可能な情報に基づいてこの現象を説明できない上、同様の報告事例も見当たらないため、設計チームにこの件をエスカレーションする必要があります。
いくつか明確にしておきたい点があります。
レジスタへの書き込み順序を変更してみましたか?なぜ一方のレジスタの更新にはドライバAPIが使用されるのに、もう一方のレジスタへの書き込みは直接行われるのでしょうか?
ソフトウェアチェックに関するご説明を、より詳しく理解したいです。私の理解では、レジスタに書き込み、条件内で直ちに読み戻します(RM、セクション3.4.1「書き込み後の読み出しシーケンスとメモリ操作の必須シリアル化」)。読み出し操作は、最近書き込まれた値を返します。
しかし、「その後、シャドウレジスタには古い値が保持されていた」という記述が具体的に何を意味するのかは明確ではありません。もう少し詳しく説明していただけますか?
ありがとうございました。
BR、ダニエル