三基色PWM调光方法

现象:

使用mcu输出三路R,G,B控制灯光的色彩与亮度
简单说明:
什么是PWM?
是一种利用简单的数字脉冲,反复开关LED启动器的调光技术。应用系统只需要提供宽窄不同(占空比)的数字脉冲,即可实现改变输出电流,从而调节LED的亮度
PWM调光特点:
1)调光精准
2)没有色偏
在整个调光范围内,由于LED电流要么处于最大值,要么等于零,通过调节脉冲占空比来改变LED的平均电流,所以该方案能避免在电流变化过程中出现色偏
3)可调范围大
PWM调光频率一般为200Hz(低频调光),——20KHz(高频调光)
4)没有频闪
人眼识别连贯图像的速度最低为24帧/每秒,换算出来也就是1000毫秒zd/24帧,每帧约40ms。也就是说只要在40ms以内连续变化,方可达到渐变效果;
建议
建议PWM调光频率高于100Hz,就光查不到LED的闪烁现象。此时不会改变恒流源的工作条件(升压与或降压比),也不可能发生过热的问题,但是PWM脉宽调光也有要注意的问题。首先是脉冲频率的选择,因为LED是处于快速开关的状态,加入工作频率很低,人眼依旧会看到闪烁现象,最好为200Hz。

流程:

根据上面的原理,我们就可以调单个LED灯的亮度,如果是单个红光(R) LED,则改变pwm占空比,达到亮度改变。
那么怎么发出任何一种颜色的光??
在这里插入图片描述
作为嵌入式,最少需要三个PWM通道来配置,如今小米智能,有采用4路PWM的。
在这里插入图片描述
各自的占空比控制各自的亮度,当各色的亮度值相加混合成想要的颜色,此时各色的PWM等比例改变,改变的不是颜色,而是混合色的亮度值。
滑稽
女生口红的颜色你可以说明白吗?那么多红,你能说几个!但是此时却可以用pwm光直接表现出来。

CIE x-y色品坐标图

在这里插入图片描述
色品图是以不同位置的点表示各种色品的平面图

目的

根据色品图,提供已知数据,求出精确的三通道占空比:
1)给出期望颜色的色品坐标期望的光通量,可以得出三通道的占空比
2)给出期望的色温的相对色温值期望的光通量,求出对应的三通道占空比
此时的期望的色温的相对色温值是三个通道的pwm比值

算法

1)色品坐标与占空比的关系
改变驱动LED的PWM占空比,其色品坐标基本不发生改变,而光通量相应地线性变化
调节混合光亮度理论依据,格拉斯曼颜色定律:
在这里插入图片描述
Ym表示混合光的光通量,Dr,Dg,Db分别代表R,G,B的占空比,Yr,Yg,Yb分别代表R,G,B满电流工作下的Y刺激值(绿原色值),也就是求出混合光的绿色值,同理可得Xm,Zm对应红色和蓝色的光通量。
根据加混色原理和CIE色度计算方法:
在这里插入图片描述
两个值分别为色品图的横座标与纵坐标,前面求出的Xm,Ym,Zm是混合光源的三刺激值,
在这里插入图片描述
Cr=Yr/yr、Cg=Yg/yg、Cb=Yb/yb为光源R,G,B满电流工作下的三刺激值之和(即Cr=Xr+Yr+Zr),在CIE-1931标准色度系统中刺激值Y等于光通量。
在PWM调光下,占空比是控制色品坐标的唯一因素,若期望的光通量为Ym,期望的色品坐标为(x,y),把占空比当作未知数,由前面公式转化则求得三通道占空比:
在这里插入图片描述
上式所建立起的色品坐标与占空比的函数关系,为探究占空比与相关色温、色品坐标与最大光通量的函数关系奠定
基础

2)色温与占空比
色温调节
物体的温度不同,颜色也就会不同,每个温度是的光的颜色,转化为色坐标,点在色度图上,成为一条曲线,称为“黑体轨迹”
如图:
在这里插入图片描述
我们可以通过调光的仪器,积分球来分析,积分球可以测出光通量,色品坐标,显示指数,色偏容差等等
思路
因为日光轨迹的色品坐标与相关色温Tcp存在函数关系,我们可以根据相关的色温推导出在日光轨迹的色品坐标进而求出占空比!
公式推导
在相关色温Tcp已知的情况下,可通过下式计算日光的色品坐标X值,当4000K<=Tcp<=25000K时:
在这里插入图片描述
进而求出Y值:
在这里插入图片描述
带入即可求出三通道占空比比值!
其他
本文只是简述了在调光是的基本流程,计算值与效果依旧需要真实的测试仪进行实际测量,与商用标准还有一定差距!

