所有关于电路
项目

设计一个颜色传感器,通过RGB LED模块显示测量结果

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

通过精确控制红色、绿色和蓝色发光二极管的强度来显示颜色。

通过精确控制红色、绿色和蓝色发光二极管的强度来显示颜色。

支持信息

白色的颜色

这个项目的目标是创造一种测量光的“颜色”的装置。你可能知道,通常照亮人类生活的光实际上是无数不同波长的电磁辐射的混合物。可见光谱中的每一种波长(约400纳米到700纳米)都对应着一种特定的颜色,我们的眼睛把这种混合的颜色解读为“白光”。

然而,你无疑已经注意到,根据照明的主要来源,生命看起来有点不同。荧光灯和强烈的阳光看起来特别白,而白炽灯和蜡烛则营造出一种更温暖、“微黄”的氛围。这些变化的发生是因为不同的“白光”来源产生了截然不同的颜色混合物。这种强度和波长之间的关系称为光谱组成这是一个用图像比文字更容易解释的概念。看看这张来自《Popular Mechanics》的图表。

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

红,绿,蓝

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

一个像素的RGB显示

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

这个项目使用了一个定制设计的PCB,其中包括一个EFM8通用蜜蜂单片机(p/n EFM8UB20F64G-A-QFP32, click)在这里数据表和在这里一个四通道DAC (p/nDAC084S085来自德州仪器),四通道op-amp(p / nLMV614,一个RGB LED (p/nASMT-YTB7-0AA02和BH1745NUC。参考“支持信息”下列出的文章,以获得将EFM8微控制器整合到定制硬件中的指导。

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

强度与电流呈线性关系;电流与电压的关系是高度非线性的,也就是说强度与电压的关系也是高度非线性的。因此,如果我们想以一种可预测和直接的方式控制强度,我们就需要进行调整当前的,而不是电压。

从电压源到电流源

DAC是一个4通道,8位,通过SPI控制的电压输出设备。EFM8提供2.4 V参考电压。因此,DAC的输出电压从0 V到2.4 V,以(2.4 V)/(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到255,然后增加通道B从0到255,然后增加通道C从0到255。结果显示在本文末尾的视频中。rgb递增例程的实现如下:

while(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);(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更新/ *此交换机语句设置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 sp_state = IDLE;打破;}}

结论

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

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

自己尝试一下这个项目吧!BOM。