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

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

前言

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

一、电机的原理和接线

image.png

首先我们需要先为电机驱动供电,看到上面的图片,有一个12V的输入和电源地。

12V的电源接口可以接收5~35V的电压范围,这里我们可以将他接在板子上面的5V供电口对其进行供电。也可以接在电源模块中为其供电。

GND接到GND即可。

image.png


一个L298N是能够控制两个电机的,并且还能够通过PWM来进行小车速度的控制。

L298N上面有马达A和马达B两个接口,这两个接口能够分别控制电机,互相不会影响。

单片机IO使能端口是用来控制电机的正反转的,A通道使能和B通道使能分别对应马达A和马达B的PWM功能。想要使用PWM的功能必须将端口的跳线帽拔下来,否则是使用不了的。

下面我们进行接线和GPIO口的配置


二、使用cubemx配置驱动电机

这里我们暂时只使用到了普通的电机旋转,不涉及PWM的调速功能,PWM功能我们放到后面讲解。

这里我建议大家接线的时候尽量将线接的有规律,不要东一个西一个。

这里我们将四个电机控制GPIO分别接到了PB12-PB15。

这里我不建议大家这里接线:

一个接PB0一个接PA0一个接PC0.。。。。。这样接线的习惯是非常不好的。大家尽量将线接的有规律方便我们的代码编写。

image.png

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

image.png

由真值表可知当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站主页

相关文章
|
5月前
|
算法
STM32CubeMX PID差速循迹小车
STM32CubeMX PID差速循迹小车
117 1
STM32CubeMX PID差速循迹小车
|
4月前
|
传感器
手把手在STM32F103C8T6上构建可扩展可移植的DHT11驱动
【8月更文挑战第29天】本文详细介绍在STM32F103C8T6上构建可扩展且可移植的DHT11温湿度传感器驱动的步骤,包括硬件与软件准备、硬件连接、驱动代码编写及测试。通过这些步骤,可根据实际项目需求优化和扩展代码。
155 0
|
5月前
STM32Cubemx PWM驱动加湿器模拟火山喷发效果
STM32Cubemx PWM驱动加湿器模拟火山喷发效果
79 14
|
5月前
STM32Cubemx PWM驱动SG90舵机
STM32Cubemx PWM驱动SG90舵机
202 13
|
5月前
STM32CubeMX mpu6050驱动
STM32CubeMX mpu6050驱动
85 10
|
5月前
STM32CubeMX EC11旋转编码器驱动
STM32CubeMX EC11旋转编码器驱动
273 10
|
5月前
STM32CubeMX OLED驱动
STM32CubeMX OLED驱动
80 10
|
5月前
|
芯片
STM32CubeMX TM1637驱动数码管
STM32CubeMX TM1637驱动数码管
158 6
|
5月前
STM32CubeMX WS2812B灯驱动
STM32CubeMX WS2812B灯驱动
234 1
|
5月前
STM32CubeMX ULN2003步进电机驱动
STM32CubeMX ULN2003步进电机驱动
71 0
下一篇
DataWorks