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

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

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

材料:

(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

 

 

 

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值