直流无刷电机(BLDC)六步换相驱动

news2024/11/23 16:34:00

直流无刷电机(BLDC)六步换相驱动

文章目录

  • 直流无刷电机(BLDC)六步换相驱动
    • 1. 前言
    • 2. 六步换相原理
    • 3. 电角度与机械角度
    • 4. 动手实践
      • 4.1 霍尔输出表测量
      • 4.2 换向控制
      • 4.3 代码编写
    • 5. 总结

1. 前言

直流无刷电机相对直流有刷电机具备效率更高,所需维护更少,寿命更长等诸多特点被广泛应用。而直流无刷电机的使用控制会比直流有刷电机更为复杂,关于直流无刷电机的控制方法,目前主要有:

  1. 六步换相控制
  2. FOC矢量控制
  3. 直接力矩控制

多种控制方式中,六步换相控制相对其他控制较为简单,也适合作为直流无刷电机的控制的入门学习方案。

关于六步换相控制,网上的资料很多,但基本上都是基于厂商提供了对应电机的换相表直接根据换向表内容进行换向控制,这样是实现起来简单,但是对于深层次的原理理解将不够,本文完整的阐述。

2. 六步换相原理

直流无刷电机六步换相控制原理如下: 直流无刷电机简化模型如下,线圈绕组A、B、C固定在电机定子上,且相互之间呈120°位置间隔摆放;电机转子由具备固定磁铁组成;

在这里插入图片描述
通过给线圈上通以不同的电流,如给U相通以正电,V相通以负电,W相悬空,根据右手螺旋定则(右手握住通电螺线管,让四指指向电流的方向,那么大拇指所指的那一端是通电螺线管的N极)通电螺线管A和B中将产生一个磁场,吸引由磁铁构成的转子转动;通电螺线管A产生的磁力为F1,通电螺线管B产生的磁力为F2,F1和F2产生的合力为F3,吸引转子磁铁转至图中所示角度。

按照同样的方法,通过不断的改变U V W的通电顺序,总共能得到如下六种通电组合,在不同的通电组合中,产生六个不同的磁力吸引转子转动到图中所对应的位置。

在这里插入图片描述
如上图所示,U V W 采用不同的通电方式将在以上六种不同方向上产生一个合成的磁力,之后给与电机转子适当的转动时间,最终转子会旋转到对应的角度位置上,这便是使得直流无刷电机转动的基本原理。

上述简化模型中,我们采用的是一对磁极的电机(一对南北极)进行讲述,而在实际电机生产制作中,往往电机具备多对磁极,且线圈绕组也不会是简单的只在间隔120°的三个位置安装,实际肯定会要更加复杂,但是不管线圈怎么绕,以及磁极怎么增加,最终回到一个电角度周期(后文有描述)内均回回到上述模型进行分析;

ps:磁极数量的增多,会使得控制电机转动将更加平缓,力矩更加稳定;

3. 电角度与机械角度

在直流无刷电机控制中,有一个很重要的概念便是电角度与机械角度。

机械角度是指轮子实际转过的物理角度,比如我们用手转动电机运转一圈,对应的机械角度转动360°。

电角度指电机转子在电机内转过的磁场角度,每经过一次南北极的变化为一个电角度周期,也即360°,如下图所示:

在这里插入图片描述
上图中电机有两对磁极,极对数为2,所以电角度转过360°,对应机械角度将转过 360°/2 = 180°;

综上,亦可推测出一个电角度周期(电角度360°)对应的机械角度关系为:

一个电角度周期 = 一个机械角度周期(360°) / 电机极对数

4. 动手实践

通过上述内容,我们已经知道如何控制UVW三相的通电顺序来实现不同方向的合成磁力的生成,但是当我们拿到一个电机之后,你肯定还会感到无所下手,究竟该先给哪个方向的合成磁力呢?以及什么时候切换合成磁力的方向呢?随机切换吗?这肯定是不行的,我们需要一个可控的电机,因此我们需要一个能确认电机内当前转子位置的传感器,在直流无刷电机中,常见的是通过三个霍尔传感器进行角度反馈。

针对采用六步换向控制的BLDC直流无刷电机,三个霍尔安装方式主要有两种:

  1. 间隔60°电角度安装(注意是电角度!!!)
  2. 间隔120°电角度安装(注意是电角度!!!)

同时,在以六步换相控制的BLDC中,通常会有一个霍尔传感器安装在电角度的30°位置,以方便检测;
(声明:如果有对应电机的手册,务必以手册为准)

通过三个间隔60°或120°电角度安装的霍尔传感器,能将一个电角度周期均分为六等份,通过霍尔传感器的输出便能检测到当前转子所在的电角度在哪一个扇区,如下图所示。
在这里插入图片描述

