步进电机的分类、原理及控制
0. 前言
在机器人中电机是驱动方面必不可少的部分,比如在3D 打印机、数控机床、自动化设备等领域,步进电机因其高精度、易于控制、成本较低等优势,成为最常用的执行器之一。本文即用于简要总结步进电机的分类、原理与控制方式等,主要用于共同学习。
1. 什么是步进电机?
步进电机(Stepper Motor)是一种将电脉冲信号转换为相应角位移或线位移的数字控制电机。每输入一个脉冲信号,电机就转动一个固定的角度(称为“步距角”)。因此,步进电动机又称脉冲电动机。在不超载的情况下,通过控制脉冲的数量和频率,即可精确控制电机的位置和转速,而无需反馈装置(开环控制)。这也使得在速度、位置等控制领域用步进电机来控制变的非常的简单。


步进电机与驱动器
2. 步进电机的分类与原理
根据结构和工作原理,步进电机主要分为三类:永磁式(PM)、反应式(VR)和混合式(HB)
2.1 永磁式步进电机PM
永磁顾名思义,其转子由两个彼此略微偏移的永磁体转子制成(采用径向多极充磁),意思就是在电机轴向上,N极与S极交替出现。定子上缠绕线圈,当电流施加时,定子上产生可控磁场而与永磁转子的磁极相对从而产生排斥力矩驱动旋转转动。


PM步进电机
具体可以看上图右侧的原理图:A与B上分别缠绕了一根电线,当电流流过定子绕组时,定子绕组产生一矢量磁场。磁场会带动转子旋转一定的角度, 使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度,转子也随着该磁场转步距角。
因此如果IA通入电流,A1被磁化为S极,A2则被磁化为N极。如果此时电流从A相转换为B相,会使得B1变为S极,此时会吸引转子顺时针旋转90°(所以以上为双极性两相的步进电机)。而如果A相转换为B相时通入的相反电流,则转子逆时针转90°。试想,如果A与B相均通入电流,使得A1与B1变为S极,此时转子就会顺时针转动45°,这就是它最小转动角度,即步距角。

上式即步进电机步距角的公式,其中为转子极数,
为定子相数。因此可知如果想要更小的步距角,也就是控制更加精准,可以让极数或相数增加,然而随着极数的增加,磁力和转矩也变弱。
2.2 反应式步进电机VR
反应式步进电机(又称磁阻式步进电机)是最早被广泛应用的步进电机类型之一。与永磁式不同,它的转子不含任何永磁材料,仅由软磁性材料(如硅钢片)制成,表面开有多个齿槽;定子则绕有多相线圈。其运动动力并非来自磁极间的吸引力,而是源于磁路磁阻最小化的物理规律——即:转子总是倾向于旋转到使磁通路径磁阻最低的位置。(如下左侧图为 8 极 12 槽的 3 相 VR 型步进电机)


VR型步进电机
VR型步进电机的步进角用下式表示,其中为转子极数,
为定子相数。因此上图左侧电机步距角为
,而右侧为50齿转子四相步进电机,步距角为
。由此可以看出,增加转子齿是有效的,但结构制造较为复杂。

以下是四极三相VR型步进电机的示意图,当在左侧图位置时B相导通,B相产生电磁场。之后转子齿与B相对齐逆时针旋转30°(磁阻最小,系统稳定)到中间图示位置对齐;之后换C相导通,B相断电,此时转子又逆时针旋转30°直到右侧图示位置对齐。

2.3 混合式步进电机HB
混合式步进电机得名于其混合结构:转子既包含永磁材料,又带有精细的齿槽;定子则为多相绕组与凸极齿的组合。这种设计巧妙结合了永磁式电机的高保持力矩和反应式电机的小步距角,成为3D打印机、CNC机床与机器人关节等高精度设备的首选。


HB型步进电机
如上图,HB型步进电机的转子由三部分组成:前端、后端铁芯与中间永磁体,中间的永磁体沿轴向充磁(一端N极另一端为S极)。其中铁芯有同样数量的N个齿,但是后端相对于前端错开半个齿距(),若转子每端50个齿,则前后错开3.6°。这种“齿错位 + 轴向永磁体”结构,使得无论转子处于哪个位置,前端总是N极性齿,后端总是S极性齿(或反之),从而在气隙中形成连续的磁场梯度。

