ARTICLE DETAIL

资讯详情

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

4相5线步进电机驱动原理与STM32实战:从接线到代码全解析

4相5线步进电机驱动原理与STM32实战:从接线到代码全解析 4相5线步进电机这名字第一次听的人基本都会愣一下步进电机不是两相就是三相哪来的4相我当年从旧打印机里拆出一个5根线的电机上网一搜“4相5线步进电机驱动原理”资料是找到了但讲得云里雾里最后是拿着万用表边量边试才真正弄明白。这东西看着怪其实内部结构特别简单——所谓4相只是从外部接线视角看到的4根相线而已电机内部依然是两个独立绕组多出来的那根是公共端。搞懂这一层后面所有驱动逻辑就顺了。这篇文章我打算把这块彻底讲透5根线怎么认、驱动时序怎么排、ULN2003和DRV8825两种主流方案怎么接、STM32代码怎么写、实际调试会遇到哪些坑。适合正在玩拆机电机、做3D打印机配件、搞课设毕设的朋友参考看完你就能把一个来路不明的5线电机稳稳转起来。1. 4相5线步进电机到底是什么1.1 先弄清楚5根线是从哪来的步进电机本质上就是两组线圈在转子上产生磁场让转子一步步跟着走。最常见的两相混合式步进电机内部有两个绕组专业上叫A相和B相每个绕组有首尾两个出线端。如果两个绕组完全独立引出就是4根线这就是标准的4线制两相步进电机。而5线制电机是在电机内部把两个绕组各取一端直接短接在一起然后从这个公共点引出一根线再加上两个绕组的另外4个出线端总共就是5根线。这根公共端引线通常叫COM端也可以理解成两个绕组的中点。打个比方4线制相当于两节电池各自独立放在两个盒子里每个盒子露出正负两个极5线制则是把两节电池的负极焊在一起再从这个焊点单独引一根线出来同时两个正极分别引出。所以从外面看是5根线里头还是那两个绕组一点没多一点没少。1.2 为什么会有这种“4相5线”的怪称呼这个称呼纯粹是历史习惯留下来的。早期步进电机驱动芯片大多采用单极性驱动方式典型如ULN2003它的输出结构是集电极开路只能把负载的一端拉到地没有能力让电流反向。为了配合这种驱动方式电机厂商就把两个绕组的公共端引出来接电源正极4根相线分别接驱动芯片的4个输出端哪相通电就把哪根相线拉低。由于外部看到4根线需要依次或组合通电很多人就直观地把这4根线叫做“4相”电机也就被叫成了“4相5线步进电机”。严格从电磁学角度说它仍然是两相电机因为磁场方向的变化归根到底只有两个正交方向4根相线里的通电组合只是改变电流流经哪个绕组而已。这个理解很重要不然你后面看驱动时序表时会觉得逻辑很乱。搞懂这个来历还有一个实际好处你能明白为什么5线电机不能像4线电机那样直接用双极性驱动方式换向——因为两个绕组的公共端已经被固定接电源了电流方向没法真正反转。想让这种电机性能更好要么把公共端悬空当4线电机用要么就老老实实按单极性方式驱动。2. 动手前必做用万用表把5根线认全2.1 三步找出公共端拿到一个没有任何资料的拆机电机第一件事不是通电是拿万用表量电阻。先把万用表拨到电阻档200欧姆档就行然后两两组合量5根线之间的阻值一共10组数据把结果记下来。判断公共端的方法很简单找到那一根线它到其他4根线的电阻都相等而且阻值最小。因为公共端是两个绕组的汇合点它到任意一个出线端都只经过半个绕组而两个绕组的匝数通常是一致的所以这4个阻值基本一样。我实测过很多拆机电机这个阻值一般在30到80欧姆之间视电机大小而定。如果是6线制电机情况会稍有不同有两个中心抽头每个抽头只对同一绕组的两个出线端导通对另一个绕组不通。但5线制只有一个公共端它对4根线全导通这是最典型的特征。万一你手里的电机是5根线但量出来有两根线彼此不通那就要怀疑是不是绕组断路了。2.2 相线和绕组的分组技巧找出公共端之后剩下的活就轻松多了。把万用表一支表笔搭在公共端上另一支表笔分别碰4根相线记下各自的电阻值。理论上这4个值应该几乎一样但实际会有细微差别这不要紧。接下来最关键的一步把公共端晾一边专门量4根相线之间的电阻。你会发现一个规律——有两根线之间是导通的阻值大约是刚才公共端到相线阻值的两倍另外两根线之间也是导通的阻值同样是两倍但这两组线之间互相不通万用表显示无穷大。原因就是内部结构决定的同一个绕组的两根出线端之间要经过整个绕组所以是两倍阻值不同绕组之间电气上是完全断开的所以不通。通过这一步你就能把4根相线准确分成两组第一组是A相绕组的两个出线端第二组是B相绕组的两个出线端。具体哪组叫A哪组叫B无所谓反正后面通电方向不对就调换不影响功能。2.3 一个完整判断流程示例假设手里有5根线颜色分别是红、黑、蓝、绿、黄。我的操作顺序是这样的先把红线和黑线之间量一下假设是50欧姆记录。继续量红线和蓝线51欧姆记录。红线和绿线50欧姆记录。红线和黄线50欧姆记录。再量黑线和蓝线发现是100欧姆左右黑线和绿线显示无穷大黑线和黄线无穷大。到这里规律基本出来了红线对谁都通且阻值都是50欧姆那红线大概率就是公共端。蓝线只跟黑线通且阻值为100欧姆说明蓝线和黑线是同一个绕组的两个头。绿线和黄线之间也是100欧姆说明它们属于另一个绕组。这个流程熟练后一分钟内就能搞定线序。注意不要只量两组数据就下结论至少把所有组合都过一遍尤其是要确认“不同绕组之间绝缘”这个特征这能帮你排除某些电机内部带有保护二极管或温控开关的干扰情况。3. 驱动原理从单四拍到八拍半步3.1 单四拍最基础的换相方式认完线之后驱动原理就变成纯粹的换相逻辑问题了。我们把4根相线编号为A1、A2、B1、B2其中A1和A2属于第一个绕组B1和B2属于第二个绕组。单四拍驱动的通电顺序是A1通电、A2通电、B1通电、B2通电然后循环。每一拍只给一根相线通电电流从公共端流进经过半个绕组再从对应的相线流到驱动芯片的地。转子会被这一拍产生的磁场拉到对应位置。下一拍换到另一根相线磁场方向跟着变转子又往前走一步。这样完整循环4拍转子正好走完一个齿距。对1.8度的两相步进电机来说一个完整通电循环是4拍对应4个步距角也就是7.2度换算过来就是电机轴转一圈需要50个完整的四拍循环总共200个单步。单四拍的特点是控制最简单4个IO口按顺序拉高就行但力矩输出不够平稳因为每一拍只有一个绕组在工作而且容易在换相瞬间出现力矩低谷导致振动偏大。3.2 双四拍力矩更稳的选择双四拍与单四拍的区别在于每一拍同时给两个相线通电通电顺序变成A1和A2同时通电、A2和B1同时通电、B1和B2同时通电、B2和A1同时通电循环。注意这里的组合是有讲究的必须是“相邻”的两根通电不能是同一绕组的两根同时通电。原因很简单同一绕组两根同时通电时电流从公共端分成两路分别流向两个出线端两个半绕组产生的磁场方向完全相反正好相互抵消转子根本不会动只会白发热。而相邻绕组的组合通电时两个绕组各自产生一个磁场分量合成磁场方向落在两者之间能产生更大的保持力矩。双四拍驱动下任意时刻都有两个绕组同时工作输出力矩比单四拍大而且磁场变化更均匀转子运行更平稳。绝大多数实际应用场合比如3D打印机步进电机驱动、CNC机床进给轴都是采用双四拍整步或者后面要说的八拍半步方式。3.3 八拍半步精度翻倍的神操作八拍模式说白了就是把单四拍和双四拍混在一起用通电顺序是A1→A1A2→A2→A2B1→B1→B1B2→B2→B2A1→A1。这样每个步进周期被拆成了8个状态其中4个状态是单绕组通电4个状态是双绕组通电交替进行。效果上每个状态的转子位置变化只有原来单四拍的一半所以同样一个电机八拍模式下步距角从1.8度变成了0.9度精度提高了一倍。这也就是常说的“半步模式”。虽然电机的物理步距角没有变但通过控制换相密度可以让转子停在更多中间位置。实际使用中八拍模式最明显的好处还不是精度而是运行更安静、振动更小。因为每次换相只改变一个绕组的状态磁场过渡更平缓转子不会像整步那样猛地跳过去。我调试设备时只要对噪音敏感一律用八拍模式即使不需要那0.9度的分辨率光凭噪音改善这点就值得了。3.4 转速、步数与时序的关系驱动时序还有一个很重要的参数——步进速度它直接由换相频率决定。假设你以每秒500次的频率切换状态在八拍模式下每秒就前进500个半步换算成角度就是500乘0.9度等于450度每秒约等于1.25圈每秒。如果要精确控制转多少圈就需要把目标角度换算成步数再对应到状态切换次数。这里有一个实际调试中容易踩的坑频率过高时步进电机会失步。这不是换相逻辑有问题而是转子机械运动还没来得及跟上磁场变化电机就会丢步甚至堵转。解决办法有两个一是降低目标速度二是加加减速曲线让电机先慢再快再慢。2023年之后我做闭环步进项目时对速度控制这块尤其重视后面问题章节会细说。4. 驱动电路怎么做两种最常用的方案4.1 方案一ULN2003单极性驱动ULN2003是驱动5线步进电机最经典、也是新手最容易上手的方案。这颗芯片内部集成了7路达林顿晶体管阵列每路输出可以承受500毫安的灌电流耐压50伏输入端直接用单片机IO口控制非常皮实。更省事的是市面上几乎所有“步进电机驱动板”都是ULN2003方案4个指示灯直观显示当前哪路导通硬件成本也就几块钱。接线方式特别清晰电机的公共端接电源正极4根相线分别接ULN2003的4路输出端驱动板的输入端接单片机4个IO口。单片机让某个IO输出高电平时ULN2003内部对应那一路达林顿管导通电流从电源正极经公共端流入绕组再从相线流出到地电机对应相通电。这里要提醒一下公共端接的电源电压必须跟电机额定电压匹配。很多拆机小电机标的是5伏或6伏你非要接12伏后果就是绕组持续大电流发热几分钟就能闻到焦味。如果手头只有高电压电源可以给公共端串一个功率电阻限流或者用PWM调压但新手不建议搞这么复杂按额定电压来最稳妥。ULN2003方案最大的局限在于单极性驱动绕组电流方向不能反转所以力矩和效率都不如双极性驱动。但对那些5伏小电机、转速要求不高的场景——比如教学演示、小云台、自动窗帘模型——完全够用胜在简单可靠不容易烧东西。4.2 方案二把5线当成4线用DRV8825/A4988双极性驱动如果你觉得ULN2003驱动出来的力矩和震动表现不够理想这里有个很值钱的变通思路把5线电机的公共端悬空不接它就在电气上变成了标准的4线双极性电机。因为公共端本来就是两个绕组的中点汇合点悬空之后等同于把4个出线端拆成两组独立绕组跟真正的4线电机没有任何区别。接DRV8825或者A4988时把A相绕组的两个出线端接到驱动模块的A1和A2B相绕组的两个出线端接到B1和B2公共端用绝缘胶带包好什么都不接。模块的VM接电机电源正极VDD接单片机3.3或5伏逻辑电源DIR接方向控制IOSTEP接脉冲输入IOEN使能脚要拉低才能让输出级工作。这个接法下好消息是能用上双极性全桥驱动电流可以双向流过绕组磁场利用率更高同样体积的电机力矩能大30%以上而且DRV8825内置电流斩波功能通过Vref引脚可以精确限制绕组电流发热和噪音都控制得更好。坏消息是5线电机本来就是按单极性驱动设计的绕组线径和匝数相对保守双极性驱动时电流设置一定要保守一点别把电流调满。我有一次图省事把公共端没包好不小心碰到金属外壳结果开机瞬间驱动芯片就保护了检查半天才发现是公共端搭铁导致电流失控。所以悬空的那根线一定要处理好这是实操里最容易忽略的细节。4.3 驱动芯片电流设置方法不管用DRV8825还是A4988都要设置Vref电压来确定绕组电流上限。DRV8825模块上有个小电位器旋转它改变Vref引脚的电压。DRV8825的电流计算公式是I_max Vref / 2的一半这里我用实际经验说不同模块的采样电阻阻值不一样最稳妥的办法是看模块丝印或者说明书但通用估算方法是Vref约等于电流峰值乘以1.0左右的值再把电位器从最小慢慢往大调同时用手摸电机发热程度。实际操作中我习惯先调到目标电流的一半让电机转起来确认方向正确后再逐步加大电流每次通电不超过10秒摸电机温度。如果温热说明电流合适如果烫手马上调小。对常见的42步进电机额定电流1.5A左右我一般设置在1.2A留一点余量。还有一个参数容易被忽略就是DRV8825的衰减模式。模块上通常有个DECAY引脚或者模式拨码通过控制PWM续流方式影响电机噪音和运行平滑度。低速运行时选慢衰减中高速选混合衰减具体可以根据实测噪音来调整。这个属于锦上添花新手可以先不管跑通后再慢慢体验区别。5. 实战STM32 HAL库驱动代码5.1 引脚初始化我以STM32F103C8T6为例写一套完整的驱动代码配合ULN2003方案。先用CubeMX生成工程4个IO选PA0到PA3全部配置为推挽输出初始电平设为低。5线电机公共端接5伏电源驱动板IN1到IN4分别接PA0到PA3驱动板OUT1到OUT4接电机四根相线。GPIO初始化代码如下void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3, GPIO_PIN_RESET); }注意GPIO速度这里选LOW就够了因为步进电机换相频率一般也就几百赫兹没必要用高速模式反而可能引入干扰。5.2 八拍时序表的实现八拍模式的核心就是一张查找表。前面说过八拍顺序是A1→A1A2→A2→A2B1→B1→B1B2→B2→B2A1对应到四个IO口就变成了一个二维数组const uint8_t step_sequence[8][4] { {1, 0, 0, 0}, {1, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} };每一行的四个数字分别代表PA0到PA3的电平状态1表示高电平0表示低电平。用ULN2003时高电平意味着对应相线被拉低导通所以这一张表直接映射到通电状态。写引脚状态我用一个封装函数void motor_set_phase(uint8_t step_index) { uint8_t p0 step_sequence[step_index][0]; uint8_t p1 step_sequence[step_index][1]; uint8_t p2 step_sequence[step_index][2]; uint8_t p3 step_sequence[step_index][3]; HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, p0 ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, p1 ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, p2 ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, p3 ? GPIO_PIN_SET : GPIO_PIN_RESET); }这套写法优点是直观、容错率高就算工程里有多处调用也不容易把IO搞乱。如果你用的是DRV8825方案代码就更简单了只需要给STEP引脚输出脉冲方向和细分由模块处理不需要这张时序表。5.3 用定时器中断控制转速手动循环翻转IO会让CPU被占死所以正规做法是让定时器产生固定频率的中断在中断里刷新一次相位。我用TIM2做1毫秒定时预分频72重装值1000在中断回调里执行换相int motor_position 0; uint8_t current_step 0; uint8_t motor_dir 1; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM2) { motor_set_phase(current_step); if (motor_dir) { current_step (current_step 1) % 8; motor_position; } else { current_step (current_step 7) % 8; motor_position--; } } }启动定时器HAL_TIM_Base_Start_IT(htim2);然后通过修改定时器重装值来改变速度比如想快一点就把ARR从1000改成500。注意不要在主循环里频繁修改ARR值最好是通过一个变量缓存目标值在中断里统一更新避免出现时序毛刺导致电机抖一下。实际调试时我习惯先设一个很慢的频率把所有IO状态观察一遍确认电机确实按预期一步步走再逐步提速。如果一上来就开3000赫兹换相很多新手会误以为“代码没问题但电机不动”其实那是失步了不是代码的问题。6. 常见问题与排查经验6.1 高频问题速查表现象可能原因解决方法电机完全不动但有嗡嗡声相序不对或某一相没接好重新用万用表核对绕组分组检查接头是否氧化电机运行时抖动严重单四拍模式力矩波动大细分设置不当改八拍模式检查驱动芯片衰减模式电机反转方向不对绕组相序接反对调任意一个绕组的两个出线端或修改方向逻辑运行一段后电机烫手电流设置过大或电压过高调低Vref确认公共端电源电压符合电机额定值高速时突然丢步停转启动频率过高无加减速加梯形加减速降低最高转速只能转一个方向DIR引脚电平未变化检查方向控制逻辑确认DIR引脚有上拉或下拉电源指示灯闪或电压跌落电源功率不足换更大的电源电机起动瞬间电流可达额定2倍6.2 几个容易踩的坑和我的习惯第一个坑是公共端处理。ULN2003方案里公共端必须接电源正极很多人接成接地结果电机一通电就发烫不转还以为电机坏了。DRV8825方案里公共端又必须悬空接错就短路。这两种接法搞混是新手重灾区我建议拿到任何5线电机先画一张接线草图标清楚每根线的颜色和去向再动手接线。第二个坑是测量时习惯性把公共端忽略。有些电机公共端颜色很特殊比如白色或者粗一点的线但也遇到过全黑线只能靠万用表辨别的。无论颜色多乱最后一定要以万用表数据为准不要凭视觉判断。颜色一样的线多了时我给每条线贴个标签A1、A2、B1、B2、COM省得回头又忘了。第三个经验是关于电机电压的。很多人手头只有12伏电源但电机是5伏的抱着“跑一下应该没事”的心态直接接结果绕组电流飙到接近1安培电机烫得握不住。这种场景下最好的办法是给公共端串一个10欧姆左右的大功率电阻或者干脆换成DRV8825电流斩波方案通过限定电流来保护电机。第四个建议是调试时不要全靠耳朵听。步进电机正常运行时会有轻微的“嘶嘶”声和周期性换相声异常时声音会明显变得低沉或者刺耳。如果条件允许用示波器看STEP引脚的波形和实际相线电压能更快定位问题。没有示波器的话就靠手指轻轻捏住电机轴感受振动也很有用。最后说一下我自己的习惯每次拿到陌生的5线电机第一件事永远是量电阻和做标签通电前一定再核对一遍接线。因为步进电机驱动一旦接错轻则电机不转重则烧驱动芯片甚至单片机IO口。这个习惯帮我避掉了很多不必要的返工也推荐大家养成。等你把这一套走通了再回头看“4相5线步进电机驱动原理”这个概念会发现它真的不复杂——无非就是一个公共端、两组绕组、四种通电状态组合的问题。
返回列表