当然实际电机中霍尔的安装顺序并非如此,根据每个电机的设计会有所区别,因此我们需要知道如何测算我们手上的这个电机在各个角度对应的霍尔输出值,或者说是需要知道我们手上的电机霍尔安装的位置。通常此数据厂家会提供,但也有意外情况,当厂家不提供此数据时,或者我们联系不上电机厂商时,我们又如何解决此问题?

4.1 霍尔输出表测量

我们可以通过以下方法测量我们手上电机霍尔的输出表:
采用直流电源,通过给U V W三相按照不同的组合通电,测量不同通电组合情况下的hall反馈值;具体步骤如下:

  1. 配置直流电源,电压设置为电机的额定电压;
  2. U相连接电源正,V相连接电源负,电流设置为一个较小值,推荐10mA,打开电源;
  3. 此时电机会受到一个固定方向的力,用手感受此力的大小;
  4. 调节电流阈值限幅,通过不断的缓慢增大电流,直至感受到此力能将电机稳定的锁定在某一个方向;
  5. 读取此时三个霍尔传感器的值,并做记录;
  6. 注意测试时,不要长时间大电流给电机通电,否则容易烧毁电机!!!
  7. 按照下述方案通电顺序,给 U V W三相按照不同的组合通电,测量不同组合情况下霍尔传感器反馈的结果,得到下表数据
    在这里插入图片描述

4.2 换向控制

在通过霍尔传感器检测到当前转子所在哪一个扇区之后,我们便可知道应该如何控制 U V W 导通从而,从而输出什么方向的合成磁力驱动电机转动了。

而根据初中物理力学知识:P = F · v ·cosθ,当合成磁力与磁铁呈90°时,力的做功最大,因此我们应尽可能希望合成磁力的方向与当前转子磁场方向呈90°,以提高电机的转动效率。

然而通过上面的知识,我们会发现,通过三个霍尔传感器拿到的转子当前的角度是会有60°的误差的,如下图,当霍尔传感器按下图所示位置安装,且三个霍尔的输出为 010b 时,转子磁铁的电角度在扇区1内的任意角度都有可能。

在这里插入图片描述

此时最佳的合成磁力方向在120°方向(U+ V- W悬空)上,此时合成磁力与转子磁铁之间的夹角在60°-120°之间波动。(这也就是为什么采用六步换相控制存在力矩存在抖动的原因,当然这对于一些场合已经满足了要求。当然网上也有人说这个夹角范围是60°-120°,这个与hall的安装的位置有关,我们这里讲解的是按照30°角度安装的)

当然也有人会问,上述图中如果合成磁力方向在90°角度(W+ V- U悬空)不也可以嘛?这当然也是可以的,但是合成磁力在此方向时电机也可以转动,但是此角度的合成磁力会更低,这会导致电机运转的效率更低,能达到的最高转速更低,以及电机转动时的噪音也会更大。

按此类推,转子所在各扇区时,为使电机逆时针转动应提供的合成磁力方向如下:

在这里插入图片描述
以此可以得出下述换向表。
在这里插入图片描述
之后便可按照上述方法进行实现软件的控制即可。

4.3 代码编写

电机控制部分代码如下:(只包含核心部分代码,重在理解,实际使用中肯定还需要加一些优化的)

#include "motor.h"
#include "./gpio/drv_gpio.h"
#include "./timer/drv_timer.h"

uint8_t hall_table[6] = {2, 6, 4, 5, 1, 3};

static void motor_six_step_switch(uint8_t step, uint8_t throttle);

/**
 * @brief 电机六步换相控制
 *
 */
void motor_control(void)
{
    uint8_t a = 0, b = 0, c = 0, hall = 0;
    uint8_t step = 0, i = 0;

    /* 读取hall IO值 -> 查hall表 -> 确认当前输出所在步数 */
    get_motor_hall_value(&a, &b, &c);
    hall = (a << 2) | (b << 1) | c;
    for (i = 0; i < 6; i++) {
        if (hall == hall_table[i])
            break;
    }
    step = i;
    motor_six_step_switch(step, 20);
}

/**
 * @brief 电机六步换相切换,控制三相桥输出,每路半桥的下桥采用IO进行全开或全关控制,上桥采用PWM控制
 * 
 * @param step 当前输出的步数值
 * @param throttle 油门值,对应上桥的PWM的占空比
 */
