做小车的人手里多少都有一块TB6612再加上一个带霍尔编码器的直流减速电机。这两个东西单独看都不难但一旦要接线很多人就在那6根线上栽跟头电机驱动线接了编码器线也接了可上电之后要么电机不转要么电机转得飞起编码器读数却像心电图。我前前后后帮人排查过不少次这种问题绝大多数都不是什么玄学故障而是接线时踩了同一个坑。这篇笔记就是专门给“准备用TB6612驱动编码电机”的朋友写的。我不讲那些照抄手册的废话只讲你在实际接线时真正会遇到的细节那6根线分别是干什么的、为什么要这么接、怎么快速确定手里的电机线序、上电前怎么自检、转起来之后编码器信号乱跳怎么排查。你把这套流程走一遍至少能避开90%以上的接线翻车现场。1. 动手之前先搞懂TB6612和编码电机各自是什么脾气很多接线错误本质上是没搞懂模块和电机到底各有哪些引脚、谁的信号该进谁的洞。这一节先把两块硬骨头的底细摸清楚后面接线图才看得明白。1.1 TB6612引脚速览哪些是电源、哪些是逻辑、哪些是输出TB6612FNG是一颗很成熟的电机驱动芯片东芝的产品中文资料一抓一大把。单颗芯片能驱动两路直流电机输出平均电流1.2A峰值3.2A左右用在常见的N20、MG310、JGB37-520这类直流减速电机上非常合适。模块上的焊盘不多但功能要分清楚我习惯把它们分成三组来看。第一组是电源组。VM是电机电源正极市面上常见的2S锂电池7.4V直接接这里就行极限不要超15VVCC是逻辑电源给芯片内部逻辑电路供电接你主控板的5V或者3.3V都行注意别超过5.5VGND是公共地这个后面要重点说是整个系统的地线汇合点。第二组是逻辑控制组。AIN1、AIN2控制A路电机的转向BIN1、BIN2控制B路电机PWMA和PWMB是PWM调速引脚STBY是待机控制脚这个最容易被人忽略——它不拉高模块直接罢工。第三组是输出组。AO1、AO2接A路电机的两根线BO1、BO2接B路电机。用表格看更清晰引脚名作用接哪里避坑重点VM电机电源正极电池正极不要超过15VVCC逻辑电源主控5V或3.3V不要超过5.5VGND公共地电池负极、主控GND必须全部连在一起AIN1/AIN2A路方向控制主控GPIOAIN1高、AIN2低时正转PWMAA路PWM调速主控PWM引脚占空比0-255调节速度STBY待机控制主控GPIO或直接拉高不接高电平模块不工作AO1/AO2A路电机输出电机两根驱动线别接到编码器信号线分组记忆最大的好处是你在接线时候脑子里清楚我在接电源、接控制、接输出而不是一堆线混乱地怼到模块上。很多人把STBY悬空上电后电机纹丝不动查半天逻辑代码也没问题结果就是这根线没处理。1.2 你手里那台“编码电机”的6根线到底是怎么构成的带编码器的直流减速电机市场上型号很多常见的有MG513P30、JGB37-520、N20等。它们的编码器大部分是霍尔式的输出两路相位差90度的方波信号也就是常说的A相和B相。通过这两路信号既可以知道电机转了多少圈还能判断转向。这里说的“6根线”是这种电机最常见的配置2根电机驱动线 4根编码器线。电机驱动线负责给电机供电一般比较粗是电机转动的动力来源。编码器这边4根线分别是编码器电源正极通常标5V、编码器地线GND、编码器A相输出有的标ENCA、M_A、OUT1、编码器B相输出有的标ENCB、M_B、OUT2。要注意的是不同厂家、不同批次的电机线色完全不统一。有的红色黑色是电机线有的红色黑色却是编码器电源线。我见过最离谱的是同一家店买回来的两个电机线色居然不一样。所以“按颜色接线”这个说法在编码电机上基本不成立正确做法是找电机丝印或者翻卖家给的资料实在不行用万用表量。后面实操环节我会仔细说怎么量。还有一个特别容易犯的错误把这6根线全部往TB6612上怼。编码器线和TB6612没有半毛钱关系TB6612只负责驱动电机那两根粗线。编码器线应该接主控板的GPIO和电源这个关系搞清楚了接线就成功了一半。2. 一张图讲清楚整个接线关系网络上传的接线图五花八门有的把编码器画成直接连TB6612有的把VM和VCC接到一起看得人头大。我画了一张我实际用的接线拓扑配合文字说明包你看完心里有底。2.1 接线图总览编码电机、TB6612、主控三者怎么连我用纯文本画了一张简化图对应Arduino Uno为例其他主控你对应引脚改一下就行。[编码电机] [TB6612模块] [主控板 Arduino Uno] 电机 ───────────────▶ AO1 电机- ───────────────▶ AO2 编码器VCC ────────────── 独立接 ───────▶ 5V 编码器GND ────────────── 独立接 ───────▶ GND 编码器A相 ────────────── 独立接 ───────▶ D2中断引脚 编码器B相 ────────────── 独立接 ───────▶ D3中断引脚 电池正极 ───────────────▶ VM 电池负极 ───────────────▶ GND ──────▶ GND共地 主控5V ───────────────▶ VCC 主控D4 ───────────────▶ AIN1 主控D5 ───────────────▶ AIN2 主控D6 ───────────────▶ PWMA 主控D7 ───────────────▶ STBY这张图看着线多其实拆开就是三条链路。第一条是电机动力链路电池正极进VM电池负极进GNDTB6612的AO1、AO2接到电机那两根粗线。电机转不转、转多快完全由这条链路决定。第二条是控制信号链路主控的D4、D5控制方向D6输出PWM速度D7控制STBY待机脚。这条链路是低压逻辑信号负责告诉TB6612该输出什么。第三条是编码器反馈链路编码器的VCC、GND接主控的5V和GNDA相、B相接主控的GPIO。这条链路和TB6612完全无关是电机把转速等信息反馈给主控的通道。2.2 为什么要这样接信号流向和共地的底层逻辑这张接线图不是随便连的背后有两个核心原则。第一个原则是“低压控高压信号单向走”。主控的GPIO输出的3.3V或5V逻辑电平进入TB6612的逻辑输入脚TB6612内部通过H桥电路用VM上接的高电压去驱动电机。驱动板和主控之间的信号是单向的主控控制TB6612TB6612控制电机。编码器的信号则是反方向电机把状态反馈给主控。你理解了这个流向就不会再把输出接到输出上或者把编码器线误接到AO1、AO2上了。第二个原则是“必须共地”。这是几乎所有接线问题的根源之一。主控和驱动板之间要传递逻辑信号必须有一个共同参考点。你把主控GND和TB6612的GND连在一起主控输出3.3V驱动板接收到逻辑“1”不共地的话这个电压差完全不确定模块收到的可能是乱跳的电平表现就是电机偶尔转一下、时好时坏。还有一个点容易被忽略STBY引脚。芯片手册里写着STBY为低电平时芯片进入待机模式输出全部关断。实际操作里这个脚你可以接到主控GPIO上需要的时候拉高也可以偷懒直接接到VCC上让它一直处于工作状态。我建议前期调试先直接接VCC少一个变量代码上也简单。2.3 主控引脚选择经验编码器千万别乱选引脚编码器信号是高频脉冲信号尤其是减速比小、转速高的时候建议接到支持硬件中断的引脚上。Arduino Uno的D2、D3是外部中断脚接编码器A/B相最省心。如果你用STM32、ESP32或者其他主控查一下芯片有哪些引脚支持外部中断尽量选这些引脚。好处是测速代码简单用中断计数不会漏掉脉冲如果你用普通GPIO轮询读电平高速旋转时会丢脉冲转速一高测出来的数据就严重偏小。当然如果你的应用只是让电机按固定方向转不需要精确测速普通GPIO也能用。但既然你用了编码电机多半后面要做闭环或里程计那就直接一步到位别给自己挖坑。3. 操作流程从端子识别到上电测试图纸看懂了接下来就是动手。这个环节我按实操顺序讲每一步都带着原因你照着做基本不会错。3.1 接线前的线序识别别靠颜色猜用万用表确认很多人买回电机第一件事就是看线色猜功能说实话赌对了是运气赌错了烧编码器。我的做法是拿到电机先花三分钟做确认。找一份电机的规格书或卖家资料上面一般会写明线序定义。如果资料丢了就用万用表的蜂鸣档来量。先把电机6根线互相之间的导通关系测一遍规律是这样的电机驱动那两根线它们之间的电阻很小通常只有几欧姆JGB37-520这类电机一般在几欧到十几欧编码器这4根线里VCC和GND之间会有明显的电源特性如果你用二极管档量能测出一个稳压管或者内部电路的正向导通压降。还有一个简单技巧把电机两根粗线短接用手拧电机输出轴如果感觉到明显阻力说明这两根就是电机绕组线因为线圈短接之后转动会产生反向电动势制动。这个方法我在没有万用表的场合下用了无数次非常管用。确认好线序后用标签纸贴上“电机”“电机-”“编码器5V”“编码器GND”“ENCA”“ENCB”再顺着标签去接线不要凭脑子记。人的临时记忆在复杂接线时极其不靠谱贴标签这个习惯帮我省了很多排查时间。3.2 按拓扑接线的关键细节电源、电容和STBY确认好线序后按第2节的图接线。有几个细节想单独强调一下。电源部分VM接电池正极电池负极接TB6612的GND同时TB6612的GND再连到主控的GND。这个“同时”很关键不是接一个就完了是围绕TB6612的GND作为星型接地点把共地关系串起来。VCC接主控的5V或者3.3V看你主控供电电压。如果你的主控是3.3V逻辑比如某些ESP32模块但TB6612的逻辑输入高电平阈值比较高可能出现主控输出1但模块识别不到高电平的情况。稳妥起见调试时VCC接5VAO1、AO2输出驱动电机逻辑电平以VCC为参考。在电池正负极之间并联一个至少470uF的电解电容位置尽量靠近TB6612。这个电容的作用是吸收电机启动瞬间的大电流尖峰避免电池电压被瞬间拉垮。我实测过没有电容时电机急停的瞬间主控直接复位加了电容之后问题消失。这个属于低成本高收益的操作建议不要省。STBY直接接VCC保证芯片一直处于工作状态。如果你后面要写待机降低功耗再改用GPIO控制也不迟。3.3 上电前的自检清单通电之前先花30秒接线完成后先别急着上电按这个清单过一遍。我吃过亏所以每次都花30秒检查。第一看VM和VCC有没有接反。VM接了主控5VVCC接了电池7.4V这个情况一旦发生芯片很快报废。用万用表电压档红表笔分别点VM和VCC焊盘黑表笔点GND确认电压正确。第二看AO1、AO2有没有碰到其他焊盘。模块引脚间距很小焊锡或者杜邦线不小心搭到相邻焊盘很容易造成短路表现为一上电就发烫。检查的时候拿放大镜或者手机拍照放大看不要嫌麻烦。第三看共地是否连好。也就是主控GND和TB6612的GND有没有导线连通。拿万用表的通断档一头点主控GND一头点TB6612的GND听蜂鸣。这一步不要偷懒很多人后面编码器读数不对都是因为这一步没做好。3.4 最小测试代码让电机转起来编码器读起来接线确认没问题后上电之前先把测试代码写好。我用Arduino Uno举例子因为这是最普及的平台。const int AIN1 4; const int AIN2 5; const int PWMA 6; const int STBY 7; void setup() { pinMode(AIN1, OUTPUT); pinMode(AIN2, OUTPUT); pinMode(PWMA, OUTPUT); pinMode(STBY, OUTPUT); digitalWrite(STBY, HIGH); } void loop() { // 正转50%占空比 digitalWrite(AIN1, HIGH); digitalWrite(AIN2, LOW); analogWrite(PWMA, 128); delay(3000); // 停止 digitalWrite(AIN1, LOW); digitalWrite(AIN2, LOW); analogWrite(PWMA, 0); delay(2000); // 反转50%占空比 digitalWrite(AIN1, LOW); digitalWrite(AIN2, HIGH); analogWrite(PWMA, 128); delay(3000); // 停止 digitalWrite(AIN1, LOW); digitalWrite(AIN2, LOW); analogWrite(PWMA, 0); delay(2000); }下载到主控后观察电机动作先正转3秒停2秒再反转3秒停2秒。这里有两个验证点一是转向和代码预期是否一致二是TB6612有没有明显发烫。如果转向反了把AO1、AO2两根对调就行不用改代码。接着测编码器。把编码器A相接D2B相接D3用中断计数volatile long encoderCount 0; void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(2), countA, RISING); } void loop() { delay(1000); Serial.println(encoderCount); } void countA() { encoderCount; }电机转到某个速度时用串口监视器看计数是否稳定递增。如果数字一直增长且比较规律说明编码器接线和读取都正常。如果数字乱跳或者一直为0大概率就是接线或者共地问题直接跳到第4节排查。4. 常见翻车现场和排查实录我把平时遇到最多的故障现象整理出来按“现象、原因、解法”的方式写你对照自己的情况找就行。4.1 现象一电机不转但模块摸上去发烫这个基本可以锁定为接线短路或者逻辑电平错误。首先断电用万用表量AO1对GND、AO2对GND的电阻如果电阻接近0说明输出脚对地短路了大概率是焊锡搭接或者杜邦线金属头碰到旁边引脚。如果量出来没有短路就检查STBY。很多朋友代码里写了digitalWrite(STBY, HIGH)但实际上STBY引脚没接任何东西悬空状态下电平不确定芯片可能还在待机模式表现为电机不转但不发烫。这种情况只要把STBY直接接到VCC就解决。还有一个常见的低级错误AIN1和AIN2接了同一个引脚或者两个引脚都输出高电平。TB6612的逻辑里AIN1和AIN2同为高或同为低时输出是刹车状态电机被锁住不转时间长了模块就会发烫。检查一下IN1、IN2是不是真的接在了两个不同的GPIO上。4.2 现象二电机能转但编码器读数像抽风编码器读数不稳定是接线问题里最让人头疼的因为现象很多变。故意的一个原因一个原因排除。第一个排查点共地。主控和TB6612的GND没连好时编码器信号电平没有参考基准主控读到的全是噪声。拿万用表通断档一量就能确认。第二个排查点编码器VCC和GND有没有接反。霍尔编码器电源接反很多不会立刻烧毁但输出电压信号会异常甚至没有信号。确认线序定义重新接一次。第三个排查点信号线有没有上拉。常见的霍尔编码器输出是开漏或者推挽前者需要外部上拉电阻才能输出高电平。如果你发现编码器输出信号波形不是正常方波而是只有低电平没有高电平很可能就需要在信号线和5V之间接一个10kΩ左右的上拉电阻。很多模块上已经内置了上拉但工控类传感器模块不一定需要自己加。Arduino内部有INPUT_PULLUP可以临时顶上但最好还是硬件上拉比较稳。第四个排查点电机驱动线和编码器线靠太近PWM电流在导线上产生电磁干扰叠加到编码器信号线上。解决方法是把两种线分开走不要绑在一起需要交叉时尽量垂直交叉不要平行长距离走线。4.3 现象三电机一启动主控直接死机或者重启这个现象非常经典很多人以为是主控坏了其实根子在电源上。电机启动瞬间电流很大尤其是带负载直接起步的时候电流可能是正常运转的好几倍。如果电池内阻大或者连接线太细、接触电阻大电压就会瞬间跌落主控检测到电压异常直接复位。排查思路很简单看电机启动时电池端电压跌落多少。用万用表或者示波器测VM对GND的电压如果启动瞬间电压掉到4V以下基本可以断定是电源撑不住。解决方案就是前面提到的在电池端并联大容量电解电容并且尽量缩短电源线的长度线径用粗一点的杜邦线最好换成硅胶线或者端子线。如果主控和驱动模块共用一个电源细分供电建议电机电源和主控电源尽量分开但地线还是要共地。两个电源的地连到一起正极各自接这样电机电流的大波动不会直接影响到主控电源。4.4 常见问题速查表故障现象优先排查点解决手段电机完全不动STBY没拉高STBY接VCC或GPIO输出高电机不动且发烫AO1/AO2短路、IN1/IN2并联检查焊点、改到两个独立GPIO电机只能一个方向转方向逻辑不对换向时IN1/IN2高低互换编码器读数一直为0VCC/GND接反、信号线没接确认线序定义重新接线编码器读数乱跳没共地、信号受干扰连接共地线驱动线和编码器线分开走电机急停时主控复位电源跌落并联470uF以上电容换粗导线模块上电就严重发烫VM/VCC接反断电检查电源引脚电压高速时编码器计数偏小没用中断引脚改接硬件中断脚写这篇笔记的时候我又回忆了一遍自己第一次接编码电机的场景6根线摆了一桌子网上找的图又乱七八糟最后凭感觉接结果模块冒烟编码器也烧了一个。后来想明白了一件事这些所谓“坑”绝大多数不是因为元器件多难伺候而是接线关没过。我的体会是编码电机接线不要急先把6根线的身份确认清楚再按照“动力链路、控制链路、反馈链路”三条线索去连最后上电前检查一遍基本就不会翻车。如果你后面要做闭环调速这个接线就是全部的地基地基稳了后面写PID调参的时候才有底气。最后再分享一个小技巧调试期间电机线最好用红色和黑色编码器信号线用其他颜色并且给每一根线都套上热缩管或者标签防止多次插拔之后搞混。线乱的时候你会感谢这个习惯。