基于STM32的智能循迹小车设计(基础版)

本文介绍了一款基于STM32F103C8T6的智能循迹小车设计方案,涵盖硬件选型如小车底盘、电机、电池、循迹模块、电机驱动等,以及软件设计细节,包括电机调速的PWM控制、循迹模块检测和主函数逻辑实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于STM32的智能循迹小车设计(基础版)

硬件准备

1、小车底盘+四直流电机(带轮)

在这里插入图片描述

2、STM32F103C8T6核心板

在这里插入图片描述

3、12V 8700mAh锂电池(可以用几节18650锂电池)

在这里插入图片描述

4、循迹模块

选择的是TCRT500L,五路集成在一起,集成度比较高,但是可能不如五个单独的循迹模块好用
在这里插入图片描述
5、L298N电机驱动模块
四驱车为啥用L298N电机驱动模块?
可以把左边的两个电机并联,用输出A控制。把右边的两个电机并联,用输出B控制。
在这里插入图片描述
12V供电接电源正极,供电GND接电源负极和核心板GND,5V供电接核心板5V和循迹模块5V,然后循迹模块GND接核心板GND,所有设备就都可以上电了。(最好设置几个开关,安全且方便调试)
另外,接线最好先试触,避免短路。

6、杜邦线、开关若干

软件设计

1、电机调速

通过输出PWM控制电机转速

PWM初始化(以A1为例)

void TIM2_CH2_PWM_Init(void)
{
	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_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
 //A1 GPIO初始化
	TIM_TimeBaseStructure.TIM_Period = 199; 
	TIM_TimeBaseStructure.TIM_Prescaler =7199; 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 
	// 定时器初始化
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);  
	//定时器通道初始化
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); 
 	//预装值初始化
	TIM_Cmd(TIM2, ENABLE);  	
	//打开定时器
}

初始化完后,输出PWM控制电机转速,注意,TIM_SetCompare2(TIM2,n);n越小占空比越大,点假转速越快,一下代码就是A1输出PWM占空比更大,它所对应的电机转速就越快。 具体的数据是多少,需要自己根据不同的场地去摸索,不停地调试。

void left()
{
		TIM_SetCompare2(TIM2,20); 
		TIM_SetCompare3(TIM2,120);
}

2、循迹模块检测

GPIOB初始化,同时将B4 B5 B6 B7 B8设置为上拉输入

void GPIOB_Init()	
{
  GPIO_InitTypeDef GPIO_InitStructure;	
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); 
	
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5  | GPIO_Pin_6 | GPIO_Pin_7| GPIO_Pin_8;	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure); 
}

宏定义,少打字,B4 B5 B6 B7 B8 分别对应L1 L2 M R2 R1

#define L1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)
#define L2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)
#define M GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)
#define R2 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
#define R1 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8) // L1 L2 M R2 R1 

读取函数

void Read_Date(void)
{
 	L1;
	L2;
	M;
	R2;
	R1;
}

3、主函数(用读取的循迹数据控制电机)

用了一个比较笨的但是很直接的方法,将所有的情况都罗列出来。
思路:如果L1检测到,那必须bigright;如果R1检测到,那必须bigleft;
那中间的那三位,还有8种,将这8种枚举就可。

