文章目录
引言
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);
}
(大家仅供参考)这个是当时我当时做的所有的位置当时用到哪个位置就就写到哪了有点乱哈=.=
|