任务书(L298N驱动小车)5.4--5.9——STM32F103RCT6,使用L298N驱动小车。

本文介绍了使用STM32F103RCT6通过L298N电机驱动模块控制小车的实现过程,包括走直线、转弯、原地转圈和行驶到指定地点的功能。通过GPIO控制引脚状态,实现电机的正反转和调速,进而控制小车运动。代码中展示了如何使用按键控制小车的前进、后退、转弯及停止,并提供了简单的路径规划示例。
摘要由CSDN通过智能技术生成

任务书(L298N驱动小车)5.4


STM32F103RCT6,使用L298N电机驱动模块驱动小车。
在这里插入图片描述


任务简介

任务2 L298N驱动小车
时间5.3-5.4
在这里插入图片描述
在这里插入图片描述

注:图片转载自转载自 L298N电机驱动模块的使用

任务简介:
了解L298N电机驱动模块的使用
了解18650锂电池参数(单节电池的电压,容量等)
了解控制电机的一般方法(如何正反转,如何调速)
严格遵守:
1、驱动小车走直线
2、实现转弯功能
3、实现原地转圈
4、行驶到指定地点

注意事项:
1、输入电压7-12v,小于7v或大于12v都会影响性能
2、先确认正负极再接线
3、严禁电池两端短路

备注:
简述“严格遵守”4项功能的实现方法:


一、我们要干什么

了解L298N电机驱动模块的使用
了解18650锂电池参数(单节电池的电压,容量等)
了解控制电机的一般方法(如何正反转,如何调速)

1、驱动小车走直线
2、实现转弯功能
3、实现原地转圈
4、行驶到指定地点

最重要的是,使用上一任务的工程文件STM32F103RCT6,用按键控制四个引脚的输出状态

二、正式开始

1.驱动小车走直线

输入电压7-12v,接线就直接PC6--9依次接IN1--4就好了,电机的两端接入L298N的输出,我们这里只控制两个电机

为了方便,还是把控制L298N的四个引脚的初始化写在led.c里了(不是好习惯,只是懒)
led.c文件:

#include "led.h"  
//初始化PB5和PE5为输出口.并使能这两个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_C;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能PC端口
	GPIO_C.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_C.GPIO_Pin = (GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);
	GPIO_C.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_C);
	GPIO_ResetBits(GPIOC,(GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9));
}	

led.h文件:

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"
//	 
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//11111111战舰STM32开发板
//LED驱动代码	   
//正点原子@11111111
//技术论坛:11111111111.com
//修改日期:2012/9/2
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 11111111111111111111111111 2009-2019
//All rights reserved									  
// 
#define LED0 PAout(8)	// PA8
#define LED1 PDout(2)	// PD2	

void LED_Init(void);//初始化

   	 				    
#endif

首先在main函数开始前,先声明头文件,并且将GPIO_ResetBits(),GPIO_SetBits()宏定义一下,因为直接放到程序里不太方便阅读。
main.c文件:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
//11111111 Mini STM32开发板范例代码2
//按键输入实验		   
//技术支持:11111111111.com
//11111111111111111111111111

#define PC6_L GPIO_ResetBits(GPIOC,GPIO_Pin_6) //PC6输出低电平
#define PC6_H GPIO_SetBits(GPIOC,GPIO_Pin_6)	//PC6输出高电平
#define PC7_L GPIO_ResetBits(GPIOC,GPIO_Pin_7)
#define PC7_H GPIO_SetBits(GPIOC,GPIO_Pin_7)
#define PC8_L GPIO_ResetBits(GPIOC,GPIO_Pin_8)
#define PC8_H GPIO_SetBits(GPIOC,GPIO_Pin_8)
#define PC9_L GPIO_ResetBits(GPIOC,GPIO_Pin_9)
#define PC9_H GPIO_SetBits(GPIOC,GPIO_Pin_9)

