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.

PWM时钟分频出了问题



调了一晚上了,想让pwm输出50hz的周期的pwm来驱动舵机,然而pwm时钟就是不分频。我设置的是16分频,但用pmwclkget函数,返回的是“不分频”,示波器测出来的是800hz,求大家解答。

附上pwm代码

#include"main.h"
#include"duoji.h"
#include"pwm.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/pwm.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"

void pwminit(void)
{

SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);

PWMClockSet(PWM0_BASE,SYSCTL_PWMDIV_16);

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);


GPIOPinConfigure(GPIO_PF0_M0PWM0);
GPIOPinConfigure(GPIO_PF1_M0PWM1);


GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1);

PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN |
PWM_GEN_MODE_NO_SYNC);


PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 20000);

PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0|PWM_OUT_1,
1000);

long aw=PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0);


PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT|PWM_OUT_1_BIT, true);

PWMGenEnable(PWM0_BASE, PWM_GEN_0);

}

//然后main是这样的

int main(void)
{

g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480), 16000000);

pwminit();
uartinit();

adcinit();
IntEnable(INT_PWM0_0|INT_PWM0_1|INT_UART3);
IntMasterEnable();
while(1)
{


pmwclk2333=PWMClockGet(PWM0_BASE);

}
}



  • g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480), 16000000);

    这个最后一个参数,你要把主频配置为16Mhz吗?TM4C129x的最大主频是120Mhz,你这个最后一个参数就设置错误了。

  • Yizhou Chen 说:

    调了一晚上了,想让pwm输出50hz的周期的pwm来驱动舵机,然而pwm时钟就是不分频。我设置的是16分频,但用pmwclkget函数,返回的是“不分频”,示波器测出来的是800hz,求大家解答。

    附上pwm代码

    #include"main.h"
    #include"duoji.h"
    #include"pwm.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/pwm.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"

    void pwminit(void)
    {

    SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);

    PWMClockSet(PWM0_BASE,SYSCTL_PWMDIV_16);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);


    GPIOPinConfigure(GPIO_PF0_M0PWM0);
    GPIOPinConfigure(GPIO_PF1_M0PWM1);


    GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0|GPIO_PIN_1);

    PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN |
    PWM_GEN_MODE_NO_SYNC);


    PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 20000);

    PWMPulseWidthSet(PWM0_BASE, PWM_OUT_0|PWM_OUT_1,
    1000);

    long aw=PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0);


    PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT|PWM_OUT_1_BIT, true);

    PWMGenEnable(PWM0_BASE, PWM_GEN_0);

    }

    //然后main是这样的

    int main(void)
    {

    g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480), 16000000);

    pwminit();
    uartinit();

    adcinit();
    IntEnable(INT_PWM0_0|INT_PWM0_1|INT_UART3);
    IntMasterEnable();
    while(1)
    {


    pmwclk2333=PWMClockGet(PWM0_BASE);

    }
    }



    //*****************************************************************************
    ///
    //! Sets the PWM clock configuration.
    //!
    //! \param ui32Base is the base address of the PWM module.
    //! \param ui32Config is the configuration for the PWM clock; it must be one of
    //! \b PWM_SYSCLK_DIV_1, \b PWM_SYSCLK_DIV_2, \b PWM_SYSCLK_DIV_4,
    //! \b PWM_SYSCLK_DIV_8, \b PWM_SYSCLK_DIV_16, \b PWM_SYSCLK_DIV_32, or
    //! \b PWM_SYSCLK_DIV_64.
    //!
    //! This function sets the PWM clock divider as the PWM clock source. It also
    //! configures the clock frequency to the PWM module as a division of the
    //! system clock. This clock is used by the PWM module to generate PWM
    //! signals; its rate forms the basis for all PWM signals.
    //!
    //! \note This function should not be used with TM4C123 devices. For
    //! TM4C123 devices, the SysCtlPWMClockGet() function should be used.
    //!
    //! \note The clocking of the PWM is dependent upon the system clock rate as
    //! configured by SysCtlClockFreqSet().
    //!
    //! \return None.
    //
    //*****************************************************************************

    注意红色字体部分,TM4C123需要使用SysCtlPWMClockGet() 

    所以不清楚你是使用哪个具体物料?

  • PWMClockSet(PWM0_BASE,SYSCTL_PWMDIV_16);

    第二个参数修改为:PWM_SYSCLK_DIV_16。

    原因: PWMClockSet中这个参数重新进行了定义,参见PWMClockSet  API说明。

    如果是TM4C123x中需要使用SysCtlPWMClockSet(SYSCTL_PWMDIV_16),第二个参数,是您上面引用的。

    这个问题我也遇到了,PWMClockSet一开始用的SYSCTL_PWMDIV_x,不分频,改为PWM_SYSCLK_DIV_x,则分频正常。