#include <stm32f10x_lib.h>
#include "TCS230.h"
#include "delay.h"
u32 Colour_num=0;
// 用于颜 {MOD}传感器脉冲计数
u8 Time3_flag=0; // 定时器中断标志
/*==============================以下为定时器3程序部分=================================*/
/*定时器3中断服务函数*/
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断
{
Time3_flag=1;
EXTI->IMR|=0<<0;//关闭外部中断0
TIM3->CR1|=0X00;
//关闭定时器3
}
TIM3->SR&=0<<0;//清除中断标志位
}
/**********************************************
函数名称:Timer3_Init
函数功能:通用定时器3中断初始化
入口函数:arr(自动重装值)
psc(时钟预分频数)
返回参数:无
备注:时钟为2倍APB1(36M)
溢出时间(MS)=(arr*(psc+1))/输入时钟频率(10KHZ)
***********************************************/
void Timer3_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1;//使能TIM3时钟
TIM3->ARR=arr;//设置计数器自动重装值(0.1ms)
TIM3->
SC=psc;//预分频器7200,刚好10khz
TIM3->DIER|=1<<0; //允许更新中断
TIM3->DIER|=1<<6; //允许触发中断
TIM3->CR1|=0X01;
//使能定时器3
MY_NVIC_Init(1,1,TIM3_IRQChannel,2);// 抢占1,子优先级1,组2
}
////////////////////////////////////////////////////////////////////////////////////
/*=============================以下为外部中断0程序部分=================================*/
/********************************
函数名称:EXTI0_Init
函数功能:外部中断端口初始化
入口参数:无
返回参数:无
备注:初始化PA0为中断输入
********************************/
void EXTI0_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入
GPIOA->CRL|=0X00000008;
GPIOA->ODR|=1<<0;
Ex_NVIC_Config(GPIO_A,0,FTIR);//下降沿触发
MY_NVIC_Init(2,2,EXTI0_IRQChannel,2);//抢占2,子优先级2,组2
}
/*外部中断0服务程序*/
void EXTI0_IRQHandler(void)
{
Colour_num++;
EXTI->
R = 1<<0; //清除line0上的中断标志位
EXTI->IMR|=0<<0;//关闭外部中断0
TIM3->CR1|=0X00;
//关闭定时器3
}
/////////////////////////////////////////////////////////////////////////////////////
/**********************************************************
函数名称:TCS230_Init
函数功能:TCS230初始化
入口参数:无
返回参数:无
备 注:初始化外部中断0及定时器中断3及相关I/O口设置
**********************************************************/
void TCS230_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFF00F;
GPIOA->CRL|=0X00000330;//PA1/PA2 推挽输出
GPIOA->ODR|=1<<1; //上拉
GPIOA->ODR|=1<<2;
Timer3_Init(400,7199); //40ms
EXTI0_Init();
}
/***********************************************
函数名称:Colour_Init
函数功能:TCS230内部颜 {MOD}滤波器设置
入口参数:Colour
返回参数:无
备 注:Colour 选择颜 {MOD}(Red1/Blue1/Green1)
************************************************/
void Colour_Init(u8 Colour)
{
switch(Colour)
{
case Red1 : TCS32_S2=0;TCS32_S3=0;break;
case Blue1 : TCS32_S2=0;TCS32_S3=1;break;
case Green1: TCS32_S2=1;TCS32_S3=1;break;
default : break;
}
}
/**********************************************************
函数名称:TCS230_Start
函数功能:初始化各变量及定时器3、外部中断0,用于脉冲计数
入口参数:无
返回参数:无
**********************************************************/
void TCS230_Start(void)
{
TIM3->CR1|=0X01;
//使能定时器3
Colour_num=0;//
计数清零
Time3_flag=0; // 定时器标志清零
EXTI->IMR|=1<<0;//开启外部中断0
}
/******************************************
函数名称:TCS230_Read_Colour
函数功能:设置颜 {MOD}滤波器并读出相应频率参数
入口参数:Colour
返回参数:Colour num
备 注:Colour :颜 {MOD}滤波器配置参数
Colour num :脉冲个数
******************************************/
u32 TCS230_Read_Colour(u8 Colour)
{
Colour_Init(Colour);//配置TCS230的颜 {MOD}滤波器
delay_ms(5);
TCS230_Start();//初始化各变量及定时器3、外部中断0
while(Time3_flag==0);//等待计数完毕
return Colour_num;
// 返回计数个数
}
/******************************************
函数名称:TCS230_Distinguish
函数功能:物体颜 {MOD}判别
入口参数:无
返回参数:0/1/2/3
备 注:0:Red1
1:Blue1
2:Green1
3:Yellow1
******************************************/
u8 TCS230_Distinguish(void)
{
u8 i;
float r=0.0,b=0.0,g=0.0;
float k=1.2; //比例系数
for(i=0;i<3;i++) // 读取三次数据
{
r=r+TCS230_Read_Colour(Red1);
b=b+TCS230_Read_Colour(Blue1);
g=g+TCS230_Read_Colour(Green1);
}
r=r/3;//取三次测量的平均值
b=b/3;
g=g/3;
if((r>k*b)&&(r>k*g))// 红 {MOD}
return Red1;
if((g>k*b)&&(g>k*r))// 绿 {MOD}
return Green1;
if((b>k*r)&&(b>k*g))// 蓝 {MOD}
return Blue1;
if((r>k*b)&&(g>k*b))// 黄 {MOD}
return Yellow1;
return 0;
}
一周热门 更多>