5724|6

1万

帖子

16

TA的资源

版主

楼主
 

LM3S811DDLLXXRR笔记之二:PWM控制LED闪烁 [复制链接]

每个Stellaris PWM模块提供3个PWM发生器模块和1个输出控制模块。每个发生器模块有2个PWM输出信号,它们可以单独操作,或者作为带有插入死区延时的一对信号来使用。每个发生器模块还有一个中断输出和一个触发输出。控制模块决定了PWM信号的极性以及哪些信号经过模块到达管脚。
Stellaris PWM模块具有的特性有:
􀁺 3个发生器模块,每个包含:
♦ 1个16位的递减或递增/递减计数器;
♦ 2个比较器;
♦ PWM发生器;
♦ 死区发生器。
􀁺 控制模块
♦ PWM输出使能;
♦ 输出极性控制;
♦ 同步;
♦ 故障处理;
♦ 中断状态。
这个驱动程序包含在src/pwm.c中,src/pwm.h包含应用使用的API定义。

 

 

想让PWM驱动LED闪就是不断改变电压,也就是改变占空比

 

以下程序控制着LM3S811板子的L5,L6分别是PB0,PB1上的PWM2,PWM3

 

 

 

需要强调的是那个中断必须加到S文件中,

 EXTERN PWM_Generator_1_ISR 加到.S文件上边部分

LIB文件夹里装有用到的库文件,如图所示

 

程序如下:

 

#include <LM3Sxxx.H>
 
#define PB0_PWM2  GPIO_PIN_0
#define PB1_PWM3  GPIO_PIN_1

//  防止JTAG失效
void jtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);          //  使能KEY所在的GPIO端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4);     //  设置KEY所在管脚为输入
if (GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_4) == 0x00)  //  若复位时按下KEY,则进入
    {
       while(1);                             //  死循环,以等待JTAG连接
    }
  SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC);   //  禁止KEY所在的GPIO端口
}

 

/*********************************************************************************************************
** Function name:       main()
** Descriptions:        主函数
** input parameters:    NONE
** output parameters:   NONE
** Returned value:      NONE
*********************************************************************************************************/
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 (;;) {
    }
}


/*********************************************************************************************************
** Function name:       PWM_Generator_1_ISR()
** Descriptions:        PWM发生器1中断服务函数
** input parameters:    NONE
** output parameters:   NONE
** Returned value:      NONE
*********************************************************************************************************/
void  PWM_Generator_1_ISR (void)
{
    const unsigned long ulTab[10] =
    {
         3000,  9000, 15000, 21000, 27000,
        33000, 39000, 45000, 51000, 57000
    };
    static unsigned long n = 0;
    PWMGenIntClear(PWM_BASE,
                   PWM_GEN_1,
                   PWM_INT_CNT_ZERO);
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, ulTab[n]);                    /*  设置PWM2输出的周期          */
    PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, ulTab[9-n]);                  /*  设置PWM3输出的周期          */
    n++;
    if ( n >= 10 ) {
        n = 0;
    }
}

 

程序打包:

myPWMLED.zip (1.32 KB, 下载次数: 115)

最新回复

  详情 回复 发表于 2012-10-10 10:53
 
点赞 关注
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr

回复
举报

996

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
到时候也来验证一下,看看控制亮度!~
 
 

回复

1万

帖子

16

TA的资源

版主

板凳
 

呵呵,我已经下载了,老亮了

反正比较闪人
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

4
 
不错,我的教程你们都写好了嘿嘿
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

5
 
不错 俺也学习来楼 支持版主大哥 关注您的笔记
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

6
 
好东西,下下来看看
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

7
 

hao

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表