前言
本篇文章将带大家学习如何驱动小车的电机让小车动起来。这里我们使用的是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站主页