搜索
bottom↓
回复: 30

RGB LED 七彩灯 做的12种颜色的呼吸灯 对数调光

  [复制链接]

出0入0汤圆

发表于 2015-10-10 14:35:06 | 显示全部楼层 |阅读模式
本帖最后由 mathison 于 2015-10-10 14:38 编辑

参考

http://www.amobbs.com/thread-5276839-1-1.html

http://www.amobbs.com/thread-5512126-1-1.html

思路来自
http://www.amobbs.com/thread-4192967-1-1.html
中“cowboy” 回复中提到的
“频率固定,亮度Y取值为0~255,色彩用RBG的比例表示,R:B:G 比值不同就有不同的色彩。设定色彩时使R+B+G=256,然后,R、B、G分别与Y相乘,再除以256,分别作为三个PWM的点空比。”


8组 RGB LED灯  3x8 = 24个 普通 GPIO口 控制 LED灯,

废话不说 直接上代码:


#if 1 //12中颜色的RGB定义ok
u8_t code RGB[13][3] =
{
    {0xFF, 0x00, 0x00},// 0 ok
    {0xFF, 0x0C, 0x00 },// 1 ok
    {0xFF, 0x33, 0x00},// 2 ok

    {0xFF, 0x66, 0x00}, // 3 ok
    {0xFF, 0xFF, 0x00 }, // 4 //ok
    {0x00, 0x99, 0x00},// 5 ok g

    {0x00, 0x99, 0x33},// 6 ok 99
    {0x00, 0x50, 0x99},// 6 ok
    {0x00, 0x00, 0x99},// 7 ok blue

    //{0x33, 0x00, 0x99}, // 8 ok
    {0x99, 0x00, 0x99}, // 9 ok
    {0xCC, 0x00, 0x66}, // 10 ok
    {0xCC, 0x00, 0x33}, // 11 ok
    //{0xFF, 0xFF, 0xFF}, // 12
    {0x00, 0x00, 0x00}
};
#endif

//80级的对数 LED 亮度的定义

#define CONST_RESPIRATION_LAMP_SERIES 80

code unsigned char RESPIRATION_LAMP_TABLE[] =
{
    1,
    1,
    1,
    1,
    1,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    2,
    3,
    3,
    3,
    3,
    3,
    4,
    4,
    4,
    5,
    5,
    5,
    6,
    6,
    6,
    7,
    7,
    8,
    9,
    9,
    10,
    11,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18,
    20,
    21,
    23,
    24,
    26,
    28,
    30,
    32,
    34,
    37,
    39,
    42,
    45,
    48,
    52,
    56,
    60,
    64,
    68,
    73,
    79,
    84,
    90,
    97,
    104,
    111,
    119,
    128,
    137,
    147,
    157,
    168,
    180,
    193,
    207,
    222,
    238,
    255,
    255
};

//3x8 = 24个 普通 GPIO口
// 1
#define LED1_RED_OUT        GPIO7_CFG_OUTPUT
#define LED1_RED_ON     GPIO7(1)//_nop_()//
#define LED1_RED_OFF        GPIO7(0)

#define LED1_GREEN_OUT  GPIO8_CFG_OUTPUT
#define LED1_GREEN_ON   GPIO8(1)
#define LED1_GREEN_OFF  GPIO8(0)

#define LED1_BLUE_OUT   GPIO12_CFG_OUTPUT
#define LED1_BLUE_ON    GPIO12(1)
#define LED1_BLUE_OFF   GPIO12(0)



// 2
#define LED2_RED_OUT    P02_CFG_OUTPUT//P00_CFG_OUTPUT
#define LED2_RED_ON P02 = 1
#define LED2_RED_OFF    P02 = 0

#define LED2_GREEN_OUT  P01_CFG_OUTPUT
#define LED2_GREEN_ON   P01 = 1
#define LED2_GREEN_OFF  P01 = 0

#define LED2_BLUE_OUT   P00_CFG_OUTPUT//P02_CFG_OUTPUT
#define LED2_BLUE_ON    P00 = 1
#define LED2_BLUE_OFF   P00 = 0