以上是用于计算步距角的公式,其中为转子每端的齿数,
为定子的相数。分母2表示定子的主磁极可以配置成北极和南极两种状态。所以50齿的转子每步旋转1.8°,而0.9°步距角的转子齿数需要增加到100,而大于100齿将更加难以制造。
2.4 三种结构的对比

3种步进电机结构对比图

3种步进电机不同点
整体来讲,市场上最受欢迎的步进电机是混合型HB,因为它提供最佳性能,但成本较高。 混合式步进电机适用于大多数应用,而永磁或可变磁阻步进电机仅限于某些应用。然而步进电机为开环控制,即由于不反馈转子位置信息,本质上是不知道电机转动的具体位置信息。如果存在一些负载异常突变,很容易造成步进电机的丢步。因此在一些高精度、高性能的应用场合,可以通过编码器或者其他的位置传感器回传位置信息,这样可以形成闭环控制,若发生丢步可以补发脉冲达到预定位置。
3. 如何控制步进电机?
3.1 控制逻辑
上面讲到了步进电机由脉冲信号控制,想要转动多少角度就控制多少脉冲信号输入,不论是哪种步进电机都是这样的控制原则。

上图是步进电机的控制逻辑,步进电机不能直接接到直流或交流电源上工作,必须接入专用的驱动器才能正常使用。控制板(PLC或单片机)将步进脉冲和方向信号发送到步进电机驱动器, 驱动器将控制器发来的步进脉冲信号转换为激励步进电动机旋转所需的功率信号。

常见的步进电机多有四线两相步进电机以及六线两相步进电机,相就是如上讲到的A、B相,线就是接口线的数量。如上图左侧就是六线两相的步进电机,下面是步进电机驱动器。六线与四线不同的地方在于两个com端,一个既可做A+,又可作A-;一个既可做B+,又可作B-。
步进电机驱动器通常都带有细分功能,可以对步距角和电流进行细分, 从而实现更请准的控制和更低的噪声震动。举个例子,在不设置步进电机驱动器细分的情况下,一般就是1.8°,也就是给一个脉冲,步进电机转1.8°。如果你驱动器细分为2,那步距角就是0.9°,从而更加精准控制。

(1)控制信号
以上是一种步进电机驱动器,上面可以看到有ENA、DIR、PUL这三组,每组信号与控制板连接。
- ENA信号为使能信号,一般不用,只有需要在驱动器停止工作时电机处于释放状态才用的。当ENA信号为低电平,驱动器输出到电机的电流被切断,电机处于自由状态(脱机状态)。比如有些结构在装备通电情况下,想要手动转动电机轴转到某一位置,就可以将ENA置为低电平使之脱机自由转动,手动调节完成后再将ENA置高即可继续自动控制。
- DIR信号用于控制方向,其中高电平:通常表示电机正转(具体方向需参考驱动器手册)。低电平:通常表示电机反转。
- PUL信号用于接脉冲信号(控制转多少角度),每个上升沿触发一步,步距角由细分设置与电机结构决定。
(2)参数设定
关于它的参数,有细分与电流两种,通过拨码开关档位选择进行控制(可以看上图SW1~8开关均对应哪种来选择具体参数)。
- 参数1:细分数就是改变步距角,一个脉冲转多少度。例如,若希望实现半步驱动(即步距角减半),可将 SW1~3 设置为 OFF/OFF/OFF 组合。然而细分数越大精度越难控制,在电机实际使用时,如果对转速要求较高,且对精度和平稳性要求不高的场合,不必选高细分。如果转速很低情况下,应该选大细分,确保平滑,减少振动和噪音。
- 参数2:电流细分则是控制电流,(由SW4~7控制)用于控制驱动器输出给电机的最大电流。电流设置必须匹配电机额定电流,通常设为略低于额定值。(避免电流过大导致烧毁,或电流过小导致力矩不足、丢步等问题)
(3)电源驱动
通过上面的讲解,A+、A-与B+、B-是接步进电机的四线两相线路,步进电机的 A 相和 B 相是两个独立的绕组,每个绕组由多匝导线缠绕在定子凸极上构成,所以拿到电机时用万用表检测哪两根通路那就是一组。(用万用表电阻档测量任意两根线,若阻值在10–30Ω之间,则为同一相;若阻值无穷大,则为不同相)
VCC电源是用于驱动器供电,驱动器上明确写明12~48V供电,所以这里需要连接外部电源。
下图展示接线方式,图源网络。

