雷竞技注册
项目

通过RGB LED模块设计具有测量的颜色传感器

2016年1月22日通过罗伯特Keim

通过精确地控制红色,绿色和蓝色LED的强度来显示颜色。

通过精确地控制红色,绿色和蓝色LED的强度来显示颜色。

支持信息

白色的颜色

这个项目的目标是创造一种可以测量光的“颜色”的设备。你可能知道,照亮人类生命的光线实际上是由无数不同波长的电磁辐射混合而成的。可见光谱中的每个波长(大约从400纳米延伸到700纳米)对应着一种特定的颜色,我们的眼睛把这种混合颜色的光解释为“白光”。

然而,您毫无疑问地注意到,根据主导的照明来源,生活看起来有点不同。荧光灯和强烈的阳光似乎是特别的,而白炽灯泡和蜡烛营造出更温暖,“淡黄色”的氛围。这些变化发生,因为不同的“白色”光源产生众所周知的颜色混合物。强度和波长之间的这种关系被称为光谱组成,这是一个用图像比用文字更容易解释的概念。看看这张来自《Popular Mechanics》的图表。

我强烈推荐这篇文章终极灯泡测试:白炽灯、紧凑型荧光灯、LED。它提供了关于不同灯泡的光谱特性的有趣而详细的信息,包括一些人们可能用来描述每个灯泡发出的光的质量的词汇。

红,绿,蓝

术语“RGB”如此常见的是,它在自己的右边几乎是一个词。我们不想以广泛的讨论对人类视野的大颜色和孕期性的广泛讨论;他可以说标准添加剂显示系统(例如计算机监视器)使用红色,绿色和蓝光的组合来产生各种不同的颜色。因此,我们可以使用红色,绿色和蓝色光电探测器的组合来“测量”颜色。在白光的背景下,以这种方式想到它可能更有助于:通过使用对红色,绿色和蓝光敏感的单独(虽然相邻)探测器,我们可以根据光能的量估算光谱组成可见光谱的下三分之一(对应于蓝色检测器),中间三分之一(对应于绿色)和上三(对应于红色)。在思考以下图像后,这应该更清晰,这传送了用于该项目的RGB传感器中的红色,绿色,蓝色和清晰光电探测器的相对光谱灵敏度(P / N.BH1745NUC从罗姆)。

一个像素RGB显示器

除非我们有方法报告结果,否则我们的颜色测量不会很有用。我们将使用RGB LED模块来实现这一点:我们可以根据RGB光电探测器的输出调整每个LED的强度(即亮度),从而模块的整体颜色将类似于照亮BH1745NUC传感器IC的颜色。本文将讨论LED控制器,在下一篇文章中,我们将把该功能与从BH1745NUC读取数据结合起来。