int main()
{
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
	USART1_Init(9600);
	GPIOB_Init();
	TIM2_CH2_PWM_Init();
	TIM2_CH3_PWM_Init();
	while(1)
	{	
		Read_Date();
	 if(L1==0&&L2==0&&M==0&&R2==0&&R1==0)
	  {
	  go();		
	  delay_ms(10);
	  }
		
	 if(L1==0&&L2==1&&M==1&&R2==1&&R1==0)
	  {
	 go();      
	  delay_ms(10);
	  }	  
		if(L1==0&&L2==0&&M==1&&R2==0&&R1==0)
	  {
	 go();      
	  delay_ms(10);
	  }	  
	 if(L1==0&&L2==1&&M==0&&R2==0&&R1==0)
	  {
	 right();   
	  delay_ms(10);
	  }
 	 if(L1==0&&L2==0&&M==0&&R2==1&&R1==0)
	  {
	 left();   
	  delay_ms(10); 
	  }
		if(L1==0&&L2==1&&M==1&&R2==0&&R1==0)
	  {
	  right();   
	  delay_ms(10); 
	  }
		if(L1==0&&L2==1&&M==0&&R2==1&&R1==0)
	  {
	  go();   
	  delay_ms(10); 
	  }
		if(L1==0&&L2==0&&M==1&&R2==1&&R1==0)
	  {
	  left();   
	  delay_ms(10); 
	  }
	  if(R1==1)
	  {
	  bigleft();   
	  delay_ms(10);
	  }
	  if(L1==1)
	  {
	  bigright();
	  delay_ms(10); 
	  }
  }	
}


工程文件现已上传到资源,2积分即可下载。

### STM32智能小车毕业设计方案 #### 1. 系统概述 STM32智能小车设计旨在创建一个能够自主导航并执行特定任务的小型机器人平台。该系统通常由主控制器、传感器模块、驱动电机和其他辅助设备组成。主控制器采用高性能的STM32系列微控制器,负责处理来自各个子系统的数据,并作出相应的决策。 #### 2. 主要功能描述 - **运动控制**:通过编码器反馈实现精确的速度调节;支持多种移动模式如直行、转弯等。 - **环境感知**:利用超声波测距仪检测前方障碍物距离;红外线循迹传感器用于路径跟踪。 - **无线通讯**:集成蓝牙模块以便于外部设备连接,允许用户发送命令给小车完成指定操作[^4]。 #### 3. 软件架构说明 整个项目的编程工作可以在Arduino IDE 或者更专业的STM32CubeIDE环境下完成。程序结构遵循面向对象的思想进行构建,分为多个独立的功能单元(类),这样不仅提高了代码可读性和重用率,也为后期调试带来了极大便利[^1]。 ```cpp // 定义全局变量和常量 #define LEFT_MOTOR_PIN 9 // 左侧马达PWM信号引脚定义 #define RIGHT_MOTOR_PIN 10 // 右侧马达PWM信号引脚定义 int speed = 50; // 默认速度设置为50% void setup() { Serial.begin(9600); // 初始化串口通信波特率为9600bps pinMode(LEFT_MOTOR_PIN, OUTPUT); pinMode(RIGHT_MOTOR_PIN, OUTPUT); } void loop(){ if (Serial.available()>0){ char command=Serial.read(); // 接收来自手机APP或其他上位机发出的操作指令 switch(command){ // 根据接收到的不同字符来判断应该采取何种行动 case 'f': // 前进 analogWrite(LEFT_MOTOR_PIN,speed); analogWrite(RIGHT_MOTOR_PIN,speed); break; case 'b': // 后退 analogWrite(LEFT_MOTOR_PIN,-speed); analogWrite(RIGHT_MOTOR_PIN,-speed); break; case 'l': // 左转 analogWrite(LEFT_MOTOR_PIN,0); analogWrite(RIGHT_MOTOR_PIN,speed); delay(500); break; case 'r': // 右转 analogWrite(LEFT_MOTOR_PIN,speed); analogWrite(RIGHT_MOTOR_PIN,0); delay(500); break; default : // 停止 analogWrite(LEFT_MOTOR_PIN,0); analogWrite(RIGHT_MOTOR_PIN,0); break; } } } ``` 上述代码片段展示了如何接收来自蓝牙模块的数据并通过解析这些信息来改变小车的动作状态。这里仅作为基础示例,在实际应用中还需要加入更多复杂的算法以提高性能表现。 #### 4. 关键技术难点分析 对于初学者来说,可能遇到的最大挑战是如何合理安排各部分之间的协作关系以及优化整体效率。特别是在多任务并发处理方面,比如当同时存在避障需求与接受新指令时该如何优先级排序等问题都需要深入研究解决办法[^3]。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值