TCS3200颜色传感器设计原理图PCB及例程手册.doc
《TCS3200颜色传感器设计原理图PCB及例程手册.doc》由会员分享,可在线阅读,更多相关《TCS3200颜色传感器设计原理图PCB及例程手册.doc(27页珍藏版)》请在冰豆网上搜索。
颜色传感器
【简要说明】
一、尺寸:
长34mmX宽26mmX高10mm
二、主要芯片:
TCS230
三、工作电压:
直流5V
四、输出频率电压0~5V
五、特点:
1、所有的引脚全部引出
2、输出占空比50%
3、采用高亮白色LED灯反射光
4、可直接和单片机连接
5、静态检测被测物颜色
6、检测距离10mm最佳
【通电展示】
【工作电压和电流】(直流5V0.04A)
【输出波形】
【板子背面】
【详细说明】
随着现代工业生产向高速化、自动化方向的发展,生产过程中长期以来由人眼起主导作用的颜色识别工作将越来越多地被相应的颜色传感器所替代。
例如:
图书馆使用颜色区分对文献进行分类,能够极大地提高排架管理和统计等工作;在包装行业,产生包装利用不同的颜色和装潢来表示其不同的性质或用途。
目前的颜色传感器通常是在独立的光电二极管上覆盖经过修正的红、绿、蓝滤波片,然后对输出信号进行相应的处理,才能将颜色信号识别出来;有的将两者集合起来,但是输出模拟信号,需要一个A/D电路进行采集,对该信号进一步处理,才能进行识别,增加了电路的复杂性,并且存在较大的识别误差,影响了识别的效果。
TAOS(TexasAdvancedOptoelectronicSolutions)公司最新推出的颜色传感器TCS230,不仅能够实现颜色的识别与检测,与以前的颜色传感器相比,还具有许多优良的新特性。
1.TCS230芯片的结构框图与特点:
TCS230是TAOS公司推出的可编程彩色光到频率的转换器,它把可配置的硅光电二极管与电流频率转换器集成在一个单一的CMOS电路上,同时在单一芯片上集成了红绿蓝(RGB)三种滤光器,是业界第一个有数字兼容接口的RGB彩色传感器,TCS230的输出信号是数字量,可以驱动标准的TTL或CMOS逻辑输入,因此可直接与微处理器或其他逻辑电路相连接,由于输出的是数字量,并且能够实现每个彩色信道10位以上的转换精度,因而不再需要A/D转换电路,使电路变得更简单,图1是TCS230的引脚和功能框图。
图1中,TCS230采用8引脚的SOIC表面贴装式封装,在单一芯片上集成有64个光电二极管,这些二极管分为四种类型,其16个光电二极管带有红色滤波器;16个光电二极管带有绿色滤波器;16个光电二极管带有蓝色滤波器,其余16个不带有任何滤波器,可以透过全部的光信息,这些光电二极管在芯片内是交叉排列的,能够最大限度地减少入射光辐射的不均匀性,从而增加颜色识别的精确度;另一方面,相同颜色的16个光电二极管是并联连接的,均匀分布在二极管阵列中,可以消除颜色的位置误差。
工作时,通过两个可编程的引脚来动态选择所需要的滤波器,该传感器的典型输出频率范围从2Hz-500kHz,用户还可以通过两个可编程引脚来选择100%、20%或2%的输出比例因子,或电源关断模式。
输出比例因子使传感器的输出能够适应不同的测量范围,提高了它的适应能力。
例如,当使用低速的频率计数器时,就可以选择小的定标值,使TCS230的输出频率和计数器相匹配。
从图1可知:
当入射光投射到TCS230上时,通过光电二极管控制引脚S2、S3的不同组合,可以选择不同的滤波器;经过电流到频率转换器后输出不同频率的方波(占空比是50%),不同的颜色和光强对应不同频率的方波;还可以通过输出定标控制引脚S0、S1,选择不同的输出比例因子,对输出频率范围进行调整,以适应不同的需求。
下面简要介绍TCS230芯片各个引脚的功能及它的一些组合选项。
S0、S1用于选择输出比例因子或电源关断模式;S2、S3用于选择滤波器的类型;OE反是频率输出使能引脚,可以控制输出的状态,当有多个芯片引脚共用微处理器的输出引脚时,也可以作为片选信号,OUT是频率输出引脚,GND是芯片的接地引脚,VCC为芯片提供工作电压,表1是S0、S1及S2、S3的可用组合。
2.TCS230识别颜色的原理
由上面的介绍可知,这种可编程的彩色光到频率转换器适合于色度计测量应用领域,如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制和色彩配合。
下面以TCS230在液体颜色识别中的应用为例,介绍它的具体使用。
首先了解一些光与颜色的知识。
(1)三原色的感应原理
通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。
白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。
根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
(2)TCS230识别颜色的原理
由三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。
对于TCS230来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其他原色的通过。
例如:
当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同时,选择其他的滤波器,就可以得到蓝色光和绿色光的光强。
通过这三个值,就可以分析投射到TCS230传感器上的光的颜色。
(3)白平衡和颜色识别原理
白平衡就是告诉系统什么是白色。
从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于TCS230的光传感器来说,它对这三种基本色的敏感性是不相同的,导致TCS230的RGB输出并不相等,因此在测试前必须进行白平衡调整,使得TCS230对所检测的"白色"中的三原色是相等的。
进行白平衡调整是为后续的颜色识别作准备。
在本装置中,白平衡调整的具体步骤和方法如下:
将空的试管放置在传感器的上方,试管的上方放置一个白色的光源,使入射光能够穿过试管照射到TCS230上;根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可计算出需要的3个调整参数。
当TCS230识别颜色时,就用这3个参数对所测颜色的R、G和B进行调整。
这里有两种方法来计算调整参数:
1、依次选通三颜色的滤波器,然后对TCS230的输出脉冲依次进行计数。
当计数到255时停止计数,分别计算每个通道所用的时间,这些时间对应于实际测试时TCS230每种滤波器所采用的时间基准,在这段时间内所测得的脉冲数就是所对应的R、G和B的值。
2、设置定时器为一固定时间(例如10ms),然后选通三种颜色的滤波器,计算这段时间内TCS230的输出脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为255。
在实际测试时,室外同样的时间进行计数,把测得的脉冲数再乘以求得的比例因子,然后就可以得到所对应的R、G和B的值。
3应用中需要注意的问题
1、颜色识别时要避免外界光线的干扰,否则会影响颜色识别的结果,最好把传感器、光源等放置在一个密闭、无反射的箱子中进行测试。
2、对光源没有特殊的要求,但是光源发出的光要尽量集中,否则会造成传感器之间的相互干扰。
3、当第1次使用TCS230时,或TCS230识别模块重启、更换光源等情况时,都需要进行白平衡调整。
【参考例程】
[C语言源程序]
/********************************************************************
汇诚科技
实现功能:
对颜色传感器输出的频率进行测量
使用芯片:
AT89S52或者STC89C52
晶振:
11.0592MHZ
编译环境:
Keil
作者:
zhangxinchun
淘宝店:
汇诚科技
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*********************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharduan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码
ucharwei[5]={0Xf7,0XEf,0XDf,0XBf,0X7f};//位的控制端
uintz,x,c,v,b,n,date; //定义数据类型
uintdispcount=0; //中断计数
uintlck=0; //定时器计数
uintdisp=0; //频率值
/******************************************************************
延时函数
******************************************************************/
voiddelay(uchart)
{
uchari,j;
for(i=0;i{
for(j=13;j>0;j--);
{;
}
}
}
/**********************************************************************
数码管动态扫描
*********************************************************************/
voidxianshi()
{
/*****************数据转换*****************************/
z=date/10000; //求万位
x=date%10000/1000; //求千位
c=date%1000/100; //求百位
v=date%100/10; //求十位
b=date%10; //求个位
P2=wei[0];
P0=duan[z];
delay(50);
P2=wei[1];
P0=duan[x];
delay(50);
P2=wei[2];
P0=duan[c];
delay(50);
P2=wei[3];
P0=duan[v];
delay(50);
P2=wei[4];
P0=duan[b];
delay(50);
}
/*************************************************************************
定时器初值1ms
**************************************************************************/
voidinitTimer(void)
{
TMOD=0x0;
TH0=0xe3;
TL0=0xc;
}