尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

FPGA控制直流电机:L9110H驱动模块从H桥原理到Verilog实现

发布时间:2026/9/28 16:56:22

资讯中心
01
ARTICLE

FPGA控制直流电机:L9110H驱动模块从H桥原理到Verilog实现

FPGA控制直流电机:L9110H驱动模块从H桥原理到Verilog实现
先聊个被问过很多次的问题想用FPGA控制直流电机驱动模块到底该怎么选。网上教程一抓一大把但大多数都停留在“接几根线、写个PWM”的层面代码能转起来、电机能转就完事了至于为什么这么接、为什么这么写、出问题了怎么查反而没人讲清楚。这篇就以L9110H电机驱动模块为例从芯片内部的H桥电路原理开始一路讲到FPGA端的Verilog代码实现和实际调试中踩过的坑争取把这条链路完整走一遍。L9110H这个东西定位很有意思。它不像L298N那么“大块头”也不像TB6612那样需要额外关注逻辑电源和电机电源分离的细节它把两个H桥集成在SOIC-8封装里一个芯片能独立驱动两路直流电机或者并起来驱动一路大电流电机。对于那些做智能小车、云台、风机控制、电动阀门这类小功率场景它比L298N省地方比TB6612便宜性能和性价比都卡在一个很舒服的位置。这篇内容适合刚入门的FPGA学习者也适合那些已经把电机转起来但还想搞明白“为什么”的进阶玩家。1. 方案选型为什么是L9110H先说清楚一个底层问题FPGA本身是不能直接驱动电机的。FPGA的IO口输出的是3.3V或2.5V的CMOS电平带载能力通常只有几毫安到十几毫安而直流电机的启动电流轻松就能到几百毫安甚至安培级别。如果不加驱动直接把电机接到FPGA的IO口上轻则电机纹丝不动重则IO口直接烧掉顺带可能把芯片也带走。所以驱动模块在中间扮演的角色本质上是“逻辑电平放大器”加“功率开关”的结合体。市面上常见的电机驱动方案抛开集成的步进电机驱动器和无刷电机驱动器不谈单说直流有刷电机主流选择就这么几个L298N、TB6612、DRV8833、L9110H以及它的一堆国产兼容型号比如MX1508模块上那颗芯片本质上就是类似结构。横向比较一下就能看出L9110H的定位。参数L298NTB6612L9110H封装Multiwatt15SSOP24SOP-8通道数双H桥双H桥双H桥峰值电流2A/通道1.2A/通道0.8A/通道逻辑电压5V2.7V-5.5V2.8V-6.6V电机电压4.5V-46V2.5V-12V2.5V-12V导通压降大约2V小约0.5V中等约0.7V自带PWM调速不支持支持支持尺寸大中小L9110H最大的好处在于SOP-8封装外围元件极少内部集成了续流二极管和电荷泵电路所以模块上几乎不需要额外的分立元件。一颗芯片加几个滤波电容就能工作这对PCB面积敏感的项目来说是很大的优势。另一个隐藏优势是它的逻辑输入兼容性虽然数据手册上标的是2.8V到6.6V但实测下来3.3V的FPGA逻辑电平可以直接驱动不需要额外加电平转换电路。这一点在FPGA项目里特别省事因为很多FPGA开发板的IO都是3.3V电平如果用5V逻辑的驱动芯片还得在中间加电平转换麻烦得很。但也要说清楚它的局限性。0.8A的峰值电流连续工作电流建议控制在0.5A以内决定了它只能驱动小功率电机。常见的小车电机如N20减速电机、130电机、小型云台电机、风扇电机都在它的覆盖范围内。如果你要驱动的是那种带大减速比、扭矩较大的直流电机或者需要频繁正反转且堵转时间较长的场景L9110H会力不从心那还是老老实实上TB6612或者L298N。选型这件事没有绝对的谁好谁坏只有谁更适合当前场景。2. H桥电路原理与L9110H内部结构2.1 H桥驱动电路的本质要理解L9110H是怎么工作的首先要理解H桥。H桥这个名字来源于电路拓扑四个开关管MOS管或三极管排成一个H形电机接在桥中间的对角线上。四个开关分别称为Q1左上、Q2右上、Q3左下、Q4右下。当Q1和Q4导通时电流从电源正极经过Q1流入电机左端再从电机右端流出经过Q4回到电源负极电机正转当Q2和Q3导通时电流方向反了过来电机反转。就这么简单。但这里有一个非常关键的细节就是“不能同时导通同一侧的上下两个开关管”。如果Q1和Q2同时导通相当于电源正极直接对地短路瞬间电流大到能把管子烧穿这个状态叫“直通”或“shoot-through”。所以H桥控制逻辑的第一条铁律就是同一桥臂上下管必须互斥导通。L9110H内部就是把这一套H桥集成进了芯片里。它有两个输入引脚IA和IB对应一路电机的控制。当IA为高、IB为低时芯片内部驱动电机正转IA为低、IB为高时反转IA和IB同为高时电机处于刹车状态两个下管导通电机两端短路同为低时电机处于惰行状态所有管子关闭电机依靠惯性自由滑行。这个真值表是后续写FPGA代码的基础必须先记牢。2.2 为什么需要续流二极管电机本质上是电感负载。学过电路基础的人都知道电感电流不能突变。当H桥关闭电机两端的电压通路时电机绕组里的电流必须要找一个地方继续流如果没有续流回路这个电流就会在开关管两端感应出极高的反向电压直接击穿MOS管或三极管。L9110H内部集成了续流二极管方向是反向并联在每个开关管上的。当管子关断时电机电流通过二极管继续形成回路把储存在电感中的能量以热能形式慢慢消耗掉保护功率管不被击穿。这也是为什么L9110H模块的外围电路可以做得非常简洁——这部分最具风险的电路被芯片厂做进了硅片里。对FPGA开发者来说这块不需要额外操心但必须明白一个道理驱动模块的存在不仅仅是“放大电流”它更承担了“保护FPGA”的重任。如果电机上产生的反向电动势串到控制电路里FPGA的IO口是扛不住的。2.3 L9110H的输入输出关系来看数据手册上的逻辑真值表IAIB输出状态高低正转低高反转高高刹车低低惰行稍微深入一下芯片内部的逻辑其实是这样的IA控制的是H桥左侧半桥的上下管IB控制的是右侧半桥的上下管。IA为高时左侧上管导通IB为低时右侧下管导通电流从左边进右边出。反过来同理。两个都为高时左侧上管和右侧上管都导通但因为电机两端电压相等没有电流流过加上电机本身的惯性它会快速停止——这就是刹车。两个都为低时四个管子全关断电机端子悬空电机自由滑行。这里有一个实践中容易踩的坑不要把刹车当惰行用。如果你的程序逻辑是“PWM占空比给0就是停止”那实际上高电平占空比为0意味着IA和IB都为低是惰行状态电机因为机械惯性和负载阻力会慢慢停下来不是急停。如果要求电机快速锁定停止需要把IA和IB同时拉高进入刹车状态或者在PWM占空比为0时强制输出刹车电平。3. 电路细节与PCB设计要点3.1 最小系统外围电路L9110H的典型应用电路非常简洁。每路电机需要以下外围元件电源滤波电容在电机电源端并联一个100uF~470uF的电解电容吸收电机启停时产生的电流尖峰。如果电机离电源远还需要在靠近模块位置额外并联一个0.1uF陶瓷电容滤高频。逻辑电源滤波如果逻辑电源和电机电源分开供电逻辑电源引脚VCC加一个0.1uF去耦电容放在芯片电源引脚旁边。电机端吸收电容在电机两个端子之间并联一个0.1uF~0.47uF的陶瓷电容可以大幅减少电机换向时产生的电磁干扰。这个电容同时也能保护H桥输出端不被电机火花产生的尖峰冲击。实际项目里我发现很多人会忽略输出端到电机之间的导线长度。如果电机离驱动模块比较远连接线超过20cm以上导线自身的电感会和电机电感叠加换向瞬间产生的反电动势更猛。这种情况下可以在靠近电机端再续一个0.1uF电容或者使用双绞线连接减少回路面积。3.2 电源设计的两个关键要点第一个要点是逻辑电源和电机电源的关系。L9110H允许逻辑电源和电机电源分开供电逻辑电压范围2.8V-6.6V电机电压范围2.5V-12V。对于FPGA系统逻辑电源直接接开发板的3.3V即可电机电源要根据实际电机的额定电压来选择。需要特别注意的是如果使用单一电源供电比如统一用5V电源的带载能力必须足够。直流电机的启动电流是额定电流的3-5倍两个电机同时启动时电源瞬间电流可能非常大如果电源带载能力不足电压会被拉低可能导致FPGA复位或逻辑混乱。第二个要点是地线处理。驱动电路的地和FPGA的地必须可靠共地但如果只有一根细长的地线连接电机大电流回流会在地线上产生压降这个压降会干扰FPGA的逻辑电平。我的做法是驱动模块的电源地、电机地、FPGA数字地采用“单点汇聚”的方式在电源入口处汇合尽量避免电机大电流走FPGA的地平面。在模块化搭建时用粗短的杜邦线或者直接焊接铜线连接电源和地不要用那种又细又长的面包板跳线。3.3 模块选型时的避坑指南市面上卖L9110H模块的很多但质量参差不齐。我买过几种发现几个值得注意的点看芯片丝印。正品L9110H或者丝印为“L9110S”的比较多见有些廉价的模块用了一颗打磨掉丝印的兼容片虽然功能差不多但电气参数可能有差异大电流场景下更容易发热。看模块上的电容容量。正规模块一般会放一个至少100uF的电解电容有些偷工减料的模块电容很小甚至没有。电容不只是滤波更主要的是吸收电机堵转或换向时的瞬间能量电容容量不足会显著缩短芯片寿命。看PCB铜皮宽度。L9110H模块的电流路径从电源输入到输出端子铜皮如果很细大电流下会有明显压降和发热。好的模块会在这些位置做加宽处理或者覆锡加厚。4. FPGA端整体设计思路4.1 模块划分与系统架构在FPGA里控制电机千万别一上来就在顶层模块里写PWM那样后面想复用、想加功能都会很吃力。先对系统做模块划分。我习惯把这套逻辑分成三层第一层是接口层负责和外部通信比如接收上位机的UART指令解析出目标转速和目标方向。第二层是控制层接收接口层解析后的指令生成对应的PWM占空比和方向控制信号同时可以做一些加减速处理。第三层是输出层也就是纯粹的PWM发生器和方向电平输出把控制层的信号转换成最终的IA和IB波形。这个分层的好处是如果我哪天把UART通信换成了按键控制、蓝牙控制或者PID闭环控制只需要改接口层和控制层的部分逻辑PWM输出层可以原封不动地复用。在做多个项目时这部分的复用率非常高。4.2 控制寄存器与接口定义为了让控制逻辑清晰我一般会在顶层定义一组内部寄存器总线接口层、控制层、输出层全部通过寄存器来交互。这样设计的好处是调试的时候可以直接例化一个调试模块通过ILA逻辑分析仪抓这些寄存器的值定位问题非常直观。定义如下// // 电机控制寄存器组 // reg [3:0] motor_speed; // 0~15级调速对应PWM占空比 reg motor_dir; // 0:正转1:反转 reg motor_brake; // 刹车使能1:刹车0:不刹车 reg motor_en; // 总使能0:惰行1:可控 // 这组寄存器从接口层来更新。比如UART模块收到一帧指令解析出数据载荷后按照自定义协议写入相应的寄存器。输出层的PWM模块只负责读motor_speed、motor_dir、motor_brake、motor_en这四个寄存器然后生成物理波形。4.3 PWM频率与分辨率的选择PWM频率的选择直接影响电机的工作状态。频率太低电机会发出明显的“嗡嗡”声转矩脉动大转速也不稳频率太高开关损耗变大驱动芯片发热加剧。对于L9110H驱动下的直流电机我建议选择10kHz到20kHz之间的频率。10kHz以上已经完全超出了人耳听觉范围不会有噪音同时MOS管的开关损耗在这个频率段也完全可以接受。分辨率方面我用8位PWM0-255级对应FPGA的主时钟50MHz分频系数为50MHz / 20kHz / 256 ≈ 9.7取整10。也就是说用每10个时钟周期计一个PWM计数单位计数器从0到255循环输出高电平的时间由比较值决定。当然这里实际实现会更细一点标准做法是用一个PWM周期寄存器配合比较器来做。5. Verilog代码实现与关键细节5.1 核心PWM模块先说一个最基础的PWM生成代码8位分辨率20kHz频率50MHz系统时钟module pwm_8bit ( input wire clk, // 50MHz input wire rst_n, input wire [7:0] duty, // 占空比0~255 output reg pwm_out ); reg [7:0] cnt; always (posedge clk or negedge rst_n) begin if (!rst_n) cnt 8d0; else cnt cnt 1b1; end always (posedge clk or negedge rst_n) begin if (!rst_n) pwm_out 1b0; else pwm_out (cnt duty) ? 1b1 : 1b0; end endmodule这个代码简单直接但存在一个隐藏的时序问题当duty的值在PWM计数周期中间发生变化时可能会产生一个异常宽或异常窄的脉冲这在电机控制里虽然不会造成太大问题电机是惯性负载对毛刺不敏感但在要求严格的PID闭环控制里会影响采样精度。更好的方案是加入同步锁存在PWM周期溢出沿更新duty值这样每个周期内的占空比保持一致。always (posedge clk or negedge rst_n) begin if (!rst_n) pwm_duty_reg 8d0; else if (cnt 8d255) pwm_duty_reg duty; // 只在计数器溢出沿锁存新的占空比 end5.2 方向控制与死区时间PWM只是控制电机的一个维度方向控制是另一个维度。按照L9110H的逻辑关系电机正转时IA给PWM、IB给低反转时IA给低、IB给PWM。但如果在同一时刻同时切换方向和PWM波形可能出现瞬间的直通或电流冲击。所以需要在方向切换时插入“死区时间”——先把两个输入都置低惰行状态等待几个微秒让H桥内部的功率管完全关断后再切换到新的方向。// 输出状态产生逻辑 always (posedge clk or negedge rst_n) begin if (!rst_n) begin IA 1b0; IB 1b0; dead_cnt 16d0; end else if (motor_brake) begin // 刹车IA和IB同时拉高 IA 1b1; IB 1b1; dead_cnt 16d0; end else if (motor_dir_changed) begin // 方向切换先进入惰行计数死区时间 IA 1b0; IB 1b0; dead_cnt dead_cnt 1b1; if (dead_cnt DEAD_TIME_CYCLES) motor_dir_changed 1b0; end else if (motor_en) begin case (motor_dir) 1b0: begin // 正转 IA pwm_out; IB 1b0; end 1b1: begin // 反转 IA 1b0; IB pwm_out; end endcase end else begin // 惰行 IA 1b0; IB 1b0; end endDEAD_TIME_CYCLES的取值我通常设成100也就是在50MHz时钟下2微秒。这个时间足够L9110H内部的功率管完成关断和开启又不会让电机的响应显得拖泥带水。5.3 完整的顶层模块设计把上面的模块组合起来做一个完整的单电机控制顶层。这个模块直接对L9110H的IA和IB输出对外只暴露时钟、复位、四个控制寄存器和两个物理输出引脚。module motor_ctrl_top ( input wire clk, // 50MHz input wire rst_n, // 控制接口 input wire [7:0] speed, // 目标PWM占空比 0~255 input wire dir, // 方向控制 input wire brake_en, // 刹车使能 input wire motor_en, // 总使能 // L9110H物理接口 output wire motor_IA, output wire motor_IB );完整代码比较长核心是几个模块之间的配合。PWM生成模块负责产出占空比信号方向控制模块负责将PWM分配到IA或IB上同时处理死区时间。顶层模块只是一个组装角色不做任何逻辑判断。5.4 加减速斜坡处理直接给电机一个阶跃的PWM占空比指令电机会瞬间承受巨大的电流冲击尤其是带负载的情况下这个冲击会导致电源电压塌陷严重时会引起FPGA复位。更优雅的做法是加一个斜坡发生器让目标占空比不是一步到位而是按照设定的加速度逐步逼近。// 斜坡发生器核心逻辑 always (posedge clk or negedge rst_n) begin if (!rst_n) actual_speed 8d0; else if (target_speed actual_speed) begin // 加速每N个时钟增加1 if (slope_cnt SLOPE_STEP_CYCLES) begin actual_speed actual_speed 1b1; slope_cnt 16d0; end else slope_cnt slope_cnt 1b1; end else if (target_speed actual_speed) begin // 减速 if (slope_cnt SLOPE_STEP_CYCLES) begin actual_speed actual_speed - 1b1; slope_cnt 16d0; end else slope_cnt slope_cnt 1b1; end else slope_cnt 16d0; endSLOPE_STEP_CYCLES的值决定了加速的平缓程度。我常用的经验值是SLOPE_STEP_CYCLES1000在50MHz时钟下每1000个时钟20微秒速度值变化1从0加速到255需要约5.1毫秒。这个对于大多数小车平台来说是合适的既不生硬响应也不会太迟钝。如果项目对响应速度有要求可以把这个系数做成可配置的寄存器运行时动态调整。6. 实测过程中的问题与排查技巧代码写完了接线也接好了但真正通电测试的时候总会冒出各种奇奇怪怪的问题。这里把我实际踩过的坑、排查过的现象整理成一张速查表每一条都是真金白银换来的经验。现象可能原因排查方法电机完全不转电源没供上或共地缺失万用表量电机两端电压L9110H逻辑地和FPGA地之间是否有导通电机只能正转不能反转方向控制信号逻辑反了确认IA/IB的接线对照真值表检查FPGA输出的方向电平电机转但转速忽快忽慢电源带载能力不足换成稳压电源测试检查供电线上是否有大压降电机转的时候FPGA复位或跑飞电机电流干扰了电源或地增加电源滤波电容检查共地处理加宽地线芯片烫手电流过大或频率过高确认电机电流是否超规格降低PWM频率电机有尖锐噪音PWM频率在可听范围提高PWM频率到18kHz以上松开电机后反向产生高电压续流回路问题检查模块上续流二极管是否虚焊电机两端加TVS管逻辑控制正常但功率输出弱模块供电电压不足测量电机电源引脚电压带载后是否跌落明显6.1 最经典的“不共地”问题L9110H的IA、IB逻辑信号是以芯片自己的GND为参考的。FPGA输出的3.3V信号是以FPGA自己的GND为参考的。如果两个地没有连在一起逻辑电平的参考点不同FPGA输出高电平时L9110H看到的可能根本就不是高电平。我见过太多人第一次接电机驱动信号线接好了电源正极也接好了唯独忘记接GND然后电机死活不转查了半天居然是这个原因。提升一下排查效率所有电机驱动类模块只要出现“信号看似正确但设备不动作”的情况第一件事查共地第二件事查逻辑电平是否匹配第三件事才去查代码。6.2 逻辑分析仪实测波形调试L9110H驱动时手边一定要有个逻辑分析仪。这东西现在很便宜几十块钱的24通道逻辑分析仪配合sigrok开源的PulseView软件就非常好用。把通道接到IA和IB上直接看波形就能判断问题出在哪一层。正常状态下正转时IA应该是连续的PWM波形IB保持低电平。反转时IA保持低电平IB输出PWM。如果IA和IB同时都是低但电机还在转这个状态其实是惰行电机靠惯性在转不是故障但如果程序逻辑让你认为“已经停了”那就要注意区分物理停止和逻辑指令之间的差异。如果IA和IB都变成了高电平那说明进入了刹车状态如果这不是你程序的本意顺着寄存器往回查通常能在控制逻辑里找到原因。6.3 死区时间的实际验证关于死区时间有人可能会问L9110H内部不是已经处理了直通保护吗为什么FPGA端还要做死区确实很多集成的H桥芯片内部会加一些保护逻辑但L9110H这种低成本芯片的内部保护并没有那么完善。更重要的是FPGA端的死区控制不光是保护H桥本身更是为了保证方向和PWM切换时电流方向的连续性。如果在方向切换的瞬间上管还没完全关断下管就已经导通即使是微秒级的瞬间也会产生一个电流尖峰这个尖峰在示波器上看起来可能不起眼但对芯片的长期可靠性是有损害的。我实测过一组数据不加入死区时间的模块在频繁正反转切换工作2小时后芯片表面温度比加入死区时间的同配置模块高大约8-10摄氏度。长期来看这个差异会直接影响芯片寿命。对于工业级产品设计死区时间是必须的不是可选项。6.4 电流检测与保护延伸如果想把控制系统做得更完善可以给L9110H驱动电路增加电流检测功能。方法有两种一种是在电机电源正极串联一个小阻值采样电阻比如0.1欧姆用仪表放大器或FPGA内置的ADC采集电压另一种是使用带电流镜像输出的H桥芯片L9110H本身没有这个功能但可以通过采样电源总线的电流来间接估算。在FPGA端可以用一个简单的比较器逻辑实现过流保护当ADC采样的电流值超过设定阈值时立即锁存故障状态同时将PWM输出强制置低断开电机电源。这样做的好处是保护响应时间可以做到微秒级比依赖软件轮询快得多。等故障解除后需要手动清除故障锁存才能重新启动电机。这个功能在小车避障、机械臂限位等场景里非常实用能有效避免电机堵转烧毁。7. 一些小经验总结写了这么多说几个我在实践中反复验证过的经验。第一个是关于PWM频率的选择。如果只驱动一个小电机20kHz和高一些的频率问题都不大但如果你在一个板子上控制多个电机不同电机之间可能会通过电源产生相互干扰。这种情况下不同电机的PWM频率最好错开一些比如一路用17kHz另一路用23kHz避免因为频率相同导致差拍噪声被人耳捕捉到。第二个是L9110H并联使用的问题。数据手册上L9110H的一路只能承受0.8A有些模块商家会宣传“双路并联可驱动更大电流电机”。实际测试表明并联使用L9110H来驱动单电机虽然短时间能撑住1A以上的电流但因为两个H桥的导通电阻不完全一致两个通道之间会存在电流分配不均的问题长期使用的可靠性存疑不太推荐。真需要更大电流直接换芯片更稳妥。第三个是模块散热。L9110H的功耗主要在导通损耗和开关损耗两部分。导通损耗和电流的平方成正比开关损耗和PWM频率成正比。在频率已经确定的情况下要控制功耗最重要的就是控制电流。如果发现芯片温度异常升高先用万用表串入电机回路测一下实际工作电流是不是超标了再回头调整PWM频率或者更换机械结构减轻负载。加散热片对SOP-8封装来说意义不大根本原因是封装太小散热面积有限治标不治本。第三个经验是关于FPGA复位信号的。电机驱动这种带有功率开关的场景电源噪声比普通数字电路大得多。如果FPGA的复位信号是那种简单的按键复位或者RC复位电机启动瞬间的电源跌落有可能导致FPGA产生亚稳态甚至误复位。解决办法是使用FPGA内部的复位管理IP或者在复位信号上做防抖处理确保复位信号在电源波动时不会被误触发。这个问题的隐蔽性很高因为复位的触发是随机的有时候几个小时都不出现有时候一启动电机就出问题排查起来非常费时。提前在复位设计上做好文章能省下后面很大的调试成本。L9110H这个模块说不上性能顶尖但在小功率电机控制这个细分领域里它的性价比和易用性真的很难被替代。从电路原理到FPGA控制这条链路涵盖了模拟电路、数字逻辑、嵌入式控制和系统调试等多个层面的知识认真研究一遍后面再做步进电机控制、无刷电机控制很多思路都是相通的。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。