stm32循迹小车详细制作过程(附加完全版代码)「建议收藏」

stm32循迹小车详细制作过程(附加完全版代码)「建议收藏」stm32循迹小车详细制作过程一.材料准备1、主控板Stm32f103c8t6(推荐,便宜够用)2、下载器USB转TTL串口模块3、电源12v锂电池组、配套充电器(推荐下图这种,方便,好接线,12v!12v!12v!)4、电机驱动模块L298n电机驱动模块(尽量多备一两个,容易烧)5、循迹模块TCRT5000循迹模块(多买几个,四个吧)6、杜邦线公对公、母对母、公对母(都买上,不贵,消耗品)7、开关避免出现意外还是备一个吧8、小车底座有四个轮的,三个轮的(

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

stm32循迹小车详细制作过程

一.材料准备

1、主控板
Stm32f103c8t6 (推荐,便宜够用)

在这里插入图片描述

2、下载器
USB转TTL串口模块
在这里插入图片描述

3、电源
12v锂电池组、配套充电器(推荐下图这种,方便,好接线,12v!12v! 12v!)
在这里插入图片描述

4、电机驱动模块
L298n电机驱动模块(尽量多备一两个,容易烧)
在这里插入图片描述

5、循迹模块
TCRT5000循迹模块(多买几个,四个吧)
在这里插入图片描述

6、杜邦线
公对公、母对母、公对母(都买上,不贵,消耗品)

在这里插入图片描述

7、开关
避免出现意外还是备一个吧
在这里插入图片描述

8、小车底座
有四个轮的,三个轮的(其中一个是万向轮)。
三个轮:好接线,可以转直角弯。
四个轮:稳定,也可以转直角弯,但相对来说比三个轮难转。
在这里插入图片描述

9、蜂鸣器模块
在这里插入图片描述

二.各器件详细解释

1.L298N介绍
如图,中间的三个接线端从左到右分别为VCC、GND、+5,其中VCC为12V供电,GND为供电地,+5为5V供电;左右两边的接线端分别为输出A和输出B;排针部分引脚分别为ENA、IN1、IN2、IN3、IN4、ENB,其中IN1~4为逻辑输入,ENA和ENB为PWM使能,已经默认被接到5V,若要使用PWM调速
可取下跳帽使用。
在这里插入图片描述
2.stm32c8t6
(1) STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。
在这里插入图片描述
(2)程序下载方法
stm32f103c8t6的TX引脚为PA9 RX引脚为PA10。

串口下载的引脚

在这里插入图片描述

stm32f103c8t6的引脚

在这里插入图片描述

接法的说明

STM32 cp2102
3.3V 3.3V
PA9(TXD引脚) RXD引脚
PA9(RXD引脚) TXD引脚
GND GND

下载程序:

打开flymcu,设置如下
下载前将 boot0 = 1

在这里插入图片描述

然后就可以下载成功了
注意:下载程序完毕后,把boot0跳线帽复位即boot0 = 0
3.循迹模块
循迹原理非常简单,模块上配有一个输出指示灯,部分模块还有电源指示灯,我们主要关注输出指示灯。红外发射器一直发射红外线,红外线经发射后被接收,此时输出低电平,输出指示灯点亮。黑色是不反射红外线的,也就是说循迹模块遇到黑线,模块输出高电平,输出指示灯熄灭。当然除了遇到黑线熄灭,当距离太远红外线反射后检测不到,此时指示灯也会熄灭。那么如果要循迹,模块离地面要近,在没有遇到黑线时确保指示灯长亮,一旦指示灯熄灭就说明遇到黑线了。
在这里插入图片描述
如上图中4个管脚的,分别是VCC、GND、A0、D0。A0是模拟信号输出,D0是TTL电平输出。使用TCRT5000主要就是用来循迹,只需要连接VCC、GND、D0就可以了。

三.代码详细介绍

首先是主函数(main.c):


#include "stm32f10x.h"
#include "motor.h"
#include "delay.h"

 



 void Delay(u32 count)
 { 
   
   u32 i=0;
   for(;i<count;i++);
 }
 int main(void)
 { 
   	

 motor_gpio();
 xunji_gpio();
 pwm();             
	 delay_init();
	 if(GO==  0)
	 { 
   
  while(1)
	{ 
   

//¼ì²âµ½ºÚÏßΪ1 ¼ì²â²»µ½ºÚÏßΪ0
      if(LEFT_ONE==0&&LEFT_TWO==0&&RIGHT_ONE==0&&RIGHT_TWO==0)
			{ 
   
					 run();
			}
					else if(LEFT_ONE==0&&LEFT_TWO==1&&RIGHT_ONE==0&&RIGHT_TWO==0)
			{ 
   
			
			  left();
			}
						else if(LEFT_ONE==0&&LEFT_TWO==0&&RIGHT_ONE==0&&RIGHT_TWO==1)
			{ 
   
			
			 right();
			}
			else if(LEFT_ONE==1&&LEFT_TWO==1&&RIGHT_ONE==1&&RIGHT_TWO==1)
			{ 
   
			 
			  turn();
				delay_ms(200);
				stop();
				delay_ms(5000);	
			}

				
				
				
			
			
	}
}
 }

其次是pwm,循迹,及电机的初始化:
.h 文件


#ifndef __motor_H
#define __motor_H 			   
#include "sys.h"  

#define      IN1         PAout(6)
#define      IN2         PAout(5)
#define      IN3         PAout(4)
#define      IN4         PAout(3)


#define      LEFT_ONE      PBin(4)  
#define      LEFT_TWO      PBin(6) 
#define      RIGHT_ONE      PBin(7) 
#define      RIGHT_TWO      PBin(8) 
#define      GO        PBin(5) 
void run(void);
void left(void);
void right(void);
void back(void);
void qleft(void);
void qight(void);
void stop(void);
void turn(void);
void motor_gpio(void);
void xunji_gpio(void);
void pwm(void);
#endif



.c文件


#include "motor.h"  
#include "stm32f10x.h"

void motor_gpio()
{ 
   

  GPIO_InitTypeDef  GPIO_InitStructure;
	 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_4|GPIO_Pin_3;		
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 
  GPIO_Init(GPIOA, &GPIO_InitStructure);			     

}

void xunji_gpio()
{ 
   

  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_5;		
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);		

}
void pwm()
{ 
   
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE); 
	  
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;		
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);	

	
	TIM_TimeBaseStructure.TIM_Period = 899; 
	TIM_TimeBaseStructure.TIM_Prescaler =0; 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 

	
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);  
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);  
	

	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); 
	TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable); 

	
	TIM_Cmd(TIM2, ENABLE);
}
void run()
{ 
   

		TIM_SetCompare2(TIM2,380);
   	TIM_SetCompare3(TIM2,380);
   IN1 = 1;
	 IN2 = 0;
	
	 IN3 = 1;
	 IN4 = 0;
}
void back()
{ 
   
	TIM_SetCompare2(TIM2,300);
	TIM_SetCompare3(TIM2,300);
	
   IN1 = 0;
	 IN2 = 1;
	
	 IN3 = 0;
	 IN4 = 1;
}
void right()
{ 
   
	TIM_SetCompare2(TIM2,400);
	TIM_SetCompare3(TIM2,400);
	
   IN1 = 1;
	 IN2 = 0;
	
	 IN3 = 0;
	 IN4 = 0;
}
void left()
{ 
   
	TIM_SetCompare2(TIM2,400);
	TIM_SetCompare3(TIM2,400);
	
   IN1 = 0;
	 IN2 = 0;
	
	 IN3 = 1;
	 IN4 = 0;
}
void turn()
{ 
   
	TIM_SetCompare2(TIM2,250);
	TIM_SetCompare3(TIM2,250);
	
   IN1 = 0;
	 IN2 = 1;
	
	 IN3 = 1;
	 IN4 = 0;
}
void stop()
{ 
   

   IN1 = 0;
	 IN2 = 0;
	
	 IN3 = 0;
	 IN4 = 0;
}

