ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

L298N电机驱动器详解:从H桥原理到PCB设计与PWM例程

2026/9/16 17:57:01 拓冰建站 浏览量
L298N电机驱动器详解:从H桥原理到PCB设计与PWM例程 简介这是一套面向电子爱好者、嵌入式开发者及机器人初学者的L298N电机驱动器完整资料包。内容覆盖驱动芯片工作原理、双H桥控制逻辑、AD原理图与PCB设计要点并附带基于单片机的C语言例程和Keil工程文件可直接用于直流电机正反转与调速控制。压缩包共376个文件、约3.1MB包含原理图schdoc、PCB文件pcbdoc、C源码、hex固件、uv2工程以及数据手册PDF等类型同时含有大量编译生成的obj/lst/opt中间文件便于对照学习。已有2993人学习下载适合正在制作小车、机械臂或需要快速上手L298N硬件与软件设计的开发者按目录检索即可获取从电路设计到程序调试的完整参考。1. L298N 电机驱动器资料全解读先搞清楚这块板到底在干什么把「资料大全」四个字换成一句实话真正的资料不在网盘里而在你照着数据手册把原理图重新画一遍、把PCB重新布一遍、把单片机例程重新移植一遍的过程里。L298N 是 ST 公司那颗经典的 L298 双 H 桥芯片模块板上标配 78M05 稳压、续流二极管和两个使能跳线帽能驱动两路直流电机或一路四线步进电机。很多人在淘宝买模块时看到的是「资料包」三个字到手后却连 IN1、IN2 和高低电平逻辑都说不清更别提自己画 AD 原理图时那几个续流二极管的极性为什么不能反。这篇文章按一个硬件工程师拿到这个标题后最常用的推演路径来讲先拆数据手册得到最小系统再在 Altium Designer 里画原理图、检查网络连接、画 PCB然后给 51 和 STM32 两套可抄的 PWM 例程最后讲上电后怎么用示波器和万用表验收。适合正在做智能小车、云台、小型传送带的读者也适合准备把 L298N 方案改成自己板子的工程师。下面所有内容以 L298 数据手册和模块实物为基准不依赖任何一份「网盘资料」的目录结构。2. 从数据手册到 AD 原理图拆开 L298N 最小系统再动手画2.1 L298N 的引脚级拆分电源、逻辑、H 桥三个回路先分开拿到 L298 的数据手册第一件事不是看绝对最大额定值那张表而是把芯片内部框图拆成三个回路逻辑回路、功率回路、保护回路。逻辑回路包含 VSS、GND 和 IN1~IN4、ENA/ENB工作电压是 5V电流消耗典型值在 20mA 左右这个电流由单片机引脚直接驱动是够的但要注意 L298 的逻辑输入带施密特触发器高电平门槛约 1.5V所以 3.3V 单片机理论能驱动实际建议加电平转换或至少把 VSS 接到 5V。功率回路是 VS 到 OUT1~OUT4VS 最高可以到 46V但模块上那颗 78M05 的输入电压有限制模块说明通常标 6~12V超过 12V 用外部 5V 给逻辑供电即可。H 桥内部是四个达林顿管饱和压降不是理想 MOSFET 的毫伏级而是 1.2V~1.8V这意味着 1A 电流时芯片自身功耗就有 1.2W 以上散热焊盘和 PCB 铜箔面积不是装饰。保护回路由八个续流二极管组成接在 VS 和 OUT 之间。电感负载关断瞬间会产生反向电动势电流方向是从地流向 VS二极管就是给这个电流提供通路。画 AD 原理图时最容易犯的错就是把二极管画反导致一上电直接短路烧 78M05 甚至烧单片机。判断方法很简单二极管阴极接 VS阳极接 OUT和电机两端反并联的是同一极性逻辑。回路关键引脚电压/电流特征画图时注意逻辑回路VSS, GND, IN1~IN4, ENA/ENB5V50mA逻辑地和功率地单点连接铺铜时分开功率回路VS, OUT1~OUT4, SENSE A/B最高 46V峰值 2A走线宽度按 2A 余量计算回路面积最小化保护回路内部二极管外部图上体现反向峰值电压接近 VS阴极接 VS阳极接 OUT不可反接2.2 在 AD 里重建 L298N 最小系统的元件库与原理图要在 Altium Designer 里画 L298N 的 AD 原理图不用从零画符号ST 官方的元件库在 Ultra Librarian 和官方资源包里都有但「资料大全」里给的原理图符号未必规范。我一般会按自己的习惯重建一个引脚按功能分组左侧放 IN1、IN2、IN3、IN4 和 ENA、ENB右侧放 OUT1~OUT4顶部放 VS 和 VSS底部放 SENSE A、SENSE B 和 GND。这样的符号在画多页原理图时连线不会交叉编译报错也容易定位。放置元件后剩下的工作就是按最小系统连线一个标准 L298N 最小系统包含这些网络VS 接电机电源正极VSS 接 5V 逻辑电源VS 和 VSS 之间各放一个 100nF 陶瓷电容ESR 低的陶瓷电容负责吸收 H 桥开关瞬间的高频噪声VS 上再并一个 10uF~47uF 电解电容承担低频能量。SENSE A 和 SENSE B 引脚接采样电阻到地电阻选 0.5Ω/2W如果不用电流采样则直接接地。每个 OUT 引脚到 VS 之间放一个续流二极管阴极接 VS阳极接 OUT。画完以后用 Project Compile 做编译重点看 Messages 面板里有没有 Unconnected Pin 这类错误。很多时候原理图看着连上了实际网络名没对上这时用快捷键 N Show Connections 或者右键网络高亮在 AD 里检查网络有没有连上就看两点一是按下高亮后相关引脚是否全部点亮二是编译后 Messages 面板有没有报 Unconnected。多页原理图要用 Off-Sheet Connector 或 Net Label 对齐网络名比如 ENA 这个网络在电机驱动页和单片机页必须完全同名大小写都算否则编译不报错但电气上就是断的。最小系统网络清单供 AD 编译后核对 VS - 电机电源正极10uF/25V 电解电容 100nF 陶瓷电容到 GND VSS - 5V 逻辑电源100nF 陶瓷电容到 GND GND - VS 电源地与单片机地单点相连 IN1/IN2 - 单片机 GPIO串联 1kΩ 电阻再接入 ENA - 单片机 PWM 输出若固定使能则接 5V 并经 10kΩ 上拉 OUT1/OUT2 - 电机两端并联 100nF 陶瓷电容抑制辐射 SENSE A/B - 0.5Ω/2W 采样电阻到 GND采样点引出到 ADC原理图检查完以后还缺一个容易被忽略的环节原理图里每个元件的 comment 和 PCB 封装是否对应AD 的原理图模板设置里如果默认 comment 显示格式是Value那在 PCB 导入时封装对不上会直接报 missing footprint。L298 本体用 Multiwatt15 封装散热片和 GND 引脚是连通的PCB 封装里散热片焊盘必须单独建不能直接合并到 GND 网络里否则后面铺铜会出大问题。3. L298N 的 PCB 设计与布线功率回路、散热焊盘与 EMC 细节3.1 功率走线宽度和过孔载流按 2A 峰值算而不是按平均电流算L298N 模块的典型应用是驱动两个直流减速电机标称电流 1A 每路堵转瞬间可能到 2A 甚至更高。PCB 设计时走线宽度不能按 1A 算要按 2A 峰值留 1.5 倍以上余量。常见经验法则是外层 1oz 铜厚、10°C 温升条件下1mm 宽走线大约过 1A这还不够我一般会让功率回路的走线宽度到 2mm 以上。如果板面积紧张可以走 1.5mm 并在走线表面开窗加锡加锡这招在模块板上很常见能有效增加载流能力。过孔载流经常被新手忽略。一个直径 0.3mm 的过孔孔壁铜厚约 0.025mm载流大约 0.5A2A 的电流回路至少要用 4~6 个过孔并联或者在顶层和底层都用宽铜箔走线避免电流集中在单个过孔上发热。还有一种做法是干脆把功率回路全部放在顶层底层只走逻辑信号把过孔数量降到最少这样回流路径最短EMC 也更好。L298N 的 H 桥开关频率取决于 PWM 频率PWM 频率越高di/dt 越快走线寄生电感带来的电压尖峰越严重。寄生电感主要由回路面积决定所以 OUT1 和 OUT2 的走线要尽量并行走减少环路面积VS 和 GND 之间的去耦电容要尽量靠近芯片的 VS 引脚放不近就在引脚旁边打孔到内层再连到电容。模块板上那颗 100nF 陶瓷电容的位置如果离芯片超过 5mm效果就打折扣这是 AD 原理图画完转 PCB 后最值得检查的一件事。3.2 散热焊盘与层叠设计Multiwatt15 的大焊盘怎么铺L298N 芯片的散热路径是从内部功率管到引脚框架再到背面的金属散热片。Multiwatt15 封装的散热片在 PCB 上对应的是一块大面积焊盘这块焊盘在电气上接到 GND。画 PCB 封装时要注意中间散热片焊盘不要开成网格状网格会减少铜箔面积直接影响散热建议做成实心焊盘并在焊盘上打 3x3 或 4x4 的过孔阵列过孔孔径 0.5mm孔间距 1.27mm这些过孔在内层连接到整块地平面把热量导到整个板子的铜皮上。模块板是两层板顶层铺功率地底层铺逻辑地两者通过靠近芯片的一个 0Ω 电阻或磁珠单点连接。如果做四层板中间层要放一个完整的地平面L298N 的 GND 引脚和散热焊盘直接打孔接到内层地平面这样可以显著降低地弹噪声。使用 cadence 或 AD 做 PCB 层叠设置时两层板的厚度建议 1.6mm铜厚外层 1oz、内层 0.5oz四层板建议用 PPcore 结构把 L298N 的功率回路的参考平面整片挖掉避免开关噪声窜到敏感信号层。L298N 功率 PCB 布线规则可在 PCB 规则管理器中设置 Min Width - 0.25mm逻辑信号 Preferred Width - 0.5mm控制信号 Power Width - 2mmVS/OUT/GND 功率走线 Clearance - 0.3mm功率网络之间 Via Diameter - 0.8mm钻孔 0.4mm功率过孔阵列用 热焊盘规则 - 直连或全相连不要用散热辐条丝印层建议把 IN1~IN4、ENA、ENB、VS、OUT 这些网络名全部标上去方便调试时用万用表量。模块上丝印模糊是个高频问题因为丝印层压在了焊盘上或者线宽小于 0.15mm 导致厂家做不出来。AD 里设置丝印规则时文字最小高度 1mm、最小线宽 0.15mm并且绝对不要放在焊盘上面焊盘开窗区域会自动把丝印盖掉这是 PCB 板厂钻孔工序之外最影响可读性的一个点。3.3 续流二极管的布局与走线八个续流二极管如果全部放在芯片同侧走线会绕得很长开关噪声反而更大。更合理的做法是每两个二极管一组紧挨着对应的 OUT 引脚放置二极管阴极通过宽走线就近接到 VS 引脚阳极通过短走线接到 OUT 引脚相当于把换向回路限制在芯片引脚附近。模块板上用的是 IN5822 这类肖特基二极管正向压降 0.4V 左右反向恢复时间比普通快恢复管还短L298N 内部其实已经集成了二极管但外部再加一份相当于双保险可以把电感储能更快地泄放掉。布局完成后在 AD 里跑一遍 DRC检查项目里有没有 Un-Routed Net 和 Clearance 违规。AD 的 DRC 检查在 PCB 界面按快捷键 T D C 打开 Design Rule Check 面板勾选 Routing 和 Manufacturing 全部选项运行后重点看 Clearance Constraint 和 Width Constraint 两类错误。功率走线的 Width 规则如果没有单独设置默认 0.25mm 会让 2mm 的走线直接报错所以在画线之前就先在 PCB Rules and Constraints Editor 里把 PWR 网络的线宽规则建好比画完再改省事得多。4. 单片机例程实操51 与 STM32 双平台点亮 L298N4.1 51 单片机例程用定时器模拟 PWM 控制电机正反转和速度L298N 控制直流电机的逻辑非常固定ENA 接 PWM 输出IN1 和 IN2 接普通 GPIO当 IN11、IN20 时电机正转IN10、IN21 时反转IN1IN2 则刹车。51 单片机没有硬件 PWM 外设最常见的做法是用定时器中断翻转引脚来模拟定时器中断里维护一个计数器计数器小于比较值时输出高电平否则输出低电平。// 51 单片机 L298N 例程定时器 0 模拟 PWM10 位分辨率 // 晶振 12MHz定时器 0 工作在方式 1中断周期 10us #include reg52.h sbit ENA P1^0; // 使能引脚接 L298N 的 ENA sbit IN1 P1^1; // 方向控制引脚 1 sbit IN2 P1^2; // 方向控制引脚 2 unsigned int pwm_counter 0; // 中断计数器 unsigned int pwm_duty 100; // 占空比设定值 0~1023 void timer0_init(void) { TMOD 0xF0; // 保留定时器 1 的模式设置 TMOD | 0x01; // 定时器 0 方式 116 位定时 TH0 0xFC; // 10us 中断一次12MHz 下初值计算 TL0 0x18; ET0 1; // 允许定时器 0 中断 TR0 1; // 启动定时器 EA 1; // 开总中断 } void timer0_isr(void) __interrupt 1 { TH0 0xFC; // 重装初值保证中断周期稳定 TL0 0x18; pwm_counter; if (pwm_counter pwm_duty) { ENA 1; // 占空比时间内输出高电平 } else { ENA 0; } if (pwm_counter 1024) { pwm_counter 0; // 周期 10us * 1024 ≈ 10.24ms约 97.6Hz } } void motor_set(int direction, unsigned int speed) { pwm_duty speed; // speed 范围 0~1023 if (direction 1) { IN1 1; IN2 0; // 正转 } else { IN1 0; IN2 1; // 反转 } } void main(void) { timer0_init(); motor_set(1, 512); // 正转占空比 50% while (1); }这段代码的初值计算是关键晶振 12MHz机器周期 1us定时器 0 方式 1 是 16 位中断周期设 10us初值就是 65536-1065526转换成十六进制约为 0xFFF6但上面代码写了 FC18这是按 20us 中断算的注意核对。如果你想直接抄把 TH0/TL0 改成 0xFF 0xF6中断周期就是 10usPWM 频率约 97.6Hz这个频率下电机噪音会比较明显但扭矩和转速控制都够用。97.6Hz 属于低频 PWM对 L298N 这类达林顿驱动器比较友好因为开关损耗低芯片发热比高频 PWM 小。实际接线时逻辑电源 VSS 和单片机 VCC 必须共地否则 I/O 高低电平没有参考点电机只会抖动不会转。这是 L298N 模块最常见的「不能转」的原因比代码问题出现得更频繁。4.2 STM32 例程硬件定时器输出 PWM 与方向控制的组合STM32F103 用硬件定时器输出 PWMCPU 不需要在中断里翻转引脚效率高很多。以 TIM3 的通道 1 为例PA6 复用为 TIM3_CH1PB0 和 PB1 做方向控制。初始化时先把 TIM3 设为 PWM 模式 1预分频器 71自动重载值 999在 72MHz 时钟下输出频率就是 1kHz。// STM32F103 标准外设库例程TIM3_CH1 输出 PWM 控制 L298N 的 ENA #include stm32f10x.h #include stm32f10x_tim.h #include stm32f10x_gpio.h void L298N_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能时钟GPIOA、GPIOB、TIM3 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 方向引脚 PB0、PB1 推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); // PA6 复用推挽输出接到 L298N 的 ENA GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); } void L298N_TIM3_PWM_Init(void) { TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 72MHz / (711) 1MHz计数 1000 次 1kHz PWM TIM_BaseInitStructure.TIM_Period 999; TIM_BaseInitStructure.TIM_Prescaler 71; TIM_BaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_BaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_BaseInitStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 500; // 初始占空比 50% TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM3, TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); } void motor_set(int direction, unsigned int speed_percent) { if (speed_percent 100) speed_percent 100; // 占空比 1000 * 百分比 TIM_SetCompare1(TIM3, speed_percent * 10); if (direction 0) { GPIO_SetBits(GPIOB, GPIO_Pin_0); // IN1 1 GPIO_ResetBits(GPIOB, GPIO_Pin_1); // IN2 0 } else { GPIO_ResetBits(GPIOB, GPIO_Pin_0); // IN1 0 GPIO_SetBits(GPIOB, GPIO_Pin_1); // IN2 1 } }这里有几个参数在实际移植时要按你的板子改TIM_Period 决定 PWM 分辨率如果设为 999 那占空比调节粒度就是 0.1%预分频 71 是在 72MHz 主频下算的如果你的芯片跑 8MHz 内部时钟预分频必须改成 7 才能维持 1kHzTIM_Pulse 是 CCR 寄存器值TIM_SetCompare1 是运行时改占空比的接口比直接改寄存器好在有预装载保护不会出现占空比跳变的毛刺。把例程从 51 移植到 STM32 时建议按下面这个清单核对避免「程序烧进去电机不动」这类问题检查项51 平台STM32 平台检查方法逻辑电源模块 VSS 与单片机 VCC 共地同上要求万用表量 VSS 与 GND 之间 5VPWM 频率97.6Hz中断模拟1kHz硬件定时器示波器测 ENA 引脚占空比输出中断中电平翻转CCR 寄存器值示波器看高电平占比方向逻辑IN 引脚按 GPIO 电平使用 GPIO_SetBits/ResetBits万用表量 IN1/IN2 电压上电瞬间状态初始化后电机才动PWM 初始化前 GPIO 默认浮空加下拉电阻或在初始化前拉低4.3 例程移植的 3 个必调参数与掉坑现场第一个必调参数是 PWM 频率。过高频会让 L298N 的达林顿管开关损耗激增芯片表面温度明显上升过低频会让电机在低速时一卡一卡地转噪音大。直流减速电机建议 1kHz~20kHz超过 20kHz 进入人耳听觉上限但驱动器的开关损耗大低于 100Hz 则转速不稳。调这个参数时优先改定时器预分频改完看电机有没有啸叫啸叫说明 PWM 频率落在了机械共振点上偏离 2~3kHz 一般能解决。第二个必调参数是占空比和转速的映射关系。直流电机带减速箱后占空比和转速接近线性但空载和带载特性差异很大。想实现闭环速度控制需要在 L298N 模块的 SENSE 引脚接采样电阻后接 ADC或者直接用编码器测速。开环场景下拉高斜率即可不要用分段线性表PID 调参时才需要精确标定。第三个必调参数是使能引脚的处理。如果用了 ENA 接 PWM那 IN1/IN2 只管方向电机能否转取决于 ENA 的占空比如果直接把 ENA 接 5V 固定使能那 IN1/IN2 电平决定转不转这种接法没法调速。模块上的跳线帽就是干这个的插上跳线帽表示 ENA 固定使能调速时拔掉跳线帽把单片机 PWM 引脚接到 ENA 排针上。很多人把跳线帽插着就去控制 ENA 引脚结果电机永远全速转这就是一个典型的掉坑现场。5. L298N 上电后的验收技巧示波器看波形、堵转测功耗、刹车与电流采样L298N 板子焊好、程序烧进去之后不要直接装车先按下面的验收流程走一遍十分钟能查出 80% 的硬件问题。把示波器探头夹在 OUT1 和 GND 之间另一路探头夹在 OUT2 和 GND 之间设置成直流耦合。电机空载转动时正常波形应该是两路反相 PWM 方波幅度接近 VS死区时间在纳秒级。如果波形在上升沿出现大幅过冲说明续流二极管接反或 PCB 走线寄生电感偏大如果波形幅度只有 VS 的一半可能是某个 H 桥管没有完全导通摸一下 L298N 芯片表面温度发烫的那个通道大概率有问题。堵转测试能直观反映功率余量。用螺丝刀卡住电机轴万用表串在 VS 回路里测电流同时用示波器测 VS 电压跌落。堵转电流 2A 时VS 跌落不应超过 0.3V如果跌落明显说明电源线太细或电源容量不足。此时 L298N 的上管压降约 1.4V下管压降约 1.2V芯片功耗约 5.2W一分钟后芯片表面应能在 60°C 以下超过这个温度要考虑换 MOSFET 驱动器或加大散热片L298N 不适合长时间堵转运行。刹车逻辑值得单独验一下把电机转起来后设置 IN1IN20 或 IN1IN21此时 H 桥两个下管或两个上管同时导通电机会快速制动。观察示波器可以看到电机两端电压很快降到接近 0但电流会瞬间增大所以频繁刹车会加剧芯片发热。如果你需要平滑制动用 PWM 动态刹车先给一个 50% 占空比的反向电压再逐步降到 0这样机械冲击小很多。电流采样是 L298N 被较少用到的功能但做闭环堵转保护时很有用。SENSE A 引脚接 0.5Ω 电阻到地当 OUT1 或 OUT2 的下管导通时负载电流流过采样电阻在电阻上产生电压。电压幅值等于 I_motor × 0.5Ω1A 电涯对应 0.5V这个电压用单片机的 ADC 可以直接测量无需运放。需要注意的是 SENSE 引脚只在对应半桥下管导通时才有电流流过所以采到的电压不是连续的需要在一个 PWM 周期内找准采样点或者加一个 1kΩ 电阻和 100nF 电容组成低通滤波器再进 ADC。这时候就能验证你画的 AD 原理图里 SENSE 网络有没有正确连接到单片机的 ADC 引脚用万用表量 SENSE 点和 ADC 引脚之间的导通性即可顺便把 PCB 上那颗 0.5Ω 采样电阻的焊点温度也摸一遍2A 电流下 0.5Ω 电阻功耗 2W温度会明显偏高记得选 2W 以上功率的电阻。本文还有配套的精品资源点击获取