Matlab/Simulink - BLDC直流无刷电机仿真基础教程(四) - PWM调制模拟
Matlab/Simulink - BLDC直流无刷电机仿真基础教程(四) - PWM调制模拟
- 前言
- 一、PWM调制技术基本原理
- 二、仿真模型中加入PWM调制
- 三、逆变电路MOS管添加体二极管
- 四、模拟添加机械负载
- 五、仿真模型与控制框图
- 文章相关模型文件下载链接
- 参考链接
前言
本系列文章分享如何使用Matlab的Simulink功能来进行BLDC直流无刷电机的基础仿真;本篇文章将会从较为贴合实际控制情况下,讲解如何使用PWM调制技术来实现对BLDC电机的转速控制。在此感谢各位读者的支持,并欢迎交流。
文章内容主要参考Matlab官网的BLDC仿真视频教程,主要是对官方视频教程的进一步详细说明,以及对BLDC电机控制原理、仿真过程部分问题点的简要讲解,希望大家通过此系列文章可以掌握Matlab电机仿真的基本技术,并在后续能够按照需要搭建更复杂的模型。
官方视频教程地址如下:
https://ww2.mathworks.cn/videos/series/how-to-design-motor-controllers-using-simscape-electrical.html
相关演示操作在Matlab2023b中进行。
一、PWM调制技术基本原理
PWM,即脉冲宽度调制(Pulse Width Modulation),是一种将连续的模拟信号转换为脉冲序列的调制技术,也就是通过对数字信号进行调制,来等效模拟信号。
面积等效原理是PWM调制技术的重要理论基础,其原理内容是:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同;这也是应用PWM调制技术的前提。
在前面的文章中,我们搭建了一个基础的电机转速闭环控制模型,其中我们通过PID控制器来实现对电源电压的直接控制,不过在实际的物理世界中,这种方法往往不能直接实现;比如有一块电池,它的电压往往也和它的电量有关,我们做不到直接改变电池本身的电压,但是通过PWM调制技术,我们可以实现几乎等效的不同幅值电压的输出。又或者我们希望能够输出正弦波形的电压,且波形幅值、频率可以变化,结合PWM技术,同样可以做到。
PWM输出的具体形式,受到目标信号的波形、频率、幅值影响,接下来将会逐个进行简要讲解:
- 波形:不同电压幅值的直流输出,可以理解为不同高度的直线波形,此外还有正弦波、三角波等,这些波形决定了我们PWM的占空比应该如何变化;例如对于不同幅值的直流输出,可以固定占空比,幅值高的输出,对应占空比则更高,对于正弦波,则是在其波峰处占空比要高一些,而在波谷处,占空比要低一些(具体也要看电路等实际物理情况)。
- 频率:一般来说,PWM信号的频率最好远高于信号频率,例如十倍以上(涉及到采样定理);PWM频率往往直接影响着调制效果,一般来说频率越高,等效的效果就越好,但是在逆变电路中也会增加开关损耗等,需要平衡。
- 幅值:目标信号的幅值影响着PWM占空比,幅值越高,占空比也就要越高,即此时等效的信号幅值更大。
注意,PWM调制技术适用的前提是控制对象具有比较明显的惯性环节的特征,若对象的惯性极小,或对噪声、纹波非常敏感,那么PWM的表现就不太好了,或是并不适用。例如一些小电感电机,若PWM的频率不高,其电流波动会非常明显,具有比较大的电流谐波,影响控制效果;还有在电源方面,MCU通常需要使用LDO来供电,而Buck电源由于存在纹波,会对MCU正常工作产生影响。
二、仿真模型中加入PWM调制
在前面的博客中,我们搭建了如下图所示的BLDC电机速度闭环控制模型,包含有电机本体、霍尔传感器、换相逻辑模块、三相逆变器模块,以及我们的控制回路。
接下来,我们需要引入PWM调制技术,使这个仿真模型更加贴近实际的电路系统。
我们打开库浏览器,并搜索PWM,将该模块拖出到右侧。(有探索精神的朋友也可以看一下simscape库中的PWM模块如何使用。)
双击该模块,在模块配置界面,可以看到我们可以修改该模块的周期、初始延迟等参数,PWM周期和频率是倒数关系,在电机控制领域中,一般10kHz的频率就可以进行大部分基础效果的控制,对应时间也就是100us,这里我们设定其周期为1e-4(即0.0001s - 100us)。
从该配置界面,我们可以看到该模块采用输入信号数值作为占空比,也就是说我们如果给定一个0.5的数值,那么占空比就是50%,数值为1,占空比就是100%。
在正式地引入PWM模块到我们的模型之前,还需要对模型的一些部分进行调整。
- 此前在逆变器电路中放置的可控电压源,需要改回我们最开始使用的电压源(记得将电压也恢复为直流100V),并删除现在多余的电压控制输入引脚
Voltage in
。(图中红色方框部分均删除。)
- 换相逻辑模块需要补充PWM关断时的处理,也就是说我们需要为该模块添加一个新的输入引脚,表示PWM信号。
仿照matlab官网视频中的做法,这里我们设定的PWM控制逻辑是在同一相位时,上桥MOS管发PWM,下桥保持常开。
这里借用一下其他博主文章中的图片,可以看到我们这种方法对应的就是下图中的(2)H_pwm-L_on;matlab官网演示的逻辑则是相当于对BLDC电机进行正反向交替的控制,控制效果方面没有本质区别,不过实际电路中这种方法会存在MOS开关次数较多的问题,会存在较高的开关损耗。
从库浏览器中搜索swith模块,拖出后按照下图方式搭建我们新的换相逻辑模块。
这里switch的阈值设定为0.5,因为我们的PWM模块的输出仅有0和1,当PWM模块输出1时,我们启用上方的换相逻辑,也就是正常的打开对应的上桥和下桥,PWM模块输出0时,启用下方的换相逻辑,表示上桥关断,下桥继续保持打开。
此时我们的仿真模型如下图所示。
这里我们的PID控制器此前所要连接的电压输入端口已经被删除了,那么现在控制器的输出应该连接到哪里?
此前我们已经知道了PWM模块的输入信号即代表其占空比,数值越大,占空比越高,那么后续控制输出的等效的电压也就越高,是不是和我们之前直接控制电压源电压有点相似?
所以PID控制器的输出要连接到PWM模块的输入,而PWM模块的输出则是连接到我们刚刚添加的换相逻辑模块的PWM输入引脚。
这里我们对我们仿真模型模块的连接进行了调整,如上图所示。
不过此时我们的模型还不适合直接运行,因为PWM模块的输入信号要求数值在0到1,而我们的PID控制器之前输出的数值则是直接控制电压,数值可以达到上百,并不合适。
这里我们重新调整PI参数,可以直接缩小为原本参数的一千分之一。
接下来切换到“饱和”栏,勾选上输出饱和和积分器饱和的“限制输出”框,并设定两者的上限为1,下限为0,将输出限定在PWM模块输入信号的规定范围内。
点击运行,在仿真结束后,我们打开速度角速度示波器,看到角速度的变化趋势与此前的设定一致。
单纯看角速度的变化情况平平无奇,毕竟我们本身就是希望引入PWM调制来实现此前直接控制电源电压相同的效果。
切换到三相逆变器模块中,打开电流、电压示波器,可以看到现在的波形长的十分奇特。
这里选定电压窗口,为了便于展示隐藏了两相电压波形,可以看到这一相电压存在频繁的高低切换,表明我们的逆变电路正在根据PWM信号对MOS管进行快速的导通与关断的切换。
我们进一步放大电压波形,并使用游标来测量电平切换的间隔。
从右侧可以看到,相邻的两个电平之间的时间间隔竟然是1ms左右,与我们设定的100us(1ms)相去甚远。
不过别担心,物理学的大厦并没有崩塌,这里我们确实设定的PWM的输出周期是100us,而此处逆变电路模块的切换间隔是1ms的缘故是求解器设定的采样时间比较大。(不知道大家还记不记得这个久远的模块。)
我们将求解器的时间也设定为100us,重新运行并再次查看电平变化的间隔。(此时由于求解器采样时间缩短,会导致运行时间变长。)
如下图所示,可以看到这次电平变化的间隔就是100us了,与我们的设定一致。(拯救物理学大厦行动大成功)
(不过后面我们将会知道,此时的设定依然有一些问题,这一点会在之后的系列文章中进行讲解。)
关于刚刚奇特的电压电流波形,大家如果进行过一些实际调试的话,会觉得这显然存在一些问题;这种波形与实际示波器中看到的电路波形差异很大,我们会在接下来的部分讲解如何修改我们的模型,使得其更贴近实际电路情况。
三、逆变电路MOS管添加体二极管
这里我们打开逆变器模块中的各个MOS管,为其添加体二极管(红色框中所示)。
为六个MOS管模块进行同样的修改,在完成之后我们再次点击运行,观察电压波形。
有实物调试经验的朋友可以看到,现在的波形就会比较贴近在示波器中看到的实际波形;从波形的高低切换过程,我们也可以看到六步换相控制方法的特征:
最开始此相下桥导通,之后作为悬空相,电机反电动势叠加到该相,使得相电压提高(上图波形两侧下方的小三角表示逆变电路上桥没有打开时对应的相电压);接下来又作为上桥导通相,导通了两个相位周期,后续又是作为悬空相、下桥导通相,与此前讲述的六步换相次序一致。
对该波形下端部分进行放大,可以看到最低达到-0.8V电压,和刚刚配置的正向导通电压一致,也就是当电机反电动势使得相位电压小于-0.8V时,MOS管内部的体二极管导通,使得相电压钳位在-0.8V,不会达到更大的负电压。
四、模拟添加机械负载
也许这个时候可以认为模型已经比较贴近实际了,不过当我们设定转速由高速重新降低回到低速时,却发现出现了不符合预期的情况。
我们修改重复序列模块的输出值,要求现在的参考速度是达到1000后,又降低回到500。
打开我们的角速度示波器,发现电机转速达到1000后,却没有按照预期降低下来。
我们在PID输出侧放置一个示波器模块,观察PID控制器的输出,发现中间及后面部分的输出都是0,表示此时不输入电压给逆变电路;但电机速度却保持了恒定,表明我们的电机是没有负载转矩及摩擦损耗的,而我们的控制逻辑又只有正向旋转的控制,因此无法降低速度。(某种程度上讲,我们这里搭建了一个永动机。)
为了模拟实际电机受到的反向转矩,我们可以按照如下步骤来为我们的模型添加机械负载。
在库浏览器搜索Ideal Torque Source
,即理想转矩源,并拖动到右侧。
阅读其帮助文档,我们知道这个模块的C端口表示外壳,R端口表示输出轴,和我们电机模型对应端口的含义一致。这里我们将其R、C两个端口和电机的R、C两个端口连接在一起。
该模块的S端口表示信号控制端口,输出转矩数值即是我们给定S端口的信号数值(单位是N*m)。
我们按照下图方式放置、连接此模块,并在S端口连接了一个Simulink-PS Converter
模块以实现信号的转换输入,在后面添加一个Constant
模块,这里我们设定数值为-4,即不断的给BLDC电机输出轴施加一个反向的,大小为4N*m的负载转矩。
此时我们再观察角速度传感器的输出,可以看到此时转速的变化大体上符合了我们设定的参考转速的给定。
五、仿真模型与控制框图
这里我们再简要分析一下现在搭建的仿真模型与自动控制领域的控制框图的联系。
目前我们的仿真模型如下图所示。
借用其他作者文章里面的自动控制系统方框图,可以看到,我们搭建的仿真模型与这张控制框图有些相似的地方;实际上我们也确实可以将两者联系起来。
接下来我们按照从左到右,从上到下的次序,依次讲解这个自动控制系统方框图各个元素与我们的仿真模型的联系。
- 输入信号r(t),在我们的模型中实则就是
Repeating Sequence
重复序列模块,这个模块给出了我们希望达到的转速,也就是参考速度。 - 偏差信号e(t),就是输入信号减去主反馈信号,在我们的模型中,就是重复序列模块减去理想角速度传感器获得的电机转速,也是对应的。
- 串联校正元件,即PID环节,对应的就是模型中的PID控制器模块。
- 放大元件,对应实际电路系统中,一般MCU的PWM信号给到逆变电路前,还会有驱动芯片等,用于放大MCU输出的弱电控制信号;在我们的模型中,换相逻辑输出直接给到了逆变电路,可以认为放大元件和我们的执行元件(MOS管)合并在了一起。
- 执行元件,如前所述,就是我们三相逆变器模块,或者说其中的MOSFET模块。
- 控制对象,这里我们搭建的是BLDC电机控制模型,控制对象自然是BLDC电机,我们希望能够控制其转速的输出,而在实际电机运行过程中,由于摩擦转矩、负载转矩波动等,会对控制结果引入扰动。
- 输出,也就是被控量,这里我们要实现的是电机转速的闭环控制,因此模型中的输出就是电机转速。
- 并联校正元件,有时放大元件、执行元件本身参数会有波动,使用并联校正的方式来降低被包围元件参数变化的敏感性。模型中没有并联校正部分。(个人对这一点也不是很理解,欢迎指导。)
- 测量元件,即理想旋转运动传感器。
- 主反馈信号,模型中我们直接获取了转速数值,不过转速这个概念实际上是抽象的,在实际系统中,我们可能通过编码器来获取电机一定时间内转过的角度,进而计算出转速;从编码器输出的各类信号量,进一步处理为电机转速,此时我们才得到了实际参与运算的反馈信号。
- 主反馈,也就是测量元件要进行测量的物理量,实际与作为输出的电机转速含义相同。
- 此外,我们还需要注意反馈信号的极性,也就是检测到了这样的反馈信号后,我们到底是要提高控制器的输出还是降低控制器的输出;例如这里电机转速低于参考量时,我们可以增加PWM占空比,也就是等效提高输出电压;但如果我们控制不了PWM占空比,例如我们只能控制一个串联在逆变器电源上的滑动变阻器,通过改变阻值来影响电压输出,阻值越高,给到电机三相的电压越低,此时如果我们检测到的电机转速低于参考转速,而我们却增加了变阻器阻值,使得输出电压更低,进一步使得电机转速更低,此时就形成了一个预期外的正反馈,而无法达到我们的控制目的。
下一篇文章中,我们将会对官方视频展示的animateRotorPosition.m
的可视化脚本进行讲解,并展示如何修改脚本以适配我们的模型进行可视化。
文章相关模型文件下载链接
通过网盘分享的文件:BLDC直流无刷电机仿真基础教程(四) - PWM调制模拟
链接: https://pan.baidu.com/s/1ORc2kw0Dn_0dOwvcu-OzUQ?pwd=32e8 提取码: 32e8
参考链接
PWM(脉冲宽度调制)原理、应用以及实现
BLDC的基本控制
自动控制原理分析工作原理以及方框图做题过程