该项目利用包括EFM8通用BEE微控制器的定制设计的PCB(P / N EFM8UB20F64G-A-QFP32,单击这里数据表和这里参考手册),一个四通道DAC (p/nDAC084S085.来自德州仪器),四通道op-amp(p / nLMV614来自德州仪器,RGB LED(P / NAsmt-ytb7-0aa02来自Avago)和BH1745NUC。请参阅“支持信息”下列出的文章,了解将EFM8微控制器纳入自定义硬件的指导。

重要的是要理解LED强度和正向电流之间的关系比LED强度和正向电压之间的关系简单得多。考虑这个项目中使用的LED模块的数据表中的以下图表。

强度和电流之间的关系是线性的;电流与电压之间的关系是高度非线性的,这意味着强度和电压之间的关系也高度非线性。因此,如果我们希望以可预测和直接的方式控制强度,我们需要调整当前的,而不是电压。

从电压源到电流源

DAC是通过SPI控制的4通道,8位电压输出设备。EFM8提供2.4 V参考电压。因此,DAC输出电压在(2.4 V)/(2)的步骤中从0 V至2.4V变化。(28) = 9.4 mV。我们想把这个电压转换成电流,使LED从零强度到最大强度。为了做到这一点,我们需要一个运算放大器和一些负反馈;一般做法如下:

这里的基本原理是,运放将以任何必要的方式调整其输出,以使负输入端的电压等于正输入端的电压。反馈电阻(RFB.)通过LED将电流转换为电压,使得施加到正输入的控制电压确定LED的正向电流,从而确定其强度。以下是该项目中使用的电路的设计过程:

  1. 选择最大正向电流。我们将使用20 mA,舒适地低于绿色和蓝色LED的最大25 mA(红色LED的最大值为50 mA)。请记住选择可以安全地源的OP-AMP,这是如此多的电流。
  2. 使用电阻分压器将控制电压降低10倍。这允许我们使用一个更小的反馈电阻,从而增加输出电压的比例,可用于LED的正向电压降。
  3. 调整反馈电阻的大小,使最大电流时的反馈电压等于最大除以10的控制电压:

\ [\ left(2.4 \ v \ div10 \ light)= r_ {fb} \ time20 \ ma \ \ \ lightarrow \ \ r_ {fb} = \ frac {240 \ mv} {20 \ ma} = 12 \ omega\

这是实际电路的原理图:

固件

以下是下载包含所有源和项目文件的ZIP文件的链接,用于测试RGB LED电路。将项目加载到Simplicity Studio时,可以双击“HWCONF”文件以访问端口引脚和外围设备的配置详细信息。另请注意,这些源文件包括此演示项目不需要的一些代码;您现在可以忽略所有这些。

RGBSensorwithLEDFeedback_Part1.zip

该项目的功能如下:DAC通道A控制红色LED,通道B控制绿色LED,通道C控制蓝色LED。EFM8首先将通道A从0递增到0到25​​5,然后将通道B从0到255,然后通道C从0到255。结果显示在本文末尾的视频中。RGB递增例程如下实现:

虽然(1){/ *它是一个8位DAC,所以全范围为0到255.第一通道A *(对应于红色LED)递增,然后频道* B(对应于绿色),然后是通道c(对应于蓝色)。* / / *未使用的颜色设置为零,以确保*我们显示纯红色,绿色和蓝色。* / updatedac(dac_rgb_g,0);updatedac(dac_rgb_b,0);updatedac(dac_rgb_r,0);delay_10ms(100);for(n = 1; n> 0; n ++){updatedac(dac_rgb_r,n);delay_us(10000);} updatedac(dac_rgb_r,0);updatedac(dac_rgb_b,0);updatedac(dac_rgb_g,0); Delay_10ms(100); for(n=1; n>0; n++) { UpdateDAC(DAC_RGB_G, n); Delay_us(10000); } UpdateDAC(DAC_RGB_R, 0); UpdateDAC(DAC_RGB_G, 0); UpdateDAC(DAC_RGB_B, 0); Delay_10ms(100); for(n=1; n>0; n++) { UpdateDAC(DAC_RGB_B, n); Delay_us(10000); } }

Updatedac()函数中的代码和注释描述了将新数据加载到DAC芯片中的过程:

void updatedac(未签名的charconlickabcord,未签名的char daccode){//确保我们不会中断(spi_state!=空闲)的持续传输;/ *此交换机语句设置16位DAC Word *的两个最高有效位,根据哪个频道正在更新。它还将两个“操作模式”*位设置为二进制01,它对应于“写入指定的寄存器和*更新输出”。* / switch(channelabcord){case dac_ch_a:upmedatedac_firstbyteb = 0x10;打破;案例dac_ch_b:updatedac_firstbyte = 0x50;打破;案例dac_ch_c:updatedac_firstbyteb = 0x90;打破;案例dac_ch_d:updatedac_firstbyteb = 0xD0;打破; } /*The upper four bits of the DAC code are the lower four bits * of the first byte, and the lower four bits of the DAC code are * the upper four bits of the second byte.*/ UpdateDAC_FirstByte = UpdateDAC_FirstByte | (DACcode >> 4); UpdateDAC_SecondByte = DACcode << 4; SPI0CFG |= BIT4; //this sets the proper clock polarity for the DAC interface DAC_NSS = LOW; //activate DAC slave select SPI0DAT = UpdateDAC_FirstByte; SPI_State = FIRST_DAC_BYTE_SENT; }

SPI传输以updatedac()中的最后四个语句开始,并继续在SPI状态机中纳入SPI中断服务程序。

SI_INTERRUPT (SPI0_ISR, SPI0_IRQn) {//SPI寄存器在所有SFR页面上,所以需要修改SFRPAGE SPI0CN0 &= ~BIT7;/ /清除中断标志开关(SPI_State) {/ / SPI通信与DAC ===================================== 案例FIRST_DAC_BYTE_SENT: SPI0DAT = UpdateDAC_SecondByte;SPI_State = SECOND_DAC_BYTE_SENT;打破;case SECOND_DAC_BYTE_SENT: DAC_NSS = HIGH;//禁用slave select SPI_State = IDLE;打破;}}

结论

我们现在具有电路和固件,将RGB LED一起转换为具有8位深度的单像素彩色显示器。在下一篇文章中,我们将使用该像素在视觉上传送照明RGB传感器的光的颜色特性。

下一篇文章串联:设计一个颜色传感器与测量通过RGB LED模块显示,第二部分

为自己提供这个项目!BOM。