前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >stm32循迹小车详细制作过程(附加完全版代码)「建议收藏」

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

作者头像
全栈程序员站长
发布2022-11-08 10:08:02
6.6K2
发布2022-11-08 10:08:02
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

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):

代码语言:javascript
复制
#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 文件

代码语言:javascript
复制
#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文件

代码语言:javascript
复制
#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;
}

四.效果展示

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月20日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • stm32循迹小车详细制作过程
    • 一.材料准备
      • 二.各器件详细解释
        • 三.代码详细介绍
          • 四.效果展示
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档