【 STM32实例 】 智能小车的红外循迹

news2024/11/19 13:25:41

文章目录

  • 前言
  • 一、硬件选择与连接
    • 1. STM32F103C8T6最小系统板
    • 2. L298N双路电机驱动
    • 3. 红外循迹模块
  • 二、环境配置
    • 1. Device
    • 2. Output
    • 3. C/C++
    • 4. Debug
  • 三、项目管理与代码实现
    • 1. 项目结构
    • 2. 工程管理
    • 3. 具体文件
      • xunji.c
      • xunji.h
      • main.c
  • 总结
  • 项目源码


前言

这篇文章我主要讲的是让基于stm32单片机下的智能小车实现红外循迹功能,智能小车的项目非常多,比如说循迹避障、蓝牙遥控、视觉控制等等,我将会一步一步带大家走进stm32单片机的项目当中。


项目源码置文章底部,可自提

一、硬件选择与连接

在硬件部分,与前几节我所介绍的51智能小车大致一样,所不同的是把51最小系统板换成了stm32最小系统板,其他驱动、红外循迹模块都一样,具体可前往【51单片机实例】智能小车(一)了解详情。

下面我还是会对相关重要模块进行简单介绍:

1. STM32F103C8T6最小系统板

在这里插入图片描述
在这里插入图片描述
配套资源:

  1. STM32F103C8主芯片一片
  2. 贴片8M晶振(通过芯片内部PLL最高达72M)ST官方标准参数
  3. 3.3V稳压芯片,最大提供800mA电流
  4. 一路miniUSB接口,可以给系统版供电,预留USB通讯功能
  5. 复位按键
  6. 标准SWD口一个,支持JLink,STLink,JLINK OB
  7. BOOT选择端口
  8. IO扩展排针 20pin x 2
  9. 电源指示灯1个
  10. 功能指示灯一个,用于验证IO口基本功能
  11. 预留串口接口,方便和5V开发板连接,用串口即可程序
  12. 高性能爱普生32768Hz晶振,价格是直插晶振的10倍价格,易起振
  13. 20K RAM,64K ROM ,TQFP48封装

2. L298N双路电机驱动

L298N,是一款接受高电压的电机驱动器,直流电机和步进电机都可以驱动。一片驱动芯片可同时控制两个直流减速电机做不同动作,在6V到46V的电压范围内,提供2安培的电流,并且具有过热自断和反馈检测功能,可对电机进行直接控制,通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动,操作简单、稳定性好,可以满足直流电机的大电流驱动条件。
在这里插入图片描述

3. 红外循迹模块

在这里插入图片描述

TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。

接口说明:
(1) VCC 外接3.3V-5V电压(可以直接与5v单片机和3.3v单片机相连)
(2) GND 外接GND
(3) OUT 小板数字量输出接口(0和1)

二、环境配置

1. Device

我们选用的是STM32F103C8T6最小系统板,所以Device应选择STM32F103C8
在这里插入图片描述

2. Output

Output中应创建HEX可执行文件
在这里插入图片描述

3. C/C++

C/C++中应定义宏和包含文件路径
在这里插入图片描述
在这里插入图片描述

4. Debug

若选用 ST-link 或 J-link 还是其他下载器or串口,都需要事先安装相应的驱动和配置相关环境,这里我以ST-link为例配置相关环境
在这里插入图片描述
在这里插入图片描述

三、项目管理与代码实现

1. 项目结构

在这里插入图片描述

2. 工程管理

应在相应的工程文件下面添加上对应的.c文件
在这里插入图片描述

3. 具体文件

以下我主要说明几个比较重要的文件

在这里插入图片描述

xunji.c

#include "xunji.h"  
#include "stm32f10x.h"

void motor_gpio()
{

  GPIO_InitTypeDef  GPIO_InitStructure;
	 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11; 		
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	  //推挽输出 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 
  GPIO_Init(GPIOB, &GPIO_InitStructure);			     

}

