资源描述
内蒙古大学本科毕业论文(设计) 第 35 页
第1章 绪论
1.1论文的背景
颜色识别兴起的时间较晚,但在实时检测系统及自动控制方面具有重要意义,单片机及微机的引入提高了颜色识别的速度及智能化程度。国内与国外尚存在较大差距,识别的精度,灵敏度,颜色范围,快速性成为颜色识别的主要问题。深入研究传统颜色识别系统十分必要,同时对国外先进的颜色识别仪器进行了解,可以在某种程度上给我们以启示。
1.2颜色识别的应用及意义
颜色识别在现代生产中的应用越来越广泛,无论是遥感技术,工业过程控制,材料分拣识别,图像处理,产品质检,机器人视觉系统,还是某些模糊的探测系统都需要对颜色进行探测,而颜色传感器的飞速发展,生产过程中长期由人眼起主导作用的颜色识别工作将越来越多地被颜色传感器所替代。为这上述应用的自动化实现提供了可能。
1.3 颜色识别的国内外研究现状及发展前景
颜色识别是新兴的测控技术,普通的工业应用如材料分拣,商标识别等已广泛应用。但高精密的颜色识别技术仍掌握在少数发达国家如美国,日本手中。我国在机器人视觉系统方面已取得了举世瞩目的成就,但在摄取数码影像,高分辨率的颜色识别方面仍缺乏自主研发的能力。
随着颜色传感器的广泛应用,颜色识别技术已成为仪器自动化,智能化的重要组成部分,发展前景十分广阔。
1.4 论文的构成及研究内容
本文首先在对传统的颜色识别技术的了解下,研究了以下内容:
1. 颜色识别的基本原理及常识。
2. 色敏传感器的介绍及识别颜色的原理,并对现在市面上使用的颜色传感器进行
分类。
3. 识别单色光的识别系统的精密放大器的模拟电路仿真及单通道A/D转换。
4. 识别全色光的识别系统的I-V变换设计及三通道数据采集显示的设计与仿真。
5. 自设计的利用电压比较器识别颜色的基本原理及相应仿真。
6. TCS230介绍及设计基于TCS230与51单片机的颜色识别系统与仿真。
第2章 颜色识别的原理及常识
2.1颜色识别的基本常识
1.可见光
一般来说,可见光波长在380—780nm之间,在光谱范围内,不同波长的辐射引起人的不同颜色感觉。大多硅光电二极管的光谱影响范围在300—1000nm之间,可以满足要求。
2.颜色的特性
1)色调(hue)以波长为基础,是区分不同颜色的特征属性。
2)饱和度(saturation) 反映颜色的纯度,任意一种颜色都可以看作某种光谱色与白色混合的结果,光谱色所占比例越大,颜色的饱和度越高。
3)亮度(lightness)是描述颜色亮暗的一种属性,是一种光强度的测量方法,与光的能量有关。
3.三基色原理:适当选取三种基色(红,绿,蓝),将它们按不同比例进行合成,就可以引起不同的颜色感觉,合成彩色光的亮度由三个基色的亮度之和决定,色度由三基色分量的比例决定,三基色彼此独立,任一种基色不能由其他两种颜色配出。国际照明委员会(CIE)推荐使用波长为700nm(红),546.1nm(绿),435.8nm(蓝)。通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。
4.Pixel 是由 Picture(图像) 和 Element(元素)这两个单词的字母所组成的,是用来计算数码影像的一种单位,也称为“像素”。
5.半导体的基本知识:根据物体导电能力(电阻率)的不同,划分为导体、绝缘体和半导体。
半导体的电阻率为10-3~109 W×cm。典型的半导体有硅Si和锗Ge以及砷化镓GaAs等。
半导体的特点:(1)导电能力不同于导体、绝缘体;
(2)受外界光和热刺激时电导率发生很大变化——光敏元件、热敏元件;
(3)掺进微量杂质,导电能力显著增加——半导体。
半导体二极管的伏安特性曲线
可近似为I=IseVD/VT
由此公式可设计对数电路。
图2.1 半导体二极管的伏安特性曲线
式中IS 为反向饱和电流,VD 为二极管两端的电压降,VT =kT/q 称为温度的电压当量,k为玻耳兹曼常数,q 为电子电荷量,T 为热力学温度。对于室温(相当T=300 K),则有VT=26 mV。半导体光电二极管为将光信号转换成电信号,并且根据半导体二极管的伏安特性可组成对数运算电路,进而组成颜色调理电路(精密放大器)。
2.2 色敏器件及色敏传感器原理:
[1]色敏器件:(1)硒光电池:最古老的光电探测器件,其特点是光谱响应几乎与人眼一样,常用于高端设备。
(2)硅光电二极管和三极管:在光照条件下硅光电二极管的短路电流与光能成正比;光电三极管也称光电晶体管,在把光信号变为电信号的同时,还将信号电流放大。二者灵敏度很高,但光谱相应曲线与人眼相差较远,很难与滤色片配合达到满意的效果。
(3)半导体色敏器件:即双结光敏二极管。
[2]色敏光电传感器原理:色敏光电传感器是半导体光敏传感器的一种,是基于内光电效应将光信号转换为电信号的光辐射探测器件。可直接测量从可见光到近红外波段内单色辐射的波长,是一种新型的光敏器件。
(1)双结色敏传感器是检测单色光的常用传感器,是一种不使用滤色器的双结型光伏二极管。由同一块硅基片上两个结深不同的P-N结光电二极管根据深浅结对不同波长的光灵敏度的不同,其中,浅结对紫外光灵敏度较高;深结对红外光灵敏度较高。这就使其具有识别颜色的功能。当入射光强度保持一定时,器件中两只光电二极管短路电流比值Isd1/Isd2与入射单色光(一般由单色光照射待测物体反射后得到)波长存在一一对应关系,根据标定的曲线及对应关系,即可唯一确定该单色光的波长。虽然对于固定波长的入射光由于外界环境的影响,在不同时刻同一结输出的电流有起伏,但同一时刻2个结的对数电流比为一定值。下图为光伏二极管结构图。
图2.2 光伏二极管结构图
(2)全色色敏传感器:在可见光传感器的玻璃衬底的入光面上同时涂盖一层红,绿蓝三基色滤色片而成;当物体或发光体反射来的光入射到红,绿,蓝三基色滤色片的检测部分上时,测量三原色的光谱强度,根据三色强度比可识别颜色。
图2.3 三刺激值光电转换结构图
[3]色敏光电传感器特性:
(1)光谱特性:表示它能检测的波长范围,不同型号略有差别,常见的CS-1型,其波长范围是400-1000nm。
(2) 短路电流比-波长特性:是表征半导体色敏器件对波长的识别能力,以确定
波长的基本特性。
(3)温度特性:由于光电二极管是做在同一块材料上的,具有相同的温度系数,这种内部补偿作用使色敏光电器件对温度不十分敏感,所以通常不考虑温度的影响,只要保证器件工作在正常的温度范围内即可。
2.3 颜色识别基本步骤
利用颜色传感器(主要为色敏传感器)将光信号转换为电流转换,再进行微小电流信号预处理,再进行A/D转换,最后将数字信号交予单片机或微机处理。
2.4颜色传感器分类
目前,用于颜色识别的传感器有两种基本类型。其一是色标传感器,其二是RGB颜色传感器,也是本文接下来研究的重点。
1)色标传感器:色标传感器常用于检测待测色标或物体上的斑点,通过与非色标区(或背景)相比较来实现色标检测,而不是对颜色进行直接测量。光源垂直于目标物体安装,而接收器与物体成锐角方向安装,让它只检测来自目标物体的散射光,从而避免传感器直接接接收反射光。此类传感器又分为两种,一类是以白炽灯为光源,以白炽灯为基础的传感器用有色光源检测颜色,这种白炽灯发射包括红外在内的各种颜色的光,因此用这种光源的传感器可在很宽范围上检测颜色的微小变化。另外,自炽灯传感器的检测电路通常都十分简单,因此可获得极快的响应速度。然而,白炽灯不允许振动和延长使用时同,因此不适用于有严重冲击和振动的场合。一类是以单色光源,使用单色光源(即绿色或红色LED)的色标传感器就其原理来说并不是检测颜色,它是通过检测色标对光束的反射或吸收量与周围材料相比的不同而实现检测的 所以,颜色的识别要严格与照射在目标上的光谱成分相对应。在单色光源中.绿光LED(565mm)和LED((660mm)各有所长 绿光LED 比白炽灯寿命长,并且在很宽的颜色范围内比红光源灵敏度高。红光LED对有限的颜色组合有响应.但它的检测距离比绿光LED 远。通常红光源传感器的检测距离是绿光源传感器的6~8倍。
2)RGB颜色传感器:RGB 颜色传感器对相似颜色和色调的检测可靠性较高。它是通过测量构成物体颜色的三基色的反射比率实现颜色检测的,由于这种颜色检测法精密度极高,所以RGB 传感器能准确区别极其相似的颜色,甚至相同颜色的不同色调。一般RGB传感器都有红、绿、蓝三种光源 ,三种光通过同一透镜发射后被目标物体反射。光被反射或吸收的量值取决于物体颜色。RGB 传感器有两种测量模式 一种是分析红、绿、蓝光的比例 因为检测距离无论怎样变化,只能引起光强的变化,而三种颜色光的比例不会变.因此,即使在目标有机械振动的场合也可检测。第二种模式是利用红绿蓝三基色的反射光强度实现检测目的。利用这种模式可实现微小颜色判别的检测,但传感器会受目标机械位置的影响。
2.5颜色传感器光源的分类
[1],非相干光源:白炽灯,发光二极管。
[2],相干光源:各种激光器。
若两光源所发出的两束光波叠加能产生干涉,则这两光源称为相干光源;否则称为非相干光源。
第3章 传统颜色识别系统研究
目前,基于各种原理的RGB颜色传感器有两种类型,一种是标准RGB颜色传感器,检测的是三刺激值,一般是三个光电二极管贴上三基滤波片;还有一种是色差传感器,检测被测物体与标准颜色的色差,两个物体的色差判断常用双PN结色敏传感器,国产CS-1属于此类型。先以颜色检测器CS-1(其光电转换图见图2.3)识别全色光及双PN结(其光电转换图见图2)识别单色光流程为例。
CS颜色传感器简介:CS系列色彩检测器是应用于自动化生产线上的色彩测量的传感器,具有测量速度快、分辨率高、不受外界光线干扰且无须任何保养的特点。可非接触监控彩色及透明的物体。主要应用于印刷品、包装标签、填充物、包装记号、商标、零件的辩识和分类。2,检测原理:颜色检测器利用特殊的三色光原理。颜色检测器将光线(红、绿、蓝)投射到被检测的物体上,利用反射光与三色光的色差计算检出的值,再与设定的三波段触发值进行比较。
3.1微小电流信号预处理
3.1.1单色信号预处理放大电路及其仿真
比起对两路电流信号模拟滤波放大后再进行同步取样,这类处理电路大大提高了颜色识别的可靠性及精确性,专门针对双结型色敏传感器转换的电流信号。由两个对数运算电路及一个减法运算电路组成(也称精密放大器)。
鉴于这种色敏传感器输出电流非常小,大概在20---50nA,用一小电压及一大电阻等效代替。(大电阻为240k,小电压分别为48mv和72mv),电流信号由对数电路直接被转为电压信号,省去了单独的I-V变换。本设计二极管采用1N4001,集成运放采用741型的OPAMP(通用放大器)。
图3.1精密放大器仿真图
如图4显示,当输入电流分别为InIsd=20nA与InIsd2=30nA时,输出为0.04V ,不符合A/D转换要求,有较大误差,还需进一步放大。对微弱信号的放大倍数也不能太高,以免引起振荡。
图3.2加次级放大的精密放大器仿真图
如图5所示,拟放大100倍,得出U0=4.033V=C(InIsd2- InIsd1)=CIn Isd2/ Isd1,使传感器输出电压达到0-5V,此电路放大后存在0.825%的误差。C为比例系数。电流比与波长存在对应关系,可作为颜色的判别标准。以上电路仿真只为更深的了解颜色识别的流程,并不代表传感器内部实际电路参数。此电路常用于识别基本单色光,也可区分两种不同光谱组成的复色光。
3.1.2全色信号预处理电路
不同与单色信号处理电路,它的电流级别为µA,需要利用专门的I-V变换,常用的方法是在被测电路中串入精密电阻,从而直接采集电阻两端电压。但当被测电流很小时,很难选择一准确的阻值进行精确测量。所以本设计采用专用的电流/电压转换器MAX472,其工作原理图如下所示:
图3.3 MAX472内部结构图
其中虚线内的是该芯片的内部结构,其中A1 和 A2 是两个运算放大器,构成差动输入,这样可以增强抗干扰能力,提高小电流信号的测量准确度;Q1和Q2 是两个三极管;COMP是一比较器;Rsence是电流采样电阻,采用热稳定性好、漂移小的康铜丝制作。虚线外的部分是用户可以根据自己的需要改变的电路。其工作原理详述如下:假定电流是从左向右(如图中Iload方向所示)流过电流采样电阻Rsence,通过一电阻Rout(输出调压电阻)接地。这样,运放A1工作,产生电流Iout 从Q1的发射极流出。而此时运放A2是截止的(电流方向改变,A1截止),没有电流从Q2流出。A1的负载输入端(-)电位为:Vpower=Iload*Rsence,A1的开环增益使其正输入端(+)与负输入端(+)有相同的电位。故RG1的压降为:Iload*Rsence,经过计算,电压/电流转换的比例P由下式给出:
P=Vout/Iload=Rsence*(Rout/RG1)
根据上式Rsence取较小的值。通过(Rout/RG1)把比例P设置为一个合适的值。对于小电流,可以获得较大的输出测量电压Vout,在电路的具体应用中,电路各参数具体计算要满足该芯片技术条件要求:
芯片技术条件要求:
OUT端的输出电压Vout<(VRG-1.5V)
OUT端的输出电流Iout<=1.5mA
不指示电流方向时SIGN端悬空
3.2 单片机选型
AT89C51是美国ATMEL公司生产的的低电压,高性能CMOS8位单片机,片内含4Kbyte的可反复擦写的的只读程序存储器(PEROM)和128bytes的RAM器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位CPU和FLASH存储单元。性价比高,可灵活用于各种控制领域。
3.3 A/D转换
3.3.1单通道A/D转换
为加快转换速度,采用8位逐次逼近式转ADC0809 ,外部clk时钟输入允许范围为500khz-1Mhz,一般选用640khz。每一通道转换需66-73个时钟脉冲,大约100-110µs。本设计基准电压采用5V;基准电压为5V时,最大量化误差约为0.02V。ADC0809将0-5V模拟信号转换00-FF数字信号并传送至51单片机,由单片机进行数据存储及数据处理。
图3.4 ADC0809引脚图
主要端口介绍:START:启动控制输入端口
ALE:地址锁存控制信号端口
EOC:转换结束信号脉冲输出端口
OE:输出允许控制端口
REF(+),REF(—):参考电压输入端
转换数据的传送A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式:
(1)定时传送方式:对于一种A/D转换其来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为110μs,相当于12MHz的MCS-51单片机共110个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。
(2)查询方式:A/D转换芯片由表明转换完成的状态信号,例ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确定转换是否完成,并接着进行数据传送。
(3)中断方式:把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
下面是单通道A/D转换图,通过改变滑动变阻器,来模拟不同的输入电压值。适于单色光识别系统。
图3.5 单通道AD转换图
在启动端START加启动脉冲(正脉冲),令ALE与START端相连,当输入一正脉冲时,立刻启动模数转换,但EOC信号是在START的下降沿10µs后才变成无效的低电平,这就要求查询EOC要在10µs后才能开始查询。转换结束后,由OE产生输出结果。也可将START端与EOC端直接相连,这样转换将是连续的,使用这种转换方式时,开始应在外部加启动脉冲。
主要程序如下(查询方式):
sbit CLOCK=P2^4//定义接口
sbit EOC=P2^5
sbit ST=P2^6
uchar ADCReg//数字量存储单元
{ST=0;ST=1;ST=0//送正脉冲
while(EOC){}//等待EOC变低
while(!EOC){ }//等待EOC变高
OE=1;ADCReg=P1;OE=0;//读转换结果
3.3.2三通道A/D转换及电压显示
为实现全色光三刺激值的采样,需采用三通道模数转换设计。
下面是三通道A/D转换,带有数字显示,可显示输入电压。数码管前三位显示电压,最后一位用点隔开,显示通道数。用直流源模拟输入电压,设置三通道输入电压值。ALE端输出的2MHZ经分频后得1MHZ送入ADC0809的CLOCK端。
通道0:2.75V,通道1:3.86V,通道2:4.88V。
图3.6 通道0电压显示
图3.7 通道1电压显示
图3.8 通道2电压显示
三通道电压采集显示流程图如下:
初始化定义
选通道,调用模数转换模块
读入数据并保存
调用数字转模拟电压计算模块(带补偿)
显示子模块调用
三电压设为V1,V2,V3,则存在下列关系:
a=R/(R+G+B)=V1/(V1+V2+V3)
b=G/(R+G+B)=V2/(V1+V2+V3)
c=B/(R+G+B)=V3/(V1+V2+V3)
根据a,b,c三值与标准系数比差的绝对值之和可确定所测颜色。(和最小的为测得颜色)
程序如下:
#include <reg51.h>
#include<absacc.h>
#include "numcode.h"
#define uchar unsigned char
#define uint unsigned int
#define adin XBYTE[0x7fff]//定义通道0地址
unsigned char code num[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x3e
};//段码表
void delayus(uint us)
{
while(us--);
}
uchar ad_action(uchar chn) //读入通道数据
{
uchar read_data;
adin=chn;
delayus(6);
read_data=adin;
return read_data;
}
#include "led.c"
#define addo (5.0/255.0)
#define zero 0.005 //用于校准AD的误差
void main()
{
uint cnt=0;
while(1)
{
switch(cnt++)
{
case 0: decodenum(ad_action(0)*addo+zero,0);break;
case 70: decodenum(ad_action(1)*addo+zero,1);break;
case 140: decodenum(ad_action(2)*addo+zero,2);break;
case 210:cnt=0;break;
}
disp();
}
#include "adc0809.c"
#define LED_Data P2
#define A 10
#define U 11
sbit LED1=P3^0;
sbit LED2=P3^1;
sbit LED3=P3^2;
sbit LED4=P3^3;
sbit dp=P3^5;
#define LED_slect P3
static uchar dispdata[4];
void decodenum(float adv,uchar chn)//电压与通道数
{
uint temp;
temp=(uint)(adv*100);
dispdata[0]=temp/100;
dispdata[1]=temp/10%10;
dispdata[2]=temp%10;
dispdata[3]=chn;
}
void select(uchar LED)
{
switch(LED)
{
case 0:LED1=0;break;
case 1:LED2=0;break;
case 2:LED3=0;break;
case 3:LED4=0;break;
default: LED_slect=0xff;
}
}
void dispone(uchar LED,bit ifpoint,uchar number) //number 0--9
{
select(LED);
if(ifpoint)
dp=1;
else
dp=0;
LED_Data=num[number]|0x80;
delayus(200);
LED_slect=0xff;
}
void disp()
{
uchar i;
bit point;
for(i=0;i<4;i++)
{
if(i==1)
point=0;
else
point=1;
dispone(i,point,dispdata[i]);
}
3.4单片机数字滤波
单片机数字滤波:在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号作无规律变化而无法预测,但多次测量符合统计规律,可对频率很低或很高的信号进行滤波,这是模拟滤波器做不到的。本设计中采用中位值平均滤波。
中位值滤波又称防脉冲干扰滤波,它是用中值滤波算法滤掉采样值中的脉冲干扰,然后把剩余的各采样值进行递推平均滤波。这种滤波方法兼容了平均滤波算法和中值滤波算法的优点,所以无论对缓慢变化的信号还是快速变化的信号,都能取得较好的滤波效果。
算法的程序如下:
char filter_1()
{char count i,j;
char value_buf[N];
int sum=0;
for(count=0;count<N;count++)
{value_buf[count]=get_data();
delay();}
for(j=0;j<N-1;j++)
{for(i=0;i<N-j;i++)
{if(value_[buf]>value_buf[i+1])//排序
{temp=value_buf[i];
value_buf[i]=value_buf[i+1];
value_buf[i+1]=temp;
}}}
for(count=1;count<N-1;count++)
sum+=value[count]
return(char)(sum/(N-2));}//取均值
3.5利用电压比较器限值识别颜色
电压比较器的输入电压为模拟信号,而输出只有两种情况不是高电平就是低电平,可直接将模拟信号转化为二值信号。所以根据这个想法,假设由红光得到的电压为1V,绿光得到电压为0.7V,蓝光得到的电压0.3V。那么我们可利用两个单限比较器,阀值可设为0.85V及0.5V,高于阀值电压则输出低电平,低于阀值则输出高电平。那么,绿色输出为10,利用3-8译码器输出(C口置0)本设计采用一般单限比较器LM358,稳压管的稳定电压设为5V。UT1=10/20=0.5V UT2=8.5/10=0.85V。如为绿色(0.7V)则在Y2输出低电平,仿真如下:
图3.9 绿色电压比较译码显示图
结果显示在0.5V至0.85V之间时,Y2输出低电平。符合设计要求。下图为输入1V(红色)时译码器输出电平,由于高于阀值电压0.85V,0.5V,比较器输出均低电平,则Y0口输出低电平,Y2为高电平。
图3.10 红色电压比较译码显示图
由此,识别N种颜色只需N-1个比较器,及相应的译码电路。由于专用电压比较器的及译码器转换速度相当快,可达到ns级别。
第4章,基于TCS230的单片机颜色识别系统
4.1,TCS230简介
颜色传感器TCS230是美国TAOS公司推出的可编程彩色光到频率转换器的传感器。该传感器具有分辨率高,可编程的颜色选择与标定,单电压供电等特点,输出为数字量,可直接与微处理器连接。
光学系统如下:
图4.1 TCS230光学系统结构图
与传统的传感器相比,TCS230的反应速度快,并可用软件的设计改变对滤波片的选择。 目前的颜色传感器通常在独立的硅光电二极管上覆盖经过修正的红,绿,蓝滤波器,然后对输出信号进行相应的处理。由于该芯片输出的是数字量,比起前面介绍的国产CS-1,减小了识别误差。并且可编程,可操作性强。
下面是TCS230与AT89C51单片机组成的颜色识别系统的接口图:
图4.2 TCS230与单片机工作接口图
Out端接p3.5口(定时/计数器1外部事件计数输入端),输出频率范围从2HZ-500KHZ。
工作原理:由三原色原理可知,如果知道构成各种颜色的三原色的值,就可知被测物体的颜色。
图4.3 TCS230引脚图
构成:包括64个光电二极管,其中有16个带红色滤波器;16个带绿色滤波器;16个带蓝色滤波器;其余16个不带任何滤波器。;另一方面,相同颜色的16个光电二极管是并联连接的,均匀分布在二极管阵列中,可以消除颜色的位置误差。工作时由S0,S1选择相应的滤波器。用户还可以通过两个可编程引脚来选择100 %、20 %或2 %的输出比例因子,或电源关断模式。输出比例因子使传感器的输出能够适应不同的测量范围,提高了它的适应能力,选通方式如下:
表一,TCS230引脚逻辑:
S0
S1
输出频率定标
S2
S3
滤波器类型
L
L
关断电源
L
L
红色
L
H
2%
L
H
蓝色
H
L
20%
H
L
无
H
H
100%
H
H
绿色
4.2 白平衡和颜色识别原理
白平衡就是告诉系统什么是白色。从理论上讲,白色是由等量的红色、绿色和蓝色混合而成的;但实际上,白色中的三原色并不完全相等,并且对于TCS230 的光传感器来说, 它对这三种基本色的敏感性是不相同的, 导致TCS230 的RGB 输出并不相等,因此在测试前必须进行白平衡调整,使得TCS230 对所检测的“白色”中的三原色是相等的。进行白平衡调整是为后续的颜色识别作准备。在本装置中,白平衡调整的具体步骤和方法如下:将空的试管放置在传感器的上方,试管的上方放置一个白色的光源,使得入射光能够穿过试管照射到TCS230 上;根据前面所介绍的方法,依次选通红色、绿色和蓝色滤波器,分别测得红色、绿色和蓝色的值,然后就可计算出需要的3 个调整参数。
当用TCS230 识别颜色时,就用这3 个参数对所测颜色的R、G和B 进行调整,有两种方法来计算调整参数:
1. 依次选通三种颜色的滤波器,然后对TCS230的输出脉冲进行计数,当计数到255时停止计数,分别计算每个通道所用时间。这些时间对应于实际测试时TCS230每种滤波器所采用的时间基准。在这段时间内所测的脉冲数就是对应的R,G,B值。
2. 设置定时器为一固定时间,然后选通三种颜色的滤波器,计算这段时间内TCS230输出的脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为255。在实际测试时,使用相同的时间进行计数,将测得的脉冲数乘以求得的比例因子,可得对应的R,G,B值。
下面选用第二种方法,TCS230颜色传感器输出方波给单片机,利用单片机的定时/计数功能得到输出方波在10ms内的脉冲数,并保存结果。为使其定时时间达到10ms,采用模式1(最大定时时间为65.536ms,而方式0只有8.192ms,需要中断两次,一次计5ms才可实现,显然是不可取的;并且由于定时时间较长,重装初值的时间可忽略不计)。
3.应用中需要注意的问题
① 颜色识别时要避免外界光线的干扰,否则会影响颜色识别的结果。最好把传感器、光源等放置在一个密闭、无反射的箱子中进行测试。
② 对光源没有特殊的要求,但是光源发出的光要尽量集中,否则会造成传感器之间的相互干扰。
③ 当第1次使用TCS230时,或TCS230识别模块重启、更换光源等情况时,都需要进行白平衡调整。
4.3 方案选择与脉冲计数设计仿真
下面的工作有两种方案
【1】 由单片机驱动7段数码管,进行脉冲计数。单片机外接12MHZ晶振。
首先,计算单片机的机器周期为1µs,则待测方波的周期不得小于2µs,即频率不得大于500kHZ,而TCS230最大输出为500kHZ,符合要求。
然后,计算定时器初值(216-X)*10-6=10*10-3,得X=55536
转化为16进制:X=0D8F0H,则TH0=0D8H,TL0=0F0H
由于TCS230输出的频率范围较宽,最低2HZ,最高500kHZ,脉冲计数的精确性不能保证。需要多段定时时间内的脉冲数取平均值,并四舍五入取整数,减小查表时带来的庞大计算。
图4.4 脉冲计数系统仿真示例一
图4.5 脉冲计数系统仿真示例二
图4.4,图4.5为protues仿真结果,当频率为1.14khz时,显示10ms的脉冲技术值为11(实际为11.4,四舍五入后为11),同理当频率为1.17khz时,显示脉冲值为12,符合要求。利用三个脉冲值乘以比例因子即可得知R,G,B的值,从而对应相应的颜色,查表可得颜色值。
语法RGB(查表)
( red,green,blue )
参数red:integer类型,指定颜色中的红色分量强度,有效值在0到255之间green:integer类型,指定颜色中的绿色分量强度,有效值在0到255之间blue:integer类型,指定颜色中的蓝色分量强度,有效值在0到255之间返回值Long。函数执行成功时返回由指定分量确定的颜色,用长整数表示。发生错误时返回-1。如果任何参数的值为NULL,RGB()函数返回NULL。
用法RGB()函数使用下述公式计算表示颜色的长整数:65536 * Blue+ 256 * Green+ Red其中,Blue代表蓝色分量,Green代表绿色分量,Red代表红色分量。各分量中,数值越小,亮度越低,数值越大,亮度越高。例如,RGB ( 0, 0, 0 )为黑色(亮度最低),RGB ( 255, 255,255 )为白色(亮度最高)。
当识别的颜色种类较多时,可采用顺序表的对分查找法,减小时间复杂度。
表1:常用RGB颜色表
颜色
R
G
B
值
黑色
0
0
0
#000000
灰色
192
192
192
#C0C0C0
红色
255
0
0
#FF0000
蓝色
0
0
255
#0000FF
绿色
0
255
0
#00FF00
紫色
160
32
240
#A020F0
橙色
255
97
0
#FF6100
黄色
255
255
0
#FFFF00
棕色
128
42
42
#802A2A
【2】 单片机将保存的数据经过MAX232电平转换后,通过计算机串行连接口送至计算
机(上机位)。最后利用LABVIEW的强大功能同时进行多数据处理,实现多颜色识别系统的同时运行处理。其中由于单片机和计算机的通讯采用的是RS232接口,在RS232标准中电压在+3 V~+15 V之间为“0”;电压在一3 V~一15 V之间为“1”。而单片机输入输出的TTL电平的逻辑“1”为3.8 V左右,逻辑“0”为0.4 V左右,所以在此使用MAX232实现电平转换。
本设计只采用第一种方案。流程图如下:
初始化
设定时/计数模式
赋定时初值,设10ms定时
开中断
定时器中断,并重装初值
N
reg++
reg=4?
Y
脉冲计数值/5,并四舍五入
调用显示子程序
脉冲计数程序如下:
#include<reg51.h>
sbit input=P2^0;//初始化
unsigned long count;
unsigned char reg=0;
unsigned char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共阳极段码
展开阅读全文