main函数:

 int main(void)
 {	
	u8 t=0;	  
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  	 	//初始化与LED连接的硬件接口
	KEY_Init();          	//初始化与按键连接的硬件接口
	LED0=0;					//点亮LED
	while(1)
	{
		t=KEY_Scan(1);		//得到键值
		switch(t)
		{				 
			case KEY0_PRES:
			
				PC6_L;//0101 正转,前进
				PC7_H;
				PC8_L;
				PC9_H;
				break;
			
			case KEY1_PRES:
				
				PC6_H;//1010 反转,倒退
				PC7_L;
				PC8_H;
				PC9_L;
				break;
			
			case WKUP_PRES:				
				
				PC6_L;//0000 停止
				PC7_L;
				PC8_L;
				PC9_L;
				break;
			
			default:
				delay_ms(10);	
		} 
	}		 
}

在这里插入图片描述
对照着表我们就可以看到,对于1个电机来说输入01表示正转,输入10表示反转,很轻易地哦通过按键实现了前进后退和停止的操作。
因为现在还调不了速度,所以车是全速跑的状态,注意别撞墙了

2.实现转弯功能

想实现转弯,就要让左右轮有转速差
也就是说,你可以让左边的速度比右边慢而实现左转,左边速度为0右边速度保持正常而快速左转,或者左边反转右边正转而实现原地旋转,实现方式多种多样,但我们现在不涉及调速,所以只能实现2,3两种方法.

		PC6_L;//1101 向左转弯前进
		PC7_H;
		PC8_H;
		PC9_L;
		PC6_L;//1110 向左倒退
		PC7_H;
		PC8_H;
		PC9_L;

3.实现原地转圈

		PC6_L;//0110 左正右反 原地转圈
		PC7_H;
		PC8_H;
		PC9_L;
		PC6_L;//1001 左反右正 原地转圈
		PC7_H;
		PC8_H;
		PC9_L;

4.行驶到指定地点

现在,只有延时和置位能用,所以想要到达特定地点,解决方案就是操作一段时间进行下一步操作就像流水灯一样。
思路如图所示,分步骤操作。
在这里插入图片描述
首先为了简化操作,我们将前进后退转弯等操作封装在函数里(一点点C语言基础

void ahead(int i)
{
				PC6_L;//0101
				PC7_H;
				PC8_L;
				PC9_H;
	delay_ms(i);
}

void turn_R(int i)
{
				PC6_L;//0111
				PC7_H;
				PC8_H;
				PC9_H;
	delay_ms(i);
}

void turn_L(int i)
{
				PC6_H;//1101
				PC7_H;
				PC8_L;
				PC9_H;
	delay_ms(i);
}

void stop(void)
{
				PC6_L;//0000
				PC7_L;
				PC8_L;
				PC9_L;
}

现在想实现小车入库就很简单了,首先声明 前进2s 的秒数是实际测试的,场地不同需要的时间不同,大家请自行测试,在这里主要介绍思路。


int main(void)
 {	
	u8 t=0;	  
	delay_init();	    	 //延时函数初始化	  
	LED_Init();		  	 	//初始化与LED连接的硬件接口
	KEY_Init();          	//初始化与按键连接的硬件接口
	LED0=0;					//点亮LED
	while(1)
	{
		t=KEY_Scan(1);		//得到键值
		switch(t)
		{				 
			case KEY0_PRES:
			//进入最近的库
				ahead(2000);
				turn_L(1000);
				ahead(1500);
				stop();
				break;
			
			case KEY1_PRES:
			//进入最远的库
				ahead(2000);
				ahead(2000);
				turn_R(1000);
				ahead(1500);
				stop();
				break;
			
			case WKUP_PRES:				
				
				PC6_L;//0000 停止
				PC7_L;
				PC8_L;
				PC9_L;
				break;
			
			default:
				stop();
				delay_ms(10);	
		} 
	}		 
}

至此拥有简易功能的小车就完成了,没有什么技术难度,主要是希望大家能熟悉函数的结构,基本语法和思考解决问题的方法。
透露一下,后面会用上六路循迹模块,淘宝上大概11–15元左右一个,不贵,但很好用,记得买上一卷黑色电工胶带用来循迹。

记录一下生活:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵芝三昧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值