NXPチームの皆様、こんにちは。
S32K396とRTD 5.0.0、およびFlexIO PWMドライバを使用しています。
私の設定は以下のとおりです。
生成された構成:
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
}
} ;
私は以下の間の正確な関係を理解しようとしています。
私のサイズは以下の通りです。
| 200 | 100 | 20kHz | 50% |
| 300 | 100 | 13.3kHz | 33.3% |
| 400 | 100 | 27.7kHz | 69.4% |
| 500 | 100 | 16.3kHz | 40% |
最初の2つの測定値は、以下のことを示しているようです。
Duty (%) = DutyTicks / PeriodTicks × 100しかし、FlexIO PWM RTD ドライバの内部で使われている正確なPWM周波数公式を導き出すことはできません。
もう少し詳しく教えていただけますか:
内部タイミング方程式に関する説明があれば大変ありがたいです。
よろしくお願いします。
こんにちは、 @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を超える値を書き込むのを防ぐべきです。
このチェックが無効になっている場合、フィールドがオーバーフローし、それがおそらく発生している問題の根本原因です。
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.
こんにちは、ダニエルさん。
ご説明ありがとうございます。
期間計算に関して、もう一つ質問があります。
あなたの説明から、デュアル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に相当する。
説明していただけますか?
FlexIO PWMデュアル8ビットモードにおける正確なPWM周波数計算式。
FlexIO PWMドライバーによって内部で追加のディバイダーやタイマーのスケーリングが適用されるかどうかも重要です。
PWMタイマーが実際に使用しているクロックを特定するには、どのランタイムレジスタまたはクロックソースを確認すればよいでしょうか。
ご協力ありがとうございます。
こんにちは、 @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
よろしくお願いいたします。
ダニエル
こんにちは、ダニエルさん。
詳細な説明と頻度の計算式をありがとうございました。
式によれば:
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と予測されます。
何かアドバイスをいただけますか:
FlexIOのPWMドライバは、クロックソースを使っている場合、設定されたFLEXIO0_CLKとは違いますか?
内部的に追加の分周器やクロックスケーリングが適用されていますか?
FlexIO PWMタイマーで実際に使用されているランタイムクロック周波数を検証する推奨方法は何ですか?
測定されたPWM周波数が、設定された160MHzのFlexIOクロックを使用して計算された周波数と一致しない理由を理解したいです。
再開まで今しばらくお待ちください。
よろしくお願いいたします。
エサッキ
こんにちは、 @Esakki さん。
再現できません。
f_timer = 160 MHz / 256 = 625 kHz
T_pwm = 周期 / f_timer
= 200 / 625000
= 320 µs
関税 = 100 / 200 = 50%
税率 = 10 / 63 ≈ 15.87%
Flexio_Pwm_Ip_Example_DS RTD のサンプルを使ってテストしました。
Flexio_Pwm_Ip_UpdatePeriodDuty(INSTANCE_0、FLEXIO_PWM_IP_CHANNEL_1、63U、10U);
問題を再現できる簡単なテストプロジェクトを作成し、ここで共有してください。そうすればテストできます。
あなたが共有してくれた結果から判断すると、あなたの設定におけるFlexIOの入力クロックは64MHzのようです。
CLKOUTを使ってシステムクロックを出力できます。
BR、ダニエル