单片机学习小组
直播中

红旧衫

9年用户 727经验值
擅长:可编程逻辑 电源/新能源 制造/封装 EDA/IC设计
私信 关注

怎样去使用寻迹传感器呢

寻迹传感器的工作原理是什么?怎样去使用寻迹传感器呢?

回帖(1)

陈浩

2022-2-10 11:21:22
一、寻迹传感器工作原理介绍
       灰度传感器有数字传感器和模拟传感器两种,其原理大致相同。原理:一只发光二极管和一只光敏二极管,安装在同一面上。灰度传感器利用不同颜色的检测面对光的反射程度不同的原理进行颜色深浅检测。在有效的检测距离内(理论上距离可以无限远,实际受外界光源的影响,最佳距离为15mm至50mm,如果距离过高的话,需要进行遮光),发光二极管发出的光,照射在检测面上,检测面反射部分光线,光敏二极管检测此光线的强度并将其转换为单片机可以识别的电信号。这个电信号是一个模拟值,单片机可以根据模拟值的大小进行二值化处理,也就是给一个电平分界线,当电压大于一个值的时候给一个高电平(或低电平),当电压小于一个值的时候给一个低电平(或高电平)。当然这里可以用电压比较器作为电平的参考电压。这就是我们用的数字量灰度传感器。数字量的灰度传感器如果加入的是单片机处理数据,那么可以把得到的原始数据加入滤波算法、数据混合算法得到一个波动小、适应环境强的数字传感器。 如果对采集的原始的数据不做处理,那么就是模拟值输出。也就是我们的模拟量灰度传感器。因为每路传感器相互之间都是有误差的,所以同样的条件下模拟值肯定不是一样。

作为我们使用者来说一般知道怎么用就可以了(说点人话)简单来说智能款传感器有两种输出方式
第一种是通过gpio输出高低电平5v/3.3v(例如传感器在黑线上输出高电平,不在黑线上输出低电平)
第二种是串口通信,因为在智能款传感器上有一颗mcu通过自身的采集和计算可以采集到传感器的状态,而我们要做的就是用我们的主板与传感器的主板通信就可以来知道我们想知道的传感器的状态就可以了。

2.使用方法
接下来给大家讲一下使用方法(仅供参考)
作为一个麦轮车要想进准的定位首先就是位置状态足够多从而实现位置闭环,如果采用第一种gpio输出高低电平的话,那么一路对应着一路引脚,四个7路就是28个引脚,太占引脚而且麻烦,所以我们采用第二种串口通信的方式,stm32f103这个型号的板子有5路硬件串口,四路作为与传感器通信,一路与我们的上位机通信处理数据和计算从而改变车身校正。
提供一个思路
第一步配置cubemx的串口
首先配置RCC、SYS、clock(这里跳过了)





然后生成项目文件打开
3.代码实现
1.主函数代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_UART4_Init();
  MX_UART5_Init();
  /* USER CODE BEGIN 2 */