void xunji_gpio()
{

  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_7;		
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);		

}
void pwm()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_8; 		
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用输出 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 
    GPIO_Init(GPIOB, &GPIO_InitStructure);	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);	  //使能定时器4时钟 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   //使能GPIOB时钟
	  
	TIM_TimeBaseStructure.TIM_Period =99;    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =71;     //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;   //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //TIM向上计数模式 
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);    
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  //选择定时器模式:TIM脉冲宽度调制模式1
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //输出极性:TIM输出比较极性高
 	TIM_OCInitStructure.TIM_Pulse=0;
	
	TIM_OC1Init(TIM4, &TIM_OCInitStructure);  
	TIM_OC3Init(TIM4, &TIM_OCInitStructure);  
	

	TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);   //使能TIM4在CCR1上的预装载寄存器
	TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);   //使能TIM4在CCR3上的预装载寄存器

	
	TIM_Cmd(TIM4, ENABLE);   //使能TIM4
}
void run()
{

		TIM_SetCompare1(TIM4,30);
   		TIM_SetCompare3(TIM4,30);
		IN1 = 1;
		IN2 = 0;
		
		IN3 = 1;
		IN4 = 0;
}
void back()
{
		TIM_SetCompare1(TIM4,70);
		TIM_SetCompare3(TIM4,70);
	
		IN1 = 0;
		IN2 = 1;
		
 
		IN3 = 0;
		IN4 = 1;
}
void right()
{
		TIM_SetCompare1(TIM4,0);
		TIM_SetCompare3(TIM4,30);
	
		IN1 = 1;
		IN2 = 0;
	
		IN3 = 0;
		IN4 = 0;
}
void left()
{
		TIM_SetCompare1(TIM4,30);
		TIM_SetCompare3(TIM4,0);
		
		IN1 = 0;
		IN2 = 0;
		
		IN3 = 1;
		IN4 = 0;
}

