2382282_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2382282_ja-JP

2382282_ja-JP

S32K396 RTD 5.0.0FlexIO PWM – 「Period [ticks]」パラメータからPWM周期はどのように計算されますか?

NXPチームの皆様、こんにちは。

S32K396RTD 5.0.0、およびFlexIO PWMドライバを使用しています。

私の設定は以下のとおりです。

  • FLEXIO0_CLK = 160 MHz
  • クロックプリスケーラ = FLEXIO_PWM_IP_CLK_DIV_16
  • チャネルID = CH_0
  • PIN ID = PIN_1

生成された構成:

const Flexio_Pwm_Ip _ChannelConfigType Flexio_Pwm_Ip _I0_Ch0 =

{

/* TimerId */ 0 U

/* PinId */ 1 U


#if (defined(FLEXIO_PWM_IP_HAS_PRESCALER) && (FLEXIO_PWM_IP_HAS_PRESCALER == STD_ON))

/*プリスケーラ*/ FLEXIO_PWM_IP_CLK_DIV_16

#endif


/* 期間 */ 400 U

/* デューティサイクル */ 0 U

#if (defined(FLEXIO_PWM_IP_HAS_LOW_MODE) && (FLEXIO_PWM_IP_HAS_LOW_MODE == STD_ON))

/* 極性 */ FLEXIO_PWM_IP_ACTIVE_HIGH

#endif

/* IrqMode */ FLEXIO_PWM_IP_IRQ_DISABLED

/* IPLコールバック */ {

/* CbFunction */ NULL_PTR

/* CbParameter */ NULL_PTR

}

/* HLD コールバック */ {

/* CbFunction */ NULL_PTR

/* CbParameter */ 0

}

} ;

 

私は以下の間の正確な関係を理解しようとしています。

  • FLEXIOクロック周波数
  • プリスケーラ
  • 期間 [ティック]
  • デューティサイクル[ティック]
  • 出力PWM周波数

私のサイズは以下の通りです。

期間 デューティ 測定頻度 デューティ
20010020kHz50%
30010013.3kHz33.3%
40010027.7kHz69.4%
50010016.3kHz40%

最初の2つの測定値は、以下のことを示しているようです。

Duty (%) = DutyTicks / PeriodTicks × 100

しかし、FlexIO PWM RTD ドライバの内部で使われている正確なPWM周波数公式を導き出すことはできません。

もう少し詳しく教えていただけますか:

  1. FlexIOのPWMドライバが Period(ティック) を出力PWM周波数に変換する際に使う正確な式は何ですか?
  2. TIMCMPレジスタは、設定された周期値からどのようにプログラムされるのですか?
  3. 有効な期間値の最大値はありますか(例えば、FlexIOタイマーの制限により255カウントなど)?
  4. 以下の場合、望ましいPWM周波数(例えば10 kHz)を得るために必要な周期値をどう計算すればよいのでしょうか:
    • FLEXIO0_CLK = 160 MHz
    • プリスケーラー = 16
  5. FlexIOのPWMタイミング計算を説明するアプリケーションノートや参考文書はありますか?

内部タイミング方程式に関する説明があれば大変ありがたいです。

よろしくお願いします。

Re: S32K396 RTD 5.0.0 FlexIO PWM – How is PWM Period Calculated from the "Period [ticks]"

こんにちは、 @Esakki さん

1.

あなたの計算式は正しいです。

2.

周期 = 200、デューティ = 100ティックの場合、デュアル8ビットカウンタPWMハイモード(TIMCTL[TIMOD]):

TIMCMP = 0x00006363

最上位バイト = 0x63 = 99 → 出力がローの間はデクリメントされる
下位バイト = 0x63 = 99 → 出力がハイの間はデクリメントされる

3.

はい、ドライバはFLEXIO_PWM_IP_DEV_ERROR_DETECT = STD_ONのバイトに対して256を超える値を書き込むのを防ぐべきです。
このチェックが無効になっている場合、フィールドがオーバーフローし、それがおそらく発生している問題の根本原因です。

danielmartynek_0-1781767472546.png

4.

周期(ティック)-勤務時間(ティック)≦256。
このモードでは、指定された入力クロックでは10kHzを実現することはできません。プリスケーラーの値を上げる必要があります。

5.

この点はリファレンスマニュアルのみが扱っています。


よろしくお願いいたします。

ダニエル

Any support, information, and technology (“Materials”) provided by NXP are provided AS IS, without any warranty express or implied, and NXP disclaims all direct and indirect liability and damages in connection with the Material to the maximum extent permitted by the applicable law. 
NXP accepts no liability for any assistance with applications or product design. Materials may only be used in connection with NXP products. Any feedback provided to NXP regarding the Materials may be used by NXP without restriction.
 
 

Re: S32K396 RTD 5.0.0 FlexIO PWM – How is PWM Period Calculated from the "Period [ticks]"

こんにちは、ダニエルさん。

ご説明ありがとうございます。

期間計算に関して、もう一つ質問があります。

あなたの説明から、デュアル8ビットカウンタのPWMハイモードでは次のようになっていると理解しました。

TIMCMP[15:8] = 期間 - 義務 - 1