delay_ms(1000);
HAL_UART_Transmit(&huart2,&Tx_strcc,sizeof(Tx_strcc),10000);//串口2发送函数
HAL_UART_Receive_IT(&huart1,&Rx_mcu,1);//串口1接收函数
HAL_UART_Receive_IT(&huart5,&Rx_dat2,1);//串口5接收函数
HAL_UART_Receive_IT(&huart3,&Rx_dat3,1);//串口3接收函数                               
HAL_UART_Receive_IT(&huart2,&Rx_dat,1); //串口2接收函数

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

        }
  /* USER CODE END 3 */
}
2.串口中断代码

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  
{
        if((huart->Instance)==USART1)
                        {
                                if(Rx_mcu==0x00)
                                {chuan_flag=0;
        Rx_dat=0;       
                                Rx_dat2=0;       
                                Rx_dat3=0;       
        wink=0;                                       
                                }
                                if(Rx_mcu==0x31)
                                {chuan_flag=1;                               
                                }
                                if(Rx_mcu==0x32)
                                {chuan_flag=2;                               
                                }
                                if(Rx_mcu==0x33)
                                {chuan_flag=3;                               
                                }
                                if(Rx_mcu==0x34)
                                {chuan_flag=4;                               
                                }
                          if(Rx_mcu==0x35)
                                {chuan_flag=5;                               
                                }
                                if(Rx_mcu==0x36)
                                {qq=1;
                                        chuan_flag=6;
                                }
                                if(Rx_mcu==0x37)
                                {qq=0;
                                        chuan_flag=7;
                                        }                                       
                                if(Rx_mcu==0x38)
                                {qq=0;
                                        chuan_flag=8;
                                }
                                if(Rx_mcu==0x39)
                                {qq=0;
                                        chuan_flag=9;
                                }
                                if(Rx_mcu==0x3a)
                                {qq=0;
                                        chuan_flag=10;
                                }
                                if(Rx_mcu==0x3b)
                                {qq=0;
                                        chuan_flag=11;
                                }
                                if(Rx_mcu==0x3c)
                                {qq=1;                                 
                                        chuan_flag=12;
                                }
                                if(Rx_mcu==0x3d)
                                {qq=0;
                                        chuan_flag=13;
                                }
                                if(Rx_mcu==0x3e)
                                {qq=0;
                                        chuan_flag=14;
                                }
                                if(Rx_mcu==0x3f)
                                {qq=1;
                                        chuan_flag=15;
                                }
                                if(Rx_mcu==0x40)
                                {qq=0;
                                        chuan_flag=16;
                                }
                                if(Rx_mcu==0x41)
                                {qq=0;
                                        chuan_flag=17;
                                }
                                if(Rx_mcu==0x42)
                                {qq=1;
                                        chuan_flag=18;
                                }
                                if(Rx_mcu==0x43)
                                {qq=0;
                                 chuan_flag=19;
                                }
                                send_data();
      HAL_UART_Receive_IT(&huart1,&Rx_mcu,1);       
                       
                        }
      if((huart->Instance)==UART5)
                        {                       
                                if(chuan_flag==4)
                                                {if(Rx_dat2 == 0x40)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
                                                        }}
                                                                                                if(chuan_flag==5)
                                                {if(Rx_dat2 == 0x7f)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
                                                        }}
                                                                                                 if(chuan_flag==7)
                                                {
                                                        if(chu_or_jue==chu)
                                                        {
                                                        if(Rx_dat2 == 0x08)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
                                                        }
                                                        if(Rx_dat2 == 0x10||Rx_dat2 == 0x18||Rx_dat2 == 0x20||Rx_dat2 == 0x40||Rx_dat2 == 0x30||Rx_dat2 == 0x60||Rx_dat2 == 0x70)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
                                                        }
                                                        if(Rx_dat2 == 0x04||Rx_dat2 == 0x0c||Rx_dat2 == 0x02||Rx_dat2 == 0x01||Rx_dat2 == 0x06||Rx_dat2 == 0x07||Rx_dat2 == 0x03)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x34,sizeof(Tx_0x34),10000);     
                                                        }
                                                  }               
                                                        if(chu_or_jue==jue)
                                                        {
                                                        if(Rx_dat2 == 0x08)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
                                                        }
                                                  }
                                                        if(chuan_flag==9)
                                                {if(Rx_dat2 == 0x40)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
                                                        }}
                                                if(chuan_flag==10)
                                                {if(Rx_dat2 != 0x40&&Rx_dat2 != 0x20&&Rx_dat2 != 0x60)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
                                                        }
                                                }
            if(chuan_flag==13)
                                                {
                                                       
                                                        if(Rx_dat2 == 0x08)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
                                                        }       
                                                        if(Rx_dat2 == 0x04||Rx_dat2 == 0x0c||Rx_dat2 == 0x02||Rx_dat2 == 0x01||Rx_dat2 == 0x06||Rx_dat2 == 0x07||Rx_dat2 == 0x03)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
                                                        }       
                                                        if(Rx_dat2 == 0x10||Rx_dat2 == 0x18||Rx_dat2 == 0x20||Rx_dat2 == 0x40||Rx_dat2 == 0x30||Rx_dat2 == 0x60||Rx_dat2 == 0x70)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x31),10000);     
                                                        }
                                                        wink++;
                                                }
            else if(chuan_flag==14)
                                                {if(Rx_dat2 == 0x08)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x34,sizeof(Tx_0x34),10000);     
                                                        }}
                                                else if(chuan_flag==17)
                                                {if(Rx_dat2 == 0x01||Rx_dat2 == 0x02||Rx_dat2 == 0x03)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
                                                        }
                                                        if(Rx_dat2 == 0x40||Rx_dat2 == 0x20||Rx_dat2 == 0x30)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
                                                        }
                                                }
                                                 HAL_UART_Transmit(&huart5,&Tx_strcc,sizeof(Tx_strcc),10000);
