栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【嵌入式&单片机】一文带你搞懂电机驱动模块

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【嵌入式&单片机】一文带你搞懂电机驱动模块

文章目录

1. 基本原理

1.1 控制电机转速1.2 控制电机旋转方向 2. H桥驱动

2.1 `H桥驱动`名称的由来2.2 H桥驱动控制电机旋转方向2.3 H桥驱动 3. 电机驱动模块

3.1 两个控制引脚的电机驱动3.2 三个控制引脚的电机驱动3.3 电机驱动模块的组成 4. 使用单片机控制电机驱动

4.1 三个控制引脚的电机驱动

4.1.1 接线4.1.2 控制方式 4.2 两个控制引脚的电机驱动

4.2.1 方式1 - 两路PWM4.2.2 :star2: 方式2 - 一路PWM,一路 GPIO 5. 实战 - 使用 Arduino 控制电机6. 实战 - 使用 STM32F103 控制电机

6.1 接线6.2 PWM设置6.3 原理分析6.4 代码

1. 基本原理 1.1 控制电机转速

在电机两端施加电压,电机就会旋转,而且电压越大,转速越快

1.2 控制电机旋转方向

通正向电压电机正转,反向电压电机反转

2. H桥驱动

2.1 H桥驱动名称的由来

在上图中,四个开关和电机构成了一个驱动电路,因为形状像字母“H”,所以称作 H桥驱动。

2.2 H桥驱动控制电机旋转方向

在本篇博客中,当电机两端的电压方向为从左到右时,电机的旋转方向为正向.

2.2.1 如上图,闭合开关 S1 和 S4,电机两端的电压方向为从左到右,电机正转

2.2.1 如上图,闭合开关 S2 和 S3,电机两端的电压方向为从右到左,电机反转

2.3 H桥驱动

在实际的应用中,并不会使用开关去驱动电机,而是一种类似开关的元器件–MOS管。

MOS管的导通条件比较繁琐,我们可以简单的认为:

接入高电平,MOS管导通接入低电平,MOS管断开

所以,实际应用中的 H桥驱动 是下面的样子

3. 电机驱动模块 3.1 两个控制引脚的电机驱动

当 IN1 = 0,IN2 = 1

M2 和 M5 导通,电机两端的电压方向为从左到右,电机正转

当 IN1 = 1,IN2 = 0

M3 和 M4 导通,电机两端的电压方向为从左到右,电机正转

当 IN1 = 0,IN2 = 0

M2、M3、M4、M5 全部断开,电机不转

当 IN1 = 1,IN2 = 1

M2、M3、M4、M5 全部导通,电机不转(电机驱动模块中s包含保护电路,所以在这种情况下并不会发生短路) 3.2 三个控制引脚的电机驱动

三个控制引脚的电机驱动是在 IN1、IN2 控制脚的基础上,增加了一个控制 IN1 和 IN2 通断的管脚 ENA(如下图)。

当 ENA = 1

控制方式与 3.1 的控制方式相同 当 ENA = 0

电机停止转动 3.3 电机驱动模块的组成

电机驱动模块除了内部的 H桥驱动 ,还由 保护电路、上下拉电阻、MOS管驱动芯片(单片机不能直接控制MOS管) 等组成。

4. 使用单片机控制电机驱动 4.1 三个控制引脚的电机驱动 4.1.1 接线

ENA <-> PWM引脚IN1 <-> 普通IO口IN2 <-> 普通IO口

4.1.2 控制方式

控制转速

调节 ENA 引脚 PWM 的占空比

当 PWM = 0,电机停止转动当 PWM = 100%,电机转速达到最大

控制转向

请参考 3.1

4.2 两个控制引脚的电机驱动

Tip:三个控制引脚的电机驱动也可以使用下面的控制方式,但是需要将其中的 ENA脚 接 VCC。

4.2.1 方式1 - 两路PWM

4.2.1.1 接线

IN1 <-> PWM1IN2 <-> PWM2

4.2.1.2 控制方式

要保证 PWM1 和 PWM2 的频率相同(通常为 10k HZ),频率与电机驱动模块和电机的规格有关,具体控制频率需要参考相关规格书。

PWM1 占空比 > PWM2 占空比(如上图)

电机正转电机的转速与 PWM1 占空比 - PWM2 占空比 有关 PWM1 占空比 < PWM2 占空比

电机反转电机的转速与 PWM2 占空比 - PWM1占空比 有关 PWM1 占空比 = PWM2 占空比

电机停止转动 4.2.2  方式2 - 一路PWM,一路 GPIO

