OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 20373|回复: 17

颜色传感器,为什么不经过判断就输出颜色,怎么回事,原子哥求助啊

[复制链接]

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
发表于 2013-8-3 10:52:01 | 显示全部楼层 |阅读模式
#include <stm32f10x_lib.h>
#include "TCS230.h"
#include "delay.h"

u32 Colour_num=0;  // 用于颜色传感器脉冲计数
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内部颜色滤波器设置
 入口参数:Colour
 返回参数:无
 备    注:Colour 选择颜色(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
 函数功能:设置颜色滤波器并读出相应频率参数
 入口参数:Colour
 返回参数:Colour num
 备    注:Colour     :颜色滤波器配置参数
           Colour num :脉冲个数
******************************************/ 
u32 TCS230_Read_Colour(u8 Colour)
{
Colour_Init(Colour);//配置TCS230的颜色滤波器
delay_ms(5);
TCS230_Start();//初始化各变量及定时器3、外部中断0
while(Time3_flag==0);//等待计数完毕
return Colour_num; // 返回计数个数
}

/******************************************
 函数名称:TCS230_Distinguish
 函数功能:物体颜色判别
 入口参数:无
 返回参数: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))// 红色
return Red1;
if((g>k*b)&&(g>k*r))// 绿色
return Green1; 
if((b>k*r)&&(b>k*g))// 蓝色
return Blue1;
if((r>k*b)&&(g>k*b))// 黄色
return Yellow1;
return 0;
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-3 11:25:00 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-3 12:12:37 | 显示全部楼层
那你看看这个,中断,定时器有没有问题
#include <stm32f10x_lib.h>
#include "TCS230.h"
#include "delay.h"

u32 Colour_num=0;   // 用于颜色传感器脉冲计数
u8  Time3_flag=0;                                 // 定时器中断标志


/*==============================以下为定时器3程序部分=================================*/
/*定时器3中断服务函数*/
void TIM3_IRQHandler(void)

 
  if(TIM3->SR&0X0001)   //溢出中断
   {
 Time3_flag=1;
 EXTI->IMR|=0<<4;   //关闭外部中断0
 TIM3->CR1|=0X00; //关闭定时器3
   }
   TIM3->SR&=0<<4;      //清除中断标志位 
}


/**********************************************
函数名称: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 EXTI4_Init(void)
{
     RCC->APB2ENR|=1<<2; //使能PORTA时钟
     GPIOA->CRL&=0XFFF0FFFF;//PA0设置成输入
     GPIOA->CRL|=0X00080000;
     Ex_NVIC_Config(GPIO_A,4,FTIR);//下降沿触发
     MY_NVIC_Init(2,2,EXTI4_IRQChannel,2);//抢占2,子优先级2,组2
}

/*外部中断0服务程序*/
void EXTI4_IRQHandler(void)
{
Colour_num++;
    EXTI->R = 1<<4; //清除line0上的中断标志位
EXTI->IMR|=0<<4;//关闭外部中断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
EXTI4_Init();
}

/***********************************************
 函数名称:Colour_Init
 函数功能:TCS230内部颜色滤波器设置
 入口参数:Colour
 返回参数:无
 备    注:Colour 选择颜色(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<<4;    //开启外部中断0
}

/******************************************
 函数名称:TCS230_Read_Colour
 函数功能:设置颜色滤波器并读出相应频率参数
 入口参数:Colour
 返回参数:Colour num
 备    注:Colour     :颜色滤波器配置参数
           Colour num :脉冲个数
******************************************/ 
u32 TCS230_Read_Colour(u8 Colour)
{
Colour_Init(Colour);//配置TCS230的颜色滤波器
delay_ms(5);
TCS230_Start();//初始化各变量及定时器3、外部中断0
while(Time3_flag==0);//等待计数完毕
return Colour_num; // 返回计数个数
}

