步进电机原理:结构、相序与步距角
步进电机这东西,说白了就是把电脉冲信号转成角位移。你给它一个脉冲,它就转一个固定的角度。我在项目里用过不少次,尤其是那些需要精确定位但又不想上伺服电机的场合——比如分析仪器里的进样臂、阀切换机构,步进电机简直是性价比之王。
步进电机的内部结构
先看看它长什么样。步进电机主要由两部分组成:
- 定子:外壳上嵌着线圈绕组,通常有好几相
- 转子:内部转动的部分,可以是永磁体,也可以是带齿的铁芯
我拆过不少步进电机,印象最深的是那种两相混合式步进电机。定子上有8个磁极,每个磁极上又有很多小齿。转子呢,是一圈永磁体,也带着小齿。定子和转子的齿距不一样,这样就能通过改变通电相序来产生微小的步距角。
关键点:步进电机的精度不靠反馈,靠的是结构本身。你想想看,只要不丢步,它转多少角度完全由脉冲数决定。这就是开环控制的底气所在。
相序与步距角
步进电机怎么转起来的?靠的是相序切换。以最常用的两相步进电机为例:
假设有A、B两相绕组。通电顺序可以是:
- A相通电 → B相通电 → A相反向通电 → B相反向通电
这就是一个完整的四拍循环。每切换一次,转子转一个步距角。常见的步距角有1.8°、0.9°、7.5°等。1.8°意味着转一圈需要200个脉冲。
| 电机类型 | 步距角 | 每转脉冲数 |
|---|---|---|
| 两相混合式 | 1.8° | 200 |
| 两相混合式 | 0.9° | 400 |
| 三相混合式 | 1.2° | 300 |
| 永磁式 | 7.5° | 48 |
我在一个分析仪器项目里用过0.9°的步进电机,配合16细分驱动器,理论上每步只有0.05625°。但说实话,细分到一定程度后,精度提升有限,反而容易因为振动导致丢步。嗯,这里要注意。
整步与半步驱动
整步驱动
整步驱动就是上面说的那种方式。每次只给一相或两相通电,切换一次走一个整步距角。这种方式扭矩大,但低速时振动也大。
我记得有一次调试一个低速旋转的样品盘,整步驱动下那个振动啊,样品都快被震出来了。后来换成半步驱动,情况好很多。
半步驱动
半步驱动是在整步的基础上,中间插入一个「两相同时通电」的状态。这样步距角就减半了。比如:
- A相通电 → A和B同时通电 → B相通电 → B和A反同时通电 → ...
这样每转一圈需要400个半步,步距角变成0.9°。半步驱动的优点是:
- 振动更小,运行更平稳
- 分辨率翻倍
- 中低速性能更好
我的经验:半步驱动在分析仪器里很常用。比如蠕动泵的步进电机,用半步驱动能明显减少脉动。但要注意,半步驱动时扭矩会比整步小一些,大概只有整步的70%左右。选型时得留点余量。
力矩-频率特性
这个特性曲线,说白了就是告诉你:电机在不同转速下能输出多大扭矩。我刚开始做运动控制时,就吃过这个亏——选了个扭矩看起来很大的电机,结果一跑高速就丢步。
特性曲线长什么样
典型的力矩-频率曲线是这样的:
- 低频区(0~几百Hz):扭矩最大,基本恒定
- 中频区:扭矩开始下降,但还算平稳
- 高频区:扭矩急剧下降,直到无法启动
为什么会这样?因为频率越高,绕组电感产生的反电动势越大,电流建立时间不够,扭矩自然就小了。
| 频率范围 | 扭矩特性 | 典型应用 |
|---|---|---|
| 0~500 Hz | 扭矩大且稳定 | 低速定位、夹紧 |
| 500~2000 Hz | 扭矩下降约30% | 常规进给、传送 |
| 2000 Hz以上 | 扭矩急剧下降 | 需配合驱动器升压 |
避坑指南:我曾经在一个高速分拣项目里,选了个标称扭矩0.5N·m的步进电机。结果跑到3000Hz时,实际扭矩连0.1N·m都不到,根本带不动负载。后来才明白,选型时一定要看力矩-频率曲线,不能只看静态扭矩。
如何利用这个特性
知道了这个特性,我们就能做两件事:
- 加减速控制:启动时用低频,慢慢加速到目标频率。这样能避免直接高速启动导致的丢步。
- 驱动器电压选择:提高驱动器电压,能改善高频性能。我习惯用36V或48V的驱动器,比24V的好很多。
举个例子,我在一个液相色谱仪的进样阀控制里,用了这样的策略:
// 伪代码:步进电机加减速控制
void move_steps(int target_steps) {
int current_speed = START_SPEED; // 200 Hz
int target_speed = RUN_SPEED; // 1000 Hz
// 加速阶段
for (int i = 0; i < ACCEL_STEPS; i++) {
step();
delay(1000000 / current_speed);
current_speed += ACCEL_RATE;
}
// 匀速阶段
for (int i = 0; i < target_steps - 2*ACCEL_STEPS; i++) {
step();
delay(1000000 / target_speed);
}
// 减速阶段
while (current_speed > START_SPEED) {
step();
delay(1000000 / current_speed);
current_speed -= ACCEL_RATE;
}
}
这段代码虽然简单,但实际效果很好。加减速曲线用梯形就够用了,没必要搞S曲线——除非你对振动特别敏感。
实际项目中的注意事项
最后说几个我在项目中踩过的坑:
- 共振区:每个步进电机都有共振频率,一般在100~300Hz。运行时要避开这个区间,否则振动大得吓人。
- 温度影响:步进电机长时间运行会发热,扭矩会下降。我一般留20%的扭矩余量。
- 细分不是万能的:细分能提高分辨率,但不能提高精度。细分到8~16就差不多了,再高意义不大。
好了,步进电机原理这部分就讲到这里。下一章我们聊聊步进电机的驱动电路和电流控制,那才是真正考验硬件功底的地方。