void stop()
{

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

xunji.h


#ifndef __xunji_H
#define __xunji_H 	

#include "sys.h"  

#define      IN1         PBout(0)
#define      IN2         PBout(1)

#define      IN3         PBout(10)
#define      IN4         PBout(11)


#define      LEFT_ONE      PAin(3)  
#define      LEFT_TWO      PAin(7) 
 
void run(void);
void left(void);
void right(void);
void back(void);;
void stop(void);
void motor_gpio(void);
void xunji_gpio(void);
void pwm(void);
#endif

main.c

#include "stm32f10x.h"
#include "xunji.h"
#include "delay.h"

 void Init()
{
	TIM_SetCompare1(TIM4,25);
	TIM_SetCompare3(TIM4,25);
	IN1=1;
	IN2=0;
	IN3=1;
	IN4=0;
}
 
 int main(void)
 {	

		motor_gpio();
		xunji_gpio();
		pwm();             
		delay_init();
	  	Init();
			while(1)
			{

					if(LEFT_ONE==0&&LEFT_TWO==0)
					{
							 run();
					}
					
					else if(LEFT_ONE==0&&LEFT_TWO==1)
					{
					
							right();
					}
					
					else if(LEFT_ONE==1&&LEFT_TWO==0)
					{
					
							left();
					}
					
		      else if(LEFT_ONE==1&&LEFT_TWO==1)
					{
							run();
					}
					else
						stop();
			 }
}

总结

本节是以STM32F103C8T6最小系统为CPU,通过一些外围电路和软件编程实现小车红外循迹的功能。整个设计过程中最大的特点是利用简单的理论原理将红外循迹模块、L298N驱动模块、51单片机这三个模块有效的结合起来,利用红外循迹原理与pwm调节占空比的简单结合实现对小车红外循迹奠定编程理论基础,提高了效率,降低了编程的复杂度,具有很强的研究的意义,智能化的发展促使了智能小车往功能更加强大的方向发展。

项目源码

链接:https://pan.baidu.com/s/1_-j6TJepvMkMjUdHvDWS6w 
提取码:s0hj

一键三连啦😊
技术交流可加下方wx联系👇👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/603825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python加颜色代码-提高代码可读性和吸引力的简单技巧

Python加颜色代码 - 提高代码可读性和吸引力的简单技巧 在编写Python代码时,您可能已经注意到,有时候需要强调某些部分,以使其更易于阅读和理解。这时候,您可以使用加颜色代码来增强代码的可读性和吸引力。在本文中,我…

Opencv项目实战:基于dlib的人脸关键点检测

文章目录 一、项目简介二、环境配置2.1、dlib人脸检测器:dlib.get_frontal_face_detector()2.2、dlib关键点定位工具:shape_predictor_68_face_landmarks.dat 三、项目实战 一、项目简介 该项目基于dlib模块提供的人脸检测器以及关键点定位工具完成。首…

大数据:hive数据库的操作语法,数据表,内部表,external外部表,数据导入导出load,insert

大数据: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要学&#x…

chatgpt赋能python:关于Python中打开文件的语句详解

关于Python中打开文件的语句详解 在Python中,打开文件是一项常见的任务,可以用于读写文件和进行日志记录。本文将介绍Python中打开文件的语句,并提供一些实用技巧,以便方便地管理文件。 为什么需要打开文件? 在计算…

【动态规划】通配符匹配与正则表达式匹配

文章目录 一、通配符匹配1.1 思路分析1.2 初始化处理1.3 代码1.4 优化 二、正则表达式匹配2.1 思路分析2.2 初始化设置2.3 代码 一、通配符匹配 题目描述: 给你一个输入字符串 (s) 和一个字符模式 ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符…

如何在Github上免费部署网站

如何在Github上免费部署静态网站 背景一、新建仓库(github账号的需要注册)二、下载仓库三、将内容上传到远程仓库里四、启动Page服务 背景 部署网站需要服务器,但是如果你只是部署静态网站就可以蹭Github上的免费服务器。因为发现现在的过程…

基于springboot+Redis的前后端分离项目(一)-【黑马点评】

🎁🎁资源文件分享 链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码:eh11 基于session和redis实现登录 (一)前言(二)导入资源(三)短信…

Spring数据库事务处理

数据库事务的基本知识 ACID 两类丢失更新 事务回滚丢失更新: 目前大部分数据库已经通过锁的机制来避免了事务回滚丢失更新。 数据库锁的机制: 锁可以分为乐观锁和悲观锁,而悲观锁又分为:读锁(共享锁)和写锁(排它锁),…

chatgpt赋能python:使用Python制作动画的步骤和工具

使用Python制作动画的步骤和工具 Python不仅是一种流行的编程语言,还可以用于制作动画。本文将介绍一些基本步骤和工具,帮助你制作出精美的动画作品。 步骤一:选择一个好的动画框架 Python有很多强大的动画框架可以使用。其中一些最受欢迎…

chatgpt赋能python:Python删除目录下文件:介绍和方法

Python删除目录下文件:介绍和方法 在日常的开发和运维工作中,我们可能会需要删除某个目录下的一些文件。使用Python的好处在于其强大的处理能力和简单易用的语法。本文将介绍Python删除目录下文件的方法,并提供一些实用的代码示例。 使用os…

java-数组和方法

java-数组和方法 一、数组 1.1 概念 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。 1.2 定义格式 第一种 数据类型 [] 数组名 例: int[] arr; double[] arr; char[] arr;第二种 数据类型 数组名[] 例: int arr[]; doubl…

交流有功功率、无功功率、视在功率计算

交流有功功率、无功功率、视在功率计算 1、有功功率2、无功功率3、视在功率4、功率因数5、总结 1、有功功率 有功功率:在交流电路中,每个瞬时的有功功率是不同的,且不断变化,一般用平均有功功率(一个周期内功率的平均…

黑盒测试用例设计练习题

1、准考证号码 对招干考试系统“输入学生成绩”子模块设计测试用例。招干考试分三个专业,准考证号第一位为专业代号,如: 1-行政专业, 2-法律专业, 3-财经专业。 行政专业准考证号码为:110001~111215 法律专…

chatgpt赋能python:Python数据清洗:如何剔除异常值

Python 数据清洗:如何剔除异常值 随着数据量的持续增长,数据清洗已经成为了数据分析中不可或缺的一个步骤。数据清洗的目的是去除错误、缺失或不必要的数据,从而使数据更加准确、可靠、一致和完整。本文将讲解如何使用 Python 编程语言来剔除…

【C++ 程序设计】第 2 章:面向对象的基本概念

目录 一、结构化程序设计 二、面向对象程序设计的概念和特点 (1)面向对象程序设计的概念 (2)面向对象程序设计的特点 三、类的初步知识 (1)类的定义 (2)类的定义示例 四、类…

Three.js--》实现3d踢球模型展示

目录 项目搭建 初始化three.js基础代码 设置环境纹理加载模型 使用Cannon-es实现物理世界 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本…

Linux4.6LNMP架构

文章目录 计算机系统5G云计算第五章 LINUX LNMP架构一、安装 Nginx 服务1.关闭防火墙,将安装nginx所需软件包传到/opt目录下2.安装依赖包3.创建运行用户、组4.编译安装Nginx5.添加 Nginx 系统服务6.修改nginx服务配置文件 三、编译安装mysqld 服务1.将安装mysql 所需…

MySQL—存储引擎(下)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易&…

Windows部署WSL开启pwn之旅

不用虚拟机来操作真的太爽了!!还有和vscode的联动,更是妙绝! 目录 前言 一、WSL获取 开启WSL支持 二、各种操作 1.apt 换源 2.更新软件 3.配置SSH服务器(对于pwn来说非必要) 4.WSL访问windows文件 …

【ChatGPT 】国内无需注册 openai 即可访问 ChatGPT:WeTab 浏览器扩展程序的安装与使用

目录 一、Sider:每天免费 30 查询额度【暂不推荐】 (1)Edge 浏览器扩展程序:Sider - ChatGPT【暂不推荐】 (2)iOS 手机 APP:Sider- Al 搭档(有需要可以安装) 二、 We…