jjzjj

【机电杂谈2】BLDC和PMSM的特点和区别

硬件狗 2024-05-15 原文

在日常生活中,小到电动玩具,大到电动汽车,永磁电机的身影可以说是无处不在。有刷直流电机、无刷直流电机、永磁同步电机由于其结构和输出特定的不同也被应用到不同的场合。如果你经常拆一些玩具和家电,就会看到大量的有刷直流电机和无刷直流电机,而永磁同步电机主要应用在高精度的工业伺服和电动汽车领域。本文就从电机的结构和控制方面,对这几种常见的永磁电机做简单的梳理和归纳。

1、有刷直流电机和无刷直流电机

有刷直流电机是结构和控制最简单的直流电机,电机主要依靠电刷进行电流换向。使用一个电磁继电器或者半导体开关即可对其进行启停控制;如果有正反转要求,则需要4颗半导体开关器件构成H桥的形式进行正反电流的控制。使用半导体开关可以很方便的实现有刷电机的调速(通过控制PWM的占空比进行调节),因此基本上现在对于有刷电机都是采用功率MOSFET进行调速和控制。

​图1.1 有刷直流电机及其控制

有刷电机的电刷是一个易损件,因此有刷电机的使用寿命有限,并且碳刷换向过程中释放出电火花无法应用在类似煤矿、油田这类具有易燃易爆物质的场景中。无刷直流电机(BLDC)的出现得益于开关半导体和电机控制芯片的发展,无刷直流电机取消的电刷换向,而使用功率半导体进行换向,驱动拓扑几乎都是三相两电平的结构,也就是我们常说的三相桥。(更多的电机控制拓扑,关注我!后续带你探讨!)通过控制三相桥的导通时序和方向,产生牵引转子永磁体的磁场,在三相桥的切换过程中能够保持定子磁场和转子磁场一个相对比较稳定的位置(90°±30°),如图1.2所示。关于定子磁场如何根据转子进行旋转的,推荐阅读:【无中生有】旋转磁场的诞生

图1.2 无刷直流电机的控制扇区

2、无刷电机结构和反电动势的波形

无刷直流电机转子是含有永磁体的,那么这和我们经常听到的永磁同步电机(PMSM)有什么区别呢?拆文解字来看:“永磁”-两种电机都是永磁电机;“同步”-无刷直流电机稍微有点不同步(定转子夹角:90°±30°)。从字面意义上并不能完全区分这两种电机的不同,实际上我们区分这两种电机的主要依据是:电机的反电动势波形! 如图2.1所示,BLDC的反电动势波形是“梯形波”,PSPM的反电动势波形是“正弦波”。

图2.1 BLDC 和PMSM反电动势波形

那么是什么导致这两种电机的反电动势波形的不同呢?反电动势波形的控制属于电机设计过程中的关键,电机的定子排布和转子的磁场排布都对最终的反电动势波形产生影响,这里不展开讨论。如图2.2,我们大致感受下两种电机的结构差异。无刷直流电机的结构相对比较简单,定子线圈大多采用图2.1左所示的集中式绕组结构,该结构工艺简单,成本低廉,是应用范围最广的BLDC定子结构。而永磁同步电机的定子绕组更加“分布、均匀”,直觉上来看PMSM运行应该更加安静、顺滑。

图2.2 BLDC 和 PMSM定子线圈结构

3、 Six-Step和 FOC控制

对于BLDC和PMSM在电机控制上有一定的区别和联系,从外面来看硬件差别不大,都是采用三相桥的结构,通过控制PWM进行调速。但是如果我们稍微深入了解下控制的技术细节,就会发现这两种电机的控制策略和成本还是存在很大的区别。

3.1 六步控制Six-Step

不管是对BLDC还是对PMSM的控制,都需要知道转子的位置,有了转子的位置信息才能够确定三相桥的开关状态,从而控制定子的磁场方向。 由于BLDC的反电动势是梯形波,存在这样快速的“换向点”,因此检测BLDC的位置相对来讲是比较简单:可以在定子内嵌入逻辑霍尔传感器,检测转子磁钢的位置进行直接的定位;也可以通过检测反电动势的换向点进行无传感器的位置检测。根据反馈的位置信息,进一步对BLDC的通电时序进行控制,如图3.1所示。我们可以看到该控制方法关键在于:相与相之间两两导通,另外一个线圈不流过电流,可以作为反电动势的检测“传感器”。该控制的本质还是基于位置信息的通电逻辑控制,因此该控制方法对芯片的要求极低,并且不需要额外的传感器成本,因此是BLDC最主流的控制方案。但是该控制的颗粒度很大,一般来讲转矩脉动和噪音都是比较大的,对于大功率,高性能的应用场合出现的频率比较小。

图3.1 六步换向示意图

3.2 磁场定向控制FOC

