我用的是TCS32OOD型号的颜色传感器 附件里面有相关的资料
附件里面还有 RGB对照表 附件里面还有我的颜色传感器的PCB和原理图
编译器 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  ne 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条评论)
登录后参与讨论