掌握MCU软件设计准则 实现直流马达控制精准度提升
扫描二维码
随时随地手机看文章
300瓦以下的小功率马达适合以MCU做为控制方案,在各家MCU硬件规格差异化日渐缩小之下,软件演算设计就显得相形重要,若能掌握MCU控制各种直流马达的软件设计原则,将能大幅提升马达控制的精准度。
运作在300瓦(W)以下的小功率马达被广泛应用于各类应用,例如汽车系统、打印机、复印机、碎纸机、玩具、工厂自动化、测试设备、机器人技术、航空航天与军工等。最流行的小功率马达类型是直流(DC)马达、无刷直流马达(BLDC)和步进马达。马达的产量大致与功率大小成反比,量产的小功率马达数量远远高于大功率马达数量。
专用于马达控制的数字信号处理器(DSP)设计主要在满足大型脱机式马达的需求。脱机马达通常为交流(AC)感应或无刷直流马达,运行在110-480VAC和1/4-100马力(HP)。专用于马达控制的DSP,对于小功率马达控制系统来说,成本太高。
本文提供使用微控制器(MCU)控制各类马达的软件范例。虽然这些范例相对简单,但其针对各类马达提供有效的解决方案。一个传统的马达控制系统通常要求额外特性并具有更高的复杂度。这些软件范例能够做为开发更复杂马达驱动系统的基础。
借助软件演算 DC有刷马达功耗下降
DC马达在小功率马达中是最常见和最便宜的。在本文中,DC马达主要指的是有刷换向永磁直流马达。
DC马达的特性使其成为变速系统中最简单易使用的马达。DC马达的转矩-速度特性如图1所示,DC马达的非负载速度与马达电源电压成线性关系。驱动稳定扭矩负载、线性负载或指数负载的DC马达的电压-速度特性也是连续的、正斜率的和可预测的,因此,在大多数情况下,使用开放回路控制系统是可行的。简单地改变通过马达的电压,任何人都能够控制马达的速度。脉宽调变(PWM)能够用于改变马达供电电压,加载到马达的平均电压与PWM工作周期比成正比例关系(这里忽略马达电感和不连续运行导致的次要影响)。
图1 DC马达特性
这里提供一个以MCU控制DC马达的简单例子。在这个范例中,使用模拟数字转换器(ADC)读取电位器的位置信息,并使用PCA 8位PWM模式输出对应的PWM信号(图2)。
图2 DC马达驱动电路
单个N通道功率金属氧化物半导体场效晶体管(MOSFET)Q1用于驱动DC马达。功率MOSFET应当根据特定的马达电压和电流需求进行选择。飞轮二极管的D1跨接到DC马达。当MOSFET关闭时,电流通过马达自感继续流动,MOSFET漏极电压将上升到超过马达电源电压的一个二极管压降,然后,电流经由飞轮二极管继续流动。
大多数低压马达驱动电路利用萧特基功率整流器实现飞轮二极管,萧特基整流器具有较低的正向电压和极短的反向恢复时间。这两者在马达驱动应用中都是非常重要的参数因子。
功率MOSFET由反向闸极驱动器驱动。F300的端口引脚默认配置为输入引脚,并且启用弱的100k上拉电阻。在端口被配置而且交叉开关器和周边启用之前,端口引脚一直保持高电平。当复位接脚保持低电平时,端口接脚也会被配置为弱上拉启用的输入接脚。透过使用反向驱动器,功率晶体管在预设状态下处于关闭状态。如果使用非反相器驱动,10k下拉电阻应当端口引脚和接地。
为使用3伏特(V)微控制器,闸极驱动器应当具有3V相容的输入电平临界值。如果马达电压在5-15V之间,闸极驱动器能够直接切断马达电源电压。如果马达电压超过15V,分开的闸极驱动器电源电压是需要的,通常为5V或者12V。当采用低于10V的闸极驱动器电源电压时,应当使用逻辑电平功率MOSFET。
软件实现非常简单。main()函数初始化频率、端口和周边,然后进入while(1)回路。在while(1)中使用avgADC()函数读取电位器电压值,然后输出这个值到8位PWM。
PORT_Init()函数配置端口输入/输出(I/O)、周边、?用数位交叉开关器。在这里,为8位PWM?用端口引脚,为闸极驱动器?用推挽式输出引脚。
系统频率SYSCLK被配置运行在24.5MHz最大速率,这允许8位PWM可配置为160奈秒(ns)频率周期和24kHz频率。
ADC0_Init()函数配置ADC为查询模式。ADC增益设定为1,并且为ADC频率选择1MHz保守频率。重要的是,这里也要初始化电压参考,配置ADC使用VDD满量程。
函数readADC()采用查询模式读取电压值一次,并返回ADC值。函数avgADC()调用readADC()函数,并且返回六十四个采样值的平均值。平均化ADC读数可以最小化噪声影响,减少PWM输出抖动。
当使用PCA 8位PWM模式时,在CEX0输出0x00值对应到100%的工作周期比;输出0xFF值对应到0.39%的工作周期比,0%的工作周期比可以透过清除PCA0CPM0 SFR中的ECOM0位来实现。
当使用反向驱动器时,这种关系是相反的。在MOSFET闸极驱动器上,0x00值对应到0%的工作周期比,0xFF值对应到99.6%的工作周期比为了简单起见,本文中所有使用8位PWM的软件范例都仅限于使用99.6%PWM。
在一些情况下,100%的工作周期比是可取的,100%工作周期比将有效的消除开关损耗。由于MOSFET从不会关闭,因此在MOSFET上没有开关损耗,在二极管上也没有损失,唯一的功率损耗是功率MOSFET中的传导损耗。如果马达预计在大部分时间里都处于全速运作,100%的最大工作周期比是合理的。100%的工作周期比,可以经由清除PCA0CPM0 SFR中的ECOM0位来实现。
MCU软件襄助 永磁DC马达更适于反转应用
永磁DC马达通常被用于须要反转马达方向的应用中。为了反转旋转方向,须要反转马达上电压的极性。这须要使用H桥电路(图3),H桥电路有四个晶体管。当在正方向驱动马达时,Q4打开,PWM信号应用于晶体管Q1。在反方向上驱动马达,Q3打开,PWM信号应用于晶体管Q2。在这个范例中,下部的晶体管被用于PWM速度控制;上部的晶体管被用于转向,使用这种拓扑结构,可以在两个方向上提供变速控制。
图3 DC马达全桥电路
在图3中,N通道功率MOSFET被用于低压侧晶体管,P通道功率MOSFET被用于高压侧晶体管。对于驱动20V以下的DC马达来说,利用互补功率MOSFET是非常符合成本效益的。如图3所示,低压侧闸极驱动器带有反相器;而高压侧闸极驱动器没有反相器。闸极驱动器极性被选择,以确保当端口引脚在弱上拉?动的重置配置模式下,功率晶体管处于关闭状态。
该范例软件建构在基本范例代码上。主回路现在包括一个if语句检查反转开关SW1的状态。当反转按键被按下,PWM停止运作,同时所有P0输出也同样被禁止。当按键释放后,马达将反转方向。范例软件中的初始化函数类似于DC有刷马达控制,只是除了增加额外的推挽式输出引脚配置之外。
调用reverse()函数反转马达方向。标志位Fwd用于保存马达状态,Fwd位被切换用于判断哪些输出须要启动。
反转马达还存在一个潜在的问题。当反转开关SW1被按下时,马达可能由于马达惯性而继续旋转一段时间。当马达正在转动时,它将产生与马达速度成比例关系的反向电动势;如果马达停止旋转之前反向按键被释放,马达反向电动势将透过上部晶体管而短路,如下所述。
参考图4,假设开始时Q4处于打开状态,马达正在正方向上旋转;假设马达正在运行,并且反向电动势大约为6V。现在反转开关被按下,所有四个晶体管被关闭,马达右侧将比左侧高约6V;然后开关释放,打开Q3,马达左侧被上拉到电源电压,马达的反向电动势必透过Q4的内部二极管而短路。
图4 DC马达反转危害
最终的结果是,马达停止,在马达机械惯性中储存的所有能量被注入Q4。反转过程中很容易损坏上部晶体管,在一些具有较大摩擦力负载的应用中,一个固定延迟时间可以确保马达有足够时间停止。而在其他应用中,马达可能须要花费几秒钟才完全停止,这个问题的通用解决方案,如图4所示。
软件防护法助力 DC马达反转控制更安全
这个用于DC马达的软件范例基于第二个范例,提供软件防护方法。为了安全的反转DC马达,我们须要判断马达是否还处于运转中。
确定马达是否仍然处于旋转状态的简单而有效方法,是测量跨接在马达端子上的电压差。ADC能够被配置,去测量模拟多路选择器中的任意两个输入引脚上的差动电压。可程序设计的窗口检测器也可以用于判断差动电压是否属于默认极限。在这个范例软件中,如果差动马达电压在100毫秒(ms)内保持在满量程的3%以下,那么马达即开始反转。具备电压感应功能的DC马达驱动的硬件实现,类似于在马达端子上分别添加两个电阻分压器(图5)。
图5 带有电压感应能力的DC马达驱动
主回路已经被改进用来检测马达是否停止。detectStop()函数首先配置ADC去测量差动电压,ADC和窗口检测器都适用于查询模式。如果ADC值在默认窗口范围内,那么计数器增加。使用实现10ms延迟的定时器T0设置采样时间,任何在窗口之外的采样值将重置定时器,退出while回路之前,它将使用十个连续的采样值;返回到主回路之前,detectStop()函数将重新配置ADC去测量速度电位器。
凭借软件算法 无刷直流马达变速控制性能大增
无刷直流马达提供一些传统有刷换向DC马达所没有的优点。电子和传感器有效的替代电刷角色,提供更长的寿命,减少维护操作,并且没有电刷噪声。正确整流的无刷直流马达的扭矩-速度特性完全相同于如图1所示的DC马达,因此,无刷直流马达展现出与DC马达相同的满足需求的质量,非常适用于变速控制。这个范例为使用霍尔效应传感器控制马达换向的无刷直流马达,提供简单的开放回路控制,无刷直流马达的速度使用简单的电位器控制。在这种方式下的无刷直流马达控制的特点,类似于经典DC马达控制范例。
这个范例的硬件实现如图6所示。马达由六个功率晶体管驱动,构成三相桥式结构。下部的晶体管Q1-3是N通道功率MOSFET;上部的三个晶体管是P通道功率MOSFET。这样就简化闸极驱动器管理,此外,互补闸极驱动器的使用使得在预设状态下,功率晶体管处于关闭状态。
图6 无刷DC马达驱动
霍尔效应传感器有开集电极输出,需要上拉电阻。检查马达规格确保霍尔效应传感器是适合配置的,开集电极输出通常是3V兼容的,然而,霍尔效应传感器也需要一个偏置电源,通常须要超过3V。在大多数系统中,霍尔效应传感器能够关闭马达电源电压,或者闸极驱动器电源电压。
使用断点调变软件可能会将马达和MOSFET置于不良状态。当MCU遇到一个断点时,引脚被及时的有效冻结,而且可以留下PWM输出处于启动状态。这里推荐的流程是在进行单步调变或者使用断点之前,一直断开马达电源连接。BLDC马达在跨越绕组时,将会满电压失速。BLDC马达失速电流仅仅与绕组的内阻相关,这很可能损坏功率MOSFET。
PORT_Init()函数对交叉开关器和输出引脚分配进行设置。额外的控制引脚为3-相控制而设置为推挽式输出,为读取霍尔传感器而设置为输入。
可程序设计计数器数组时基采用160ns,启动计数器。然而,模块0模式SFR没有初始化为8位PWM。在霍尔效应位置被确定之前,没有马达驱动被?用。
main()函数首先初始化相关资源,设置start标志位。主回路首先使用hallPosition()函数检测霍尔效应传感器的位置。如果start标志位被设置或者霍尔位置已经改变,马达透过调用commutate()函数进行换向。接下来,速度输入被读取,速度设置被写入PWM输出。
hallPosition()函数在错误状态时返回0,这发生在霍尔效应输入全为高或全为低时。如果错误发生,主回路经过调用coast()函数使所有输出无效;起始位也在错误条件发生时置位,而迫使换向发生在下一个合法的霍尔位置读数时。[!--empirenews.page--]
readHalls()函数在霍尔效应输入端口引脚上读取,并且去除霍尔效应编码抖动,该函数等待三个连续的相同读数。当霍尔编码正在改变时,这种方式降低错误读数的可能性。
hallPosition()首先透过上面描述的readHalls()函数读取霍尔效应编码。霍尔编码模式被储存在常量数组hallPattern[]中。为了匹配霍尔效应编码,一个带有后递减的单行for回路被用于寻找对应的索引。hallPosition()函数如果发现一个匹配的模式,则返回1-6中的一个值;如果没有发现匹配,hallPosition()函数返回0值。
commutate()函数用来在启动时初始化输出,当霍尔位置改变时改变输出状态,并且在检测到霍尔错误后重新启动马达。commutate()函数首先禁止PWM和上部的晶体管,然后,它才使用从hallPosition()函数中获得的索引。
对于霍尔效应模式或者整流模式来说,没有统一的标准。请参阅你所使用之特定马达制造商所提供的数据手册,依据制造商的资料手册仔细查核两种模式。同时,也请检查霍尔效应模式和整流模式之间的通信,必要时请改变两种模式之间的位移。