// 3
#define LED3_RED_OUT    P20_CFG_OUTPUT
#define LED3_RED_ON     P20 = 1
#define LED3_RED_OFF    P20 = 0

#define LED3_GREEN_OUT  P04_CFG_OUTPUT
#define LED3_GREEN_ON   P04 = 1
#define LED3_GREEN_OFF P04 = 0

#define LED3_BLUE_OUT   P03_CFG_OUTPUT
#define LED3_BLUE_ON    P03 = 1
#define LED3_BLUE_OFF   P03 = 0


// 4
#define LED4_RED_OUT    P23_CFG_OUTPUT
#define LED4_RED_ON     P23 = 1
#define LED4_RED_OFF    P23 = 0

#define LED4_GREEN_OUT P24_CFG_OUTPUT
#define LED4_GREEN_ON   P24 =1
#define LED4_GREEN_OFF  P24 =0

#define LED4_BLUE_OUT   P25_CFG_OUTPUT
#define LED4_BLUE_ON    P25 = 1
#define LED4_BLUE_OFF   P25 = 0


// 5
#define LED5_RED_OUT    P26_CFG_OUTPUT
#define LED5_RED_ON     P26=1
#define LED5_RED_OFF    P26 = 0

#define LED5_GREEN_OUT P27_CFG_OUTPUT
#define LED5_GREEN_ON   P27 =1
#define LED5_GREEN_OFF  P27 = 0

#define LED5_BLUE_OUT   P17_CFG_OUTPUT
#define LED5_BLUE_ON    P17 = 1
#define LED5_BLUE_OFF   P17 = 0

// 6
#define LED6_RED_OUT    GPIO17_CFG_OUTPUT
#define LED6_RED_ON GPIO17(1)
#define LED6_RED_OFF    GPIO17(0)

#define LED6_GREEN_OUT GPIO18_CFG_OUTPUT
#define LED6_GREEN_ON   GPIO18(1)
#define LED6_GREEN_OFF GPIO18(0)

#define LED6_BLUE_OUT   P10_CFG_OUTPUT
#define LED6_BLUE_ON    P10 = 1
#define LED6_BLUE_OFF   P10 = 0

// 7
#define LED7_RED_OUT    GPIO14_CFG_OUTPUT
#define LED7_RED_ON GPIO14(1)
#define LED7_RED_OFF    GPIO14(0)

#define LED7_GREEN_OUT  GPIO15_CFG_OUTPUT
#define LED7_GREEN_ON   GPIO15(1)
#define LED7_GREEN_OFF  GPIO15(0)

#define LED7_BLUE_OUT   GPIO16_CFG_OUTPUT
#define LED7_BLUE_ON    GPIO16(1)
#define LED7_BLUE_OFF   GPIO16(0)

// 8
#define LED8_RED_OUT    GPIO13_CFG_OUTPUT
#define LED8_RED_ON     GPIO13(1)
#define LED8_RED_OFF    GPIO13(0)

#define LED8_GREEN_OUT  P34_CFG_OUTPUT
#define LED8_GREEN_ON   P34 = 1
#define LED8_GREEN_OFF  P34 = 0

#define LED8_BLUE_OUT   P35_CFG_OUTPUT
#define LED8_BLUE_ON    P35 = 1
#define LED8_BLUE_OFF   P35 = 0


//Timer0 系统时间片

//Timer1:用来做呼吸灯  大约80us产生一次中断 4MHz的 系统时钟
//TMOD[5:4]=10来选择模式 2
//定时器是由清除 TMOD[6]来选择的
//作为一个 8位重载定时器/计数器工作的。
void timer_init(void)     //定时器初始化
{
    //TMOD = 0x21;
    TMOD = TMOD & 0xF0;
    TMOD = TMOD | 0x01;
    TL0 = T0_LOW;
    TH0 = T0_HIGH;
    TR0 = 1;
    ET0 = 1;
#if 1
    TMOD = TMOD & 0x0F;
    TMOD = TMOD | 0x20;
    PT1 = 1;//优先级
    //TH1 = 0xC3;//200us
    //TL1 = 0xC3;//
    TH1 = 0xE8;//80us--E8
    TL1 = 0xE8;//
    TR1 = 1;        //允许T1跑起来
    ET1 = 1;
#endif
}

