1.无传感器无刷直流电机控制原理
2.无传感器无刷直流电机开发板部分硬件电路分析
3.无传感器无刷直流电机部分代码分析与运行结果
①硬件上,增加了电机本身的质量和尺寸,不易安装与维护,且霍尔传感器本身存在着一定的磁不敏感区;
②应用上,霍尔传感器安装的精度和灵敏度会影响电机的运行性能,且传感器不能很好的适应恶劣的工作环境。
直流电动机最初起动时,励磁绕组建立一个磁场,电枢电流产生另一个磁场,两磁场相互作用,起动电动机运行。电枢绕组在磁场中旋转,因此产生发电机效应。实际上旋转电枢产生一个感应电动势,与电枢电压极性相反,这种自感应电动势称为反电动势。同理,在无刷直流电机中,受定子绕组产生的合成磁场的作用,转子沿着一定的方向连续转动。电机定子上放有电枢绕组。因此,转子一旦旋转,就会在空间形成导体切割磁力线的情况。根据电磁感应定律可知,导体切割磁力线会在导体中产生感应电势。所以,在转子旋转的时候就会在定子绕组中产生感应电势,即反电动势。
同有传感器无刷直流电机一样,无传感器无刷直流电机也采用六步换相控制,每一个换相周期,将有一相绕组处于不导通状态。因此通过检测第三相反电动势信号,可检测到转子微极在该绕组经过的时刻。反电动势检测原理图下图所示,在AB绕组通电时应检测C相反电动势电压。
对于120°有传感器无刷直流电机,其反电势和传感器信号下图所示,需要注意的点如下:
① 有传感器和无传感器无刷直流电机的控制都采用六步换相控制;
② 使用无传感器无刷直流电机控制,当检测到过零点时,需要延后30个角度再换相。
无传感器无刷直流电机需要采用三段式启动的原因:
① 硬件上,对于小功率电机,直接上电启动时电流是非常大的,容易导致硬件电路短路或者减少电子器件的寿命;电流过大容易引起过热去磁问题,容易导致电机启动失败;启动过快还会引起机械负载的冲击等。
② 应用上,定子绕组的反电动势同电机的转速成正比,也就是说,当电机未上电时,无法根据反电动势检测转子的状态,也就无法达到电机的控制效果。
三段式启动包括:转子预定位、加速和运动状态转换三步,三段式启动的好处是,可以是电机达到可控效果,提高电机控制的稳定性,同时也是对电机本身的一种合理应用,增加其使用周期。下面是对三段式启动的具体分析:
1)转子预定位
刚开始电机在静止情况下,而且开始不知道转子的情况下,可以进行通过对三相电机的其中两相通电,等待一段时间,然后再对电机相邻状态的两相通电,此时转子会转动,并且会转动到当前两相合成磁场的所在的位置。注意预定位中pwm以及的通电的等待时间,需要根据实际情况选取。
2)加速运行阶段
pwm的开始占空比,应该从克服外界负载的最小力矩开始,逐渐提高,pwm占空比的增大作用其实等效于加在通电两相的电压增大,逐渐提高电机换相的频率,此时电机就会加速起来。常见加速有三种方式,恒频升压法 恒压升频法,升频升压法。
①恒频升压法:电机换相频率不变,电机供电的电压逐渐提高,以此达到加速效果。
②恒压升频法:电机供电的电压不变,电机换相时间逐渐提高,以此达到加速效果。
③升压升频法:电机供电的电压与电机换相频率都逐渐进行提高,达到加速效果。
升压升频法实现起来相比前面两种方法实现较为复杂。需要协调好电压与频率的递增,换相信号的频率需要根据实际电机的电机极对数以及电机相电阻等其他原生参数确定。换相频率太低,电机加速不起来;换相频率太高,电机运行起来容易失步,导致加速失败。
3) 运动状态转换——开环切入闭环
当电机加速到一定速度,最好直到当前速度下电机反电动势要呈梯形波,可以用示波器观察。当反电动势检测通过ADC连续稳定采集到3个过零点的情况,说明当前电机的运行速度达到无位置传感器的运行要求。此时可以切入到闭环状态。当注意的一个细节是,相同pwm占空比电机在开环时对应的速度与进入闭环时对应的速度相差越小,切换成功的几率越大,而且切换的也越平滑。
值得注意的是,电机从开环切入闭环的过程是电机启动最为困难的一个阶段,难度系数比较高。而且这个环节是电机启动最重要的一个阶段,它决定着电机是否能进入后面的闭环操作。
将偏差的比例(Proportion)、积分(Integral)和微分(Differential)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称 PID 控制器。在模拟控制系统中,控制器常用的控制规律是 PID 控制。下图所示是一个小功率直流电机的调速原理图。给定速度与实际转速进行比较,其差值经过 PID控制器调整后输出电压控制信号,经过功率放大后,驱动直流电动机改变其转速。
常规的模拟PID控制系统原理框图下图所示。该系统由模拟PID控制器和被控对象组成。图中,r(t)是给定值,y(t)是系统的实际输出值,给定值与实际输出值构成控制偏差e(t),有: e(t)= r(t)-y(t)。
e(t)作为PID 控制的输入,u(t)作为 PID 控制器的输出和被控对象的输入。所以模拟 PID 控制器的 控制规律为:
u(t)= Kp[e(t)+1/Ti∫0t e(t)dt+Td*de(t)/dt]
其中:Kp为控制器的比例系数、Ti控制器的积分时间,也称积分系数、Td控制器的微分时间,也称微分系数。
PID 控制系统数学表达式如下:
① 比例部分的数学式表示是:Kp*e(t)
② 积分部分的数学式表示是:Kp/Ti∫0t e(t)dt
③ 微分部分的数学式表示是:KpTdde(t)/dt
首先,利用变压器使220V交流电转化为24V直流电,通入电机开发板,根据电机开发板上各个模块的电压需求(如STM32F103芯片、按键模块需要3.3V供电),通过LM2576系列芯片,以及ASM1117芯片,依次实现直流电源24V到15V、15V到12V、12V到5V、5V到3.3V的转换,达到供电效果。其中,各个电压转换电路原理图下图所示。
电机开发板所使用的主控芯片为STM32F103RBT6,其引脚为64个,flash为128kb。STM32F103RBT6主控芯片原理图下图所示,图中包括晶振、复位键、程序下载口等部件。另外,主控芯片的部分引脚与相对应的模块相连接,控制着电机的运动、运动状态检测等功能。
同有传感器无刷直流电机相比,无传感器无刷直流电机的控制电路只多了一个状态数字采样模块,即下图中红框部分。状态数字采样模块是反电动势法电机控制的核心,它的主要作用在于检测转子的位置信息,并通过PB11/M_BREAK口返回给主控芯片,使其对其运动状态进行控制,从而代替传感器的工作效果。
首先对中断、时钟、IO口、A/D端口、按键及定时器等模块进行初始化,并给相关参数赋初值,在如下主程序中,实现的功能是通过判断key1的状态,控制电机转动,判断key2的状态,控制电机停止,其对应的主控芯片端口为PC5、PC15,另外,通过调用Timeproc()函数,控制电机转动的加减速。电机转动实物图下图所示。
int main (void )
{
//ClockDir=0;
ClockDir=1;
SystemInit();
NVIC_Configuration();//中断设置
RCC_GetClocksFreq(&RCC_Clocks);
GPIO_Configuration();//GPIO 初始化
ADC_Configuration();//模拟端口初始化
TIM_Configuration2();//Tim1定时器初始化
BLDC_Init();
KEY_Init();
ShowMenu_init();
//My_PWM=1250;
My_PWM=250;
BEMF_Cnt = 0;
BEMF_ADC_Cnt = 0;
MotorA.Step = 0;
ucMotorStep=MotorA.Step;
ucMotorAD=0;
//BLDC_SwitchStep();//采用6步法驱动BLDC
MENOFF();
MENON();//芯片端使能
LcdReset();
fgDispMode=1;
while(1)
{
if(KEY_Read(KEY1))
{
//CoTickDelay(5);
Delay1Us();
if(KEY_Read(KEY1))
{
//BLDC_Init();
My_PWM=250;
TIM_Configuration1();
TIM_Configuration2();//Tim1定时器初始化
}
}
if(KEY_Read(KEY2))
{
//CoTickDelay(5);
Delay1Us();
if(KEY_Read(KEY2))
{
BLDC_Stop();
if(ucT10S>=1) //每秒的事件处理
{
My_PWM=250;
if(ClockDir==1)ClockDir=0;
else ClockDir=1;
ucT10S=0;
}
}
}
Timeproc();
}
}
unsigned long
BEMF(void)
{
// unsigned short VoltBEMF = 0;
unsigned long dir = 0;
if (ucMotorStep!=MotorA.Step)
{
ucMotorStep=MotorA.Step;
ucMotorAD=0;
}
switch (MotorA.Step)
{
case 0:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[2]; dir = 1;/*下降*/ break;
case 1:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[1]; break;
case 2:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[0]; dir = 1; break;
case 3:VoltBEMF[ucMotorAD] = ADCConvertedValue_2[2]; break;
case 4:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[1]; dir = 1; break;
case 5:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[0]; break;
default: break;
}
if(ucMotorAD<2)
{
ucMotorAD++;
}
else
{
//ucMotorAD=0;
if (((dir ==1)&&(ClockDir==0))||((dir == 0)&&(ClockDir==1))) //下降,PWM-OFF检测BEMF,过零点标志是BEMF电压为0
{
if((VoltBEMF[0]>0)&&(VoltBEMF[1]==0))
{
usOZTimeS++;
return 1;
}
}
else
{
if((VoltBEMF[0]==0)&&(VoltBEMF[1]>0))
{
usOZTimeS++;
return 1;
}
}
}
VoltBEMF[0]=VoltBEMF[1];
VoltBEMF[1]=VoltBEMF[2];
return 0;
}
void Timeproc()
{
if(fgT10Ms ==0)
{
return;
}
//SendFrame();
fgT10Ms = 0;
ucT100ms++;
ucT1S++;
if(ucT100ms>=10)
{
if((My_PWM<1000)&&(flag== 0))
{
My_PWM=My_PWM+10;
}
if(My_PWM>=1000)flag = 1;
if(My_PWM>=200)
{
if(flag== 1) My_PWM=My_PWM-10;
}
else
{
flag= 0;
}
MENON();
ucT100ms=0;
}
if(ucT1S>=100) //每秒的事件处理
{
speed_1=My_PWM;//计算速度
//aim_speed=0;
ShowMenuMain();//菜单显示
//ShowMenu_init();
ucT10S++;
ucT1S=0;
}
if(ucT10S>=10) //每秒的事件处理
{
//if(flag11== 1)flag12 = 1;
//ShowMenuMain();//菜单显示
//ShowMenu_init();
ucT10S=0;
}
}
这半个月以来,主要是在学习了有传感器无刷直流电机相关内容的基础上,对无传感器无刷直流电机相关内容进行一个学习。其中,学习的成果主要是对无传感器无刷直流电机控制原理有了较为深刻认识,并且比较了有、无传感器在电机控制上的不同,加深了硬件原理图部分的理解,但是在程序方面,还没有完全吃透,需要进一步的学习。