HAL_UART_Receive_IT(&huart5,&Rx_dat2,1);                                                                                                
                        }
                        if((huart->Instance)==USART3)
                        {                                       
                                 if(chuan_flag==6)
                                                {if(Rx_dat3 == 0x7f)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
                                                        }}
                                                                                                                                                else if(chuan_flag==18)
                                                {if(Rx_dat3 == 0x01||Rx_dat3 == 0x02||Rx_dat3 == 0x03)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
                                                        }
                                                        if(Rx_dat3 == 0x40||Rx_dat3 == 0x20||Rx_dat3 == 0x30)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
                                                        }
                                                }
                                                HAL_UART_Transmit(&huart3,&Tx_strcc,sizeof(Tx_strcc),10000);
                         HAL_UART_Receive_IT(&huart3,&Rx_dat3,1);               
                         }
                        if((huart->Instance)==USART2)                     
      {   
                                   if(chuan_flag==1)
                                                {if(Rx_dat == 0x08||Rx_dat == 0x04||Rx_dat == 0x0c)        
                             {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);                                                 
           }}
            if(chuan_flag==2)
                                                {if(Rx_dat == 0x7f)        
                             {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);                                                 
           }}
                                                 if(chuan_flag==3)
                                                {
           if(Rx_dat != 0x7f)      
                             {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);                                                                                                           
             }
                                          if(Rx_dat == 0x7f)        
                             {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);                                                           
            }}
                                               
                                                if(chuan_flag==8)
                                                {if(Rx_dat == 0x08)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
                                                        }}       
            if(chuan_flag==11)
                                                {
                                                        if(Rx_dat == 0x08)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
                                                        }       
                                                        if(Rx_dat == 0x04||Rx_dat == 0x0c||Rx_dat == 0x02||Rx_dat == 0x01||Rx_dat == 0x06||Rx_dat == 0x07||Rx_dat == 0x03)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x33,sizeof(Tx_0x33),10000);     
                                                        }
                                                        if(Rx_dat >= 0x10||Rx_dat == 0x18||Rx_dat == 0x20||Rx_dat == 0x40||Rx_dat == 0x30||Rx_dat == 0x60||Rx_dat == 0x70)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x31),10000);     
                                                        }
                                                        wink++;
                                                }
                   if(chuan_flag==12)
                                                {if(Rx_dat == 0x3f)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x37,sizeof(Tx_0x37),10000);     
                                                        }
                                                }
            else if(chuan_flag==15)
                                                {if(Rx_dat == 0x40)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x35,sizeof(Tx_0x35),10000);     
                                                        }}
                                                else if(chuan_flag==16)
                                                {if(Rx_dat == 0x01||Rx_dat == 0x02||Rx_dat == 0x03)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
                                                        }
                                                        if(Rx_dat == 0x40||Rx_dat == 0x20||Rx_dat == 0x30)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x32,sizeof(Tx_0x32),10000);     
                                                        }
                                                }
             if(chuan_flag==19)
                                                {if(Rx_dat == 0x20||Rx_dat == 0x30)
                                                        {HAL_UART_Transmit(&huart1,&Tx_0x31,sizeof(Tx_0x31),10000);     
                                                        }
                                                }                       
                                if(chu_or_jue==1)
                                {                                       
HAL_UART_Receive_IT(&huart1,&Rx_mcu,1);       
                                }
  HAL_UART_Transmit(&huart2,&Tx_strcc,sizeof(Tx_strcc),10000);
      HAL_UART_Receive_IT(&huart2,&Rx_dat,1);      
                        }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分