任务书(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元左右一个,不贵,但很好用,记得买上一卷黑色电工胶带用来循迹。
记录一下生活: