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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Spring+MyBatis实例详解「建议收藏」

    Spring+MyBatis实例详解「建议收藏」1.项目结构:                2.项目的Maven依赖:&lt;properties&gt; &lt;spring-version&gt;4.3.21.RELEASE&lt;/spring-version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;dependen…

    2022年6月24日
    21
  • ubuntu 怎么更改用户名和密码_ubuntu更改用户名密码

    ubuntu 怎么更改用户名和密码_ubuntu更改用户名密码参考文章:Ubuntu修改密码和用户名更改密码:sudopasswd[用户名]

    2022年9月29日
    3
  • 程序人生-感受湖光景色随笔

    开头聊几句1、首先在说明下,我不是大佬,我是渣飞,这个“渣”是技术方面,不要想多,虽然我现在渣,但是我希望不断努力朝大佬的方向靠近2、今天是周四,我司的周四特定上线日,每月总有那么几天,在公司待待很晚。公司楼下有个湖,最近几次上线,有空都会去下面走走3、从公司上线完后,趁着验证功能的时间,写下此篇4、今天闲踱湖边,想写点东西,记录下,写完估计验证也完了,就回家了5、本文非技术文章,是一篇记录自己生活的随笔,我定义自己的程序人生。喜欢看技术文的伙伴可以忽略开头之前文章说过,这是我的一个小

    2022年3月1日
    35
  • c#程序中的AssemblyInfo.cs

    c#程序中的AssemblyInfo.cs在asp.net中有一个配置文件AssemblyInfo.cs主要用来设定生成的有关程序集的常规信息dll文件的一些参数,下面是默认的AssemblyInfo.cs文件的内容具体介绍//是否符合公共语言规范(CLS)[assembly:CLSCompliant(true)]//控制程序集中所有类型对COM的可访问性[assembly:ComVisible(false)]//代码的作者和这…

    2022年7月13日
    17
  • 我自己电脑上安装IDEA解决使用中变大

    我自己电脑上安装IDEA解决使用中变大

    2021年7月11日
    119
  • c#时间转时间戳_数据库时间戳转换日期格式

    c#时间转时间戳_数据库时间戳转换日期格式原文地址:http://www.cnblogs.com/codemo/archive/2012/05/18/2507251.html//////时间戳转为C#格式时间/////////privateDateTimeGetTime(stringtimeStamp){

    2022年10月2日
    2

发表回复

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

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