查看: 2058|回复: 3

[原创] TMR时钟模块初探

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19937
最后登录
2024-4-19
发表于 2019-5-27 13:58:37 | 显示全部楼层 |阅读模式
TMR时钟模块初探
Ø 问题
         客户想用i.MX RT1050输出PWM波形,以SDK库中的inputcapture_outputpwm工程作为模板工程进行测试,发现从MIMXRT1050EVKB评估板上J23-5脚输出的PWM波并不符合readme描述的频率:50 KHz和占空比:50%,PWM真实的频率略低一点,约为49.7 KHz,刚开始的时候还以为是示波器的原因,换了一台新的示波器后,测出来的频率值还是跟原来的一样,即基本能够确定问题出在代码本身。

1.png
图 1
Ø 错误分析
        TMR时钟模块能够实现频率固定和可调的PWM,具体的实现机制和步骤建议请浏览参考手册中的52.6.5.13Fixed-Frequency PWM Mode和52.6.5.14 Variable-FrequencyPWM Mode章节来了解详情,在这里就不做过多的介绍了。

        inputcapture_outputpwm工程采用的是Variable-Frequency PWM Mode来输出PWM波的,该机制输出的PWM占空比和频率由比较寄存器COMP1和COMP2的值决定(如下图所示)。但是有个小细节容易被忽略,就是OFLAG输出引脚电平的改变是在时钟计数与比较寄存器发生比较事件后的下一个时钟时刻,这就需要在计算比较寄存器COMP1和COMP2的值时要格外注意。
2019-05-24_17-45-05.jpg
图 2
         检查inputcapture_outputpwm工程中产生PWM的函数:
status_t QTMR_SetupPwm(

TMR_Type *base,qtmr_channel_selection_t channel, uint32_t pwmFreqHz, uint8_t dutyCyclePercent,bool outputPolarity, uint32_t srcClock_Hz);就会发现该函数在配置比寄存器和比较加载寄存器时未减1,这将导致PWM周期变大,而使得频率比预期的降低了些,这就是问题所在。
  1. status_t QTMR_SetupPwm(TMR_Type *base,
  2.                        qtmr_channel_selection_t channel,
  3.                        uint32_t pwmFreqHz,
  4.                        uint8_t dutyCyclePercent,
  5.                        bool outputPolarity,
  6.                        uint32_t srcClock_Hz)
  7. {
  8.     uint32_t periodCount, highCount, lowCount, reg;

  9.     if (dutyCyclePercent > 100)
  10.     {
  11.         /* Invalid dutycycle */
  12.         return kStatus_Fail;
  13.     }

  14.     /* Set OFLAG pin for output mode and force out a low on the pin */
  15.     base->CHANNEL[channel].SCTRL |= (TMR_SCTRL_FORCE_MASK | TMR_SCTRL_OEN_MASK);

  16.     /* Counter values to generate a PWM signal */
  17.     periodCount = (srcClock_Hz / pwmFreqHz);
  18.     highCount = (periodCount * dutyCyclePercent) / 100;
  19. lowCount = periodCount - highCount;

  20.     /* Setup the compare registers for PWM output */
  21.     // base->CHANNEL[channel].COMP1 = lowCount;
  22.     // base->CHANNEL[channel].COMP2 = highCount;

  23.     /* Setup the pre-load registers for PWM output */
  24.     // base->CHANNEL[channel].CMPLD1 = lowCount;
  25.     // base->CHANNEL[channel].CMPLD2 = highCount;

  26. /* Setup the compare registers for PWM output */
  27. /*根据上面的提示,在实际配置比寄存器和比较加载寄存器值,需要减1*/
  28.     base->CHANNEL[channel].COMP1 = lowCount-1;
  29.     base->CHANNEL[channel].COMP2 = highCount-1;

  30.     /* Setup the pre-load registers for PWM output */
  31.     base->CHANNEL[channel].CMPLD1 = lowCount-1;
  32.     base->CHANNEL[channel].CMPLD2 = highCount-1;

  33.     reg = base->CHANNEL[channel].CSCTRL;
  34.     /* Setup the compare load control for COMP1 and COMP2.
  35.      * Load COMP1 when CSCTRL[TCF2] is asserted, load COMP2 when CSCTRL[TCF1] is asserted
  36.      */
  37.     reg &= ~(TMR_CSCTRL_CL1_MASK | TMR_CSCTRL_CL2_MASK);
  38.     reg |= (TMR_CSCTRL_CL1(kQTMR_LoadOnComp2) | TMR_CSCTRL_CL2(kQTMR_LoadOnComp1));
  39.     base->CHANNEL[channel].CSCTRL = reg;

  40.     if (outputPolarity)
  41.     {
  42.         /* Invert the polarity */
  43.         base->CHANNEL[channel].SCTRL |= TMR_SCTRL_OPS_MASK;
  44.     }
  45.     else
  46.     {
  47.         /* True polarity, no inversion */
  48.         base->CHANNEL[channel].SCTRL &= ~TMR_SCTRL_OPS_MASK;
  49.     }

  50.     reg = base->CHANNEL[channel].CTRL;
  51.     reg &= ~(TMR_CTRL_OUTMODE_MASK);
  52.     /* Count until compare value is  reached and re-initialize the counter, toggle OFLAG output
  53.      * using alternating compare register
  54.      */
  55.     reg |= (TMR_CTRL_LENGTH_MASK | TMR_CTRL_OUTMODE(kQTMR_ToggleOnAltCompareReg));
  56.     base->CHANNEL[channel].CTRL = reg;

  57.     return kStatus_Success;
  58. }
复制代码
TMR时钟模块初探.pdf (304.74 KB, 下载次数: 20)
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2019-5-28 09:21:55 | 显示全部楼层
    前排,支持下
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-9 17:01
  • 签到天数: 1478 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92609
    最后登录
    2024-4-9
    发表于 2019-5-28 12:49:39 | 显示全部楼层
    支持GG~~~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    6

    帖子

    0

    新手上路

    Rank: 1

    积分
    10
    最后登录
    2019-7-1
    发表于 2019-6-3 16:50:53 | 显示全部楼层
    请大家来玩一玩,保证好玩的江苏快3
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 22:45 , Processed in 0.177660 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表