你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32智能小车循迹教程

[复制链接]
STMCU小助手 发布时间:2022-5-20 17:35
前言
本篇文章将带大家学习STM32智能小车的循迹功能。

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

电路工作描述
以其中一路为例

Y~1C~U16KT%H)ZR[X6860%4.png

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

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

JENFP47~AD0CJ$~9VJZPF8L.png

二、cubeMX配置
将红外循迹的4个IO口都设置为上拉输入模式即可。

HDT[}~~VQ}G7{3TORDDXTQD.png

三、代码解析

find.c

  1. #include "find.h"
  2. #include "Moto.h"

  3. extern TIM_HandleTypeDef htim3;

  4. /*
  5. 函数功能:调节小车左右电机PWM
  6. Left:左电机PWM
  7. Right:右电机PWM
  8. */
  9. void Moto_speed_set(int Left,int Right)
  10. {
  11.   __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Right);
  12.   __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, Left);
  13. }

  14. /*
  15. 函数功能:循迹
  16. */
  17. void Find(void)
  18. {
  19.   //全是白线前进
  20.   if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
  21.   {
  22.     Moto_speed_set(800,800);
  23.     car_move(0);   
  24.   }
  25.   //右边有黑线小车向左即左轮加速右轮减速
  26.   else if((IO1_read()==0)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
  27.   {
  28.     Moto_speed_set(800,0);
  29.     car_move(0);   
  30.   }
  31.   //右边有黑线小车向左即左轮加速右轮减速
  32.   else if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
  33.   {
  34.     Moto_speed_set(800,0);
  35.     car_move(0);   
  36.   }
  37.   //右边有黑线小车向左即左轮加速右轮减速
  38.   else if((IO1_read()==1)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
  39.   {
  40.     Moto_speed_set(800,0);
  41.     car_move(0);   
  42.   }


  43.   //左边有黑线小车向右即右轮加速左轮减速
  44.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==0))
  45.   {
  46.     Moto_speed_set(0,800);
  47.     car_move(0);   
  48.   }
  49.   //左边有黑线小车向右即右轮加速左轮减速
  50.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==1))
  51.   {
  52.     Moto_speed_set(0,800);
  53.     car_move(0);   
  54.   }
  55.   //左边有黑线小车向右即右轮加速左轮减速
  56.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==1))
  57.   {
  58.     Moto_speed_set(0,800);
  59.     car_move(0);   
  60.   }

  61.   //全是黑线停车
  62.   if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==1)&&(IO4_read()==1))
  63.   {
  64.     Moto_speed_set(0,0);
  65.     car_move(2);
  66.   }
  67. }
复制代码

find.h

  1. #ifndef _FIND_H_
  2. #define _FIND_H_

  3. #include "main.h"

  4. #define u8 unsigned char
  5. #define u16 unsigned short
  6. #define u32 unsigned int

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


  13. void Find(void);
  14. void Moto_speed_set(int Left,int Right);


  15. #endif
复制代码

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


收藏 评论0 发布时间:2022-5-20 17:35

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版