static void motor_six_step_switch(uint8_t step, uint8_t throttle)
{
    uint16_t u_output = 0, v_output = 0, w_output = 0;
    
    throttle %= 100;
    
    switch (step) {
        case 0:     /* U+ V- */
            gpio_u_low_ctrl(0);
            gpio_v_low_ctrl(1);
            gpio_w_low_ctrl(0);
        
            u_output = throttle * 10;
            v_output = 0;
            w_output = 0;
            set_motor_phase_output(u_output, v_output, w_output);
            break;
        case 1:     /* U+ W- */
            gpio_u_low_ctrl(0);
            gpio_v_low_ctrl(0);
            gpio_w_low_ctrl(1);
        
            u_output = throttle * 10;
            v_output = 0;
            w_output = 0;
            set_motor_phase_output(u_output, v_output, w_output);
            break;
        case 2:     /* V+ W- */
            gpio_u_low_ctrl(0);
            gpio_v_low_ctrl(0);
            gpio_w_low_ctrl(1);
        
            u_output = 0;
            v_output = throttle * 10;
            w_output = 0;
            set_motor_phase_output(u_output, v_output, w_output);
            break;
        case 3:     /* V+ U- */
            gpio_u_low_ctrl(1);
            gpio_v_low_ctrl(0);
            gpio_w_low_ctrl(0);
        
            u_output = 0;
            v_output = throttle * 10;
            w_output = 0;
            set_motor_phase_output(u_output, v_output, w_output);
            break;
        case 4:     /* W+ U- */
            gpio_u_low_ctrl(1);
            gpio_v_low_ctrl(0);
            gpio_w_low_ctrl(0);
        
            u_output = 0;
            v_output = 0;
            w_output = throttle * 10;
            set_motor_phase_output(u_output, v_output, w_output);
            break;
        case 5:     /* W+ V- */
            gpio_u_low_ctrl(0);
            gpio_v_low_ctrl(1);
            gpio_w_low_ctrl(0);
        
            u_output = 0;
            v_output = 0;
            w_output = throttle * 10;
            set_motor_phase_output(u_output, v_output, w_output);
            break;
    }
}

5. 总结

以上便是针对直流无刷电机的六步换向控制啦,欢迎大家共同讨论。


创作不易,转载请注明出处!

关注、点赞+收藏,可快速查收博主有关分享!


