本篇文章介绍了使用NXP公司提供的塔式快速原型系统来驱动控制带霍尔传感器的无刷直流电机。文章涉及的塔式快速原型系统主要包括以下四个独立板卡:1.塔式系统支撑模块(TWR-Elevator),用以连接微控制器以及周边模块;2.低电压3相电机控制模块(TWR-MC-LV3PH);3.通信(USB、Ethernet、CAN、RS232/485)塔式系统模块(TWR-SER);4.塔式系统K60 MCU模块(TWR-K60N512)。
文章从基础理论讲起,帮助读者梳理电机控制相关概念,了解整个电机驱动系统构成,带领读者从BLDC电机控制实现的各个开发步骤来直观体验了整个实现过程。
目录
NXP公司把电机在汽车中的应用主要分为三类:动力总成,安全和地盘以及车身和舒适。下图为这三类具体包含涉及到了电机控制的汽车部分。
电机按照实现原理又分为直流有刷电机,直流无刷电机,步进电机,永磁同步电机。下图为这四种电机在不同汽车部分的应用情况。
本文主要介绍的是带霍尔传感器的直流无刷(BLDC)电机的控制应用实现。
BLDC的定子(stator)是通电的线圈,而转子(rotor)是永磁体。换句话来说,BLDC 电机的磁体保持转动,导体保持静止。
利用磁铁同性相斥,异性相吸的原理,我们在定子上的线圈接入方向适当的电流,即让电磁铁的磁极方向和永磁体的磁极方向正好对应,不就能排斥、或者吸引转子做旋转运动了。BLDC电机将那六个线圈两两组合,分成A,B,C三个绕组(三相),这样就能同时控制两个中心对称的绕组采用相同的极性,从而提高了驱动效率,而A,B,C三个绕组又会两两结对,这样又能驱动相邻的两个转子提供不同的极性,那么转子将会获得更高的驱动力,如下面动图所示,通过AB-AC-BC-BA-CA-CB,这六个节拍(六步),依次循环驱动定子的绕组,转子就能一直旋转下去。
综上所述,换相可以产生旋转场,通过六步控制,我们总共可以获得六种可能的定子磁通向量。必须在特定的转子位置更改定子磁通向量。转子位置通常通过霍尔效应传感器检测。霍尔传感器生成三种信号,这三种信号也包含六种状态。每个霍尔传感器的状态对应特定的定子磁通向量,如下表所示。
霍尔传感器H1 | 霍尔传感器H2 | 霍尔传感器H3 | A相 | B相 | C相 |
0 | 0 | 1 | V+ | V- | NC |
0 | 1 | 1 | V+ | NC | V- |
1 | 1 | 1 | NC | V+ | V- |
1 | 0 | 0 | V- | V+ | NC |
0 | 0 | 0 | V- | NC | V+ |
0 | 0 | 1 | NC | V- | V+ |
我们现在先拿六个电子开关来理解六个节拍的转化,如下图:
对于常见的三相BLDC电机,可以使用标准的H桥驱动电路,如下图。
BLDC 电机控制应用采用互补双极开关PWM。利用互补双极开关,两相由互补 PWM 信号供电 (底部 MOSFET的开关与一相之内的顶部MOSFET的开关互补),一相的占空比大于 50%,另 一相的占空比为互补值(小于 50%),如下图所示。
互补双极开关PWM技术的优点是可以在所有四个工作象限中控制电机。双极PWM开关方案要 求顶部和底部开关PWM信号在换向事件时交换。另一个要求是在互补顶部和底部信号中插入死区。
换相可确保BLDC电机的转子正确旋转,而电机转速则仅取决于所施加电压的振幅。可使用PWM技术调整所施加电压的振幅。所需转速由速度控制器控制,速度控制器由比例 - 积分 (PI) 控制器实现。实际转速与所需转速之差为PI控制器的输入,该控制器随后根据此差值控制 PWM 脉冲的占空比,并且此占空比与维持正确转速所需的电压振幅相对应。
该系统设计用于驱动三相 BLDC 电机。该应用符合以下性能规范:
K60N512运行主控制算法。根据用户接口和反馈信号,它将会生成六路PWM输出信号(FTM0)。如果所需转速不为零,则应用启用霍尔传感器中断并强制首次调用霍尔中断程序。每个霍尔传感器的新边沿自动调用中断程序。在此霍尔中断程序中,将会扫描来自霍尔传感器的信号,并交换和屏蔽对应的 PWM 通道。此过程称为换相。霍尔传感器扫描独立于速度控制(FTM1)。速度控制循环由PIT0定时调用,此周期循环中存在速度斜坡和应用状态机。主程序中仅存在一个针对FreeMASTER协议处理的无限循环,这样就可以通过FreeMASTER上位机调试此应用。
为了使此应用正确工作,必须使用以下外设。不允许将这些外设用于其他目的。
电机驱动应用要求表明软件将提取用户接口下发的速度等参数和传感器采集的部分数值进行处理,然后生成用于电机控制的三相PWM信号。闭环BLDC电机驱动的控制数据流程图如下所示。
其中包含的关键流程如下:
实际电机速度基于旋转周期 (time_measured) 计算得出,并与用户提供的 speed_req 进行对比。随 后,通过速度斜坡算法对速度命令进行处理。从斜坡算法输出获得的实际速度命令与 speed_measured进行比较,将生成一个speed_error。 旋转周期通过霍尔传感器 A 和 flex timer 1 扫描,可在捕捉模式下对其进行配置。
速度 PI控制算法用于处理speed_req和speed_measured之间的speed_error。PI控制器输出传输至 PWM发生器,以作为所施加电机电压的新校正值。
PI控制器程序在PIT设备中断程序PIT0_isr中计算,它每10 ms被调用一次。此中断将在电机停止时禁用,从而使PI也禁用。PI控制器的积分部分在低速 (低于 499 RPM)时禁用,因为在此情况下,速度测量并不准确且PI控制器可能不稳定。要确定何时禁用,程序中存在两个宏: MIN_CW_SPEED_32和MIN_CWW_SPEED_32。
PI控制器的输入为斜坡算法speed_scaled的输出,另一个输入为实际speed_measured。另外两个 输入为PI控制器参数trMyPI结构的指针。所有这些参数均供PI控制器函数GFLIB_ControllerPIp 使用。
此函数输出为s32Output。它将按照PWM比例缩放为delta_duty并添加到half_duty。此处理结果为duty_cycle,这将被加载至Flex Timer寄存器中。 每当速度比例更改或者电机改变时,必须配置 PI速度控制器参数。
整个电机控制算法由中断驱动。主函数仅用于MCU和应用初始化;如下图所示。初始化终止时, 程序将进入无限循环或其他应用处理程序 (web 服务器、 USB、FreeMASTER协议处理等)。
为了使此电机应用正常工作,需要使用四个中断。 四个中断处理程序分别提供以下服务:
裸机版本与MQX版本的差别仅在于中断安装方法。我们这里仅仅介绍裸机版本中的安装方法。
在裸机版本中,我们可以直接安装中断。您可以通过在NVICISER寄存器中设置正确位来轻松实现中断。可以使用寄存器NVIC_IP配置中断的优先级。为了更好地理解,请看以下示例。
中断安装:
- NVICICPR2 = 0x4800010; // 首先清除可能的挂起中断
- NVICISER2 = 0x4800010; // 启用中断
- NVICICPR1 |= 0x80000000; // 首先清除可能的挂起中断
- NVICISER1 |= 0x80000000; // 启用中断
设置中断的优先级:
- NVIC_IP(63) = 0x40; // 针对 FTM1 设置优先级
- NVIC_IP(68) = 0x50; // 针对 PIT0 设置优先级
- NVIC_IP(87) = 0x40; // 针对霍尔传感器设置优先级
- NVIC_IP(90) = 0x40; // 针对霍尔传感器设置优先级
本软件除了可以通过FreeMASTER调试通信软件来控制电机速度,还可以集成到一个完整的应用中作为电机驱动来使用。要达到此目的,我们需要封装三个对外接口API:
- /************************************************************
- * 函数名称:Set_speed
- * 参数: 所需速度,带符号短整型数据格式的输入速度。输入值以 RPM 为单位。
- * 电机序号,此例仅有一个。
- * 返回:void
- * 描述:用于为每个电机输入所需速度。
- ***********************************************************/
- void Set_speed(signed short speed_input, int motor_number)
- { speed_req = INT16TOF32((speed_input*SPEED_TO_RPM_SCALE));}
-
- /*******************************************************
- * 函数名称:Get_speed
- * 参数:电机序号
- * 返回:测得的速度
- * 描述:用于获取每个电机的速度(带符号短整型数据格式).此值以 RPM 为单位。
- ******************************************************/
- signed short Get_speed(int motor_number)
- {
- signed long speed_temp;
- speed_temp = (speed_measured * MAX_SCALED_SPEED);
- return (speed_temp >> 15);
- }
-
- /***************************************************
- * 函数名称:Get_status
- * 参数:无
- * 返回:应用状态
- * 0 — 处于空闲状态
- * 1 — 处于停止状态
- * 2 — 处于正在运行状态
- **************************************************/
- unsigned char Get_status(void)
- { return App_state; }
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。