TIMCMP[7:0] = 義務 - 1

また、両フィールドともカウント数は256に制限されています。

出力PWM周波数を計算する正確な公式を教えていただけますか:

  • FlexIO入力クロック周波数

  • プリスケーラ

  • 期間値

例えば、次のような場合:

  • FlexIOクロック = 160MHz

  • プリスケーラー = 256

  • 期間 = 63ティック

想定されるPWM周波数はどれくらいでしょうか?

以下の式を使用します。

PWM周波数 = FlexIOクロック / (プリスケーラ × 周期)

およそ9.92kHzになると思われます。

しかし、PWM出力を測定したところ、約3.9kHzであることが確認されました。

同様に、以下についても:

  • プリスケーラー = 16

  • 期間 = 200

計測値は約20kHzで、これは実効PWMクロックが160MHzではなく約64MHzに相当する。

説明していただけますか?

  1. FlexIO PWMデュアル8ビットモードにおける正確なPWM周波数計算式。

  2. FlexIO PWMドライバーによって内部で追加のディバイダーやタイマーのスケーリングが適用されるかどうかも重要です。

  3. PWMタイマーが実際に使用しているクロックを特定するには、どのランタイムレジスタまたはクロックソースを確認すればよいでしょうか。

ご協力ありがとうございます。

Re: S32K396 RTD 5.0.0 FlexIO PWM – How is PWM Period Calculated from the "Period [ticks]"

こんにちは、 @Esakki さん

この式はドライバー実装から直接導出できます — Flexio_Pwm_Ip_UpdatePeriodDuty(参照):

Flexio_Pwm_Ip_SetLowerValue(Base, Channel, (uint8)(DutyCycle - 1U));
Flexio_Pwm_Ip_SetUpperValue(Base, Channel, (uint8)(Period - DutyCycle - 1U));

したがって、TIMMPへのマッピングは次の通りです:

下位8ビット = デューティサイクル - 1
上位8ビット = 周期 - デューティサイクル - 1


Flexio_Pwm_Ip_GetPeriod () から:

周期 = 上限 + 下限 + 2

周期 = (デューティサイクル - 1) + (周期 - デューティサイクル - 1) + 2


f_pwm = Input_FlexIO_CLK (プリコール済み) / 周期

デューティ比(%)=デューティサイクル/期間×100


例(FLEXIOクロック=160MHz、プリスケーラ=16→10MHzタイマークロック):

周期 = 200ティック -- f_pwm = 10 MHz / 200 = 50 kHz


よろしくお願いいたします。

ダニエル

 
Re: S32K396 RTD 5.0.0 FlexIO PWM – How is PWM Period Calculated from the "Period [ticks]"

こんにちは、ダニエルさん。

詳細な説明と頻度の計算式をありがとうございました。

式によれば:

f_pwm = FlexIO_Input_Clock (プリスケーラ後) / 周期

私の設定では:

  • FlexIOクロック = 160MHz

  • プリスケーラー = 256

  • 期間 = 63

私はこう予想します:

f_pwm = 160 MHz / (256 × 63)
= 9.92 kHz

しかし、オシロスコープで測定すると、PWM周波数は約3.9kHzである。

同様に、以下についても:

  • プリスケーラー = 16

  • 期間 = 200

私が計測したところ約20kHzでしたが、FlexIOクロックが160MHzの場合、計算式では50kHzと予測されます。

何かアドバイスをいただけますか:

  1. FlexIOのPWMドライバは、クロックソースを使っている場合、設定されたFLEXIO0_CLKとは違いますか?

  2. 内部的に追加の分周器やクロックスケーリングが適用されていますか?

  3. FlexIO PWMタイマーで実際に使用されているランタイムクロック周波数を検証する推奨方法は何ですか?

測定されたPWM周波数が、設定された160MHzのFlexIOクロックを使用して計算された周波数と一致しない理由を理解したいです。

再開まで今しばらくお待ちください。

よろしくお願いいたします。
エサッキ

Re: S32K396 RTD 5.0.0 FlexIO PWM – How is PWM Period Calculated from the "Period [ticks]"

こんにちは、 @Esakki さん

再現できません。

f_timer = 160 MHz / 256 = 625 kHz

T_pwm = 周期 / f_timer
= 200 / 625000
= 320 µs

関税 = 100 / 200 = 50%

danielmartynek_0-1782374766856.png

T_pwm = 周期 / f_timer
= 63 / 625000
約100.8マイクロ秒
 

税率 = 10 / 63 ≈ 15.87%

danielmartynek_1-1782374873329.png


Flexio_Pwm_Ip_Example_DS RTD のサンプルを使ってテストしました。

Flexio_Pwm_Ip_UpdatePeriodDuty(INSTANCE_0、FLEXIO_PWM_IP_CHANNEL_1、63U、10U);


問題を再現できる簡単なテストプロジェクトを作成し、ここで共有してください。そうすればテストできます。


あなたが共有してくれた結果から判断すると、あなたの設定におけるFlexIOの入力クロックは64MHzのようです。

CLKOUTを使ってシステムクロックを出力できます。


BR、ダニエル



Tags (1)
No ratings
Version history
Last update:
8 hours ago
Updated by: