ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

单极性步进电机驱动原理与程序设计:从绕组结构到半步控制

单极性步进电机驱动原理与程序设计:从绕组结构到半步控制 1. 为什么要搞懂单极性步进电机1.1 单极性步进电机到底长什么样步进电机这东西搞嵌入式、做机器人、玩3D打印的朋友应该都不陌生。但很多人一上来就盯着双极性电机死磕因为市面上绝大多数驱动器都是给双极性电机用的。单极性步进电机反而被当成“老古董”看待好像只有教学实验箱里才见得到。我自己最开始也这么想直到有一次手头只有一个五线四相电机驱动器坏了才被迫把单极性驱动逻辑从头啃了一遍。啃完之后发现单极性电机在特定场景下其实非常好用而且它的驱动原理搞清楚了再看双极性电机、再看那些驱动芯片的数据手册都会轻松很多。所谓单极性步进电机最直观的特征就是绕组里有中心抽头。常规两相双极性电机是四根线A、A-、B、B-单极性电机通常是五根线或者六根线五线制是两组绕组各有一个中心抽头然后抽头并到一起变成一根公共线通常是红色。六线制则是两组绕组的中心抽头分别引出来一共六根线。公共线或者中心抽头一般接电源正极另外四根线分别接驱动管的集电极或漏极单片机给低电平、管子导通电流就流过那半边绕组。结构上听上去不复杂但很多人第一次看到五线电机就懵了为什么五个端子到底哪根接哪为什么公共端要接正极这些问题不搞清楚后面写驱动代码都是瞎猜。我后面会从线圈绕组的物理结构一点一点拆开讲保证你看完能把电机的内部接线在脑子里画出来。1.2 它和双极性电机有什么区别单极性和双极性最大的区别在于电流方向的控制方式。双极性电机的绕组没有中心抽头想要让磁场反向必须让整个绕组电流反向所以驱动电路必须是H桥四个管子控制一个绕组。单极性电机因为绕组被中心抽头分成了两半每一半都是独立的线圈只要给对应的那半边线圈通电就行。用一个生活化的类比双极性电机就像一个双向车道汽车要掉头必须整条路都改造用H桥改变电流方向单极性电机则像是两条单向车道你要去哪个方向就走哪条道不用“掉头”。这个区别直接带来三个实际影响驱动电路复杂度不同。单极性只需要四颗达林顿管或者MOS管每个绕组配一个低端开关公共线接电源正极。双极性需要八颗管子组成两个H桥要么用现成的驱动芯片比如A4988、DRV8825去内置桥电路。绕组利用率不同。单极性电机正常工作时半个绕组通电另外半匝线是空闲的。同样体积、同样线径的电机单极性电机的铜利用率理论上比双极性低一半因此同样外壳尺寸下双极性电机通常能输出更大扭矩。但单极性驱动有个隐藏优势公共端接电源正极绕组电流方向天然固定不会出现上下桥臂直通的问题。这意味着驱动电路的死区设计、上电时序、保护逻辑都简单很多尤其对自制驱动板的初学者非常友好。我自己早期做数控小台钻的Z轴用的是六线电机临时用手头ULN2003搭驱动效果居然不错。而同样条件下用双极性电机还得先解决H桥上下臂直通烧管子的风险。所以单极性不是没用而是要看你怎么用。2. 从线圈绕组的细节看单极性电机的驱动逻辑2.1 中心抽头是怎么来的理解中心抽头最好的办法是把一颗两相五线电机拆开看或者至少看它的绕组示意图。一颗两相单极性电机定子有八个磁极每个磁极上都绕了线圈。通常做法是一组绕组相位A绕在四个磁极上另一组绕组相位B绕在另外四个磁极上。而每个绕组的绕线方式不是一整根线从头绕到尾而是从中间分成两段分别绕在相邻的磁极上中间引出一个抽头。举例说A相绕组先从公共端抽头引出然后分成两条路径一条绕到1号磁极末端接到A端子另一条绕到2号磁极末端接到A-端子。所以从电气上看A和公共端之间是半个绕组A-和公共端之间也是半个绕组这两半绕组绕在同一组磁极上只是绕线方向相反。当电流从公共端流到A时1号磁极是N极2号磁极是S极当电流从公共端流到A-时电流方向相对于前面那半圈是反向的所以1号磁极变成S极2号磁极变成N极。就这样只用单方向电流就实现了磁极极性的翻转。这就是“单极性”的物理含义绕组中的电流方向始终是同一个方向从公共端流入从相位端流出但通过切换不同半段绕组让磁场方向反过来。实操中新拿到的五线电机可能没有数据手册怎么判断公共端万用表电阻档两两测六次五线电机。其中有一根线对另外四根线的电阻都相等那这根线就是公共端。六线电机则需要先区分出两组绕组先找电阻为零或者极小的两根线它们可能是同一相的两个相位端然后那个对它们都呈相同电阻的就是这组的中心抽头。另外两根同理。记住单极性电机相位端与中心抽头之间的典型电阻在几十欧姆以内厂家标多少不重要重要的是对称性。2.2 单极性驱动的本质单向导通如果说电机绕组是舞台驱动电路就是灯光师负责按顺序给不同线圈通电。单极性电机因为每相只有一个导通方向所以驱动开关只需要放在低边。典型的单极性步进电机驱动电路长这样公共线接电源正极常见电源电压是5V、12V或24V取决于电机额定电压。A通过一个开关管接到GNDA-通过另一个开关管接到GNDB、B-同理。开关管可以是ULN2003里面的达林顿管内置续流二极管也可以是NPN三极管或者N沟道MOS管。单片机IO口通过基极电阻或栅极电阻控制管子导通。当IO输出高电平管子导通电流路径就是电源正极 - 公共端 - 半个绕组 - 相位端 - 管子 - GND。此时另外三个相位端悬空没有电流。这个电路不用纠结“电流方向怎么换”因为根本没有换向。每个相位端只管把公共端过来的电流接到地就算完成使命。设计者唯一要注意的是开关管关闭时绕组里的感性电流不能突变会产生反电动势所以必须给每个相位端加续流二极管。ULN2003这种芯片内部已经集成好了续流二极管特别省事。如果自己用MOS管必须在相位端对电源正极并一个快恢复二极管否则关断瞬间的尖峰电压很容易击穿MOS。有人会问接反了会怎样比如把公共端接地、相位端接电源正极反向驱动从原理上说磁场方向不会变但驱动的安全性和控制逻辑就乱了。特别是用集成驱动芯片时有的芯片不允许这种接法。我自己试过把五线接成四线双极性模式悬空公共端把A和A-分别接到H桥两端也可以转但这样其实不是单极性驱动了而且会改变绕组电感和电阻电流特性完全不一样不建议新手这样搞。2.3 为什么单极性电机更容易上手再强调一下单极性驱动的“亲和力”来源因为很多读者可能第一次接触自制驱动板体会不到双极性驱动的坑。双极性驱动每个绕组要四个管子组成H桥。H桥如果同时导通对角两个管没问题但如果上下两个管同时导通电源直接短路瞬间烧管子。所以H桥必须加死区时间或者在软件里保证“先关断同一桥臂再导通对边桥臂”。而这些在单极性驱动里完全不用操心——因为电源正极接公共端低边管永远不可能“倒灌”电路拓扑上就不存在直通的路径。另外单极性驱动的控制信号和步进逻辑是一一对应的非常直观。比如给A通电时转子会停在某个位置关A开A-转子转一个步距角然后关A-开B再转一个步距角。每一步只需要把一个IO口置高、把上一个IO口置低。即使完全不懂电机控制理论拿着真值表也能让电机转起来。这种确定性特别适合教学、验证驱动逻辑也适合快速搭建原型。当然容易上手不等于性能最优。单极性电机在连续运行扭矩、发热、噪音方面普遍不如同尺寸的双极性电机加细分驱动器。所以现在大部分3D打印机、CNC都转向双极性电机细分驱动芯片。但单极性电机在低成本、低复杂度、教学验证、小功率自动控制设备里仍然大量存在比如空调摆风、摄像头云台、老式打印机字车驱动。3. 单相、双相、半步驱动逐个拆解3.1 单相驱动最基础的开关控制先明确一个容易混淆的概念这里说的“单相驱动”不是指电机只有一相而是指同一时刻只给一相通电。对应的英文术语是wave drive也叫单四拍、整步之一。单相驱动的通电序列步骤AA-BB-11000201003001040001每一步只有一根相位线通电。以五线电机为例四步为一个循环转子走完一个齿距。这种驱动方式的特点是每个时刻只有一个绕组通电所以消耗电流最小发热最低但扭矩也最小因为只有一半的定子磁极在出力。很多初学者做实验发现用单相驱动电机转动时每一步的定位精度还行但手感上明显“一钝一钝”而且用手捏住转轴感觉扭矩很小。这是因为单相驱动的磁场合成向量幅值不稳定在有些角度上气隙磁场较弱。从实践角度看单相驱动适合什么场景我个人的经验是用它作为最基本的调试手段。比如刚焊好驱动板不确定接线是否正确先用单相驱动让电机慢速转如果每一步都能明显感觉到转子被吸到对应位置那说明绕组和开关管基本正常。如果单相驱动能转双相却出问题那可能是IO口驱动能力或时序冲突排查范围就缩小了。另外在一些极低功耗的电池设备里单相驱动可以用来省电只要不要求扭矩还是可以考虑的。这里要注意的是单相驱动时转子其实停在两相绕组的中间位置。每一步只切换一个相位转子的运动是“从静止瞬间跳到下一个平衡位置”所以会有比较明显的振动噪声。如果电机本身质量一般低速时还可能听到“嗡嗡”声这是正常现象。3.2 双相驱动扭矩提升的秘诀双相驱动英文常叫two-phase-on drive或full step drive同一时刻给两相绕组通电。依然拿两相五线电机举例每相分为两半但双相驱动时同时导通A相的一半和B相的一半。通电序列步骤AA-BB-11010201103010141001对比单相驱动双相驱动每一步同时有两相绕组产生磁场合成磁场矢量的幅值是单相时的约1.414倍矢量和所以扭矩明显提高。这也是整步模式里最常用的驱动方式。常规的步进电机驱动芯片在没开细分时默认就是走这个逻辑。双相驱动的另一个特点是转子的平衡位置正好落在单相驱动平衡位置的中间。这意味着用双相驱动时电机转轴的停止点与单相驱动错开了半个步距角。所以有人说单相驱动和双相驱动的“零位”不一样其实不是零位变了而是步进角相位不同。如果你用单相驱动校准零点再切换到双相驱动会发现转轴偏移了半个步距角。这在需要绝对定位的设备里要特别注意。从控制代码的角度双相驱动每步只需要把两个IO口置高再把前一步的两个IO口清除。很多人会直接把“四步表”写成数组然后循环查表。双相驱动比单相驱动多消耗一倍电流所以电源的电流能力要留足。比如一个相电流0.5A的电机双相同时导通就是1A电源至少要按1.5倍余量选否则电压会被拉低导致扭矩下降甚至丢步。我自己用12V电源带额定额定电压5V的单极性电机用了PWM限流双相驱动时电流略微调高一点扭矩提升非常明显而发热还在可控范围。如果直接接额定5V电源、不开PWM双相驱动长时间运行电机会烫到不敢摸这点后面还会细讲。3.3 半步驱动用细分换来平顺半步驱动half step是在单相和双相之间插入一个状态让每一步的步距减半。通电序列如下步骤AA-BB-模式11000单相21010双相30110单相40101双相50010单相60001双相70001单相注意与6不同注意这张表写到这里有点乱实际上半步驱动的完整八步序列应该是步骤AA-BB-1100021010301104010150010600017100181010不对让我仔细推理。以两相单极性电机四个相位端A A- B B-整步双相序列是 1: A B 2: A- B 3: A- B- 4: A B-单相序列 1: A 2: A- 3: B 4: B-半步是交替单相、双相形成八步 1: A 2: AB 3: B 4: A-B 5: A- 6: A-B- 7: B- 8: AB-然后回到1。对照表格| 步骤 | A | A- | B | B- | | 1 | 1 | 0 | 0 | 0 | | 2 | 1 | 0 | 1 | 0 | | 3 | 0 | 0 | 1 | 0 | | 4 | 0 | 1 | 1 | 0 | | 5 | 0 | 1 | 0 | 0 | | 6 | 0 | 1 | 0 | 1 | | 7 | 0 | 0 | 0 | 1 | | 8 | 1 | 0 | 0 | 1 |对这才对。步骤7是B-单相通电步骤8是A和B-同时通电。这样每个循环八步步距角是整步的一半。比如常规1.8°步距角电机半步驱动每一步0.9°。这样一来相同脉冲频率下转速减半要达到同样的角速度需要发两倍的脉冲但带来的好处是运行更平滑噪声和机械振动显著降低。定位精度更高能停到整步无法到达的中间位置。低频共振现象有所缓解因为每一步的磁场切换更频繁转子没有足够时间在共振点大幅振荡。然而半步驱动并不是真正的细分驱动。它的磁场矢量幅值在单相通电和双相通电之间波动所以扭矩也会周期性波动。如果要求更平滑必须做微步细分也就是把单相到双相之间的电流变化过程分成更多等级让磁场矢量均匀旋转。单极性电机理论上也可以做微步只要你用两个PWM分别控制A相和B相的电流大小但实际操作中因为中心抽头结构单极性电机各半段绕组的电流控制要比双极性麻烦一些后面我会专门聊。半步驱动在代码实现上非常简单只需要把八步表写成数组然后循环查表。真正的细节在于时序和电流控制如果你用的是ULN2003这种开关驱动每一步要么开、要么关电流上升沿和下降沿都存在电感效应所以半步模式下切换速度太快时电流波形会畸变导致实际转矩损失。最好在每次换步之间加一个极小的延时或者使用带PWM斩波的驱动芯片让电流尽量接近理想波形。4. 控制代码怎么写从寄存器到脉冲序列4.1 基础驱动代码框架这一节我们直接落地上位或者单片机的驱动代码。不论你用的是Arduino、STM32、ESP32还是51单极性步进电机的驱动逻辑大同小异四个IO口控制四个相位端按真值表轮询输出。以Arduino为例最简单的一段代码// 单极性步进电机 - 双相整步驱动 const int pinAplus 8; const int pinAminus 9; const int pinBplus 10; const int pinBminus 11; // 双相整步真值表A, A-, B, B- bool stepTable[4][4] { {1, 0, 1, 0}, {0, 1, 1, 0}, {0, 1, 0, 1}, {1, 0, 0, 1} }; void setup() { pinMode(pinAplus, OUTPUT); pinMode(pinAminus, OUTPUT); pinMode(pinBplus, OUTPUT); pinMode(pinBminus, OUTPUT); } void setWinding(bool a1, bool a2, bool b1, bool b2) { digitalWrite(pinAplus, a1); digitalWrite(pinAminus, a2); digitalWrite(pinBplus, b1); digitalWrite(pinBminus, b2); } void stepMotor(int index) { int i index % 4; setWinding(stepTable[i][0], stepTable[i][1], stepTable[i][2], stepTable[i][3]); } void loop() { static int currentStep 0; stepMotor(currentStep); delay(5); // 控制转速 }这段代码看起来平平无奇但有几个细节值得说明。第一个细节是setWinding函数封装的好处如果你的驱动板不是按A、A-、B、B-顺序接到MCU而是乱序你只需要修改函数内部的引脚映射不要改真值表。第二个细节是延时控制转速延时越小电机转得越快但电机有机械惯性脉冲切换太快而电流跟不上会丢步。这里5ms对应每秒200步对1.8°电机就是每秒100转左右已经接近普通Однополярного电机不细分时的极限了。但是上面这个代码有个隐患如果IO口上电默认是低电平没问题如果某个引脚默认高电平上电瞬间电机可能跳到任意位置而且可能处于“两相同时导通”的状态导致锁止。所以更稳妥的做法是在setup里先调用一次setWinding(0,0,0,0)让所有绕组断电然后再开始转。4.2 半步驱动的完整代码示例半步驱动只需把真值表变成八行。这里我直接在代码里写清楚。// 单极性步进电机 - 半步驱动 const int pinAplus 8; const int pinAminus 9; const int pinBplus 10; const int pinBminus 11; // 半步八步真值表A, A-, B, B- bool halfStepTable[8][4] { {1, 0, 0, 0}, // 1: A {1, 0, 1, 0}, // 2: AB {0, 0, 1, 0}, // 3: B {0, 1, 1, 0}, // 4: A-B {0, 1, 0, 0}, // 5: A- {0, 1, 0, 1}, // 6: A-B- {0, 0, 0, 1}, // 7: B- {1, 0, 0, 1} // 8: AB- }; void setup() { pinMode(pinAplus, OUTPUT); pinMode(pinAminus, OUTPUT); pinMode(pinBplus, OUTPUT); pinMode(pinBminus, OUTPUT); setWinding(0, 0, 0, 0); // 上电先全部释放 } void setWinding(bool a1, bool a2, bool b1, bool b2) { digitalWrite(pinAplus, a1); digitalWrite(pinAminus, a2); digitalWrite(pinBplus, b1); digitalWrite(pinBminus, b2); } void stepMotor(int index) { int i index % 8; setWinding(halfStepTable[i][0], halfStepTable[i][1], halfStepTable[i][2], halfStepTable[i][3]); }这里的八步表是从单相通电开始插入双相通电的写法使用这段代码时电机每一步转半个整步步距。如果你把这段代码用在实际项目中建议先用非常慢的速度比如delay(20)测试确认转向、发热、噪声都正常后再逐步提速。有人会问为什么步骤2和步骤8都是AB但中间隔了六步因为每一步对应的转子位置不同它们处在两个相邻的齿距周期。查表算法就是索引模8取余步进方向则是索引递增/递减。如果你想改变电机方向只需要把索引从递增改成递减或者把数组反向遍历。写代码时还有一个小技巧不用把四个引脚的信息存成二维数组可以直接用整型编码比如用四位二进制表示A, A-, B, B-然后通过位操作设置引脚。这样代码更紧凑但可读性略差适合引脚绑定到同一端口的单片机比如STM32的GPIO寄存器操作。4.3 速度控制与加减速很多人让电机转起来很容易但要做到“稳定、不丢步、震动小”就需要处理加减速问题。最朴素的方法是在loop里用delay控制脉冲间隔但delay会阻塞CPU导致单片机无法同时处理其他任务。更好的办法是使用非阻塞定时以Arduino的millis()为例unsigned long lastStepTime 0; int stepInterval 2000; // 单位微秒这里用微秒更精细 int currentStep 0; void loop() { unsigned long now micros(); if (now - lastStepTime stepInterval) { lastStepTime now; stepMotor(currentStep); } // 其他任务可以在这里执行 }但这样还只是固定速度。实际使用中直接把步进脉冲频率从零拉到目标值电机一定会啸叫甚至丢步因为转子惯性跟不上磁场的快速旋转。所以要做梯形加减速。加减速的核心思想是启动时慢一些中间全速快到目标位置前再慢下来。梯形加减速需要计算每一步的延时。最简单实用的做法预先生成一张延时表把从启动速度到最大速度之间的步数对应的延时存到数组里。比如加速阶段100步从延时5000微秒线性减少到1000微秒然后把这张表按顺序查一遍后面匀速就用最小延时减速阶段再反向查表。这里有个工程细节线性改变delay不一定让加速度线性变化。因为步进电机的角速度正比于脉冲频率而频率是延时的倒数。应该按“每一步延时 1 / 目标频率”来算如果用户想实现恒定加速度频率需要线性增加那么延时应该按1/频率取曲线而不是简单等差递减。如果懒得算也可以直接用恒加速度模型离散化速度 初始速度 加速度 * 时间 步数累计积分得到位置实现时用查表或者在线计算都行。对大多数业余项目线性减delay也够用只是加减速手感稍差而已。还有一点如果你用的是步进电机驱动专用芯片比如L298N、TB6600、A4988单片机只需要发脉冲和方向信号不需要自己管理绕组通断。但这种情况下你仍然需要加减速控制因为脉冲频率突然跳变同样会导致丢步。驱动芯片只负责把脉冲翻译成电流不会帮你做加减速。4.4 用PWM实现电流限制和微步控制前面说的都是简单的开关型驱动相位端要么接GND要么悬空。实际上单极性步进电机也可以用PWM控制电流大小。只要在每个相位端接一个PWM控制的低边开关就可以实现“半步再细分”的效果。这也是为什么有些两相单极性电机配合L297或者专用驱动芯片也能做到8细分甚至16细分。PWM控制的基本思路是在同一时刻不仅决定哪个相位导通还决定它的导通占空比。比如在A到AB过渡时可以分8步让A的占空比从100%逐步下降到0%同时B的占空比从0%逐步上升到100%。这样磁场矢量不是从A跳过到B而是平滑旋转。但请注意电机的绕组是电感元件电压PWM后电流会有滤波作用所以直接用单片机IO输出PWM电流纹波可能较大。如果在R-L电路上直接用PWM电流上升速率取决于电感值需要保证PWM频率足够高通常20kHz以上才能避免啸叫并且最好串联一个小采样电阻做恒流控制。这样一搞驱动的复杂度就上来了和直接用双极性细分芯片相比没有太大优势。所以我在实际项目里如果确实需要细分就直接换双极性电机加A4988或DRV8825省心得多。单极性PWM微步控制在教学演示和特殊场景里能用但不要流行不是没原因的。5. 常见问题排查与实测心得5.1 电机不转但发热这是单极性步进电机接线最常见的问题之一。现象是电机有“锁止力”用手拧转轴有阻力但就是不转或者只在一个位置微微抖动。原因一般是每次只给同一相的一侧通电从来没有切换或者控制时序写错了。排查顺序拔掉信号线让电机完全断电确认它是否自由转动。如果自由转动说明机械部分没问题。接上电源用万用表量公共端与各相位端的电压。公共端应该是电源电压如果甚至对GND短路或过低先查供电。单独给一相比如A通电电机应该锁定在某个位置。再单独给另一相比如A-通电电机应该转到另一个位置。如果这两个位置相同说明A和A-实际上驱动的是同一半绕组或者接线有短路。如果单独通电位置都在变但连续跑不转检查代码中的真值表是否连续。把每一步之间的延时加大到100ms逐拍观察看每拍转子是不是都移动一个步距角。常见发热原因绕组长期通电没有换向锁止状态或者电流太大。单极性电机额定电流通常不高但如果你直接用12V供电又没限流绕组电流会很大几分钟就能烫手。解决办法是降低电压或者用PWM限流比如设定20kHz、占空比20%把平均电流压下来。5.2 震动大、丢步还伴随异响震动大最可能的原因是驱动方式是单相整步且运行频率落在电机的机械共振区。步进电机在比较低的脉冲频率通常100Hz到几百Hz下有一个明显共振峰转子会在每一步之间来回振荡。此时听起来是“呜呜”的噪声转轴也明显在抖。解决思路换半步驱动共振问题会缓解不少。提高转速跳过共振区。如果负载允许加速运行比低速运行更稳。如果必须低速运行考虑用细分驱动把每一步细分很多级让磁场连续变化。检查机械安装是否牢固联轴器是否偏心有些震动不是电机引起的是机械谐振放大。检查电源电压是否稳定如果电源纹波大也会让电机电流脉动加剧表现为震动。丢步则不同。丢步意味着转子转过的角度比应到的少一步或者多一步通常是负载过大、加速度过快或者电流不足。排查时可增大电流、降低最高速度、延长加速阶段。还有就是单极性电机如果公共端接触不良瞬间断电再上电很容易丢步。接插件用压线端子会比杜邦线可靠很多。5.3 扭矩不足怎么办很多人说单极性电机扭矩小其实要在相同条件下比较。如果电流受限扭矩不足可以从几个方向入手双相驱动比单相驱动扭矩高约40%先确保用的是双相整步或半步。提高电流在额定电流范围内增加电流是直接有效的。如果用恒压驱动可以降低绕组限流电阻阻值如果用PWM限流调高占空比。提高供电电压配合PWM限流。绕组电流上升率正比于电源电压 - 反电动势/ 电感电压更高电流建立更快所以高速时扭矩损失更小。这也是为什么很多5V电机用24V驱动反而更稳前提是必须限流。我在驱动一个额定5V的旧打印机电机时用12V供电、PWM限流扭矩提升非常明显且温度正常。考虑减速箱。在低速大扭矩场合加一个行星减速箱比盲目升电流划算得多。如果电机在高速时扭矩下降严重优先检查是不是步进脉冲频率太高电流波形还没建立起来就换相了。适当降低转速或者换更大电感的电机。5.4 单极性电机到底能不能做细分这是高频问题。答案是可以但要做得好并不容易。单极性电机绕组中间抽头每一相是两半线圈你可以把每一半线圈都当做一个独立相用精确的PWM控制四组电流。但问题在于中心抽头共用一个电源A和A-两个线圈虽然是同一相的左右两半如果要同时通不同大小的电流比如做微步时磁场从一个半段过渡到另一个半段公共端的电压电流分配会变得非常复杂。因为两个线圈的公共端是连在一起的它们的电流都从同一个节点流出无法单独控制每一半线圈的电流方向只能控制各自的开断占空比。要让合成磁链按正弦变化必须精确控制两半电流的叠加这相当于控制一个在时间上需要“先减后增”的电流波形。用模拟恒流电路可以实现但成本和复杂度远超双极性方案。所以在实际工业生产中需要细分的时候几乎都是双极性电机配专用驱动芯片。单极性电机做细分更多是实验室验证电磁控制理论的时候玩一玩或者在一些对成本敏感、对振动要求不高的场合使用半步作为妥协。自己设计时不要因为“听说单极性也可以细分”就选了单极性电机结果后面发现需要稳定低速那就头疼了。5.5 自制驱动板的一些细节如果你也想自己焊一块单极性驱动板我有几个踩坑后的心得分享用ULN2003最简单但要注意每个通道电流限制。ULN2003内部达林顿管最大电流500mA实际不要跑满建议控制在300mA以下否则芯片会很烫。多个通道同时导通总功耗要考虑。如果相电流大于500mA改用MOS管。如果你选N沟道MOS管一定要选逻辑电平MOS比如IRLZ44N、AO34005V单片机可以直接驱动。普通IRF540之类的高电平驱动电压要求高3.3V或5V单片机推不动管子只开了一半内阻大发热严重。相位端与GND之间、相位端与公共端之间都要有续流二极管。很多MOS自带体二极管但体二极管速度慢最好外接一个快恢复二极管。ULN2003内置了续流二极管到公共端所以设计电路如果有自带就不必外接。公共端接电源正极时最好在靠近电机处并联一个100uF电解电容和0.1uF瓷片电容吸收换相瞬间的尖峰。否则会干扰单片机甚至导致复位。根据实际经验驱动板的逻辑地和功率地建议单点接地或者用较宽的铜皮连接避免地弹导致IO误触发。6. 写在最后的一些经验折腾单极性步进电机这段时间我最大的体会是很多技术入门时的“笨办法”反而能帮你建立起最扎实的底层直觉。双极性电机和驱动器用起来固然顺手但如果不理解绕组中心抽头、不熟悉单相/双相切换带来的磁场变化出了问题就只能盲目换硬件。单极性电机虽然效率上吃亏却是一个完美的“教学模型”。如果你刚接触步进电机可以先把单极性电机跑明白再做双极性。在动手实验时尽量准备一个带电流显示的电源测量功耗和发热对理解电机的电气特性会很有帮助。最后再分享一个小技巧测试单极性电机时用一个10k电位器从0到5V调节模拟输入控制脉冲延时可以非常直观地感受不同驱动方式在低速、中速、高速下的振动和扭矩差异比固定跑一个速度有用得多。这个领域再往深处走就是电流环、微步细分、共振抑制这些内容了。但无论后面遇到多复杂的驱动系统脑子里始终要有一张线圈绕组的图公共端在高边相位端在低边电流只能单向流动磁场方向靠切换半段线圈来翻转。把这个想通了步进电机控制的半壁江山就都是你的了。
返回列表