打印
[DemoCode下载]

以Timer控制RGB LED實現調光&閃爍&呼吸燈功能

[复制链接]
3109|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Howard16|  楼主 | 2016-3-17 16:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Howard16 于 2016-3-17 18:46 编辑

l  支持芯片系列: M451 series
l  所使用的开发软件包: M451SeriesBSP_v3.01.001
l  Project 所在的目录.
\M451SeriesBSP_v3.01.001_RGBLED\SampleCode\NuEdu\
l  Project Name: Smpl_Basic01_RGBLED
l  所使用的板子:NuEdu-SDK-M451
Timer控制I/O显示LED的各种表现方式,包括RGB调光、闪烁以及常见的呼吸灯,通常调光都是用PWM设定duty的方式,但是当LED数量比PWM还多的时候,就轮到Timer出场了,只需要一组Timer定时去处理I/O状态即可。
程序中有五个参数可以设定,LED1_R, LED1_G, LED1_B这三个是设定RGB的亮度,输入值可为0~100对应0~100%的亮度,Blink参数是闪烁设定,输入值可为0~10,定义是1秒钟切成10份,设定要亮多久,例如:Blink=5,那就是亮0.5秒,灭0.5秒,来做闪烁功能,最后是brea参数,输入值为01,设定为1则将呼吸灯功能打开。

详细如何控制可以看Timer interrupt中的程序代码,有需要也可以增加I/O数量控制更多LED


void TMR1_IRQHandler(void)
{
    if(TIMER_GetIntFlag(TIMER1) == 1)
    {
        uint32_t LED_duty,RLED,BLED,GLED,LED_brea;
        /* Clear Timer1 time-out interrupt flag */
        TIMER_ClearIntFlag(TIMER1);
                                LED_cnt++;
                                LED_duty=LED_cnt%100;
                                if ((brea==1)&&((brea_cnt%2)==0))
                                                LED_brea=100-(LED_cnt/100);
                                else if (brea==1)
                                                LED_brea=LED_cnt/100;
                                else
                                                LED_brea=0;
                               
                                RLED=((int32_t)(LED1_R-LED_duty-LED_brea)>0)?1:0;
                                BLED=((int32_t)(LED1_B-LED_duty-LED_brea)>0)?1:0;
                                GLED=((int32_t)(LED1_G-LED_duty-LED_brea)>0)?1:0;       
                       
                                if (LED_cnt>=(Blink*1000))
                                {
                                                RLED=0;
                                                BLED=0;
                                                GLED=0;
                                }
                                       
                                PC->DOUT = (PC->DOUT|BIT9|BIT10|BIT11)&(~((RLED<<9)|(GLED<<10)|(BLED<<11)));
                                if (LED_cnt==10000)
                                {
                                                LED_cnt=0;
                                                brea_cnt++;
                                }
    }
}


M451SeriesBSP_v3.01.001_RGBLED.rar (753.69 KB)
沙发
wahahaheihei| | 2016-3-17 22:30 | 只看该作者
这算是一种基于定时器的模拟方法,不如直接使用PWM的方法更高效率。

使用特权

评论回复
板凳
598330983| | 2016-3-20 20:16 | 只看该作者
当LED数量比PWM还多的时候,就轮到Timer出场了,只需要一组Timer定时去处理I/O状态即可。

使用特权

评论回复
地板
Roderman_z| | 2016-3-20 20:47 | 只看该作者
好像用硬件PWM的方式做呼吸灯更容易实现并且节约资源

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

44

帖子

1

粉丝