This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C1294 Timer PWM 和 PWM 模块精度不一致

使用了 Timer PWM 和 PWM 模块产生 250KHZ 的方波, 用示波器测试,发现 PWM 模块方波频率很准, 但是Timer PWM 产生的方波在 249.8~250.2 KHZ 之间跳动,请问这是什么问题? 

  • 请问您timer与PWM模块的时钟源是什么?若是可以的话,请给出配置代码,谢谢
  • uint32_t g_cpuFrequency = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000);

    // timer 方波
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
    ROM_GPIOPinConfigure(GPIO_PD3_T1CCP1);


    ROM_GPIOPinTypeTimer(GPIO_PORTD_BASE, GPIO_PIN_3);
    ROM_TimerConfigure(TIMER1_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PWM);
    ROM_TimerLoadSet(TIMER1_BASE, TIMER_B, 480);
    ROM_TimerMatchSet(TIMER1_BASE, TIMER_B,
    ROM_TimerLoadGet(TIMER1_BASE, TIMER_B) / 2);
    ROM_TimerEnable(TIMER1_BASE, TIMER_B);



    //PWM 方波

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);


    ROM_GPIOPinConfigure(GPIO_PF0_M0PWM0);
    ROM_GPIOPinConfigure(GPIO_PF2_M0PWM2);
    ROM_GPIOPinConfigure(GPIO_PK4_M0PWM6);


    ROM_GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_2);
    ROM_GPIOPinTypePWM(GPIO_PORTK_BASE, GPIO_PIN_4);

    ROM_PWMClockSet(PWM0_BASE,PWM_SYSCLK_DIV_2);


    ROM_PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN |
    PWM_GEN_MODE_NO_SYNC);
    ROM_PWMGenConfigure(PWM0_BASE, PWM_GEN_1, PWM_GEN_MODE_UP_DOWN |
    PWM_GEN_MODE_NO_SYNC);
    ROM_PWMGenConfigure(PWM0_BASE, PWM_GEN_3, PWM_GEN_MODE_UP_DOWN |
    PWM_GEN_MODE_NO_SYNC);

    ROM_PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 240); // 120M/2/240 = 250K
    ROM_PWMGenPeriodSet(PWM0_BASE, PWM_GEN_1, 240);
    ROM_PWMGenPeriodSet(PWM0_BASE, PWM_GEN_3, 480);


    ROM_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0,
    ROM_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0) / 2);


    ROM_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_2,
    ROM_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_1) / 2);


    ROM_PWMPulseWidthSet(PWM0_BASE, PWM_OUT_6,
    ROM_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_3) / 2);


    ROM_PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT, true);

    ROM_PWMOutputState(PWM0_BASE, PWM_OUT_2_BIT, true);

    ROM_PWMOutputState(PWM0_BASE, PWM_OUT_6_BIT, true);
  • 谢谢您的快速回复,我手边暂时没有这个板子,所以先将您的问题发给了国外的工程师测试。

    请跟踪下面的回复

    e2e.ti.com/.../926013
  • 请您关注一下下面的回复

    e2e.ti.com/.../3421553
  • hi,

        问题没有解决,PWM 还是很精确, 250KHZ,  timer 的PWM 现在稳定在 249.5KHZ, 任然不精确。

       我是同时测量,而且示波器的2个表也对调过, 也用了2块 EX-TM4C1294XL 板子测试,是同样的问题

       我调整了不同的参数:

                   理论              实际

         480        250K     249.5K

          476      252.1K     251.6K

      470            255.3K    254.8K

       460          260.8K           260.3K

    同样, PWM 很准

    看上去 , timer PWM  似乎要比理论值少 0.5K 

  • 很抱歉,之前漏掉了您的帖子

    请问您现在问题是否有解决?若还是未解决,请将情况在下面的帖子内说明一下

    e2e.ti.com/.../3421553