草庐IT

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

云朵先生_ 2023-04-09 原文

文章目录

1. 基本原理

1.1 控制电机转速

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

1.2 控制电机旋转方向

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

2. H桥驱动

2.1 H桥驱动名称的由来

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

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

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

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

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

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 <-> PWM1
  • IN2 <-> PWM2

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

4.2.1.2 控制方式 1

  • PWM1 占空比 > PWM2 占空比(如上图)
    • 电机正转
    • 电机的转速与 PWM1 占空比 - PWM2 占空比 有关
  • PWM1 占空比 < PWM2 占空比
    • 电机反转
    • 电机的转速与 PWM2 占空比 - PWM1占空比 有关
  • PWM1 占空比 = PWM2 占空比
    • 电机停止转动

4.2.1.3 控制方式 2

  • PWM1 占空比 = 0,PWM2 占空比 不为 0
    • 电机反转
    • 电机的转速与 PWM2 占空比 有关
  • PWM2 占空比 = 0,,PWM1 占空比 不为 0
    • 电机正转
    • 电机的转速与 PWM1 占空比 有关
  • PWM2 占空比 = PWM1 占空比
    • 电机停止转动
    • 建议此时的占空比为 0 或 100%

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

它的原理图如下

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

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

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

接线如下:

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

代码:

/*
 * @Author: CloudSir
 * @Github: https://github.com/cloudsir
 * @Date: 2022-01-11 12:52:48
 * @LastEditTime: 2022-01-11 12:58:13
 * @LastEditors: CloudSir
 * @Description: Arduino 控制电机
 */

#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 HZ
  • PWM模式为 模式1
  • PWM有效电平为高电平

名词规定:

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

此时在一个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 (speed< 0)
    {
        // 反转
        DIR = 1;
        pulse = maxPulse + speed; // 这时speed是负数
        setPulse(pulse);
    }
    else
    {
        // 停止转动
        DIR = 1;
        pulse = maxPulse;
        setPulse(pulse);
    }
}

6.4 代码

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


版权声明:本文为CSDN博主 云朵先生_ 的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34802028/article/details/122431195


致正在学习嵌入式的小伙伴们:
嵌入式的学习是要基础知识 + 动手实践同步进行的,在这里给大家推荐一个可以系统学习嵌入式和刷题的网站:牛客网(传送门:牛客网)。

牛客网原本是一个刷 IT 题库的网站,经过多年的发展,已经成为了一个集 课程+刷题+面经+求职+讨论区分享 的一站式求职学习网站,最最最重要的里面的资源全部免费, 而最近他们正打算将这套模式推广到嵌入式行业,专门为嵌入式工程师开设了相应的板块,正在学习嵌入式、寻找嵌入式专项题库、想要找嵌入式相关工作但又缺乏经验的小伙伴们,千万不要错过(链接在下面哦)!

有关【嵌入式 · 单片机】一文带你搞懂电机驱动模块的更多相关文章

  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. 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

  3. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  4. ruby - 运行测试时静音 Chrome 驱动程序控制台输出 - 2

    我使用的是最新版本的Chrome(32.0.1700.107)和Chrome驱动程序(V2.8)。但是当我在Ruby中使用以下代码运行示例测试时:require'selenium-webdriver'WAIT=Selenium::WebDriver::Wait.new(timeout:100)$driver=Selenium::WebDriver.for:chrome$driver.manage.window.maximize$driver.navigate.to'https://www.google.co.in'defapps_hoverele_hover=$driver.find_

  5. node.js - 从未编写过任何自动化测试,我应该如何开始行为驱动开发? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易

  6. ruby-on-rails - 在 Rails/Capybara/Poltergeist 规范中使用 url_for 将驱动程序发送到 example.com 而不是应用程序 - 2

    如果我在功能规范中调用url_for,它会返回一个以http://www.example.com/开头的绝对URL.Capybara会很乐意尝试加载该站点上的页面,但这与我的应用程序无关。以下是重现该问题的最少步骤:从这个Gemfile开始:source'https://rubygems.org'gem"sqlite3"gem"jquery-rails"gem"draper"gem"rails",'4.1.0'gem"therubyracer"gem"uglifier"gem"rspec-rails"gem"capybara"gem"poltergeist"gem"launchy"运行

  7. 一文解决关于VLAN所有的疑惑 - 2

    一文解决关于VLAN所有的疑惑VLAN基本概念为什么需要VLAN?怎么在交换机上划分VLAN,VLAN的工作原理有了子网,已经隔离了广播,还需要VLAN干啥?只进行子网划分,不进行VLAN划分VLAN划分与子网划分附加VLAN信息的方法VLAN划分交换机的端口类型(Access和Trunk)一、访问链接二、汇聚链接汇聚链接VLAN间通信为什么要进行VLAN间通信?路由器实现VLAN间通信路由器和交换机的连接方式通信细节三层交换机实现VLAN间通信加速VLAN间通信三层交换机与路由器三层交换机路由器路由器和交换机配合构建LAN的实例使用VLAN设计局域网的特点VLAN增加网络的灵活性不使用VLA

  8. 驱动开发:内核无痕隐藏自身分析 - 2

    在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,

  9. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  10. ruby - 事件/观察者驱动的 Ruby on Rails - 2

    我有一个适用于事件/监听器模型的应用程序。发布了几种不同类型的数据(事件),然后许多不同的事情可能需要也可能不需要对该数据(监听器)采取行动。监听器的发生没有特定的顺序,每个监听器将决定是否需要对事件采取行动。Rails应用程序有哪些工具可以完成此任务?我希望自己不必这样做(尽管我可以。这没什么大不了的。)编辑:观察者模式可能是更好的选择 最佳答案 查看EventMachine.它是一个非常流行的Ruby事件处理库。它看起来相当不错,而且很多其他库似乎都在利用它(Cramp)。这是一个很好的介绍:http://rubylearnin

随机推荐