2382282_zh-CN

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2382282_zh-CN

2382282_zh-CN

S32K396 RTD 5.0.0FlexIO PWM – 如何根据“周期 [滴答数]”参数计算 PWM 周期?

您好,NXP团队,

我使用的是S32K396 ,RTD 版本为 5.0.0 ,以及FlexIO PWM 驱动器

我的配置如下:

  • FLEXIO0_CLK = 160 MHz
  • 时钟预分频器 = FLEXIO_PWM_IP_CLK_DIV_16
  • 频道 ID = CH_0
  • 引脚 ID = PIN_1

生成的配置:

常量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.3 kHz33.3%
40010027.7 kHz69.4%
50010016.3 kHz40%

前两项测量结果似乎表明:

Duty (%) = DutyTicks / PeriodTicks × 100

但是,我无法推导出 FlexIO PWM RTD 驱动器内部使用的确切 PWM 频率公式。

请问您能否澄清一下:

  1. FlexIO PWM 驱动器使用什么公式将周期(滴答数)转换为输出 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.pngdanielmartynek_0-1781767472546.png

4.

周期(以刻度为单位)- 工作量(以刻度为单位)≤ 256。
在这种模式下,使用给定的输入时钟无法达到 10 kHz 的频率。你需要增加预分频器的值。

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]"

@Esakki

您可以直接从驱动程序实现中推导出该方程式——请参阅Flexio_Pwm_Ip_UpdatePeriodDuty ():

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

因此,到 TIMCMP 的映射关系为:

低 8 位 = 占空比 - 1
高 8 位 = 周期 - 占空比 - 1


来自Flexio_Pwm_Ip_GetPeriod ():

周期 = 上限 + 下限 + 2

周期 = (占空比 - 1) + (周期 - 占空比 - 1) + 2


f_pwm = Input_FlexIO_CLK(预调用)/ 周期

占空比(%) = 占空比 / 周期 × 100


示例(FLEXIO 时钟 = 160 MHz,预分频器 = 16 → 10 MHz 定时器时钟):

周期 = 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]"

你好,丹尼尔,

谢谢你的解释。

关于周期计算,我还有一个后续问题。

根据您的解释,我理解在双8位计数器PWM高电平模式下:

TIMCMP[15:8] = 周期 - 工作量 - 1

TIMCMP[7:0] = 值 - 1

并且这两个字段的计数都限制为 256。

请问能否详细说明一下计算输出PWM频率的具体公式?

  • FlexIO 输入时钟频率

  • 预分频器

  • 期间值

例如,如果:

  • FlexIO 时钟频率 = 160 MHz

  • 预分频器 = 256

  • 周期 = 63 个刻度

预期的PWM频率应该是多少?

使用以下公式:

PWM频率 = FlexIO时钟 / (预分频器 × 周期)

我预计频率约为 9.92 kHz。

但是,在测量 PWM 输出时,我观察到大约为 3.9 kHz。

同样地,对于:

  • 预分频器 = 16

  • 周期 = 200

我测得的频率约为 20 kHz,这相当于有效 PWM 时钟频率约为 64 MHz,而不是 160 MHz。

请问您能否解释一下:

  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]"

你好,丹尼尔,

感谢您提供的详细解释和频率公式。

根据公式:

f_pwm = FlexIO_Input_Clock(预分频后)/ 周期

我的配置如下:

  • FlexIO 时钟频率 = 160 MHz

  • 预分频器 = 256

  • 周期 = 63

我预期:

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

然而,用示波器测量时,PWM 频率约为 3.9 kHz。

同样地,对于:

  • 预分频器 = 16

  • 周期 = 200

我测得的频率约为 20 kHz,而如果 FlexIO 时钟频率为 160 MHz,则公式预测的频率为 50 kHz。

请问您能否提供以下建议:

  1. FlexIO PWM 驱动器使用的时钟源是否与配置的 FLEXIO0_CLK 不同?

  2. 内部是否应用了额外的分频器或时钟频率缩放?

  3. 验证 FlexIO PWM 定时器实际运行时时钟频率的推荐方法是什么?

我想了解为什么测得的 PWM 频率与使用配置的 160 MHz 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 微秒

税率 = 100 / 200 = 50%

danielmartynek_0-1782374766856.pngdanielmartynek_0-1782374766856.png

T_pwm = 周期 / f_timer
= 63 / 625000
≈ 100.8 微秒
 

税率 = 10 / 63 ≈ 15.87%

danielmartynek_1-1782374873329.pngdanielmartynek_1-1782374873329.png


我用 Flexio_Pwm_Ip_Example_DS RTD 示例进行了测试。

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


请创建一个简单的测试项目来重现这个问题,并在这里分享,以便我进行测试。


根据你分享的结果来看,你设置中的 FlexIO 输入时钟频率似乎是 64 MHz。

您可以使用 CLKOUT 输出系统时钟。


BR,丹尼尔



标记 (1)
无评分
版本历史
最后更新:
‎06-26-2026 02:27 AM
更新人: