[DemoCode下载] 以Timer控制RGB LED實現調光&閃爍&呼吸燈功能

[复制链接]
3481|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, 下载次数: 38)
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

粉丝
快速回复 在线客服 返回列表 返回顶部