搜索
bottom↓
回复: 14

请问8位机全彩RGB渐变,有好的算法吗?

[复制链接]

出0入0汤圆

发表于 2022-2-24 10:16:25 | 显示全部楼层 |阅读模式
如题,项目有个附属功能需要有个RGB灯做全彩渐变效果。开始用R G B三个PWM相位相差120度呼吸灯,自我感觉效果还可以,但是这样的效果同时只有两个颜色混色,没有三个颜色的时候,客户不满意。我想用可能要用HSV转RGB,可是8位机的算力不够。。  请问大家有啥简单的办法么?谢谢~!

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入224汤圆

发表于 2022-2-24 10:24:44 | 显示全部楼层
给你个HSV转RGB的算法,你看看

  1. void led_strip_hsv2rgb(uint32_t h, uint32_t s, uint32_t v, uint32_t *r, uint32_t *g, uint32_t *b)
  2. {
  3.     h %= 360; // h -> [0,360]
  4.     uint32_t rgb_max = v * 2.55f;
  5.     uint32_t rgb_min = rgb_max * (100 - s) / 100.0f;

  6.     uint32_t i = h / 60;
  7.     uint32_t diff = h % 60;

  8.     // RGB adjustment amount by hue
  9.     uint32_t rgb_adj = (rgb_max - rgb_min) * diff / 60;

  10.     switch (i) {
  11.     case 0:
  12.         *r = rgb_max;
  13.         *g = rgb_min + rgb_adj;
  14.         *b = rgb_min;
  15.         break;
  16.     case 1:
  17.         *r = rgb_max - rgb_adj;
  18.         *g = rgb_max;
  19.         *b = rgb_min;
  20.         break;
  21.     case 2:
  22.         *r = rgb_min;
  23.         *g = rgb_max;
  24.         *b = rgb_min + rgb_adj;
  25.         break;
  26.     case 3:
  27.         *r = rgb_min;
  28.         *g = rgb_max - rgb_adj;
  29.         *b = rgb_max;
  30.         break;
  31.     case 4:
  32.         *r = rgb_min + rgb_adj;
  33.         *g = rgb_min;
  34.         *b = rgb_max;
  35.         break;
  36.     default:
  37.         *r = rgb_max;
  38.         *g = rgb_min;
  39.         *b = rgb_max - rgb_adj;
  40.         break;
  41.     }
  42. }
复制代码

出0入90汤圆

发表于 2022-2-24 10:44:57 | 显示全部楼层
是要用HSV,算力不够空间来凑啊,提前算好存下来

出0入0汤圆

 楼主| 发表于 2022-2-24 11:14:37 | 显示全部楼层
aammoo 发表于 2022-2-24 10:44
是要用HSV,算力不够空间来凑啊,提前算好存下来
(引用自3楼)

空间也不够

出0入0汤圆

 楼主| 发表于 2022-2-24 11:14:50 | 显示全部楼层
yyts 发表于 2022-2-24 10:24
给你个HSV转RGB的算法,你看看
(引用自2楼)

先谢谢~!

出0入0汤圆

 楼主| 发表于 2022-2-24 14:05:12 | 显示全部楼层
没仔细看HVS转RGB程序,抛开V ,S两项为固定值的情况下,没有浮点运算。问题解决,感谢大家。

出0入0汤圆

发表于 2022-2-24 14:10:27 | 显示全部楼层
有没有视频看效果如何

出0入16汤圆

发表于 2022-2-24 14:59:03 | 显示全部楼层
楼主,给你一个思路:3个颜色可以混出来7种颜色,保存下来表格
R         G         B
255     0          0
0         255      0
0         0          255
255     255      0
255     0          255
0         255      255
255     255      255
通过设置RGB三个变量,当前变量值跟颜色表格的目标颜色对比,大的就自减1,小的就自加1,三个变量都等于目标颜色了,就取下一个目标颜色做对比,每对比一次,就将当前的RGB变量值输出给到PWM,这样就可以控制渐变了,通过设置对比的速度,可以控制渐变的快慢

出0入0汤圆

 楼主| 发表于 2022-2-24 16:33:10 | 显示全部楼层
#define rgb_max  255
#define rgb_min   0
void led_strip_hsv2rgb(void)
{
        static unsigned char Speed=0;
        unsigned char i,diff;
        unsigned int rgb_adj;
        //=========
        if(Speed<5)
        {
                Speed++;
                return;
        }
        Speed=0;
    h++;
    if(h>360)h=0;
    i = h / 60;
    diff = h % 60;
        rgb_adj = 255* diff / 60;
    switch (i)
     {
    case 0:
        PwmR = rgb_max;
        PwmG = rgb_min + rgb_adj;
        PwmB = rgb_min;
        break;
    case 1:
        PwmR = rgb_max - rgb_adj;
        PwmG = rgb_max;
        PwmB = rgb_min;
        break;
    case 2:
        PwmR = rgb_min;
        PwmG = rgb_max;
        PwmB = rgb_min + rgb_adj;
        break;
    case 3:
        PwmR = rgb_min;
        PwmG = rgb_max - rgb_adj;
        PwmB = rgb_max;
        break;
    case 4:
        PwmR = rgb_min + rgb_adj;
        PwmG = rgb_min;
        PwmB = rgb_max;
        break;
    default:
        PwmR = rgb_max;
        PwmG = rgb_min;
        PwmB = rgb_max - rgb_adj;
        break;
    }
}
改成适应小资源的MCU使用,PwmR ,PwmG , PwmB 赋值到对应的PWM寄存器,10MS调用一次。Speed的最大值决定速度。

出0入0汤圆

发表于 2022-2-28 14:26:32 | 显示全部楼层
记号,谢谢分享

出0入0汤圆

发表于 2022-2-28 18:46:14 | 显示全部楼层
谢谢,好方法

出0入0汤圆

发表于 2023-6-16 09:17:42 | 显示全部楼层
孤独飞行 发表于 2022-2-24 16:33
#define rgb_max  255
#define rgb_min   0
void led_strip_hsv2rgb(void)
(引用自9楼)

能否稍作你的思路解释?
最近看FOC无刷电机控制算法,把RGB看成相位相差120度,旋转角度相当于颜色配比选项,各自向量大小控制亮度。不知道这个启发能否实现。

出0入0汤圆

发表于 2023-6-16 09:21:26 | 显示全部楼层
本帖最后由 zyw19987 于 2023-6-16 09:22 编辑
孤独飞行 发表于 2022-2-24 16:33
#define rgb_max  255
#define rgb_min   0
void led_strip_hsv2rgb(void)
(引用自9楼)


似乎看明白了,你的i应该就是做所在象限的判断,然后对第三象限进行耦合计算。h相当于旋转角度。
果然,技术都是相通的。

出0入0汤圆

发表于 2023-6-17 00:49:40 来自手机 | 显示全部楼层
学习了,谢了

出0入91汤圆

发表于 2023-6-17 08:54:19 | 显示全部楼层
本帖最后由 ackyee 于 2023-6-17 08:55 编辑

无非就是 +1   减1  的问题  这项目我做过  你想的太复杂了   而且我用的  星芒微来做的  成本 几毛钱   几乎无法做复杂算法 ,我还加了个  FFT

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

本版积分规则

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

GMT+8, 2024-4-27 06:56

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

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