原创 TCS32OOD颜色传感器资料+程序

2011-9-15 18:44 2815 20 20 分类: MCU/ 嵌入式

我用的是TCS32OOD型号的颜色传感器  附件里面有相关的资料
附件里面还有 RGB对照表  附件里面还有我的颜色传感器的PCB和原理图

rar.gif颜色传感器PCB.rar

rar.gif资料.rar

编译器 ICC AVR


这款传感器是在不同颜色光照情况下面输出的波的频率不一样,注意在颜色传感器周围加上几个高亮的白色LED灯来返回被照颜色
这里我用了AVR128内部定时器T2外部的计数方式, 
检测传感器返回的波形的频率 , 通过频率和RGB对照表来修正检测到的颜色信息.
注意在校准颜色前需要进行白平衡调整,即找到白色的频率对应值.


下面是源代码:
/************************************************/
#include<iom128v.h>
#include<macros.h>

#include"Mydelay.h"
#include"LCD12864.h"

#define TCS32_PORT  PORTD
#define TCS32_DDR   DDRD

#define S0   PD2
#define S1 &nbspne TCS32_OE_SET()  TCS32_PORT|=BIT(OE);  TCS32_DDR|=BIT(OE) 
#define TCS32_OE_CLR()  TCS32_PORT&=~BIT(OE); TCS32_DDR|=BIT(OE) 

//下面是使用内部不同颜色的滤波器
//共有三基色颜色滤波器  通过这三个滤波器返回的波形的频率 转换后对照RGB表校准颜色信息
#define Red_filter()    TCS32_PORT&=~BIT(S2); TCS32_PORT&=~BIT(S3)
#define Blue_filter()   TCS32_PORT&=~BIT(S2); TCS32_PORT|=BIT(S3)
#define NO_filter()     TCS32_PORT|=BIT(S2);  TCS32_PORT&=~BIT(S3)
#define Green_filter()  TCS32_PORT|=BIT(S2);  TCS32_PORT|=BIT(S3)

//下面是选择输出波形的频率比例
//20就是百分之20输出  100就是原样输出
#define Power_down()    TCS32_PORT&=~BIT(S0); TCS32_PORT&=~BIT(S1)
#define freq_2()       TCS32_PORT&=~BIT(S0); TCS32_PORT|=BIT(S1)
#define freq_20()      TCS32_PORT|=BIT(S0);  TCS32_PORT&=~BIT(S1)
#define freq_100()     TCS32_PORT|=BIT(S0);  TCS32_PORT|=BIT(S1)


unsigned int ovf_num=0;
//下面变量存放返回的波形频率值
unsigned int Red_num=0,Blue_num=0,Green_num=0;

void TCS32_Port_init(void)
{
 TCS32_PORT=0x00;
 TCS32_DDR |= BIT(S0)|BIT(S1)|BIT(S2)|BIT(S3)|BIT(OE);
 //输出管脚
 TCS32_DDR &= ~BIT(OUT);
 //信号时钟输入管脚
}

void TCS32_Init(void)
{
 TCS32_OE_CLR();
 freq_2();
}

void timer2_init(void)
{
 TCCR2 = 0x00;     //关闭定时器T2
 TCNT2 = 0x00;     //计数器赋初值
 TCCR2 = 0X07;     //设置为外部事件计数模式,时钟为上升沿
}

void main(void)
{
 DDRE|=BIT(PE2);
 PORTE|=BIT(PE2);
 DDRA=0XFF;
 
 CLI();
 
 Init_lcd12864();
 

 TCS32_Port_init();
 TCS32_Init();
 timer2_init();
 
 MCUCR=0X00;
 TIMSK=0X40;  //T2的溢出中断使能
 
 SEI();
 
 while(1)
 {
   TCCR2 = 0x00;  //关闭定时器T2
   TCNT2 = 0x00;
   ovf_num = 0;
   Red_filter(); 
   TCCR2 = 0X07;     //设置为外部事件计数模式,时钟为上升沿 
   delay_nms(100);
   TCCR2 = 0x00;  //关闭定时器T2
   Red_num = 256*ovf_num + TCNT2;
   
   LCD128_print_int(10,10,Red_num);
   
   /*TCCR2 = 0x00;  //关闭定时器T2
   TCNT2 = 0x00;
   ovf_num = 0;
   Blue_filter();
   TCCR2 = 0X07;     //设置为外部事件计数模式,时钟为上升沿 
   delay_nms(100);
   TCCR2 = 0x00;  //关闭定时器T2
   Blue_num = 256*ovf_num + TCNT2;
   
   TCCR2 = 0x00;  //关闭定时器T2
   TCNT2 = 0x00;
   ovf_num = 0;
   Green_filter();
   TCCR2 = 0X07;     //设置为外部事件计数模式,时钟为上升沿 
   delay_nms(100);
   TCCR2 = 0x00;  //关闭定时器T2
   Green_num = 256*ovf_num + TCNT2;
   TCNT2 = 0x00;
   ovf_num = 0;*/
 }
}

#pragma interrupt_handler timer2_ovf_isr:11
void timer2_ovf_isr(void)
{
 ovf_num++;
}
/************************************************************/

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条