实现的代码如下:

void TIMER1_ISR (void) interrupt 3 //using 1
{
#if 1
    u16_t tmp_respiration_lamp_threshold;

    //GPIO0 ^= BIT7; 50us  //TH1 = 0xF0;//50us //TL1 = 0xF0;//
    //GPIO0 ^= BIT7; //80us  79us

    //if(bFlag_respiration_lamp_enable)
    if(led_display_mode == BREATHE)
    {
        //
        if(!(++respiration_lamp_timer))
        {
            TL0 = T0_LOW;
            TH0 = T0_HIGH;

            //TR0 = 0;
            //ET0 = 0;
            //256*100us=25600us
            //respiration_lamp_timer = 96; //100-->96   200us * 100 =20000us =2ms  2ms*256=512ms *80
            //GPIO0 ^= BIT7;//13.5ms  50us*256 = 12800us = 12.8ms
            //GPIO0 ^= BIT7
            if(led_inc_or_dec_flag)
            {
                //lamp_series_down
                if(!(--respiration_lamp_series))
                {
                    //TURN_ON_RED;
                    led_inc_or_dec_flag = 0;

                    //GPIO0 ^= BIT7;//  一呼一吸2.160s  单呼单吸1.080s  13.5ms X 80 = 1080ms //TH1 = 0xF0;//50us //TL1 = 0xF0;//
                    //++respiration_lamp_num;
                    //GPIO0 ^= BIT7;//
                    if(++respiration_lamp_num > 11)respiration_lamp_num = 0;
                }

            }
            else

            {
                //lamp_series_up
                if(++respiration_lamp_series >= CONST_RESPIRATION_LAMP_SERIES)
                {
                    led_inc_or_dec_flag = 1;//TURN_OFF_RED;
                    //GPIO0 ^= BIT7;//  一呼一吸2.160s  单呼单吸1.080s //TH1 = 0xF0;//50us //TL1 = 0xF0;//
                    //GPIO0 ^= BIT7;////  一呼一吸3.260s  单呼单吸1.630s
                }

            }

            //mov here
            respiration_lamp_threshold = RESPIRATION_LAMP_TABLE[
                                             respiration_lamp_series];


#if 1  //“频率固定,亮度Y取值为0~255,色彩用RBG的比例表示,R:B:G 比值不同就有不同的色彩。设定色彩时使R+B+G=256,然后,R、B、G分别与Y相乘,再除以256,分别作为三个PWM的点空比。”
//这里没有严格按照  cowboy 的回复去做 而是根据 RGB的数组来做,RGB的颜色是客户指定的,我用photoshop 试管取的。

            red_lamp = RGB[respiration_lamp_num][0];
            tmp_respiration_lamp_threshold = respiration_lamp_threshold * red_lamp;
            red_lamp = (u8_t)(tmp_respiration_lamp_threshold >> 8);

            green_lamp = RGB[respiration_lamp_num][1]; //
            tmp_respiration_lamp_threshold = respiration_lamp_threshold * green_lamp;
            green_lamp = (u8_t)(tmp_respiration_lamp_threshold >> 8);

            blue_lamp = RGB[respiration_lamp_num][2];
            tmp_respiration_lamp_threshold = respiration_lamp_threshold * blue_lamp;
            blue_lamp = (u8_t)(tmp_respiration_lamp_threshold >> 8);
#endif
        }

        {
#if 1

            if(respiration_lamp_timer >= red_lamp)
            {
                if(red_lamp_on)
                {
                    red_lamp_on = 0;
                    LED1_RED_OFF;
                    LED2_RED_OFF;
                    LED3_RED_OFF;
                    LED4_RED_OFF;
                    LED5_RED_OFF;
                    LED6_RED_OFF;
                    LED7_RED_OFF;
                    LED8_RED_OFF;
                }
            }
            else
            {
                if(!red_lamp_on)
                {
                    red_lamp_on = 1;
                    LED1_RED_ON;
                    LED2_RED_ON;
                    LED3_RED_ON;
                    LED4_RED_ON;
                    LED5_RED_ON;
                    LED6_RED_ON;
                    LED7_RED_ON;
                    LED8_RED_ON;
                }
            }

#endif
#if 1

            if(respiration_lamp_timer >= green_lamp)
            {
                if(green_lamp_on)
                {
                    green_lamp_on = 0;
                    LED1_GREEN_OFF;
                    LED2_GREEN_OFF;
                    LED3_GREEN_OFF;
                    LED4_GREEN_OFF;
                    LED5_GREEN_OFF;
                    LED6_GREEN_OFF;
                    LED7_GREEN_OFF;
                    LED8_GREEN_OFF;
                }
            }
            else
            {
                if(!green_lamp_on)
                {
                    green_lamp_on = 1;
                    LED1_GREEN_ON;
                    LED2_GREEN_ON;
                    LED3_GREEN_ON;
                    LED4_GREEN_ON;
                    LED5_GREEN_ON;
                    LED6_GREEN_ON;
                    LED7_GREEN_ON;
                    LED8_GREEN_ON;
                }
            }

#endif
#if 1

            if(respiration_lamp_timer >= blue_lamp)
            {
                if(blue_lamp_on)
                {
                    blue_lamp_on = 0;
                    LED1_BLUE_OFF;
                    LED2_BLUE_OFF;
                    LED3_BLUE_OFF;
                    LED4_BLUE_OFF;
                    LED5_BLUE_OFF;
                    LED6_BLUE_OFF;
                    LED7_BLUE_OFF;
                    LED8_BLUE_OFF;
                }
            }
            else
            {
                if(!blue_lamp_on)
                {
                    blue_lamp_on = 1;
                    LED1_BLUE_ON;
                    LED2_BLUE_ON;
                    LED3_BLUE_ON;
                    LED4_BLUE_ON;
                    LED5_BLUE_ON;
                    LED6_BLUE_ON;
                    LED7_BLUE_ON;
                    LED8_BLUE_ON;
                }
            }

#endif
        }
    }
}


阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2015-10-10 15:58:18 | 显示全部楼层
玩玩可以,产品就呵呵了

出0入0汤圆

发表于 2015-10-10 16:20:10 | 显示全部楼层
冲着对数调光,先收下了,以后再慢慢看。

出0入0汤圆

 楼主| 发表于 2015-10-10 20:20:54 | 显示全部楼层
nishuizhou 发表于 2015-10-10 15:58
玩玩可以,产品就呵呵了

别吓我啊 这是个真实的产品,出口的单。

出0入0汤圆

发表于 2015-10-10 20:36:09 | 显示全部楼层
其实一直在奇怪,对数曲线是以前对于传统灯源的,现在的LED灯源是否还是适用呢?

出0入0汤圆

发表于 2015-10-12 09:52:01 | 显示全部楼层
mathison 发表于 2015-10-10 20:20
别吓我啊 这是个真实的产品,出口的单。

你用的是STM8S么?量多么?为什么不去定制芯片?

出0入0汤圆

发表于 2015-10-12 12:47:13 | 显示全部楼层
本帖最后由 zyw19987 于 2015-10-12 12:48 编辑

有没有严格cowboy 思路来做的程序。
一直没想到好的思路。
按他那思路写应用比较灵活。

出0入0汤圆

发表于 2015-10-12 13:01:20 | 显示全部楼层
nishuizhou 发表于 2015-10-10 15:58
玩玩可以,产品就呵呵了

是不是觉得大材小用啦

出0入0汤圆

 楼主| 发表于 2015-10-12 14:15:04 | 显示全部楼层
nishuizhou 发表于 2015-10-12 09:52
你用的是STM8S么?量多么?为什么不去定制芯片?