/******************************************
 函数名称:TCS230_Distinguish
 函数功能:物体颜色判别
 入口参数:无
 返回参数: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))// 红色
return Red1;
if((g>k*b)&&(g>k*r))// 绿色
return Green1; 
if((b>k*r)&&(b>k*g))// 蓝色
return Blue1;
if((r>k*b)&&(g>k*b))// 黄色
return Yellow1;
return 0;
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-3 12:31:28 | 显示全部楼层
/*外部中断0服务程序*/ 
void EXTI4_IRQHandler(void) 

Colour_num++; 
    EXTI->R = 1<<4; //清除line0上的中断标志位 
EXTI->IMR|=0<<4;//关闭外部中断0 
TIM3->CR1|=0X00; //关闭定时器3 


这里的|=0<<4,是没有作用的!!
之类的|=1才有用,|=0是废话.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-3 12:35:28 | 显示全部楼层
EXTI->IMR|=0<<4;这是关闭中断啊,EXTI->IMR|=1<<4;是开启中断,这是我的理解啊,有问题吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-3 12:46:53 | 显示全部楼层
回复【5楼】王军强:
---------------------------------
自己想.
X|=0;
能改变X的值么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-3 12:56:09 | 显示全部楼层
不能改变,我发现程序的问题是中断,定时器那里,怎么改呢
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-3 13:00:00 | 显示全部楼层
关闭中断,怎么写呢
回复 支持 反对

使用道具 举报

13

主题

45

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2013-7-17
在线时间
10 小时
发表于 2013-8-3 17:13:58 | 显示全部楼层
EXTI->IMR&=~(1<<4);这是关闭中断啊,EXTI->IMR|=1<<4;是开启中断
回复 支持 反对

使用道具 举报

13

主题

45

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2013-7-17
在线时间
10 小时
发表于 2013-8-3 17:15:04 | 显示全部楼层
回复【8楼】王军强:
---------------------------------
颜色传感器是什么型号的?使用复杂吗?分享一下下,我最近可能会用到这个东西
回复 支持 反对

使用道具 举报

13

主题

45

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
314
金钱
314
注册时间
2013-7-17
在线时间
10 小时
发表于 2013-8-3 17:15:22 | 显示全部楼层
回复【8楼】王军强:
---------------------------------
EXTI->IMR&=~(1<<4);这是关闭中断啊,EXTI->IMR|=1<<4;是开启中断
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-3 17:16:35 | 显示全部楼层
就是我上面的程序,其实程序是对的,只是,算法错了
if((r>k*b)&&(r>k*g))// 红色 
return Red1; 
if((g>k*b)&&(g>k*r))// 绿色 
return Green1;  
if((b>k*r)&&(b>k*g))// 蓝色 
return Blue1; 
if((r>k*b)&&(g>k*b))// 黄色 
return Yellow1; 
这里有问题
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-3 17:18:11 | 显示全部楼层
会写关闭中断了,谢谢
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2012-9-1
在线时间
0 小时
发表于 2013-8-6 14:07:34 | 显示全部楼层
现在可以了吗 
回复 支持 反对

使用道具 举报

15

主题

204

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
287
金钱
287
注册时间
2013-7-17
在线时间
0 小时
发表于 2013-8-7 08:04:21 | 显示全部楼层
回复【10楼】tinwyzhang:
---------------------------------
可以百度一下的,就是判断颜色中RGB三种颜色的含量,一般使用的是定时器和计数器就可以搞定的。
有生之年,只诉温暖不言殇,花味渐浓,茶味渐醇,倾心相遇,安暖相陪。
回复 支持 反对

使用道具 举报

43

主题

152

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-8-11
在线时间
57 小时
发表于 2013-8-12 19:58:28 | 显示全部楼层
回复【楼主位】王军强:
---------------------------------
楼主,你可以把你的改完后的程序给我一下么
回复 支持 反对

使用道具 举报

45

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
448
金钱
448
注册时间
2013-5-18
在线时间
0 小时
 楼主| 发表于 2013-8-16 10:28:22 | 显示全部楼层
可以啊
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2019-4-26
在线时间
37 小时
发表于 2019-5-19 00:45:48 来自手机 | 显示全部楼层
我也想要看改完的程序
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 20:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表