STM32基于hal库的智能小车—红外寻迹

该博客介绍了使用STM32F407ZGT6开发板结合L298N电机驱动模块控制四个电机的组装过程及程序设计。通过STM32CUBEMX配置电机和红外寻迹模块的引脚,设置时钟和PWM参数。在main.c中启动PWM并定义电机速度,然后在无限循环中调用寻迹函数。寻迹函数根据三个红外传感器的读数判断车辆行驶方向,实现直行、左转、右转或停止。
该文章已生成可运行项目,

材料:

(1)stm32f407zgt6最小系统开发板

(2)l298n电机驱动模块1个

(3)四个电机

(4)循迹红外模块3个

一、组装

(1)L298N电机驱动模块与stm32开发板接线如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_17,color_FFFFFF,t_70,g_se,x_16

说明:PWM接线把跳线帽扒开接外面引脚 CH1接ENA,CH2接ENB。

(2)寻迹红外接线:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

二、主要程序

1、STM32CUBEMX配置如下:

(1)引脚配置:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

说明:

1)motor11、motor12 、motor21、motor22 为电机驱动引脚

2)  sensor1、sensor2、sensor3 为红外引脚

(2)配置RCC时钟:  watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

(3) 时钟的配置: watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 (4)预分频、分频和占空比配置:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA54K554Gv5Luj5biI,size_20,color_FFFFFF,t_70,g_se,x_16

 三、程序

main.c

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
TIM3->CCR1=TIM3->CCR4=80;//两个电机的速度范围(0-100),越大越快。
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

    Tracking();//寻迹
  }
  /* USER CODE END 3 */

 main.h

#include "Track.h"

电机程序: 

 Motor.c

#include "motor.h"
 
//前进
void car_go_straight(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_SET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_RESET);
	
   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_SET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_RESET);
}
 
//右转
void car_go_right(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_SET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_RESET);
 
   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_SET);
 
}
 
//左转
void car_go_left(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_SET);
 
   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_SET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_RESET); 
 
}
 
 
//停止
void car_go_ahead(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_RESET);
 
   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_RESET);
 
}
 
 
//后退
void car_go_after(void)
{
   HAL_GPIO_WritePin(motor11_GPIO_Port,motor11_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor12_GPIO_Port,motor12_Pin,GPIO_PIN_SET);
 
   HAL_GPIO_WritePin(motor21_GPIO_Port,motor21_Pin,GPIO_PIN_RESET);
   HAL_GPIO_WritePin(motor22_GPIO_Port,motor22_Pin,GPIO_PIN_SET);
 
}

 Motor.h

#ifndef __MOTOR_H_
#define __MOTOR_H_
 
#include "main.h"
 
void car_go_straight(void);
void car_go_right(void);
void car_go_left(void);
void car_go_ahead(void);
void car_go_after(void);
 
#endif

寻迹程序:

Track.c

#include "Track.h"
#include "motor.h"

void Tracking(void)
{
	   ///////////////////////////////////右转
		if ((HAL_GPIO_ReadPin(sensor1_GPIO_Port,sensor1_Pin)==1)&&(HAL_GPIO_ReadPin(sensor2_GPIO_Port,sensor2_Pin)==0)) 
		while(1)//10
		{
			car_go_right();
			if((HAL_GPIO_ReadPin(sensor1_GPIO_Port,sensor1_Pin)==1)&&(HAL_GPIO_ReadPin(sensor2_GPIO_Port,sensor2_Pin)==1)&&(HAL_GPIO_ReadPin(sensor3_GPIO_Port,sensor3_Pin)==0))
			break ;	
		}
		
		//////////////////////////////////左转
		else  if((HAL_GPIO_ReadPin(sensor1_GPIO_Port,sensor1_Pin)==0)&&(HAL_GPIO_ReadPin(sensor2_GPIO_Port,sensor2_Pin)==1)) 
		while(1)//01
		{
			car_go_left();
		 if((HAL_GPIO_ReadPin(sensor1_GPIO_Port,sensor1_Pin)==1)&&(HAL_GPIO_ReadPin(sensor2_GPIO_Port,sensor2_Pin)==1)&&(HAL_GPIO_ReadPin(sensor3_GPIO_Port,sensor3_Pin)==0))
			break ;	
		}
		
		/////////////////////////////////直行
		else
			car_go_straight();
		 	
 }

Track.h

#ifndef __TRACK_H_
#define __TRACK_H_

#include "main.h"

extern void Tracking(void);

#endif

 

 

 

 

 

该文章已生成可运行项目
### STM32智能寻迹小车HAL使用教程 #### 1. 红外传感器初始化 红外传感器用于检测地面颜色的变化,通常通过GPIO口读取信号。在HAL中,可以通过配置`MX_GPIO_Init()`函数来设置相应的引脚模式。 ```c void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置红外传感器输入引脚 */ __HAL_RCC_GPIOA_CLK_ENABLE(); // 假设红外传感器连接到PA0 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 设置为输入模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不启用上拉/下拉电阻 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 上述代码实现了红外传感器的硬件初始化[^1]。 #### 2. 轨迹跟踪逻辑实现 轨迹跟踪的核心在于实时获取红外传感器的状态并据此调整电机的速度方向。以下是`Tracking()`函数的一个简单实现: ```c #include "track.h" #define TRACK_LEFT (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) // 左侧红外传感器状态 #define TRACK_RIGHT (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)) // 右侧红外传感器状态 void Tracking(void) { uint8_t leftSensor = TRACK_LEFT; // 获取左侧传感器状态 uint8_t rightSensor = TRACK_RIGHT; // 获取右侧传感器状态 if (!leftSensor && !rightSensor) { MoveForward(); // 当两侧均未检测到黑线时前进 } else if (!leftSensor && rightSensor) { TurnLeft(); // 当仅右侧检测到黑线时左转 } else if (leftSensor && !rightSensor) { TurnRight(); // 当仅左侧检测到黑线时右转 } else { Stop(); // 当两侧均检测到黑线时停止 } } // 定义运动控制函数(需自行实现) void MoveForward() {} void TurnLeft() {} void TurnRight() {} void Stop() {} ``` 此部分展示了如何利用红外传感器数据完成基本的小车动作控制。 #### 3. 主程序结构设计 主程序应循环调用轨迹跟踪功能模块,并处理其他必要的任务。 ```c int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); // 初始化GPIO Motor_Init(); // 初始化电机驱动器(假设已定义) while (1) { Tracking(); // 实时执行轨迹跟踪算法 HAL_Delay(10); // 添加适当延时以降低CPU负载 } } ``` 以上为主程序框架的设计思路。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值