搜索
bottom↓
回复: 15

关于RGB 调光抖动的问题

[复制链接]

出0入0汤圆

发表于 2018-11-9 20:08:51 | 显示全部楼层 |阅读模式
大神,请教一个关于rgb的调光的问题:
我在调节亮度的时候,得到一个PWM 的调光曲线,R,G,B 的取值范围为(0~255)
然后通过如下的公式
                        u16Red = (uint16)((uint32)u8CurrRed * (uint32)au16DimmerCurve[u8CurrLevel]/(uint32)255);
                        u16Green = (uint16)((uint32)u8CurrGreen * (uint32)au16DimmerCurve[u8CurrLevel]/(uint32)255);
                        u16Blue = (uint16)((uint32)u8CurrBlue * (uint32)au16DimmerCurve[u8CurrLevel]/(uint32)255);
得到r,g,b的值,然后输出PWM,但是调色的时候还好,调节亮度的时候会有点抖动,请问有没有什么好的建议?

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2018-11-10 07:58:10 | 显示全部楼层
转换成HSL

出0入0汤圆

 楼主| 发表于 2018-11-10 10:40:14 | 显示全部楼层

H,大神,感谢你的回答,我想把这个流程叙述一下, 手机APP 的发送HSV 的色域模型的值给带单片机,单片机将HSV 转化为 XY , 在 XY 的基础上进行 RGB 的转换,
    当APP 调节亮度时(0~254),我一个调光曲线的值放入一个数组当中,然后将R,G,B 与对于亮度的调光曲线的值一起进行计算的, 现在我需要将 这个调光曲线参与
   的过程提前到  HSL 中进行计算吗?

出0入213汤圆

发表于 2018-11-10 17:26:15 来自手机 | 显示全部楼层
0~255的范围,小值变动时确实会看到抖,比如由1变到2就抖,有240变241就感觉不出

出0入22汤圆

发表于 2018-11-10 19:05:40 来自手机 | 显示全部楼层
如果是65536的分辨率呢?1-2变化如何?

出0入4汤圆

发表于 2018-11-10 19:05:54 | 显示全部楼层
调光暗的时候需要曲线,前面慢慢变

出0入0汤圆

发表于 2018-11-10 19:41:37 | 显示全部楼层
指数曲线调光,调亮度

出0入0汤圆

发表于 2018-11-10 22:17:41 | 显示全部楼层
要用算法处理的

出0入0汤圆

发表于 2018-11-10 22:19:36 | 显示全部楼层
指数曲线调光 x 2

出0入0汤圆

发表于 2018-11-10 22:46:50 来自手机 | 显示全部楼层
残荷听雨aaron95 发表于 2018-11-10 10:40
H,大神,感谢你的回答,我想把这个流程叙述一下, 手机APP 的发送HSV 的色域模型的值给带单片机,单片机 ...

不是电脑或手机计算好最终值给下面更清爽么

出615入1076汤圆

发表于 2018-11-10 22:52:40 | 显示全部楼层
本帖最后由 dukelec 于 2018-11-11 14:27 编辑

轉換過程用 float, 最後 +0.5 轉 uint16,pwm 用 12 bit

增加:

用 float 就不要用查表了,而是每次計算公式得出結果,一般對數調光 stm8 跑的動。

還要加差補,譬如電腦下發 8 bit 數據從 5 -> 6, 那麼要做一個平滑效果:5.0 -> 5.1 -> 5.2 -> 5.3 -> 5.4 -> ... -> 6.0, 譬如這個過程持續 1 秒走完。

出0入4汤圆

发表于 2018-11-11 09:14:45 来自手机 | 显示全部楼层
dukelec 发表于 2018-11-10 22:52
轉換過程用 float, 最後 +0.5 轉 uint16,pwm 用 12 bit

为什么要加0.5  我在其他地方也看到这种操作  不明白什么目的

出0入0汤圆

发表于 2018-11-11 11:41:53 来自手机 | 显示全部楼层
xiepan2010 发表于 2018-11-11 09:14
为什么要加0.5  我在其他地方也看到这种操作  不明白什么目的

强行四舍五入

出0入4汤圆

发表于 2018-11-11 14:15:58 | 显示全部楼层

原来如此  好巧妙的操作啊

出0入0汤圆

发表于 2018-11-11 22:10:51 | 显示全部楼层


调光的核心原理是什么,是电压进行PWM,还是SPWM,还是正弦,还是什么呢?

出0入8汤圆

发表于 2018-11-12 12:37:51 | 显示全部楼层
本帖最后由 smallwood 于 2018-11-12 12:39 编辑

调光要用对数/指数, 这是大家都知道的, 因为人眼看光度的变化是非线性的, 所以要把pwm值先变成曲线再写进pwm timer, 这样调出来的光人眼看起来才是线性的.

想要PWM调光细腻平滑不抖动, 有两个决定因素:1). pwm timer的分辨率要够大, 2). 扫描频率要够高.

第一点pwm timer分辨率: 决定了pwm的duty cycle波形变化够不够细腻. 用8bit(256级)pwm timer是不够的,要用16bit(65536计),有32bit就更好. 不过16bit timer做出来的调光效果已经可以非常平滑, 无论是0.1秒内快速调光,还是1小时/10小时内很慢调光, 光度/颜色的过渡肉眼都可以没法看出任何抖动.
第二点扫描频率: 就是每一次扫描变更一次pwm timer的值. 每秒扫描60次或以上肉眼已经看不出闪动(所谓频闪), 当然扫描频率越高越好, 例如几百Hz到几KHz, 扫描频率够高的话, 就没有所谓的用手机摄像头拍照会看到频闪.

一般的stm8和stm32都有16bit pwm timer, 用一个pwm timer就可以做到.

给你程序设计的思路:

1. 设timer的period为:65535, 如果是stm8s用16MHz, 在每次timer中断里刷新pwm timer内容, 刷新频率就是: 16000000/65536=244.14Hz, 已经超过最低60次每秒的扫描频率所以很足够了. 如果是stm32f0用48MHz, 刷新频率就是: 48000000/65536=732.42Hz 更好.

2. 在timer的中断里, 用指数算式(不要用查表)算出每一次的pwm值,写进pwm timer. 例如:

-----------------------------------
#include "stm32f0xx.h"
#include <math.h>
...

static float brightness = 0;
void TIM3_IRQHandler(void)
{
    double pwm_value;

    brightness = brightness + 0.1; //+0.1是每次增加0.1级调光, 这只是任意的, 你可以根据要求自己算每次要加/减多少.
    pwm_value = pow(brightness ^ 2.2); //pow()函数, 2.2是一个阈值,不同阈值会影响曲线特性,你可以改为2, 1.x, 2.x 看看那个更好更符合你的调光要求.

    if(pwm_value > 65535)
        pwm_value = 65535;
    else if(pwm_value < 1)
        pwm_value =0;

    TIM3->CCR1 = (uint32_t)pwm_value;
}

-----------------------------------

解释一下: 上面不是完整的程序,只是为了解释程序的思路而已. 大概意思是从完全不亮调到全亮(在2秒多内). brightness 是一个线性值,你可以设0-154.6344, 这样就可以得到最暗/最亮的pwm_value值: 0-65535.022 (65535.022=pow(154.6344^2.2)) 你可以在timer中断里每次把brightness 加0.1: brightness = brightness + 0.1;
你也可以不在timer中断里, 而在一个loop里设pwm timer的值.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-2 12:11

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

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