
简介L298N电机驱动器资料大全整合了原理图、PCB设计与单片机例程面向机器人、无人机、电动模型开发者解决双通道电机驱动中的电平匹配、散热布局与控制逻辑问题。资源共包含376个文件压缩包约3.1MB核心内容涵盖AD原理图与PCB工程、C语言及汇编源代码、KEIL工程配置、编译生成的HEX烧录文件以及数据手册、应用笔记、设计指南等PDF与DOC文档schdoc与pcbdoc可直接查看版图uv2与opt便于二次开发txt提供接线与调试说明。目前已有2993人学习适合电子爱好者与嵌入式开发者在实际项目中快速调用。通过这套资料可系统理解L298N的H桥控制时序学会设计包含续流二极管、限流电阻的保护电路并参考完整例程完成电机调速与正反转控制显著缩短开发周期。压缩包内目录按原理图、PCB、程序与文档分类整理便于快速定位。1. L298N电机驱动器资料为什么总是缺东西L298N是一款双H桥电机驱动芯片也是做小车、机械臂、智能家居最容易上手的方案之一。很多人手里攒了不少AD原理图库、PCB封装和单片机例程可真到动手时原理图里引脚对不上PCB过流发热例程烧进去电机不动。资料大全的难点从来不在文件数量而在于把AD原理图、PCB和例程串成一条可复现的链路。这里按平时整理资料的习惯从画原理图、排PCB到写51和STM32例程把每个环节的参数和坑讲清楚。2. L298N电机驱动原理图绘制AD原理图库、网络标号与ERC检查2.1 先看懂L298N引脚双H桥的电流路径L298N内部是两个H桥供电分成两路VS接电机电源VSS接5V逻辑电源。GND是公共地。控制侧有4个输入引脚IN1-IN4和两个使能引脚ENA/ENB。输出侧OUT1-OUT4分别接两个电机的两根线。ISEN A和ISEN B是电流检测脚通常串取样电阻接地不需要检测电流时直接接地。引脚功能整理如下表引脚名称方向功能4VS电源输入电机驱动电源常见6-12V最高46V9VSS电源输入逻辑电源5V5,7,10,12IN1-IN4输入H桥控制信号决定电机方向6,11ENA, ENB输入使能端接PWM可以调速2,3,13,14OUT1-OUT4输出接电机两端的引线1,15ISEN A/B检测/输出电流检测常接地或串电阻画AD原理图时我习惯把引脚按功能分区摆放而不是照抄数据手册的排列。这样读图的人能一眼看出电流路径VS和GND在左边电机输出在右边控制信号在下方。为了避免手工录入引脚导致错位我通常先用一段小脚本把数据手册的引脚表生成为CSV再对照AD库逐项检查# 生成L298N引脚定义CSV用于核对AD原理图库 pins [ (1, ISEN A), (2, OUT1), (3, OUT2), (4, VS), (5, IN1), (6, ENA), (7, IN2), (8, GND), (9, VSS), (10, IN3), (11, ENB), (12, IN4), (13, OUT3), (14, OUT4), (15, ISEN B), ] with open(l298n_pins.csv, w) as f: f.write(Designator,Name\n) for designator, name in pins: f.write(f{designator},{name}\n)这段脚本把15个引脚的Designator和Name写到CSV之后用Excel或者Python的pandas和AD导出的库报告做对比。参数上需要注意数据手册里1脚和15脚都叫ISEN只是A和B的区别核对时不能只看前半段。2.2 用AD从零画L298N电机驱动原理图2.2.1 创建AD原理图库元件在Altium Designer里先新建原理图库放置一个矩形边框然后按名字放置引脚。引脚端点的方向要朝外。L298N是15脚Multiwatt封装引脚间距比较大放引脚时把Display Name和Designator都填好例如1号脚Name填ISEN ADesignator填1。放置引脚的快捷键是PP也可以在菜单Place - Pin。放完引脚之后检查一下Pin Length默认30mil够用但信号名较长时可以改成40mil。把15个引脚按2.1里的位置分区摆放电源脚放上边地线下边输入左边输出右边。这样在原理图上放置这个元件时连线方向自然清晰后面接网络标号也省事。单独画一个L298N驱动模块时还要把模块上常用的电阻、电容、接线端子一并画进原理图库比如VSS对地的104电容、VS对地的电解电容。2.2.2 电机驱动原理图的电源和网络标号设置画L298N驱动电路时我习惯把VS和VSS分开标注。VSS接5VVS接电池正极。如果AD原理图模板里已经有电源符号最好在原理图页的属性里定义Power Port类型。电机输出端OUT1和OUT2之间可以放一个电机符号也可以直接用网络标号M和M-引出。用网络标号连接可以让原理图更干净而且不需要把线拉得很远。放置网络标号的快捷键是PN或者在Place - Net Label。放置后按Tab键编辑名称注意网络标号必须放在导线上不能悬空。这里有个容易忽略的细节L298N的GND引脚有多个画原理图时不能只在其中一个脚上放GND符号其他脚悬空。ERC检查时会报单端网络但不会自动告诉你该不该连。我的做法是给所有GND脚都放同一个GND电源符号让AD自动归类到同一网络。2.2.3 AD检查原理图有没有连上ERC规则与网络跳转经常有人画完原理图后发现引脚没连上测试时电机不动。Altium里最直接的手段是编译工程后看Messages面板或者手动执行Tools - Design Rule Check快捷键TD做电气规则检查。ERC会报Unconnected Pin和Net with no driver之类的错误。还有一个小技巧在原理图中双击网络标号或者按住右键拖动时按C键可以快速跳转到该网络的所有位置。AD原理图网络怎么跳转这个问题本质上是利用Navigator面板选中一个网络后它会列出所有连接点点击任意节点就能跳过去。我一般会在画完电源部分之后立刻做一次ERC把未连接引脚全部清掉再继续画控制部分。2.3 电机驱动原理图里最容易漏的3个点第一ISEN引脚悬空或直接接地。直接接地不影响基础功能但如果后面要接电流检测原理图就要预留电阻和运放位置。第二逻辑与驱动电源隔离。很多L298N模块在板上已经做了共地但自己画板子时如果不把VSS的GND和VS的GND连在一起控制信号没有参考地芯片可能无法正常工作。第三使能引脚ENA/ENB直接接VCC。想用PWM调速时使能脚必须接到单片机的定时器输出不能一直拉高。这三个问题在AD检查原理图有没有连上时不一定能查出来因为它们是有电气连接的但功能上不对。3. L298N驱动器PCB设计从PCB走线要求到DRC检查3.1 高电流路径的PCB走线宽度计算3.1.1 IPC-2221经验公式L298N每通道最大连续输出电流是2A峰值可达3A。走线宽度如果按普通信号线0.5mm处理大电流下会发热严重时铜箔会烧断。PCB走线要求里最关键的一条就是载流能力。常见做法是用IPC-2221的公式估算I k * dT^0.44 * A^0.725其中I是电流AdT是温升摄氏度A是铜箔截面积平方密耳k在外层走线时取0.048内层取0.024。知道电流后反推截面积再结合铜厚算出宽度。手算比较麻烦我习惯用下面的Python脚本快速估算import math def trace_width(current_A, thickness_oz, temp_rise_C, externalTrue): # IPC-2221 走线宽度估算 # current_A: 电流(A) # thickness_oz: 铜厚(oz), 1oz约35um # temp_rise_C: 允许温升(摄氏度) # external: 外层走线为True, 内层为False k 0.048 if external else 0.024 # 铜厚转换为英寸 thickness_in thickness_oz * 0.001374 # 先求截面积平方密耳 area_mil2 (current_A / (k * temp_rise_C**0.44)) ** (1/0.725) width_mil area_mil2 / (thickness_in * 1000) # 注意单位换算 width_mm width_mil * 0.0254 return width_mm # 3A电流, 1oz铜厚, 温升20度 print(trace_width(3.0, 1.0, 20, externalTrue))这段代码先按公式反推所需截面积平方密耳再由截面积除以铜箔厚度得到宽度mil最后转成毫米。参数里thickness_in是铜箔的物理厚度1oz铜箔约为35微米但这里用0.001374英寸来做单位换算。external参数很关键内层散热差载流能力下降一半所以同样的电流算出来宽度会是外层的两倍左右。实际PCB设计中L298N功率端都走外层所以尽量全板外层铺铜。3.1.2 推荐宽度和铜厚参数表为了快速查我整理了常用参数电流(A)铜厚(oz)温升(度)最小走线宽度(mm)推荐宽度(mm)11100.350.621200.751.231201.53.032200.91.821400.61.0推荐宽度是按实际生产余量取的。如果板子空间紧张可以在走线表面加锡或开窗Top Solder开窗这样等效铜厚增加但我只在样品阶段用这个办法。注意最小宽度是理论值PCB板厂的蚀刻误差、钻孔偏差都会让实际线宽变窄所以最终制板时至少加50%的余量。3.2 布局要点散热、电容和地线L298N的功耗主要由饱和压降产生大电流下芯片表面温度会明显上升。PCB布局时芯片的散热焊盘Tab引脚要直接连到一块加宽的铜皮上最好再打一圈过孔到背面铺铜。VS和GND之间的电解电容要尽量靠近芯片的VS引脚常见用100uF和100nF组合。电容离太远会失去滤波作用电机换向时尖峰可能让单片机复位。控制线和功率线要分开走。单片机那边的小信号地和大电流地单点相连防止地弹把PWM波形毛刺带到控制部分。L298N这类功率板用双面板就够板厚1.6mm铜厚1oz起步。PCB层叠厚度对散热的影响比想象中小关键还是铜厚和散热过孔数量。若还要做单片机驱动板那么单片机最小系统要离高电流路径至少5mm以上电机接线端子旁边的PCB丝印要标注正负极方便后面接电机时不会反接。3.3 AD20 PCB DRC检查与Gerber输出画完PCB之后Altium里执行Design - Rules - Electrical检查然后Tools - Design Rule Check用默认规则跑一遍。AD20的PCB DRC检查重点看Clearance和Width这两项L298N这种功率板建议把电源网络的Min Width单独设为1mm而不是用全板默认的0.254mm。可以在Rules里为VCC和GND网络添加独立规则。跑完DRC后Messages里如果出现Un-Routed Net Constraint说明还有线没连完。此时按快捷键Ctrl点击飞线可以快速定位。Gerber输出在File - Fabrication Outputs - Gerber Files。输出前确认layers里只勾选需要的铜层和丝印层不要选Keep-Out Layer。如果拿到的是别人给的参考板Gerber文件想转成PCB文件来复用布局可以在File - Import里尝试导入但铜箔和过孔参数往往会丢失我一般只用来参考外形和安装孔位置不走板层拆解。cadence PCB板层设置跟AD不同但核心思路一样把功率网络和信号网络分开设置线宽规则。4. 单片机例程51和STM32驱动L298N的PWM与方向控制4.1 电机驱动模块的引脚连接定义无论用哪种单片机控制L298N的引脚关系是一致的。ENA和ENB接PWM输出IN1到IN4接普通GPIO。实际连接可以按下面的表格。L298N模块STC89C52STM32F103作用VSS5V5V逻辑电源GNDGNDGND共地ENAP1.0PA6(TIM3_CH1)PWM调速IN1P1.1PA0方向控制IN2P1.2PA1方向控制ENBP1.3PA7(TIM3_CH2)PWM调速IN3P1.4PB0方向控制IN4P1.5PB1方向控制51单片机没有硬件PWM只能靠定时器中断模拟。STM32使用TIM3的CH1和CH2PA6和PA7默认复用功能初始化时必须配置为AFIO。下面代码以STC89C52为例用定时器0产生一个1kHz的PWM通过变量duty控制占空比。4.2 51单片机L298N例程定时器模拟PWM#include reg52.h #define PWM_PERIOD 20 // 一个PWM周期包含20个中断计数 sbit ENA P1^0; sbit IN1 P1^1; sbit IN2 P1^2; unsigned char duty 10; // 占空比 duty / PWM_PERIOD 50% void timer0_init(void) { TMOD 0x02; // 定时器0,8位自动重装 TH0 0xCE; // 12MHz晶振, 每50us中断一次 TL0 0xCE; ET0 1; TR0 1; EA 1; } unsigned char pwm_cnt 0; void timer0_isr(void) interrupt 1 { pwm_cnt; if (pwm_cnt PWM_PERIOD) { pwm_cnt 0; } if (pwm_cnt duty) { ENA 1; } else { ENA 0; } } void motor_forward(void) { IN1 1; IN2 0; } void motor_backward(void) { IN1 0; IN2 1; } void motor_stop(void) { IN1 0; IN2 0; }定时器0方式2是8位自动重装溢出周期固定为50us20次中断组成1个PWM周期所以PWM频率是1kHz。duty是中断计数的阈值duty越大每周期内高电平时间越长。修改duty值就可以调速但不要超过PWM_PERIOD否则PWM会一直输出高电平。如果不需要调速直接把duty初始化为PWM_PERIOD此时pwm_cnt duty恒成立ENA持续输出高电平相当于常开。实际电机调速时我一般让duty只从3变化到18避免边界处出现失控。STC89C52的IO默认是准双向口直接驱动L298N的输入脚没问题不需要加外部上拉。4.3 STM32例程用TIM输出PWM到L298N使用STM32F103时我习惯用HAL库操作初始化代码更短。这里只保留关键函数#include stm32f1xx_hal.h TIM_HandleTypeDef htim3; TIM_OC_InitTypeDef sConfigOC {0}; GPIO_InitTypeDef GPIO_InitStruct {0}; void L298N_PWM_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_TIM3_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_6; // PA6 - TIM3_CH1 GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); htim3.Instance TIM3; htim3.Init.Prescaler 72 - 1; // 72MHz/72 1MHz htim3.Init.Period 1000 - 1; // 1MHz/1000 1kHz HAL_TIM_PWM_Init(htim3); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 500; // 50%占空比 HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); } void motor_forward(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); } void motor_speed(unsigned short speed) { __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, speed); }这段代码里Prescaler和Period共同决定PWM频率72MHz先除以72得到1MHz的计数频率再除以1000得到1kHz。Pulse是初始占空比数值范围0到999。电机调速时直接调用motor_speed函数修改比较寄存器。注意PA6的复用功能映射在STM32F103上TIM3_CH1默认就在PA6不需要配置AFIO重映射但如果工程里其他外设占用PA6就要改用TIM3_CH2加PB5那一路需要重新查复用表。4.4 运行L298N例程前必查的3个条件第一共地。单片机和L298N模块的GND必须连在一起否则高低电平参考点不同经常出现电机不动或者抖动。第二VSS和VS供电正确。VSS稳定在5VVS到达电机额定电压但不要超过L298N的46V上限。第三ENA和ENB不能悬空。如果例程里没有使用PWM也要把ENA/ENB接到高电平。很多新人在STM32上只配置IN1-IN4忘了使能引脚的PWM电机当然不转。5. 把AD原理图、PCB和单片机例程整理成可复用的资料包5.1 资料包目录结构与命名规范我习惯按四个目录组织L298N_DriverKit/ ├── 00_Datasheet/ │ ├── L298N_datasheet.pdf │ └── 驱动板说明.pdf ├── 01_AD_Project/ │ ├── L298N_DRV_V10.SchDoc │ ├── L298N_DRV_V10.PcbDoc │ └── L298N_DRV_V10.PrjPCB ├── 02_Firmware/ │ ├── 51_demo/ │ │ ├── main.c │ │ └── README.txt │ └── STM32_demo/ │ └── Core/Src/main.c └── 03_Test/ ├── 实测参数.csv └── 接线图.pdf命名规范上AD原理图和PCB文件名要带版本号比如L298N_DRV_V10。例程main.c里要加上单片机型号和晶振频率注释。资料包里最重要的不是文件多而是每个文件引用的器件、网络名、引脚号完全一致。5.2 用AD输出PDF和BOM与立创EDA交叉核对整理资料时我一般会在AD里通过File - Smart PDF输出带网络标号的原理图PDF再导出一份BOM表。拿到BOM后去立创EDA打开相同元件封装核对引脚定义。为什么这么做网上流传的AD原理图库很多是从旧版数据手册手工画的引脚编号可能错位。交叉核对只需要几分钟但能避免PCB画完打样回来电机反转或烧芯片。核对完成后把PDF连同BOM一起放进03_Test目录这样下次直接打开PDF看网络名不用再启动AD。5.3 最省事的L298N硬件验证顺序找一块面包板先把L298N模块、单片机、电池和电机按4.1的表格接好。上电前用万用表量VSS对地电压应为5VVS对地电压为电机额定电压。然后用最少的代码测试单片机只做一件事把IN1拉高、IN2拉低、ENA给高电平。电机应该转起来。如果方向反了交换OUT1和OUT2接线不要改代码。PWM调速验证时用示波器或者逻辑分析仪抓ENA引脚确认波形频率是1kHz而不是几百赫兹的乱跳。STC的51单片机可以先用内部RC时钟跑排除外部晶振故障。调试时遇到电机抖动不转先把duty调到80%以上排除PWM电压不足再把使能脚直接用跳线帽接VCC区分是软件问题还是硬件问题。这个看似简单的顺序能筛掉大部分L298N驱动不转的案例。做资料包时把这套验证步骤写进README下次不管是自己还是别人接手都能在十分钟内判定问题出在AD原理图、PCB还是单片机例程。本文还有配套的精品资源点击获取