TLE9879 DEMO实现3相无感BLDC电机的运转
在用DEMO进行控制3相直流无刷电机之前先了解下,直流无刷电机的相关基础知识。
无刷直流(Brushless Direct Current, BLDC)电机是一种正快速普及的电机类型,它可在家用电器、汽车、航空航天、消费品、医疗、工业自动化设备和仪器等行业中使用。正如名称指出的那样,BLDC 电机不用电刷来换向,而是使用电子换向。BLDC 电机和有刷直流电机以及感应电机相比,有许多优点。其中包括:
? 更好的转速-转矩特性 ? 快速动态响应 ? 高效率 ? 使用寿命长 ? 运转无噪音 ? 较高的转速范围
此外,由于输出转矩与电机体积之比更高,使之在需要着重考虑空间与重量因素的应用中,大有用武之地。BLDC 电机可配置为单相、两相和三相。定子绕组的数量与其类型对应。三相电机最受欢迎,使用最普遍。定子绕组类型有两种:梯形与正弦。以定子绕组中线圈的互连方式为依据来区分这两种电机,不同的连接方式会产生不同类型的反电动势(Electromotive Force,EMF)。图1与图2为这两种形式的图:
反电动势的定义
BLDC 电机转动时,每个绕组都会产生叫做反电动势(反电动势)的电压,根据楞次定律,其方向与提供给绕组的主电压相反。这一反电动势的极性与励磁电压相反。反电动势主要取决于三个因素:
? 转子角速度
? 转子磁体产生的磁场
? 定子绕组的匝数
公式 1: 反电动势 = (E) ∝ NlrBω
其中:
N 是每相绕组的匝数, l 是转子的长度, r 是转子的内径, B 是转子磁场密度,
ω 是电机的角速度
转子磁场和定子绕组的匝数都是固定的,唯一决定反电动势的因素就是角速度,或者说转子转速,随着转子转速的提高,反电动势也随之增加。电机技术规范提供了一个称为反电动势常数的参数(见表 A-1:“典型的电机技术规范”)及表A-2描述了常规的相关名词解释。反电动势常数的参数可用于估计给定转速下的反电动势。绕组两端的压降可通过从供电电压中减去反电动势值算出。使用反电动势常数设计电机的方法如下:当电机以额定转速运行时,反电动势和供电电压间的电势差足以使电机消耗额定电流,提供额定转矩。如果电机转速超过额定转速,反电动势会显著增长,从而降低绕组两端的压降,减小电流,从而导致转矩曲线下降。转速曲线上最后一点表示供电电压等于反电动势与电机中压降损耗之和,此时电流和转矩都等于 0。
BLDC 电机的无传感器控制
BLDC 电机除了用霍尔传感器信号来进换向外还可通过监视反电动势信号来换向。下图展示了 BLDC电机无传感器控制的框图。
具体的工作原理,由上面的结构图示意图也基本显示了,这里也不再多描述。由于没有了霍尔,电机无法知道转子当前的位置所以就无法换相,而感应电动势也只有在转起来之后才有,所以无感模式的启动是个难点。一般方法都是分三段法:1 预定位 2 启动 3 进入闭环反馈:
1. 预定为就是强制给某一相通电一段时间,让电机定位到这个位置。占空比30-50%不要太大,可能会发热。
2. 启动,就是逐步的强制换相,当然要有个加速的过程,使电机转起来。
这个过程太慢会抖动反转,太快会丢步。参数需要一点点试,有点像控制步进电机。要能使电机转的能产生电动势,我也是参照的德国MK 电调的算法。每次延时时间比上一次少1/25,形成一个加速的过程,直到电机完全转起来产生足够的电动势。
3. 闭环反馈控制换相跟有感差不多一样。
要考虑的另一个方面是电机转速极慢的情况,由于反电动势与转子转速成正比,在极慢的转速下反电动势的幅值很低,很难检测到过零点。因此,当电机从静止状态起动时必须采用开环控制,待有足以检测到过零点的反电动势时,才转而采用反电动势检测控制。可检测到反电动势的最低转速可通过该电机的反电动势常数算出。用这种方法换向无需霍尔传感器,在某些电机中连霍尔传感器磁体也不需要了。这就简化了电机结构,同时节约了成本。如果电机在多灰尘或多油的环境中运行,需要不时清洁才能确保霍尔传感器检测正常,在这种情况下使用无传感器控制自然很有优势。电机安装在难以检修的位置时同样也是如此。
下面是用TLE9879 DEMO进行控制3相BLDC无感马达,首先是电路实物的连接如下图所示:
本实验电机是可两用的电机即可当作无霍尔传感器使用,同时也有备用霍尔传感器的接口,下图是3相无刷内部拆解图。
接下来是程序的编写,主要是调用KEIL软件里自带的例程。
程序名称:BLDC Block Commutation Sensorless (BEMF)
此程序的标配的马达型号是: QBL4208 所以如果用的马达不是标配的需要更改电极对数。
MAIN.C
#include <tle_device.h>
#include "Emo_BEMF.h"
static void Main_lStartMotor(void);
static void Main_lStopMotor(void);
static uint8 bMotorRun;
/** rief Executes main test code.
*
* param None
* eturn None
*
*/
int main(void)
{
TLE_Init();
Emo_Init();
Emo_setspeedreferenz(500);//此处里的数字是改电机转速,数字越小,转速越小;
for (;;)
{
/* Service watch-dog */
(void)WDT1_Service();
/* Wait for MON button pressed */
if (MON_Debounce(0u) == 0u)
{
if (bMotorRun == 0u)
{
/* Start motor to run up to the desired speed */
Main_lStartMotor();
bMotorRun = 1u;
}
else
{
/* Stop motor */
Main_lStopMotor();
bMotorRun = 0u;
}
/* Wait until MON button is released */
while (MON_Debounce(1u) == 0u) {}
}
}
} /* End of main() */
void Main_HandleSysTick(void)
{
} /* End of Main_HandleSysTick */
static void Main_lStartMotor(void)
{
uint32 Error;
Error = EMO_ERROR_NONE;
if (Error == EMO_ERROR_NONE)
{
Error = Emo_StartMotor();
}
if (Error == EMO_ERROR_NONE)
{
}
else /* Error */
{
}
} /* End of Main_lStartMotor */
static void Main_lStopMotor(void)
{
uint32 Error;
Error = Emo_StopMotor();
if (Error != EMO_ERROR_NONE)
{
}
} /* End of Main_lStopMotor */
只有注册用户才能在此添加评论。 如果您已经注册,请登录。 如果您还没有注册,请注册并登录。