PWM调光,脉宽与光的亮度成正比 /*----------------------------------------------- 名称:PWM 调光 日期:2009.5 修改:无 内容:1、学习目的:利用定时器产生PWM,了解原理和使用方法 2、硬件要求:LED灯 定时器 3、试验现象:LED灯由亮到灭,由灭到亮逐步变化,也就是调光现象 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbit LED = P1^2; sbit LED2 = P1^1; //定义LED灯,通过LED显示调光效果 unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms unsigned char PWM_ON, PWM_ON2;//定义高电平时间 /******************************************************************/ /* 延时函数 */ /******************************************************************/ void delay(unsigned int cnt) { while(--cnt); } void Init0() {TMOD |=0x01; //定时器设置 0.1ms in 12M crystal 16位工作模式 TH0=(65536-100)/256; TL0=(65536-100)%256; IE= 0x82; //打开中断 TR0=1;} void Init1() {TMOD |=0x10; //定时器设置 0.1ms in 12M crystal 16位工作模式 TH1=(65536-100)/256; TL1=(65536-100)%256; IE= 0x82; ET1=1; } /******************************************************************/ /* 主函数 */ /******************************************************************/ main() { bit Flag; Init0(); Init1(); if((TH0=(65536-6)/256 )&&(TL0=(65536-6)%256))//与定时器1初值相差100,则相位改变1/10T,相差500,相位改变1/2T TR1=1;//打开中断 CYCLE =10; // 时间可以调整 这个是10调整 8位PWM就是256步 pwm周期=CYCLE*定时时间 while(!Flag) { delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果 PWM_ON=6; PWM_ON2=6; //这个使用较长延时,以便能看清楚变化过程 控制占空比q=(CYCLE-PWM_ON-1)/CYCLE if(PWM_ON ==PWM_ON2== CYCLE) { //这个里可以添加其他程序 如到最亮时候控制设备 Flag=1; } } while(Flag) //亮度递减 同上,是个相反的过程 { delay(20000); PWM_ON--; PWM_ON2--; if(PWM_ON == 0||PWM_ON2==0) { Flag=0; } } } /******************************************************************/ /* 定时器中断函数
### STM32 PWM 实现 RGB 调光 #### 使用STM32实现PWM基色调光涉及几个关键部分:硬件连接、软件配置以及编程逻辑。 对于硬件方面,通常会选择带有RGB LED的电路来展示效果。这里假设使用的是常见的共阴极RGB LED,并且通过个NPN晶体管分别驱动红绿蓝种颜色的LED[^4]。每种颜色对应一个独立的PWM通道以便单独调整其亮度。 关于软件设置,在初始化阶段需利用STM32CubeMX工具完成必要的外设配置工作,比如GPIO端口与时钟使能等操作;接着针对TIMx定时器进行参数设定以生成所需的PWM波形输出[^1]。具体来说: - **配置RGB彩灯时钟和IO** - 开启相应GPIO模块及时钟资源。 - **配置定时器(PWM模式)** - 设置预分频系数Prescaler用于定义计数频率; - 设定自动重装载寄存器ARR决定PWM周期长度; - 对于每个颜色通道,指定捕获/比较寄存器CCRn值作为占空比大小[^3]。 下面给出一段简单的C语言程序片段用来演示如何编写这样的功能函数: ```c #include "stm32f1xx_hal.h" // 定义全局变量保存当前各色LED对应的PWM数值(范围0~255) uint8_t red_pwm_value; uint8_t green_pwm_value; uint8_t blue_pwm_value; void Set_RGB_LED(uint8_t r, uint8_t g, uint8_t b){ TIM_HandleTypeDef *htim = &htim3; // 假设使用TIM3产生PWM __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, (r / 255.0)*__HAL_TIM_GET_AUTORELOAD(htim)); __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, (g / 255.0)*__HAL_TIM_GET_AUTORELOAD(htim)); __HAL.TIM.SET.COMPARE(htim, TIM_CHANNEL_3, (b / 255.0)*__HAL_TIM_GET_AUTORELOAD(htim)); red_pwm_value = r; green_pwm_value = g; blue_pwm_value = b; } ``` 此代码段展示了怎样根据输入参数`r`, `g`, `b`(代表红色、绿色和蓝色强度),计算并更新相应的PWM输出值给定时器的不同通道,以此达到改变RGB LED色彩的目的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值