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

直流无刷电机(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.niftyadmin.cn/n/5153994.html

相关文章

java高级之单元测试、反射

1、Junit测试工具 Test定义测试方法 1.被BeforeClass标记的方法,执行在所有方法之前 2.被AfterCalss标记的方法&#xff0c;执行在所有方法之后 3.被Before标记的方法&#xff0c;执行在每一个Test方法之前 4.被After标记的方法&#xff0c;执行在每一个Test方法之后 public …

C# 基类中的虚函数调用基类的虚函数执行的是派生类实现的对应函数吗

答案 &#xff1a; 是的。 比如基类Base中有两个virtual 函数A和B&#xff0c;然后派生类为Derive&#xff0c;override了函数A记为A&#xff0c;override了函数B记为B&#xff0c;且B之中会执行base.B的逻辑&#xff1b; 在Base中&#xff0c;B调用了A的逻辑&#xff0c;那么外…

高等数学教材重难点题型总结(十二)无穷级数

最后一更&#xff01;原谅博主已经开始瞎写字了&#xff0c;最近压力太大&#xff0c;以后有时间用mathPix打出来&#xff0c;看起来更舒适一些~ 高数最后一章&#xff0c;重点在于审敛法和求解幂级数的收敛半径~ 高数基础笔记全部更新完毕&#xff0c;共12*336期&#xff0c…

多媒体应用设计师 2023年(含答案回忆版)

以下是小红书上的回忆版 软考考完疯狂回忆&#xff0c;多媒体应用设计师选择题 1.pattern 2.effective 3.merge 4.applications 5.graphic 6.udp 7.rtp 8.rtsp 9.10cm 10.永久 11…97 12.工作技术管理标准 13.管理型元数据 14.premiere 15.wave 16.500km/h 17.3M 18.44000 19.…

OpenMMlab导出mobilenet-v2的onnx模型并推理

使用mmpretrain导出mobilenet-v2的onnx模型: import torch import numpy as np from mmpretrain import get_modelmodel get_model(mobilenet-v2_8xb32_in1k,pretrainedmobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth, devicecpu) input torch.zeros(1, 3, 224, 22…

使用 javascript 在 n*m 网格中演示 BFS 广度优先搜索算法在带权重图中求最短路径

普通的广度优先最短路径搜索算法只能解决无权重的图&#xff1a; 求出的最短路径没问题&#xff0c;但是如果上边的空缺格子的距离为100呢&#xff1f;这种方式搜出的最短路径可能就是错的&#xff1a; 我们可以找一个距离1作为基本距离&#xff0c;然后距离为100的格子在搜索时…

浅谈事件冒泡和事件捕获

事件冒泡和事件捕获分别由微软和网景公司提出&#xff0c;这两个概念都是为了解决页面中事件流&#xff08;事件发生顺序&#xff09;的问题。 <div id"div1"><div id"div2"><div id"div3">click</div></div> <…

[LeetCode]-160. 相交链表-141. 环形链表-142.环形链表II-138.随机链表的复制

目录 160.相交链表 题目 思路 代码 141.环形链表 题目 思路 代码 142.环形链表II 题目 思路 代码 160.相交链表 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 给你两个…