TCS3200颜色传感器设计原理图PCB及例程手册Word格式.doc
- 文档编号:349851
- 上传时间:2023-04-28
- 格式:DOC
- 页数:27
- 大小:2.79MB
TCS3200颜色传感器设计原理图PCB及例程手册Word格式.doc
《TCS3200颜色传感器设计原理图PCB及例程手册Word格式.doc》由会员分享,可在线阅读,更多相关《TCS3200颜色传感器设计原理图PCB及例程手册Word格式.doc(27页珍藏版)》请在冰点文库上搜索。
另一方面,相同颜色的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<
reg52.h>
#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<
t;
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];
P2=wei[2];
P0=duan[c];
P2=wei[3];
P0=duan[v];
P2=wei[4];
P0=duan[b];
}
/*************************************************************************
定时器初值1ms
**************************************************************************/
voidinitTimer(void)
TMOD=0x0;
TH0=0xe3;
TL0=0xc;
定时器函数
voidtimer0(void)interrupt1
lck++;
if(lck==1000)
{
disp=dispcount;
lck=0;
dispcount=0;
中断函数
voidint0(void)interrupt0
dispcount++;
//每一次中断,计数加一
主函数
voidmain(void)
IT0=1;
//INT0下降沿中断
EX0=1;
//允许INT1中断
initTimer();
//装入初值
TR0=1;
ET0=1;
EA=1;
while
(1)
date=disp;
xianshi();
结束
**************************************************************************/ /*实现功能:
对颜色传感器输出RGB
#defineuintunsignedint
//==============LCD1602接口连接方法=====================
/*-----------------------------------------------------
|DB0-----P0.0|DB4-----P0.4|RW-------P2.3|
|DB1-----P0.1|DB5-----P0.5|RS-------P2.4|
|DB2-----P0.2|DB6-----P0.6|E--------P2.2|
|DB3-----P0.3|DB7-----P0.7|
---------------------------------------------------*/
//================================================*/
#defineLCM_DataP0//LCD1602数据接口
#defineBusy0x80//用于检测LCM状态字中的Busy标识
sbitLCM_RW=P2^3;
//读写控制输入端,LCD1602的第五脚
sbitLCM_RS=P2^4;
//寄存器选择输入端,LCD1602的第四脚
sbitLCM_E=P2^2;
//使能信号输入端,LCD1602的第6脚
//=================颜色传感模块连接=====================
|EO-----GND
|S0-----VCC|S2-----P2.0|OUT-------P3.5
|S1-----VCC|S3-----P2.1|
---------------------------------------------------*/
sbittcs230_s2=P2^0;
//TCS230S2接单片机P2.0
sbittcs230_s3=P2^1;
//TCS230S3接单片机P2.1
sbittcs230_en=P3^0;
//TCS230EN(E0)接GND
//**************函数声明***************************************
voidWriteDataLCM (ucharWDLCM);
//LCD模块写数据
voidWriteCommandLCM (ucharWCLCM,BuysC);
//LCD模块写指令
ucharReadStatusLCM(void);
//读LCD模块的忙标
voidDisplayOneChar(ucharX,ucharY,ucharASCII);
//在第X+1行的第Y+1位置显示一个字符
voidLCMInit(void);
//LCD初始
voidDelayMs(uintMs);
//1MS基准延时程序
voidbaipingheng();
//白平衡子程序
voidceliang();
//实际颜色程序
uintryz,gyz,byz;
//分别定义红色因子绿色因子蓝色因子
uintrb,gb,bb;
//RGB值
uchartab1[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
A'
B'
C'
D'
E'
F'
};
//***********************主程序******************************
main()
{
TMOD=0x51;
//设定T0以工作方式1定时10毫秒
LCMInit();
baipingheng();
//上电时先白平衡一次
while
(1)
celiang();
//颜色测试
DisplayOneChar(0,0,'
R'
);
//以十进制显示RGB中红色的分值
DisplayOneChar(0,1,rb/100+0x30);
//显示百位数据
DisplayOneChar(0,2,rb/10%10+0x30);
//显示十位数据
DisplayOneChar(0,3,rb%10+0x30);
//显示个位数据
DisplayOneChar(0,5,'
G'
//以十进制显示RGB中绿色的分值
DisplayOneChar(0,6,gb/100+0x30);
DisplayOneChar(0,7,gb/10%10+0x30);
DisplayOneChar(0,8,gb%10+0x30);
DisplayOneChar(0,10,'
//以十进制显示RGB中蓝色的分值
DisplayOneChar(0,11,bb/100+0x30);
DisplayOneChar(0,12,bb/10%10+0x30);
DisplayOneChar(0,13,bb%10+0x30);
//*****在LCD1602的第二行以16进制显示RGB*******************
DisplayOneChar(1,1,tab1[rb/16]);
DisplayOneChar(1,2,tab1[rb%16]);
DisplayOneChar(1,3,'
H'
DisplayOneChar(1,6,tab1[gb/16]);
DisplayOneChar(1,7,tab1[rb%16]);
DisplayOneChar(1,8,'
DisplayOneChar(1,11,tab1[bb/16]);
DisplayOneChar(1,12,tab1[bb%16]);
DisplayOneChar(1,13,'
DelayMs(250);
//每隔0.25秒测试一次颜色
}
//******************************************************
voidceliang()
//*********求R值************************************
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=0;
//选择红色滤光器
tcs230_en=0;
TR0=1;
//10毫秒开始计时
TR1=1;
//开始计数
while(TF0==0);
//等待定时器溢出
TF0=0;
//清楚定时器0溢出标志
TR0=0;
//关闭定时0
TR1=0;
rb=(unsignedlong)(TH1*256+TL1)*255/ryz;
if(rb>
255)rb=255;
//判断RGB值是否合法
//***********求B值**************************************
tcs230_s3=1;
//选择蓝色滤光器
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TCS3200 颜色 传感器 设计 原理图 PCB 例程 手册