首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

lm3s811 学习【PWM】

PWM是一种对模拟信号电平进行数字化编码的方法,可以通过调整方波的占空比来对模拟信号电平进行编码,通常使用在开关电源(switching power)和电机控制中。
Stellaris® PWM模块由 3个 PWM发生器模块 1个控制模块组成。每个 PWM发生器模块包含1个定时器(16位递减或先递增后递减计数器),2个PWM比较器,PWM信号发生器,死区发生器和中断/ADC-触发 选择器。而控制模块决定了PWM信号的极性,以及将哪个信号传递到管脚。

下图为PWM模块结构图

当讨论到一个 PWM 模块的各种部件时,这个 API 使用了下列标号约定:
3 个发生器模块称为 Gen0、Gen1 和 Gen2。
与每个发生器模块相关的 2 个 PWM 输出信号称为 OutA 和 OutB。
6 个输出信号称为 PWM0、PWM1、PWM2、PWM3、PWM4和 PWM5。

PWM0 和 PWM1 对应 Gen0、PWM2和 PWM3 对应 Gen1、PWM4 和 PWM5 对应 Gen2。
而且,作为对这个 API 的一个简化的假设,每个发生器模块的比较器 A 专门用来调整偶数编号的 PWM 输出(PWM0、PWM2 和 PWM4)的脉宽。另外,比较器 B 专门用于奇数编号的 PWM 输出(PWM1、PWM3和 PWM5) 。

附上代码:
int  main (void)
{
    jtagWait();

SysCtlClockSet(SYSCTL_SYSDIV_1 |                                    /*  配置6MHz外部晶振作为主时钟  */
                   SYSCTL_USE_OSC  |
                   SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_6MHZ);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);                        /*  使能PWM2和PWM3输出所在GPIO  */
    SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);                          /*  使能PWM模块                 */
    SysCtlPWMClockSet(SYSCTL_PWMDIV_1);                                 /*  PWM时钟配置:不分频         */
    GPIOPinTypePWM(GPIO_PORTB_BASE,                                     /*  PB0和PB1配置为PWM功能       */
                   GPIO_PIN_0 | GPIO_PIN_1);
    PWMGenConfigure(PWM_BASE, PWM_GEN_1,                                /*  配置PWM发生器1:加减计数    */
                    PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
    PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 60000);                        /*  设置PWM发生器1的周期        */
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 3000);                        /*  设置PWM2输出的脉冲宽度      */
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, 3000);                        /*  设置PWM3输出的脉冲宽度      */
    PWMOutputState(PWM_BASE,                                            /*  使能PWM2和PWM3的输出        */
                   PWM_OUT_2_BIT | PWM_OUT_3_BIT,
                   true);
    PWMGenEnable(PWM_BASE, PWM_GEN_1);                                  /*  使能PWM发生器1,开始产生    */
                                                                        /*  PWM方波                     */
    PWMGenIntTrigEnable(PWM_BASE,                                       /*  使能PWM发生器1归零触发中断  */
                        PWM_GEN_1,
                        PWM_INT_CNT_ZERO);
    PWMIntEnable(PWM_BASE, PWM_GEN_1);                                  /*  使能PWM发生器1中断          */
    IntEnable(INT_PWM1);                                                /*  使能PWM1中断                */
    IntMasterEnable();                                                  /*  使能总中断                  */
    for (;;) {
    }
}

这个例程是拿L5、L6对应的PWM2、PWM3来说明的
1、显然我们应该使能外设。GPIO B 和PWM(在这之前主时钟设置)
2、PWM时钟设置(由系统时钟分频得到)
3、PB0和PB1设置成PWM类型
4、PWMGenConfigure()PWN发生器模式配置(PWM2和 PWM3 对应 Gen1),设置发生器周期。
5、设置输出信号脉宽,使能输出
6、使能发生器,开始产生方波
7、使能PWM1发生器中断
8、PWM1使能中断
返回列表