四.效果展示

请添加图片描述
请添加图片描述
请添加图片描述

stm32循迹小车系列文章:
1.stm32循迹小车详细制作过程(附加完全版代码)
2.L298n电机驱动详细介绍(stm32循迹小车中L298n的用法)
3.超声波模块详细介绍(stm32循迹小车中超声波的介绍)

寻迹程序在群资料,有问题可以直接在群里问,互相交流学习。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191340.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • js电子邮箱正则表达式「建议收藏」

    js电子邮箱正则表达式「建议收藏」邮箱正则:/^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/

    2022年9月25日
    0
  • EtherCAt总线运动控制_运动控制器ethercat

    EtherCAt总线运动控制_运动控制器ethercat运动控制器作为数控系统的核心部件,在高端机器人、数控机床、工业自动化等领域得到了广泛的应用。本文以实际工程应用为背景,以研制高效、高可靠性、功能丰富的运动控制器为目标,对运动控制器及运动控制算法进行了研究与分析,对于实现高速、高效、高精度的运动控制具有重要的理论意义和实际应用价值。基于ARM+FPGA的硬件架构,提出了硬件设计的总体方案。设计了运动控制器的硬件电路及主控制板和扩展板,搭建了三维运动控制平台。提出了运动控制器软件设计的总体方案,基于MODBUS协议,设计了串口通

    2022年10月14日
    0
  • 贪婪算法(贪心算法)「建议收藏」

    贪婪算法(贪心算法)「建议收藏」贪心算法简介:@anthor:QYX贪心算法是指:在每一步求解的步骤中,它要求“贪婪”的选择最佳操作,并希望通过一系列的最优选择,能够产生一个问题的(全局的)最优解。贪心算法每一步必须满足一下条

    2022年7月3日
    23
  • 使用断点调试代码「建议收藏」

    使用断点调试代码「建议收藏」简单地说,断点调试是指自己在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后你可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下。在web开发中,打断点是经常使用的调试代码的方法,现在在这里简略的翻译一下官方对此功能的讲解,并插入一些自己的说明。文章翻译自:https://developers.google.com……

    2022年5月11日
    36
  • Java自学视频整理(持续更新中…)

    Java自学视频整理(持续更新中…)1.Java基础视频 《张孝祥JAVA视频教程》完整版[RMVB](东西网)历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播客)张孝祥2010年贺岁视频:Java高新技术(传智播客)Java多线程与并发库高级应用(传智播客)尚学堂JAVA视频下载大全(持续更新中…请关注!)(尚学堂)《动力节点,王勇JAVA系列视频教程》(东西网)张孝祥Java高新技术

    2022年7月8日
    21
  • webstorm2021.11.2激活码【2021最新】

    (webstorm2021.11.2激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html9K2BT69C4S-eyJsa…

    2022年3月28日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号