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

2019-07-21 01:15发布

#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; }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
正点原子
1楼-- · 2019-07-21 01:20
 精彩回答 2  元偷偷看……
王军强
2楼-- · 2019-07-21 02:07
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-21 02:31
/*外部中断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是废话.
王军强
4楼-- · 2019-07-21 04:07
EXTI->IMR|=0<<4;这是关闭中断啊,EXTI->IMR|=1<<4;是开启中断,这是我的理解啊,有问题吗
正点原子
5楼-- · 2019-07-21 05:49
回复【5楼】王军强:
---------------------------------
自己想.
X|=0;
能改变X的值么?
王军强
6楼-- · 2019-07-21 06:49
 精彩回答 2  元偷偷看……

一周热门 更多>