4.2.2.1 接线

IN1 <-> PWM (通常为 10k HZ)IN2 <-> DIR (普通GPIO引脚)

4.2.2.2 控制方式

DIR = 0(见上图)

电机正转转速与 PWM 的正向占空比有关

PWM = 100% 时,电机正向转速最大PWM = 0 时,电机停止转动

DIR = 1 (见上图)

电机反转转速与 PWM 的反向占空比有关

PWM = 0 时,电机反向转速最大PWM = 100% 时,电机停止转动 5. 实战 - 使用 Arduino 控制电机

使用的电机驱动是 L298N

它的原理图如下

L29N是一个双路驱动,它可以同时驱动两个电机

ENA,IN1,IN2 控制左边的电机ENB,IN2,IN3 控制右边的电机

使用的控制方式是 4.1 的控制方式。

接线如下:

ENA <-> D11 (注意:一定要接PWM引脚)IN1 <-> D10IN2 <-> D9

代码:


#define ENA 11
#define IN1 10
#define IN2 9

// speed的范围 -255 ~ 255
void setMotorSpeed(int speed)
{
    if(speed > 0)
    {
        // 如果速度大于0,则正转
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, LOW);
    }
    else (speed < 0)
    {
        // 如果速度小于0,则反转
        digitalWrite(IN1, LOW);
        digitalWrite(IN2, HIGH);
    }
    else
    {
        // 如果速度等于0,则停止转动
        digitalWrite(IN1, HIGH);
        digitalWrite(IN2, HIGH);      
    }

    analogWrite(ENA, abs(speed));
}

void setup()
{
    pinMode(IN1, OUTPUT);
    pinMode(IN2, OUTPUT);
}

void loop()
{
    int i = 0;

    // 电机正向旋转,速度逐渐增加
    for(i = 0; i <= 255; i++)
    {
        setMotorSpeed(i);
        delay(100);
    }

    // 电机正向旋转,速度逐渐减小
    for(i = 255; i >= 0; i--)
    {
        setMotorSpeed(i);
        delay(100);
    }

    // 电机反向旋转,速度逐渐增加
    for(i = 0; i <= 255; i++)
    {
        setMotorSpeed(-i);
        delay(100);
    }

    // 电机反向旋转,速度逐渐减小
    for(i = 255; i >= 0; i--)
    {
        setMotorSpeed(-i);
        delay(100);
    }

}
6. 实战 - 使用 STM32F103 控制电机

4.2.2 中控制电机驱动的方式最常用,但它的逻辑有些难理解,我们将以这种控制方式为例。

6.1 接线

使用的驱动是 5. 中的 L298N

ENA <-> VCC (改装为2线驱动)IN1 <-> DIR (任意一个GPIO口)IN2 <-> PWM (任意一个PWM输出口) 6.2 PWM设置

首先对 STM32 的PWM模式进行设置:

定时器为向上计数定时器频率设置为 10k HZPWM模式为 模式1PWM有效电平为高电平

名词规定:

maxPulse:定时器的最大计数值cnt:当前计数器值duty :占空比 ,duty = pulse / maxPulsepulse:比较寄存器的值

此时在一个PWM周期内,

当 cnt < pulse, PWM 引脚输出高电平当 cnt >= pulse, PWM 引脚输出低电平

6.3 原理分析

参考 4.2.2 的控制方式,结合上图:

当 DIR = 0 时,电机正转,电机的转速取决于正向占空比 ,此时 duty = pulse / maxPulse当 DIR = 1 时,电机反转,电机的转速取决于反向占空比,此时 duty = (maxPulse - pulse) / maxPulse

所以可以写出下列 伪代码:

// speed最大值是maxPulse, 最小值是 -maxPulse
// speed为正数时正转,为负数时反转
void setSpeed(int speed)
{
    // 限幅
    if(speed > maxPulse)
        speed = maxPulse;
    else if(speed < -maxPulse)
        speed = -maxPulse;
    
    
    if (speed > 0)
    {
        // 正转
        DIR = 0;
        pulse = speed;
        setPulse(pulse);
    }
    else if (pulse < 0)
    {
        // 反转
        DIR = 1;
        pulse = maxPulse + speed; // 这时speed是负数
        setPulse(pulse);
    }
    else
    {
        // 停止转动
        DIR = 1;
        pulse = maxPulse;
        setPulse(pulse);
    }
}

6.4 代码

明白了原理后,不难写出上面的代码,所以这里先不给出代码了。


本文由 CloudSir 原创,转载请在CSDN私信

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702305.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号