(编码器用于反馈位置信息,一般步进电机只有电机相线而无编码器线)
总之,驱动器的作用在于接受前端控制器的使能信号、方向控制与脉冲信号,然后输出控制步进电机通断电时间以及顺序,最终实现步进电机的转速、方向控制。
3.2程序实现步进电机控制
其实明白了信号如何控制电机运动,就容易理解驱动代码,无非是控制信号高低与脉冲数量等,具体程序不再赘述分析,可以参考下面的控制代码。(代码来源:清雨夜NWC)
// 方向控制IO口的初始化
void DIR_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_APB2PeriphClockCmd( DIR_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = DIR_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(DIR_GPIO_PORT, &GPIO_InitStructure);
}
static void BJ_TIM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 输出比较通道1 GPIO 初始化
RCC_APB2PeriphClockCmd(BJ_TIM_CH1_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = BJ_TIM_CH1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(BJ_TIM_CH1_PORT, &GPIO_InitStructure);
}
static void BJ_TIM_Mode_Config(void)
{
// NVIC初始化
NVIC_InitTypeDef NVIC_InitStructure;
// 设置中断来源
NVIC_InitStructure.NVIC_IRQChannel = BJ_TIM_IRQ ;
// 设置主优先级为 0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
// 设置抢占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 开启定时器时钟,即内部时钟CK_INT=72M
BJ_TIM_APBxClock_FUN(BJ_TIM_CLK,ENABLE);
/*--------------------时基结构体初始化-------------------------*/
// 配置周期,这里配置为100K
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
TIM_TimeBaseStructure.TIM_Period=BJ_TIM_Period;
// 驱动CNT计数器的时钟 = Fck_int/(psc+1)
TIM_TimeBaseStructure.TIM_Prescaler= BJ_TIM_Prescaler;
// 时钟分频因子 ,配置死区时间时需要用到
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
// 计数器计数模式,设置为向上计数
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 重复计数器的值,没用到不用管
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
// 初始化定时器
TIM_TimeBaseInit(BJ_TIM, &TIM_TimeBaseStructure);
/*--------------------输出比较结构体初始化-------------------*/
TIM_OCInitTypeDef TIM_OCInitStructure;
// 配置为PWM模式1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
// 输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// 输出通道电平极性配置
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// 输出比较通道 1
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC1Init(BJ_TIM, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(BJ_TIM, TIM_OCPreload_Enable);
// 清除计数器中断标志位
TIM_ClearFlag(BJ_TIM, TIM_FLAG_Update);
// 开启计数器中断
TIM_ITConfig(BJ_TIM,TIM_IT_Update,ENABLE);
// 使能计数器
TIM_Cmd(BJ_TIM, ENABLE);
}
void BJ_TIM_Init(void)
{
BJ_TIM_GPIO_Config();
BJ_TIM_Mode_Config();
DIR_GPIO_Config();
}
extern uint16_t hopeSignal;
void BJ_TIM_IRQHandler (void)
{
if ( TIM_GetITStatus( BJ_TIM, TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(BJ_TIM , TIM_FLAG_Update);
{
if(hopeSignal<=0)
{
hopeSignal=0;
TIM_SetCompare1(BJ_TIM, 0); // 停止动
}
else
{
hopeSignal--;
TIM_SetCompare1(BJ_TIM, 100); // 停止动
}
}
}
}
总结
工业现场中有大量的步进电机应用,比如3D打印机自动化控制、机器人关节等等。包括永磁式、反应式和混合式步进电机,其中应用最广泛的是混合式步进电机,也是我们日常接触到的绝大部分步进电机的形式。本文通过总结三类步进电机结构与原理,对比了三种结构的不同点与优势等。之后又通过驱动器介绍等说明了步进电机如何实现控制,为实际控制操作提供一定参考。

本文用于总结学习,如有不足还望批评指正~
参考网络来源如下:
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)