用的是 类8051的MCU 但不是STC

每个月所有产品加起来的出货 大概在 50k 左右吧 具体不是很清楚 只有业务知道出货量

出0入0汤圆

 楼主| 发表于 2015-10-12 14:18:29 | 显示全部楼层
zyw19987 发表于 2015-10-12 12:47
有没有严格cowboy 思路来做的程序。
一直没想到好的思路。
按他那思路写应用比较灵活。 ...

设定色彩时使R+B+G=256

实际上客户要求的 颜色  不可能 正好 R+B+G=256

所以我说没有  严格按 cowboy 说的做

出0入0汤圆

发表于 2015-10-13 05:28:27 来自手机 | 显示全部楼层
mathison 发表于 2015-10-12 14:18
设定色彩时使R+B+G=256

实际上客户要求的 颜色  不可能 正好 R+B+G=256

cowboy的思路没法做全彩?

出0入0汤圆

发表于 2015-10-22 09:20:44 | 显示全部楼层
你的C8051能控制到5毛钱以下吗?

出0入0汤圆

发表于 2015-10-22 14:17:00 来自手机 | 显示全部楼层
什么是对数调光?

出0入0汤圆

发表于 2015-10-24 16:36:31 | 显示全部楼层
不错,真的需要。谢谢楼主

出0入0汤圆

 楼主| 发表于 2015-11-5 16:30:20 | 显示全部楼层
nishuizhou 发表于 2015-10-22 09:20
你的C8051能控制到5毛钱以下吗?

看我搂主位给出的参考连接

出0入0汤圆

发表于 2015-11-5 16:50:35 | 显示全部楼层
对数调光 学习了

出0入0汤圆

发表于 2017-7-20 09:46:37 | 显示全部楼层
你好,我想请教您,那个RGB调光的,调光光那里我有点不太理解。亮度Y=0~256,R+G+B = 256;最终的颜色是(R、G、B*Y)/256;这样的数值不是最多只能达到85么?

出0入0汤圆

发表于 2017-7-20 09:49:25 | 显示全部楼层
mark 一下

出0入0汤圆

发表于 2017-7-28 00:12:03 | 显示全部楼层
涧边梧桐 发表于 2017-7-20 09:46
你好,我想请教您,那个RGB调光的,调光光那里我有点不太理解。亮度Y=0~256,R+G+B = 256;最终的颜色是(R ...

亮度Y取值为0~255  

code unsigned char RESPIRATION_LAMP_TABLE[]
这个表就是 Y的取值

出0入0汤圆

发表于 2017-7-28 11:21:00 | 显示全部楼层
mark一下 后面号使用

出0入0汤圆

发表于 2018-6-3 10:37:27 | 显示全部楼层
mark 对数调光

出0入0汤圆

发表于 2018-7-9 09:26:04 | 显示全部楼层
学习了,刚好碰到这个知识点。谢谢。

出0入0汤圆

发表于 2018-7-9 12:22:11 | 显示全部楼层
好办法
值得学习一下~~~~

出0入0汤圆

发表于 2018-10-31 11:31:41 | 显示全部楼层
对数调光可以用在单路调光上吗?

出0入0汤圆

发表于 2018-11-29 20:37:13 | 显示全部楼层
现在汽车上都RGB酷炫LED了,用FPGA控制,只能远观。

出0入0汤圆

发表于 2019-3-11 11:13:47 | 显示全部楼层
RGB LED 收藏

出0入0汤圆

发表于 2019-3-13 14:03:24 | 显示全部楼层
RGB LED 收藏

出0入0汤圆

发表于 2020-10-9 21:24:36 | 显示全部楼层
mark 呼吸灯

出0入0汤圆

发表于 2020-10-9 21:36:08 | 显示全部楼层
不错 调光

出0入0汤圆

发表于 2020-10-10 15:28:11 | 显示全部楼层
实际效果怎么样?

出0入0汤圆

发表于 2021-11-19 10:23:35 | 显示全部楼层

mark 呼吸灯
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 06:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表