首先,我们需要知道BLDC是什么,BLDC指的是无刷直流电机,无刷直流电机(Brushless Direct Current Motor, BLDCM)克服了有刷直流电机的先天性缺陷,以电子换向器取代了机械换向器,所以无刷直流电机既具有直流电机良好的调速性能等特点,又具有交流电机结构简单、无换向火花、噪音小,寿命长,运行可靠和易于维护等优点。无刷直流电机的实质是直流电源输入,采用电子逆变器将直流电转换为交流电,有转子位置反馈的三相交流永磁同步电机。
当两头的线圈通上电流时,根据右手螺旋定则,会产生方向指向右的外加磁感应强度B(如粗箭头方向所示),而中间的转子会尽量使自己内部的磁感线方向与外磁感线方向保持一致,以形成一个最短闭合磁力线回路,这样内转子就会按逆时针方向旋转了。
当转子磁场方向与外部磁场方向垂直时,转子所受的转动力矩最大。注意这里说的是“力矩”最大,而不是“力”最大。诚然,在转子磁场与外部磁场方向一致时,转子所受磁力最大,但此时转子呈水平状态,力臂为0,当然也就不会转动了。补充一句,力矩是力与力臂的乘积。其中一个为零,乘积就为零了。以上就是BLDC旋转的基本原理。
下图为一对极电机旋转示意图,三个霍尔H1、H2、H3间隔120°放置一周,根据霍尔的输出状态,不断的改变A、B、C三相通电顺序,使定子形成一个旋转磁场,带动转子旋转。
电机按一定方向转动时,3个霍尔的输出会按照6步的规律变化如下:
BLDC有感控制系统如下:根据霍尔信号的换向顺序图,红线的方向为电流的方向,标记红线的管为打开的MOS管,每次换向只为其中的两相通电。
按照这样的顺序给ABC三相加电,电机就会全速旋转起来,如果想反向旋转,按照霍尔的反向顺序给三相供电即可。直流电机的转速和电压是成正比的,如果想改变转速只需要改变导通的MOS管的PWM占空比即可,相当于调压。
PWM的调节一般有三种方式,下桥臂打开,只调节上桥臂,比如第一个状态,UB给正UC给负,Q3 Q4打开,电流从Q3流向B再经C流出到Q4最后至电源的负极。那么就可以只调节上桥臂Q3的占空比,而Q4一直打开;也可以Q3常开只调节Q4;还有一种方式为互补PWM调节,Q3和Q2为一组互补输出,Q5与Q4为一组互补输出,Q1和Q0关断;互补的好处是上管关断的瞬间电流可以由下管续流而不经过MOS管的内部续流二极管,以免在大电流时造成MOS管的烧坏。
BLDC速度控制
在BLDC电子换相的基础上,通过更改导通时PWM占空比即可改变等效的输出电压, 从而更改来实现调速。
有感BLDC程序开源
根据之前分享的AutoChips AC7801x电机demo板的硬件电路和相关的驱动程序,就可以写一个简单的BLDC方波控制程序。
hall传感器接口
PC8 |
PWDT_IN0 |
PC7 |
PWDT_IN1 |
PC6 |
PWDT_IN2 |
VR:AD调速
电机驱动IO引脚
PB5 |
PWM1_CH0 |
PB4 |
PWM1_CH1 |
PB8 |
PWM1_CH2 |
PB7 |
PWM1_CH3 |
PB10 |
PWM1_CH4 |
PB9 |
PWM1_CH5 |
电机驱动程序
void BLDC_PhaseSwitch(int16_t motorDir, uint8_t hallStatus)
{
if(motorDir == 1)
{
switch (hallStatus)
{
case 5://B+,A-
BLDC_PwmUpdate(PHASEB, PHASEA);
break;
case 1: //B+,C-
BLDC_PwmUpdate(PHASEB, PHASEC);
break;
case 3: //A+,C-
BLDC_PwmUpdate(PHASEA, PHASEC);
break;
case 2:// A+,B-
BLDC_PwmUpdate(PHASEA, PHASEB);
break;
case 6: //C+,B-
BLDC_PwmUpdate(PHASEC, PHASEB);
break;
case 4://C+,A-
BLDC_PwmUpdate(PHASEC, PHASEA);
break;
default:
BLDC_Stop();
break;
}
}
else if(motorDir == 2)
{
switch (hallStatus)
{
case 5://A+,B-
BLDC_PwmUpdate(PHASEA, PHASEB);
break;
case 1: //C+,B-
BLDC_PwmUpdate(PHASEC, PHASEB);
break;
case 3: //C+,A-
BLDC_PwmUpdate(PHASEC, PHASEA);
break;
case 2:// B+,A-
BLDC_PwmUpdate(PHASEB, PHASEA);
break;
case 6: //B+,C-
BLDC_PwmUpdate(PHASEB, PHASEC);
break;
case 4://A+,C-
BLDC_PwmUpdate(PHASEA, PHASEC);
break;
default:
BLDC_Stop();
break;
}
}
}
main.c文件
int main(void)
{
GPIO_LedInit();
MC_PWDT1_Init();
CTU_Config();
ADC_init();
TIMER_PrdInit();
BLDC_PWM_Init();
//发波调试
g_startupPwmRatio = ratio_q12(10);//30
BLDC_SetMotorSpeed(g_startupPwmRatio);
g_hallStatus = PWDT_GetHallStatus(PWDT1) & 0x07;
BLDC_PhaseSwitch(1,g_hallStatus);
while(1)
{
GPIO_ToggleLedPrd();
if(g_scanKeyTime >= SCAN_KEY_INTVL)
{
g_scanKeyTime = 0;
AdjustPwmVal = (g_ADCValueBuffer[0]*100)>>12;//AD调速
if(AdjustPwmVal != AdjustPwmValpre)
{
if(AdjustPwmVal > 80)
{
AdjustPwmVal = 80;
}
else if(AdjustPwmVal < 8)
{
AdjustPwmVal = 8;
}
g_startupPwmRatio = ratio_q12(AdjustPwmVal);//30
BLDC_SetMotorSpeed(g_startupPwmRatio); //设置速度
}
}
if(g_hallStatus != g_hallStatuspre)
{
BLDC_PhaseSwitch(1,g_hallStatus);//换相
g_hallStatuspre = g_hallStatus;
}
}
}
编译工程,下载程序运行可直以看到电机成功转动起来,用示波器可以看到三相线上的输出电压波形图如下:
程序在此
BLDC_SHALL2.rar
(1.78 MB, 下载次数: 34)
请看调速波形动态图,哈哈