资讯专栏INFORMATION COLUMN

工创赛基于stm32f103的HAL库的全向麦轮的四个7路寻迹传感器智能款采集程序

hersion / 3275人阅读

摘要:灰度传感器利用不同颜色的检测面对光的反射程度不同的原理进行颜色深浅检测。这就是我们用的数字量灰度传感器。数字量的灰度传感器如果加入的是单片机处理数据,那么可以把得到的原始数据加入滤波算法数据混合算法得到一个波动小适应环境强的数字传感器。

文章目录

引言

1.寻迹传感器工作原理介绍

2.使用方法

3.代码实现


引言:

    基于刚刚结束的工创赛给大家分享一下我们的传感器选择方案

一、寻迹传感器工作原理介绍

       灰度传感器有数字传感器和模拟传感器两种,其原理大致相同。原理:一只发光二极管和一只光敏二极管,安装在同一面上。灰度传感器利用不同颜色的检测面对光的反射程度不同的原理进行颜色深浅检测。在有效的检测距离内(理论上距离可以无限远,实际受外界光源的影响,最佳距离为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);       			}

(大家仅供参考)这个是当时我当时做的所有的位置当时用到哪个位置就就写到哪了有点乱哈=.=

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121784.html

相关文章

  • 项目五:基于stm32f103寻迹小车

    摘要:前言传感器工作原理代码部分电机初始化延迟初始化电机管脚初始化寻迹管脚初始化。电机管脚初始化函数定义管脚的结构体打开所要使用的时钟将管脚特殊功能关掉配置管脚的参数,用于驱动电机。配置管脚的参数红外传感器。 前言:传感器工作原理: 代码部分:    main.c #include motor....

    kyanag 评论0 收藏0
  • STM32学习笔记 第二章 STM32资源介绍

    摘要:总线挂载的外设有等。外设地址映射片上外设区分为三条总线,根据外设速度的不同,不同总线挂载着不同的外设,挂载低速外设,和挂载高速外设。 第二章 STM32资源介绍 2...

    G9YH 评论0 收藏0
  • 基于STM32f103c8t6和L292N驱动设计避障小车(核心函数建立为自己所写)

    基于STM32f103c8t6和L292N驱动设计避障小车(核心函数的建立为自己所写) 一.项目感触 完成这个项目自己一开始也是无法从本身上出发,看着这个最小系统板和这个电机驱动模块上面想着怎样实现让这两块板子实现四个电机上面转动呢,还要加入避障模块,自己一开始一头雾水,于是开始了漫长的借鉴之路,首先作为一个开发者,我觉得学习的地方首选是B站,所以我找了相关的做智能小车的视频 首先是B站智能小车教...

    CoffeX 评论0 收藏0
  • STM32F103基于spi实现OLED显示

    摘要:文章目录一原理二实现显示中文滚动显示显示字符串读取温湿度显示温湿度三结果开机显示欢迎信息循环读取温湿度以及滚动显示我的四总结五参考六源码一原理的定义就是串行外围设备接口。 ...

    xfee 评论0 收藏0
  • 基于STM32Cube MX开发TencentOS-Tiny软件包

    摘要:基于开发的软件包导师汪礼超学员崔林威摘要腾讯物联网操作系统是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,可裁剪等特性。图中断函数处理进行生成工程配置,按如下界面进行配置,最后点击,并点击。 ...

    shiyang6017 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<