草庐IT

STM32智能小车 0基础教学(驱动小车电机)

花落已飘 2023-04-13 原文

文章目录


前言

本篇文章将带大家学习如何驱动小车的电机让小车动起来。这里我们使用的是L298N电机驱动板驱动我们的电机。

一、电机的原理和接线


首先我们需要先为电机驱动供电,看到上面的图片,有一个12V的输入和电源地。
12V的电源接口可以接收5~35V的电压范围,这里我们可以将他接在板子上面的5V供电口对其进行供电。也可以接在电源模块中为其供电。
GND接到GND即可。


一个L298N是能够控制两个电机的,并且还能够通过PWM来进行小车速度的控制。
L298N上面有马达A和马达B两个接口,这两个接口能够分别控制电机,互相不会影响。
单片机IO使能端口是用来控制电机的正反转的,A通道使能和B通道使能分别对应马达A和马达B的PWM功能。想要使用PWM的功能必须将端口的跳线帽拔下来,否则是使用不了的。
下面我们进行接线和GPIO口的配置

二、使用cubemx配置驱动电机

这里我们暂时只使用到了普通的电机旋转,不涉及PWM的调速功能,PWM功能我们放到后面讲解。
这里我建议大家接线的时候尽量将线接的有规律,不要东一个西一个。
这里我们将四个电机控制GPIO分别接到了PB12-PB15。
这里我不建议大家这里接线:
一个接PB0一个接PA0一个接PC0.。。。。。这样接线的习惯是非常不好的。大家尽量将线接的有规律方便我们的代码编写。

如何控制小车电机选择呢,两个GPIO口就对应了一个电机。为什么是两个呢?现在我们给出一张真值表进行讲解。

由真值表可知当IN1和IN2同时输出0或者1时电机停止旋转,当IN1输出0,IN2输出1时电机正转。当IN1输出1,IN2输出0时电机反转。
知道原理后我们编写代码:
这里我们创建一个Moto.c和Moto.h来管理电机模块。
在这个文件中封装了小车初始化函数、左右电机控制函数、小车移动函数。
并对各个端口的输出进行了宏定义操作,这样方便我们后续的调用和编写代码。
Moto.h

#ifndef _MOTO_H_
#define _MOTO_H_

#include "main.h"


//右电机
#define  AIN1_RESET()  HAL_GPIO_WritePin (AIN1_GPIO_Port ,AIN1_Pin ,GPIO_PIN_RESET);
#define  AIN1_SET()    HAL_GPIO_WritePin (AIN1_GPIO_Port ,AIN1_Pin ,GPIO_PIN_SET);
#define  AIN2_RESET()  HAL_GPIO_WritePin (AIN2_GPIO_Port ,AIN2_Pin ,GPIO_PIN_RESET);
#define  AIN2_SET()		 HAL_GPIO_WritePin (AIN2_GPIO_Port ,AIN2_Pin ,GPIO_PIN_SET);

//左电机
#define  BIN1_RESET()  HAL_GPIO_WritePin (BIN1_GPIO_Port ,BIN1_Pin ,GPIO_PIN_RESET);
#define  BIN1_SET()    HAL_GPIO_WritePin (BIN1_GPIO_Port ,BIN1_Pin ,GPIO_PIN_SET);
#define  BIN2_RESET()  HAL_GPIO_WritePin (BIN2_GPIO_Port ,BIN2_Pin ,GPIO_PIN_RESET);
#define  BIN2_SET()		 HAL_GPIO_WritePin (BIN2_GPIO_Port ,BIN2_Pin ,GPIO_PIN_SET);

//小车初始化
void Car_Init(void);

//左电机
void Left_moto(unsigned char mode);

//右电机
void Right_moto(unsigned char mode);

//小车移动
void Move_car(unsigned char mode);

Moto.c
通过真值表很容易就能编写出小车电机的控制函数。
具体逻辑大家可以参照下面的代码。

#include "Moto.h"
#define back 1
#define go 2
#define stop 3

#define left 4
#define right 5

//小车状态初始化
void Car_Init()
{
	Move_car(stop);
}

//左电机
void Left_moto(unsigned char mode)
{
	switch(mode )
	{
	  case back:
		{
			BIN2_RESET();
			BIN1_SET();
		}
		break;
		
	  case go :
		{
			BIN1_RESET();
			BIN2_SET();
		}
		break;

	  case stop :
		{
			BIN1_RESET();
			BIN2_RESET();
		}
		break;
	}
}
//右电机
void Right_moto(unsigned char mode)
{
	switch(mode )
	{
	  case back:
		{
			AIN2_RESET();
			AIN1_SET();
		}
		break;
		
	  case go :
		{
			AIN1_RESET();
			AIN2_SET();
		}
		break;

	  case stop :
		{
			AIN1_RESET();
			AIN2_RESET();
		}
	}
}

//小车移动(后退,前进,停止)
void Move_car(unsigned char mode)
{
	switch(mode)
	{
	  case back:
		{
			Left_moto(back);
			Right_moto(back);
		}
		break;
		
	  case go :
		{
			Left_moto(go);
			Right_moto(go);
		}
		break;

	  case stop :
		{
			Left_moto(stop);
			Right_moto(stop);
		}
		break;
	}
}

总结

希望大家多多点赞评论留言,B站讲课地址:B站主页

有关STM32智能小车 0基础教学(驱动小车电机)的更多相关文章

  1. ruby-on-rails - 如何在 Ruby on Rails 中实现由 JSF 2.0 (Primefaces) 驱动的 UI 魔法 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道ruby​​onrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim

  2. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  3. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  4. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  5. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  6. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  7. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  8. 【网络】-- 网络基础 - 2

    (本文是网络的宏观的概念铺垫)目录计算机网络背景网络发展认识"协议"网络协议初识协议分层OSI七层模型TCP/IP五层(或四层)模型报头以太网碰撞路由器IP地址和MAC地址IP地址与MAC地址总结IP地址MAC地址计算机网络背景网络发展        是最开始先有的计算机,计算机后来因为多项技术的水平升高,逐渐的计算机变的小型化、高效化。后来因为计算机其本身的计算能力比较的快速:独立模式:计算机之间相互独立。    如:有三个人,每个人做的不同的事物,但是是需要协作的完成。    而这三个人所做的事是需要进行协作的,然而刚开始因为每一台计算机之间都是互相独立的。所以前面的人处理完了就需要将数据

  9. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  10. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

随机推荐