ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

直流电机驱动与控制全攻略:从选型到PID调试

直流电机驱动与控制全攻略:从选型到PID调试 1. 写在前面DC Motors到底在做什么先说结论吧这期内容不是讲某个具体的电机型号而是把直流电机DC Motors从选型、驱动、调速到闭环控制整条链路完整走一遍。如果你正准备做机器人小车、3D打印机、自动窗帘、云台、小型传送带这类项目那这些东西的核心执行部件大概率就是直流电机这篇文章就是给你准备的。市面上的直流电机种类实在太多了光按结构分就有永磁有刷、串励、并励、复励、无刷这几种大类更不用说同一种类型下还有成百上千个规格型号。很多初学者第一次接触直流电机时最容易踩的坑就是拿着一块驱动板接上线发现电机要么不转要么转得忽快忽慢要么直接把驱动芯片烧了然后完全不知道问题出在哪。我自己刚开始做电子制作那会儿也经历过这种“看得见现象、找不到原因”的痛苦阶段所以这篇文章不只是给你贴一堆参数表格而是把我从实际项目中总结出来的那些“怎么选、怎么接、怎么调、怎么修”的经验全部讲透。这篇文章覆盖的内容包括如何根据项目需求快速确定电机类型和功率、H桥驱动电路的核心工作原理、PWM调速时频率和占空比的确定方法、编码器反馈加PID实现精确转速控制的完整思路、以及一张非常实用的故障排查速查表。无论你是刚接触电机的初学者还是已经在项目中摸爬滚打过一阵子的爱好者这篇文章都值得花点时间看完里面有不少东西是文档和说明书里不会写的。在正式开始之前我先把全文的核心逻辑做个梳理。直流电机系统说复杂也复杂说简单也简单本质上就三件事第一搞清楚你的应用场景需要什么样的电机第二把功率电路和控制信号正确连起来让电机能转第三如果需要精确控制速度或位置再加上传感器反馈和算法。这篇文章就是严格按照这个顺序展开的每一部分我都会讲清楚“怎么做的”和“为什么这么做”。2. 选型这一步走错后面全白干2.1 先别急着买把需求参数列清楚我见过太多人上来就问“哪种电机好”这是一个没法回答的问题。电机选型不是找最好的是找最匹配的。在打开购物网站之前你需要先把下面这几个参数整理出来哪怕只是粗略估算也行。第一个是供电电压。这是最硬的约束条件直接决定了你后级驱动电路和电源模块怎么设计。你手头是两节18650电池串联约7.4V还是一个12V铅酸电池或者是一个5V的USB供电供电电压不同电机的额定电压就要跟着匹配。一般来说用比额定电压高一点的电源问题不大比如3V电机用5V供电性能会有提升但发热也会增加但反过来用低电压驱动高额定电压电机电机通常会因为扭矩不足而转不动整机表现为“有气无力”。第二个是转速需求。电机转速分空载转速和额定转速买的时候标称值一般是空载转速实际带载后会掉速。如果做小车你需要的轮子转速取决于目标速度和轮径公式是转速转/分 目标速度米/分 / 轮子周长米。举个例子想让直径6.5cm的轮子跑到0.5米/秒轮子周长约0.204米需要的转速就是0.5×60÷0.204≈147转/分。这个数算出来了你去挑电机时就有谱了。第三个是转矩需求。这是很多新手最容易忽略的参数。电机的转矩决定了它能拉动多重的负载、爬多陡的坡。转矩的单位是kg·cm或者N·m1N·m约等于10.2kg·cm。对于常见的小车项目需求在0.5到3kg·cm之间如果做机械臂关节可能需要5到20kg·cm甚至更高。这里有个比较快的估算方法先估算负载产生的阻力矩再乘以1.5到2倍的安全系数防止电机长时间工作在过载状态。第四个是运行方式。你的应用是连续旋转如风扇、传送带还是需要频繁启停、正反转如小车、云台这决定了你需要什么样的驱动方案。连续旋转对电机本身要求较低但频繁正反转对驱动电路的散热和电机换向器的寿命就是考验了。2.2 有刷、无刷、永磁、串励怎么选定好需求参数后接下来就是选择电机类型。我把最常见的几类直流电机参数整理成了一张表方便你对照着看。表常见直流电机类型对比类型优点缺点典型应用永磁有刷电机控制简单、价格便宜、启动扭矩大电刷磨损需维护、高速时有火花玩具、小车、电动工具串励电机启动扭矩极大、过载能力强空载转速过高有飞车风险、不能轻载运行吸尘器、角磨机、轨道交通牵引并励电机转速特性平稳、调速范围宽启动扭矩比串励小机床、印刷设备复励电机综合串励并励优点结构和控制较复杂电梯、起重机无刷直流电机BLDC效率高、寿命长、噪音小需要电子换向器、控制复杂航模、电动自行车、硬盘如果你是做小型电子项目我强烈建议优先选永磁有刷电机因为它只需要两根电源线接上就能转换向逻辑也简单。无刷电机的效率确实更高、噪音更小但它需要三个相位的驱动信号控制电路复杂度上升一个量级新手很容易在电调配置和环境初始化阶段就卡住。当然如果你的项目对效率、噪音或者寿命有硬性要求比如做一个四轴飞行器或者需要全天候运行的家电那BLDC就是绕不开的选择了。这部分的选型逻辑说白了是在“简单可靠”和“性能上限”之间做取舍没有标准答案只有适合你的答案。2.3 减速箱转速和扭矩之间的杠杆很多人忽略了一个关键组件——减速箱。我强烈建议初学者在选电机时直接买带减速箱的减速电机而不是裸电机。原因是裸电机转速动不动就几千转每分钟扭矩却小得可怜直接用它驱动轮子要么跑得飞快但没力气要么因为负载稍微变大就堵转。减速箱的作用就是用转速换扭矩你投入的转速越高获得扭矩也越大中间损耗掉的功率就是齿轮摩擦和传动效率的损失整体效率在60%到90%左右具体看减速比和齿轮类型。减速比是核心参数减速比1:30表示输入轴转30圈输出轴转1圈同时扭矩放大约30倍再乘以传动效率。选择减速比的时候需要注意电机工作区间匹配问题。任何电机都有一个高效运行区间一般是额定转速的70%到90%这个区段。如果你的应用需要输出轴转速150转/分电机额定转速6000转/分那就需要减速比约6000÷15040再根据实际负载微调即可。这里有个实操经验我想多说一句选择减速电机时不要只看减速比数字还要关注齿轮材质。常见的材质有塑料齿轮、粉末冶金齿轮和金属齿轮。塑料齿轮便宜、噪音小但扭矩一大就容易扫齿粉末冶金齿轮成本适中、强度较好适合中小负载的常规项目金属齿轮最耐用但价格高、噪音稍大。如果你做的是会经常遇到冲击负载的项目比如越障小车强烈建议直接上金属齿轮版本多花的一点钱能帮你省掉后面反复拆换的麻烦。3. 驱动电路让电机按照指令转起来3.1 为什么不能直接用单片机引脚接电机选好了电机下一个问题就是怎么驱动它。很多新手第一反应是把电机的正负极直接接到arduino或者STM32的GPIO引脚上结果单片机立刻复位或者冒烟。这个教训我当年也经历过原因其实很简单单片机的GPIO引脚通常只能提供几毫安到几十毫安的电流而直流电机正常工作时需要几百毫安到几安培的电流。驱动能力差了几十上百倍GPIO根本扛不住。正确的驱动方案是用逻辑电平控制开关器件如MOS管、三极管再由开关器件控制电机的大电流通路。这就像是你用手去按一个继电器开关手指力气很小但通过继电器的电磁铁就能控制一个大功率电路的通断。在直流电机驱动中常用的开关器件就是功率MOSFET或者集成电机驱动芯片如L298N、TB6612、DRV8833等。3.2 H桥电路正反转的秘密直流电机需要正反转控制最简单的办法是改变电源极性但实际电路中不会让你手动去调换正负极。这时候H桥电路就派上用场了。之所以叫H桥是因为四个开关管组成的拓扑结构从电路图上看像一个字母“H”电机就是H中间那一横。通过控制四个开关管的开闭组合就能实现电机两端电压方向的切换表H桥开关状态与电机运行状态Q1Q2Q3Q4电机状态导通断开断开导通正转电流从左往右断开导通导通断开反转电流从右往左导通导通断开断开刹车两端短路断开断开断开断开滑行惯性自由转动导通断开导通断开禁止状态电源短路特别注意最后一行Q1和Q3同时导通等于把电源正负极直接短路了这个状态是绝对禁止的轻则烧管发热重则驱动板直接报废。实际驱动时一定要在程序里做互锁逻辑或者在硬件上设计死区时间。这是H桥驱动中最基本也最重要的安全措施。用集成驱动芯片是最省心的方案。以TB6612为例它内部集成了两个H桥可以同时驱动两个电机最大持续电流1.2A。输入端只需要三根控制线PWM调速、IN1和IN2方向控制。实际接线时把单片机的PWM引脚接到PWMA把两个GPIO分别接到IN1和IN2然后设置A01和A02接电机即可。控制逻辑是IN1高、IN2低时正转IN1低、IN2高时反转两者相同同为高或同为低时刹车或者停止具体看芯片手册。3.3 自己搭H桥时MOSFET怎么选如果你对集成芯片不满足想自己用分立元件搭H桥那MOSFET的选型就是核心工作。我在项目里用的比较多的是IRLZ44N或者AO4406A这类N沟道增强型MOS管。选型时重点看三个参数VGS(th)栅极开启电压、RDS(on)导通电阻、ID持续电流能力。VGS(th)这个参数特别关键。经典IRLZ44N的栅极阈值电压在1V到2V之间用3.3V或5V单片机可以直接驱动但有些MOSFET阈值电压较高比如4V5V单片机驱动时栅极电压余量不足无法完全导通MOS管会工作在“半导通”状态内阻很大发热严重这种情况就得加一级三极管或者栅极驱动芯片来抬升栅极驱动电压。RDS(on)决定了MOS管导通时的损耗导通电阻越小越好。IRLZ44N的RDS(on)约22mΩ假设电机电流2A那么单个管子上的压降约为0.044V功耗约为0.088W基本可以忽略但如果你用一个RDS(on)高达0.5Ω的管子同样2A电流下的功耗就是2W不加散热片的话管子几秒钟就会烫手。所以选型时优先选RDS(on)小的管子总是没错的。ID持续电流参数同样要看但这个值一般是有条件的很多MOSFET的ID是基于25℃壳温标定的实际工作中管内温度会升高能承受的电流会下降。保守做法是让MOSFET的额定电流至少是实际工作电流的2倍以上比如电机工作电流2AMOS管额定电流至少选4A以上。我自己的习惯是直接留3倍余量成本增加不多但稳定性好很多。表MOSFET选型关键参数计算示例参数数值计算/说明电机堵转电流3A用万用表实测或者查电机规格书供电电压12V选定电源越高则需要更高耐压MOSFETMOSFET耐压30V以上至少为供电电压的2倍留余量RDS(on)20mΩ导通损耗PI²×R≈9×0.020.18W栅极驱动电压5V需要VGS(th)低于5V最好2V以下散热方式裸铜散热/小铝片功率小于0.5W时一般裸管可用3.4 续流二极管大多数烧管事故的救星直流电机在本质上是一个感性负载电机的绕组是电感电流变化时会产生反向感应电动势。当MOSFET关断时电机两端会产生一个很高的尖峰电压这个电压可能高达电源电压的数倍甚至十倍如果电路里没有续流通道这个尖峰电压直接灌进MOSFET的漏极管子就报废了。这就是很多DIY项目“烧驱动管”的根本原因。解决办法是在每个MOSFET旁边并联一个续流二极管或者叫飞轮二极管。注意这个线路的接线位置比较讲究二极管要跨接在电机的两端方向是反向并联即二极管的阴极接电源正极侧阳极接电源负极侧。这样正常工作时二极管承受反向电压不导通MOSFET关断的瞬间感应电动势会顺着二极管形成回路把电感中的能量泄放掉保护MOS管不被尖峰击穿。选二极管时注意三点一是额定反向耐压要大于电源电压的2倍以上二是要选快恢复二极管或者肖特基二极管普通二极管恢复时间太长在PWM频率较高时会来不及关断依然有损坏风险三是电流承受能力要大于电机工作电流。常用的1N58191A/40V肖特基和1N58223A/40V肖特基都是不错的选择。4. 调速与精度从“能转”到“精准转”4.1 PWM调速原理占空比与等效电压电机调速最常用的手段就是PWM脉宽调制。原理很简单用固定频率的方波信号通过改变高电平在一个周期内所占的比例占空比来调节平均输出电压。占空比50%时电机两端等效平均电压就是电源电压的50%转速大约也是全速的50%严格说不是线性的因为电机有摩擦力等非线性因素。PWM信号有两个参数需要设置频率和占空比。频率决定了信号变化的快慢占空比决定了输出的平均电压。常见的PWM频率选择范围是1kHz到20kHz。频率太低比如100Hz电机每转一圈会脉动几次容易产生明显的“咔咔”声和转速波动频率太高比如50kHz以上则会增加MOSFET的开关损耗因为每次开关都有过渡损耗频率越高单位时间内损耗越大管子发热越严重。实际操作中我个人建议10kHz左右比较平衡。这个频率下人耳已经基本听不到高频啸叫15kHz以上才会让人烦躁MOSFET的开关损耗也不算大。如果你用的是集成驱动芯片像TB6612和DRV8833它们的PWM输入频率上限通常在100kHz左右10kHz完全没问题实测也非常稳定。有些老式的L298N模块对PWM频率比较敏感频率太高它的内部达林顿管发热厉害建议用1kHz到5kHz之间。4.2 占空比计算从目标速度倒推PWM参数假设你的项目要求小车以0.4米/秒的速度匀速行驶电机供电电压12V减速电机搭配轮子后实测在12V下空载线速度为0.8米/秒。那么你需要输出的平均电压就是12V×0.4÷0.86V对应的PWM占空比就是50%。这算是一个理论参考值实际运行时因为轮胎摩擦、地面坡度和负载变化速度会偏低需要闭环控制来修正。如果你用的是定时器产生PWM还需要把占空比换算成定时器的比较值。以STM32F103的16位定时器为例你要产生20kHz的PWM信号预分频器设置好之后自动重装载值ARR设为900那么比较值CCR就是900×占空比。占空比50%时CCR就是450。这类计算在使用硬件定时器时特别常见建议在代码里封装成一个函数输入占空比百分比输出CCR值方便项目后续调整。4.3 闭环控制光有PWM还不够占空比调好了速度就能稳定了吗答案是不一定。因为开环PWM控制下电机的转速会受到负载变化、电池电压下降、摩擦力波动等多种因素影响。比如你的小车从地毯开上地板摩擦阻力变化会导致转速明显波动。这时候就需要引入闭环控制通过传感器实时测量当前转速与目标转速比较根据误差动态调整PWM输出。这个思路其实就是PID控制的核心理念。测速传感器最常见的选择是编码器。光电编码器通常安装在电机的尾轴端随着电机转动输出脉冲信号。以最常见的AB相增量式编码器为例一圈能输出固定数量的脉冲比如11个/转通过检测A、B两相脉冲的相位关系还能判断旋转方向。实际测速时如果只用A相计数转速公式是转速转/分 每秒钟脉冲数 × 60 ÷ 每转脉冲数。比如某减速电机尾轴编码器每圈输出11个脉冲1秒内计数到110个脉冲那么转速就是110×60÷11600转/分。这里注意测的是电机尾轴转速不是减速箱后的输出轴转速如果你要的是输出轴转速需要再除以减速比。4.4 PID控制算法参数整定的完整实操PID控制原理上不复杂P项放大误差I项消除稳态误差D项抑制超调。但真正把它调到好用还需要反复试验。贴一段我常用的增量式PID代码直接用C语言写方便移植到STM32或者Arduino环境typedef struct { float target; // 目标值 float current; // 当前值 float err; // 当前误差 float err_last; // 上一次误差 float err_prev; // 上上次误差 float kp; // 比例系数 float ki; // 积分系数 float kd; // 微分系数 float output; // PID输出值 float out_max; // 输出限幅 float integral; // 积分累计值 } PID_TypeDef; void PID_Init(PID_TypeDef *pid, float kp, float ki, float kd, float out_max) { pid-target 0.0f; pid-current 0.0f; pid-err 0.0f; pid-err_last 0.0f; pid-err_prev 0.0f; pid-kp kp; pid-ki ki; pid-kd kd; pid-output 0.0f; pid-out_max out_max; pid-integral 0.0f; } float PID_Process(PID_TypeDef *pid, float target, float current) { pid-target target; pid-current current; pid-err pid-target - pid-current; pid-integral pid-err; if (pid-integral pid-out_max) pid-integral pid-out_max; if (pid-integral -pid-out_max) pid-integral -pid-out_max; pid-output pid-kp * pid-err pid-ki * pid-integral pid-kd * (pid-err - pid-err_last); if (pid-output pid-out_max) pid-output pid-out_max; if (pid-output -pid-out_max) pid-output -pid-out_max; pid-err_prev pid-err_last; pid-err_last pid-err; return pid-output; }注意代码里做了两个关键处理一是积分限幅防止积分饱和避免系统长时间无法消除大误差时积分项疯狂累积导致输出严重超限二是输出限幅保证PID输出的PWM比较值不会超出定时器的范围这也算是一层保护逻辑。PID调参没有万能公式只有一个可循的过程。我的习惯是三步走第一步把I和D都设为0只保留P项。从小到大慢慢增加kp观察电机的响应。当电机开始出现反复振荡嗡嗡响或者转速波动时把kp往回退一点到电机能稳定响应的位置这就是kp的大致区间。这个kp值作为后续调参的基准。第二步保持P不变从零开始增加ki。ki的用武之地是消除稳态误差典型表现就是目标转速与实际转速之间存在一个固定的偏差比如总是慢50转/分。逐渐增大ki直到堵转时的静态误差被消除。但ki过大会导致低速时出现缓慢的周期性振荡要特别注意。第三步最后调kd。D项的作用是预测误差趋势、抑制超调但它的副作用是放大高频噪声如果编码器测速噪声大kd稍微给一点就会让PWM输出抖动明显。所以D项要非常克制很多场合甚至不需要加D只有P和I就能获得足够好的控制效果。如果你做的项目是位置控制比如云台角度D项才更值得考虑。5. 常见问题排查一张表解决80%的故障5.1 故障速查表做过的项目多了遇到过的电机故障也五花八门。我把这些常见问题整理成一张速查表你遇到问题时可以对着找原因。表直流电机系统常见故障速查故障现象可能原因排查方向电机完全不转无声音电源未接通、保险丝断、驱动板无输出用万用表测电机两端电压是否为0电机不转有嗡嗡声负载卡死或堵转、电压过低断开负载测空载是否转动测供电电压是否足够电机可以正转但不反转H桥IN1/IN2逻辑接错、驱动板其中一个通道损坏检查控制信号电平交换测试引脚电机转速忽快忽慢电源电压不稳、PWM频率过低、编码器接线松动示波器看PWM波形检查电源压降测编码器信号质量电机转但扭矩明显不足供电电压不足、MOSFET半导通、减速箱滑齿测量MOSFET栅极电压是否达到开启阈值检查减速箱驱动芯片或MOSFET发烫PWM频率过高、散热不足、短路降低PWM频率检查续流二极管增强散热一上电就烧驱动管H桥上下管直通、续流二极管缺失检查程序逻辑死区确认续流二极管接线电机不受控制全速转动PWM信号断开悬空、驱动芯片损坏检查PWM引脚是否有波形输出测GPIO输出5.2 案例复盘之一电机能转但没力气有一次我做一台履带小车使用的减速电机额定12V实测空载转速220转/分一切看起来正常。结果一装到车底电机完全带不动履带只听到电机转动沉闷的声音车就是不走。排查的时候我先测了电源电压发现空载时12.4V接上电机后瞬间掉到9.8V问题就清楚地暴露了电池放电能力不足。很多用18650电池组的项目都有这个坑18650的标称容量虽然是2000mAh起步但放电倍率一般在1C到3C之间两个电机同时堵转时电流可能达到好几安培电池内阻大、压降明显电机自然就没力了。解决办法是换成高倍率锂电池比如航模常用的3S锂电池支持20C以上放电或者加一个大容量电解电容作为瞬态储能。电容的作用可以理解为一个“蓄水池”当电机突然大电流启动时电容先放电顶住缓解电池的瞬时压降。实际选容值时建议每安培工作电流搭配至少1000uF电容比如2A的电机就并一个2200uF到4700uF的电解电容效果很明显。5.3 案例复盘之二PWM占空比60%时转速突变另一个让我印象深刻的问题某次调试中PWM占空比从0%加到50%时转速线性上升但到了60%左右转速突然跳变好像系统不稳定。查了好久发现不是控制算法的问题而是驱动芯片本身在此时进入过流保护限流状态电流被限制后转速突变。这种问题往往不是软件能修复的要么换更大电流的驱动芯片要么在硬件上减少电机负载。如果你也遇到这种“转速突变但其曲线诡异”的情况先别急着调PID参数先确认驱动芯片是否进入保护状态用电流钳或者万用表监测驱动板输入电流观察突变时电流有没有被削顶。硬件问题优先解决软件调参永远救不了硬件瓶颈这是我在实际项目里悟出来的一个硬道理。6. 一点实操心得和小工具推荐最后再分享一些我在实际项目中沉淀的经验。关于示波器我建议有条件的话一定要备一台不用很贵入门级的两通道数字示波器就够用。很多迷惑性问题用示波器一看就知道PWM波形是否变形、栅极驱动电压是否足够、续流二极管两端尖峰有多大、编码器A/B相脉冲是否干净。没有示波器的话很多问题只能靠猜效率低且容易误判。如果实在没有示波器也可以用多用电表粗略测平均电压和电流方法不一样但思路一致。关于电流测量我特别推荐买一个便宜的霍尔电流模块如ACS712或者INA219串联在电机供电支路里。它不仅能帮你判断电机是否堵转还能实时监控系统功耗对排查问题非常有帮助。比如测到电机电流持续偏高说明机械负载过大或者电机轴承润滑不好测到电流脉动剧烈说明PWM占空比或负载的力矩波动大。关于保护电路我要再强调一次电机系统里一定要加“软启动”和“过流保护”。软启动就是程序里占空比从0慢慢增大到目标值避免启动瞬间电流冲击。过流保护可以通过采样电阻检测电流超过阈值时迅速切断PWM输出。这两个功能在很多电机驱动库里都有现成的实现但也有人嫌麻烦直接跳过结果把电源模块或者驱动芯片烧了几次后才追悔莫及。我个人的习惯是只要是超过2A的电机系统保护电路必须上这不是可选项。关于项目扩展直流电机的控制结构和思路是可以迁移的。你把有刷电机的PWM驱动和PID调参学会了后面做无刷电机、步进电机、伺服电机核心思路都是互通的——无非是“驱动方式”和“反馈方式”变了。比如把编码器换成角度传感器把速度环改成位置环你就能做出一个简单的舵机把电机换成加热丝或电磁阀PWM控制逻辑照样适用。所以这篇文章讲的虽然都是直流电机但背后的控制思维可以复用很久。我在实际使用中还有一个习惯就是给每一台电机的关键参数建档额定电压、空载转速、堵转电流、减速比、编码器线数、实际使用的PWM频率这些全部记录下来。测试一个新电机时先在最小电压下空载试转确认转动顺滑没有异响再用逐级升压的方式测试最后再接入负载做完整测试。这套流程听上去繁琐但能帮你避免很多早期故障也更方便横向比较不同型号电机在项目中的实际表现。希望这篇从选型一路讲到故障排查的文章能让你在直流电机的世界里少踩几个坑多省几块驱动板。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进