关于LM3S1138的PWM时钟设置的问题,想请教大家



看到公司提供的库函数对于PWM的时钟设置,提供了一个函数如下:

 SysCtlPWMClockSet()

我理解是对主频分频下来做PWM的时钟信号,可是感觉这样下来没看到效果啊?请问有谁有理解?

  •        //PWM时钟配置:不分频

       SysCtlPWMClockSet(SYSCTL_PWMDIV_1);

     括号里面是有参数的,SYSCTL_PWMDIV_1 是一分频的宏;

    楼主可以参看StellarisWarer软件库中的PWM部分例程;

    也可以在官网上下载外设驱动库应用指南查阅库函数的具体用法:www.ti.com/.../spmu019m.pdf

  • 是啊 我知道你说的代表不分频处理  可是我把它改成别的后  程序下载到单片机后 没有看到PWM时钟发生变化啊?我想问 在配置PWM时钟的时候需要注意什么地方的没?

  • liu zhang 说:

    看到公司提供的库函数对于PWM的时钟设置,提供了一个函数如下:

     SysCtlPWMClockSet()

    我理解是对主频分频下来做PWM的时钟信号,可是感觉这样下来没看到效果啊?请问有谁有理解?

    你说得没错,确实是对主频分频下来作为PWM的时钟信号。

    不过PWM的脉宽或者周期还需要用函数PWMPulseWidthSet或PWMGenPeriodSet来设定。这样你才能够看到波形发生变化。

    你可以参考以下datasheet中有关pwm的初始化和配置相关内容:

    初始化和配置

    以下是对PWM发生器0进行初始化的示例,要求频率为25KHz,PWM0管脚上的占空比为25%,

    PWM1管脚上的占空比为75%,这个实例假定系统时钟为20MHz。

    1. 使能PWM时钟,通过写0x0010.0000到系统控制模块中的RCGC0 寄存器来实现。

    2. 使能对应GPIO模块的时钟,通过系统控制模块中的RCGC2 寄存器来实现

    3. 在GPIOCTL模式中,根据管脚具体的功能,使用GPIOAFSEL 寄存器来使能相应的管脚。

    4. 配置GPIOPCTL 寄存器中的PMCn字段,为相应的引脚分配PWM信号。

    5. 配 置 系 统 控 制 模 块 中 的 运 行 - 模式时钟配置( RCC ) 寄存器配置为使用PWM分频

    (USEPWMDIV) ,并将分频器(PWMDIV)设置为分频2 (000)。

    6. 将PWM发生器配置为递减计数模式,并立即更新参数。

    ■ 向PWM0CTL 寄存器写入0x0000.0000.

    ■ 向PWM0GENA寄存器写入0x0000.008C.

    ■ 向PWM0GENB寄存器0x0000.080C.

    7. 设置周期。若要得到25Khz频率,即周期为1/25,000(40μs)。PWM时钟源为10MHz;由系

    统时钟2分频得到。这意味着一个定时器周期等于400个PWM时钟。然后用这个值来设置

    PWM0LOAD 寄存器。在递减模式中,将PWM0LOAD 寄存器的load字段设置为请求的周期减1。

    ■ 向 PWM0LOAD 寄存器写入0x0000.018F (399)。

    8. 将PWM0管脚的脉冲宽度设置为25%占空比。

    ■ 向PWM0CMPA 寄存器写入0x0000.012B。(299)

    9. 将PWM1管脚的脉冲宽度设置为75%占空比。

    ■ 向PWM0CMPB 寄存器写入0x0000.0063。(99)

    10. 启动PWM发生器0中的定时器。

    ■ 向PWM0CTL寄存器写入0x0000.0001。

    11. 使能PWM输出.

    ■ 向PWMENABLE 寄存器写入0x0000.0003。

    请看第5步和第7步,你完成了第5步……

  • 另外很重要的一点是LM3S1138内部没有PWM模块,它是利用通用定时器模块通过软件模拟实现的一个简单得PWM模式!

    所以你要改变PWM输出脉宽,实际上是通过改变定时器的周期来实现的。