STM32智能小车循迹教程

举报
yd_274589494 发表于 2023/07/25 11:32:11 2023/07/25
【摘要】 @TOC 前言本篇文章将带大家学习STM32智能小车的循迹功能。 一、红外循迹模块工作原理及接线图 红外循迹模块工作原理电路工作描述以其中一路为例TCRT5000传感器的红外发射二极管不断发射红外线,当发射的红外线没有被反射回来或者反射回的强度不够大时,红外接收管一直处于关闭状态,此时比较器LM393的2脚的电压低于3脚的电压,输出OUT1为低电平,LED1为点亮状态;当红外反射强度足够且被...

@TOC


前言

本篇文章将带大家学习STM32智能小车的循迹功能。

一、红外循迹模块工作原理及接线图

红外循迹模块工作原理

电路工作描述
以其中一路为例
在这里插入图片描述

TCRT5000传感器的红外发射二极管不断发射红外线,当发射的红外线没有被反射回来或者反射回的强度不够大时,红外接收管一直处于关闭状态,此时比较器LM393的2脚的电压低于3脚的电压,输出OUT1为低电平,LED1为点亮状态;当红外反射强度足够且被接收到时,比较器LM3932脚的电压大于3脚的电压,输出OUT1为低电平,LED1为熄灭状态。简单的可以理解为遇到黑线灯亮,遇到白线灯灭。

红外循迹模块和STM32的接线图

此红外循迹模块使用到了4个IO口分别接到了STM32的PA4~PA7。

在这里插入图片描述

二、cubeMX配置

将红外循迹的4个IO口都设置为上拉输入模式即可。
在这里插入图片描述

三、代码解析

find.c

#include "find.h"
#include "Moto.h"

extern TIM_HandleTypeDef htim3;

/*
函数功能:调节小车左右电机PWM
Left:左电机PWM
Right:右电机PWM
*/
void Moto_speed_set(int Left,int Right)
{
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Right);
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, Left); 
}

/*
函数功能:循迹
*/
void Find(void)
{
  //全是白线前进
  if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
  {
    Moto_speed_set(800,800);
    car_move(0);    
  }
  //右边有黑线小车向左即左轮加速右轮减速
  else if((IO1_read()==0)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
  {
    Moto_speed_set(800,0);
    car_move(0);    
  }
  //右边有黑线小车向左即左轮加速右轮减速
  else if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
  {
    Moto_speed_set(800,0);
    car_move(0);    
  }
  //右边有黑线小车向左即左轮加速右轮减速
  else if((IO1_read()==1)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
  {
    Moto_speed_set(800,0);
    car_move(0);    
  }
  
  
  //左边有黑线小车向右即右轮加速左轮减速
  else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==0))
  {
    Moto_speed_set(0,800);
    car_move(0);    
  }
  //左边有黑线小车向右即右轮加速左轮减速
  else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==1))
  {
    Moto_speed_set(0,800);
    car_move(0);    
  }
  //左边有黑线小车向右即右轮加速左轮减速
  else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==1))
  {
    Moto_speed_set(0,800);
    car_move(0);    
  }
  
  //全是黑线停车
  if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==1)&&(IO4_read()==1))
  {
    Moto_speed_set(0,0);
    car_move(2);
  }
}

find.h

#ifndef _FIND_H_
#define _FIND_H_

#include "main.h"

#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int

//红外循迹IO口定义
//传感器从右到左  IO1 IO2 IO3 IO4
#define IO1_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)
#define IO2_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)
#define IO3_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)
#define IO4_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7)


void Find(void);
void Moto_speed_set(int Left,int Right);


#endif

总结

循迹代码已经贴出希望大家可以好好理解一下循迹算法的编写。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。