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