相关推荐:

  • 专栏:电机控制专栏(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 理论(一)(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 理论(二)(点击跳转)

  • 博文:直流无刷电机FOC控制算法 理论到实践 —— 实践(点击跳转)

  • 博客主页:爱出名的狗腿子(点击跳转)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AOE性能调优问题案例

AOE&#xff08;Ascend Optimization Engine&#xff09;是一款自动性能调优工具&#xff0c;目的是为了充分利用有限的硬件资源&#xff0c;满足算子和整网的性能要求。 本期就分享几个关于AOE性能调优问题的典型案例&#xff0c;并给出原因分析及解决方法。 调优过程中进程…

Mysql之多表查询上篇

Mysql之多表查询上篇 多表查询什么是多表查询笛卡尔积(交叉连接)产生笛卡尔积的条件避免笛卡尔积的方法 多表查询的分类1.等值连接 VS 非等值连接等值连接非等值连接扩展1表的别名扩展2&#xff1a;连接多个表 2.自连接与非自连接扩展3&#xff1a;SQL语法标准 内连接SQL92语法…

【大模型应用开发教程】04_大模型开发整体流程 基于个人知识库的问答助手 项目流程架构解析

大模型开发整体流程 & 基于个人知识库的问答助手 项目流程架构解析 一、大模型开发整体流程1. 何为大模型开发定义核心点核心能力 2. 大模型开发的整体流程1. 设计2. 架构搭建3. Prompt Engineering4. 验证迭代5. 前后端搭建 二、项目流程简析步骤一&#xff1a;项目规划与…

TensorRT量化实战课YOLOv7量化:YOLOv7-PTQ量化(二)

目录 前言1. YOLOv7-PTQ量化流程2. 模型标定3. 敏感层分析 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 TensorRT下的模型量化&#xff0c;在其课程的基…

el-tree中展示项换行展示

文章目录 效果如下所示&#xff1a;没有换行展示的效果修改样式换行之后的展示效果 想要了解el-tree使用的详情往下看代码和数据如下所示Vue代码中可能使用到的数据如下Vue的代码如下&#xff1a;没有换行展示的效果换行之后的展示效果样式调试 效果如下所示&#xff1a; 没有…

仅以此文,纪念毕业一年后的日子

22年6月份从华农毕业了之后&#xff0c;拿到了好几份不错的offer&#xff0c;最后我进入了我学生时代十分憧憬的一家公司&#xff08;腾讯&#xff09;工作&#xff0c;加上实习的时间&#xff0c;已经在腾讯差不多工作了两年了。 从一开始实习的时候的懵懂学生气到现在的清醒…

Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测

目录 一、环境准备二、下载 ONNX 模型文件2.1 Azure 机器学习工作室2.2 Azure 机器学习 Python SDK2.3 生成模型进行批量评分多类图像分类 三、加载标签和 ONNX 模型文件四、获取 ONNX 模型的预期输入和输出详细信息ONNX 模型的预期输入和输出格式多类图像分类 多类图像分类输入…

【Liunx基础】之指令(一)

【Liunx基础】之指令&#xff08;一&#xff09; 1.ls指令2.pwd命令3.cd指令4.touch指令5.mkdir指令(重要)6.rmdir指令与rm指令&#xff08;重要&#xff09;7.man指令&#xff08;重要&#xff09;8.cp指令&#xff08;重要&#xff09; &#x1f4c3;博客主页&#xff1a; 小…

核电堆芯组件动态特性试验研究

u 核电试验概述 反应堆是核电事业的核心组成部分之一&#xff0c;堆内构件、堆芯燃料组件等部件在冷却剂流动冲击下&#xff0c;会诱发剧烈振动&#xff0c;导致堆芯内试验件流道不稳定。为了保障反应堆的安全运行&#xff0c;根据国家核安全法规规定&#xff0c;有必要对受冷…

单链表的应用(2)

环形链表的约瑟夫问题 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; 利用链表实现 思路&#xff1…

基础Redis-结构与命令

结构与命令 1.基础-Redisa.Redis数据结构介绍b.Redis通用命令c.key的结构d.String类型e.Hash类型f.List类型g.Set类型h.SortedSet类型 1.基础-Redis a.Redis数据结构介绍 Redis是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型多种多样&a…

idea中配置spring boot单项目多端口启动

参照文章 https://zhuanlan.zhihu.com/p/610767685 项目配置如下 下面为 idea 2023&#xff0c;不同版本的设置有区别&#xff0c;但是没那么大&#xff0c;idea 2023默认使用新布局&#xff0c;切换为经典布局即可。 在项目根目录的.idea/workspace.xml文件里添加如下配置 &l…

Java用log4j写日志

日志可以方便追踪和调试问题&#xff0c;以前用log4net写日志&#xff0c;换Java了改用log4j写日志&#xff0c;用法和log4net差不多。 到apache包下载下载log4j的包&#xff0c;解压后把下图两个jar包引入工程 先到网站根下加一个log4j2.xml的配置文件来配置日志的格式和参…

测试开发面试宝典,涨价倒计时

大家好&#xff0c;我是洋子&#xff0c;相信在面试软件测试、测试开发岗位的小伙伴都深有体会&#xff0c;考察的知识点越来越多 不仅会考察到软件测试的理论&#xff0c;让你对某种功能进行测试用例的设计&#xff0c;更难一点会给出一个测试场景进行测试方案的设计&#xf…

C++二分算法:平衡子序列的最大和

涉及知识点 二分 动态规划 #题目 给你一个下标从 0 开始的整数数组 nums 。 nums 一个长度为 k 的 子序列 指的是选出 k 个 下标 i0 < i1 < … < ik-1 &#xff0c;如果这个子序列满足以下条件&#xff0c;我们说它是 平衡的 &#xff1a; 对于范围 [1, k - 1] 内的所…

openGauss学习笔记-115 openGauss 数据库管理-设置安全策略-设置密码安全策略

文章目录 openGauss学习笔记-115 openGauss 数据库管理-设置安全策略-设置密码安全策略115.1 操作步骤 openGauss学习笔记-115 openGauss 数据库管理-设置安全策略-设置密码安全策略 115.1 操作步骤 用户密码存储在系统表pg_authid中&#xff0c;为防止用户密码泄露&#xff…

2023-2024-1高级语言程序设计-一维数组

7-1 逆序输出数组元素的值 从键盘输入n个整数存入一维数组中&#xff0c;然后将数组元素的值逆序输出。 输入格式: 第一行输入整数个数n&#xff1b; 第二行输入n 个整数&#xff0c;数据之间以空格隔开。 输出格式: 逆序输出数组元素的值&#xff0c;每个数据之后跟一个空…

[React] React-Redux 快速入门

文章目录 1.安装 Redux Toolkit 和 React Redux2.创建 Redux Store3.为 React 提供 Redux Store​4.创建 Redux State Slice5.添加 Slice Reducers 到 Store6.在 React 组件中使用 Redux State 和 Actions​7.总结 1.安装 Redux Toolkit 和 React Redux npm install reduxjs/t…

测试服务器端口是否开通,计算退休时间

本案例知识点 netstat -tuln | grep 80 nestat 目前主机打开的网络服务端口&#xff0c;-tuln目前主机启动的服务&#xff0c;如图 报错说参数太多&#xff0c;仔细检查发现if后的中括号内&#xff0c;变量少双引号导致&#xff0c;改完之后运行显示22,25端口开放&#xff0…

关于编程不得不说的事

这些年&#xff0c;互联网爆炸式的发展&#xff0c;促生了无数程序员&#xff0c;也促生了大量 IT培训机构。短短数年间&#xff0c;科班出生的程序员和培训机构出生的程序员呈指数增长。程序员的职业也不再是金饭碗。写了这么多代码&#xff0c;有些感触&#xff0c;所以写下来…