磁场定向控制(FOC)的基本原理:通过高精度的角度解析,产生和转子相对静止的控制磁场,实现对PMSM的像素级控制。关键的关键就是对电机转子的位置信息获取,一般来讲有如下几种方案:

  1. 位置编码器:通过高精度的光栅感应定子旋转过程中引起的数字编码变化,从而解析转子位置信息,一般应用在高精度的伺服系统中。

  2. Hall磁编码器:通过在电机轴的端部安装的永磁体旋转,引起Hall传感器的磁感线变化,从而解析转子位置信息,一般应用在中小功率泵类驱动系统中。

  3. 旋转变压器:电机轴的旋转引起旋转变压器感应电压的变化,通过一定的解码算法,从而解析转子位置信息,一般应用在高可靠性、高寿命的电动汽车系统中。

  4. 观测器位置算法:这是一种无位置传感器的方法,通过电机模型的建模计算出反电动势的变化,从而解析出转子的位置信息,该方法可靠性高,成本低,维护方便,也是电机控制最火热的方向。笔者认为,该方案主要取代的是Hall编码器的应用市场,对于高精度,高可靠性,快速动态性能的场合应用还是比较有限。

FOC的基础磁场控制逻辑如图3.2所示,依然使用最基础的6扇区,但是和Six-Step 控制不同的是,三相桥都参与了磁场控制,并且可以通过矢量合成的方式可以做到任意角度的磁场控制。关于FOC控制,相关的研究、论文和实践可以说是“汗牛充栋”,本文不展开进行具体控制策略。关注我,后续我们有时间,继续探索!

图3.2 FOC的矢量合成示意图

3.3 BLDC的类FOC控制

在小电机的应用中,BLDC越来越广泛,对其要控制要求也是越来越高:既要低成本,也要静谧性!我们知道Six-Step的转矩脉动很大,电机功率小的应用还能忍受,电机功率稍微到几百瓦这个量级,噪音成为了产品的短板!因此,很多厂家也推出了类FOC的控制方案去控制BLDC,这类方案在不增加系统成本得前提下,使BLDC运行的更安静! 所谓类FOC,其实最主要的就是我们把BLDC的角度进行更细的划分,那么这个更细角度主要是靠:猜!通过反电动势检测,我们能够检测出60°的反电动势换向点,那么在这个60°之间的角度,就要根据电机的运行速度和状态去插值,从而产生类似的平稳的“定向磁场”。 现在还有一个问题,就是三相都参与调制的情况下如何检测反电动势换向点?可以采用低成本数字Hall芯片进行磁钢位置检测,也可以通过驱动的适当控制,检测反电动换向点。如图3.3所示,是ELMOS所采用的一种的算法:就是在死区时间段内,检测相电压信号,从而获得相电流的方向信息,进而找出相电流的过零点。从相电流推断反电动势过零点,可以预见该方法的环路响应是比较慢的。

图3.3 ELMOS 反电动势过零预测

小结

本文简述了常见的永磁电机的基本类型:有刷电机、无刷电机和永磁同步电机。分别从电机结构,反电动势波形和控制方法上进行了比较,对其应用的场景和范围进行了总结。 关注我!后续带你了解更多最硬核的硬件电子技术!

参考资料:

  1. https://zhuanlan.zhihu.com/p/109480589

  2. https://zhuanlan.zhihu.com/p/415924876

有关【机电杂谈2】BLDC和PMSM的特点和区别的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  3. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  4. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  5. ruby - 这两段代码有什么区别? - 2

    打印1:defsum(i)i=i+[2]end$x=[1]sum($x)print$x打印12:defsum(i)i.push(2)end$x=[1]sum($x)print$x后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类Array的任何方法(不仅是push)都会发生这种情况吗? 最佳答案 变量范围在这里无关紧要。在第一段代码中,您仅使用赋值运算符=为变量i赋值,而在第二段代码中,您正在修改$x(也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性

  6. ruby - Ruby 中 .next 和 .succ 的区别 - 2

    Ruby中的Fixnum方法.next和.succ有什么区别?看起来它的工作原理是一样的:1.next=>21.succ=>2如果有什么不同,为什么有两种方法做同样的事情? 最佳答案 它们是等价的。Fixnum#succ只是Fixnum#next的同义词。他们甚至在thereferencemanual中共享同一block. 关于ruby-Ruby中.next和.succ的区别,我们在StackOverflow上找到一个类似的问题: https://stacko

  7. ruby - 在参数为 `yield self` 的方法中使用 `&block` 和在没有参数 `yield self` 的方法中使用 `&block` 有什么区别吗? - 2

    我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti

  8. ruby - 无法理解 `puts{}.class` 和 `puts({}.class)` 之间的区别 - 2

    由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A

  9. ruby - [1,2,3].to_enum 和 [1,2,3].enum_for 在 Ruby 中的区别 - 2

    在Ruby中,我试图理解to_enum和enum_for方法。在我提出问题之前,我提供了一些示例代码和两个示例来帮助理解上下文。示例代码:#replicatesgroup_bymethodonArrayclassclassArraydefgroup_by2(&input_block)returnself.enum_for(:group_by2)unlessblock_given?hash=Hash.new{|h,k|h[k]=[]}self.each{|e|hash[input_block.call(e)]示例#1:irb(main)>puts[1,2,3].group_by2.ins

  10. ruby - Capistrano 中的执行、测试和捕获命令有什么区别? - 2

    关于SSHkit-Github它说:Allbackendssupporttheexecute(*args),test(*args)&capture(*args)来自SSHkit-Rubydoc,我明白execute实际上是test的别名?test之间有什么区别?,execute,capture在Capistrano/SSHKit中我应该什么时候使用? 最佳答案 执行只是执行命令。使用非0退出引发错误。测试方法的行为与execute完全相同,但是它返回bool值(true如果命令以0退出,而false否则)。它通常用于控制任务中的流程

随机推荐