
做电子硬件的人大多有个错觉好像只要涉及PWM不上MOSFET就显得不专业。我刚入行那几年也是这个毛病一提到PWM就去翻MOS管选型手册完全没把三极管放在眼里。直到有一次给客户做一台低压小功率的恒温控制板BOM成本被压得很死我试着把输出级的MOSFET换成了BJT整板成本直接就降了功能测试还一次通过。从那以后我养成了一个习惯BOM选型先算账再谈情怀。这篇文章围绕“用BJT做PWM控制器、把成本真正压下来”这个项目做一次完整复盘。核心涉及PWM信号产生、三极管开关电路设计、基极驱动计算以及实际调试中踩过的坑。适合正在做电机调速、LED调光、加热器控温或者风扇调速的硬件工程师、电子爱好者和学生。就算你手上用的是STM32、ESP32这类单片机也完全能用上这里面的思路。1. 方案论证BJT做PWM到底划不划算1.1 为什么很多人一上来就选MOSFET先聊一个现实问题为什么工程师们一听到PWM脑子里第一个蹦出来的就是MOSFET三个原因栅极几乎不取电流、导通电阻低、开关速度快。MOSFET的栅极是绝缘的只要在栅极和源极之间建立起足够电压就能导通稳态时栅极电流几乎是零所以驱动电路可以做得很简单。导通电阻Rds(on)在低压小电流器件上也可以做到几十毫欧大电流下功率损耗很低。开关速度更是BJT比不了的功率MOSFET在几百kHz的应用里都能轻松工作。这些优势在中等以上功率、高频开关的场景下确实是决定性的谁都替代不了。但在低压、小功率、频率不高的PWM控制场景里MOSFET的这些优势基本发挥不出来而它的成本劣势就露头了。如果只是驱动一颗LED、一个小电机、一根加热丝负载电流在几百毫安到一两安培开关频率在1kHz到20kHz之间MOSFET的快速开关能力完全用不上低导通电阻带来的效率提升也微乎其微。这时候还为每个通道多花几毛钱甚至几块钱去上MOSFET纯属浪费。1.2 成本账BJT到底能省多少钱拿具体价格说话。我平时在国内电子市场拿货常见的贴片三极管SS8050、2N2222批量单价在3到8分钱直插的BC547也就是一毛上下。而常见的N沟道小信号MOSFET比如AO3400批量也要0.1到0.2元带一点电流规格的贴片MOS像Si2302这种单价通常不会低于0.1元中等功率的TO-252封装MOS一般要0.5元以上。价格差异只是冰山一角。MOSFET在某些电路里还需要额外的栅极驱动半桥、全桥里的高边MOS要做电平移位或者干脆加专用栅极驱动芯片BJT就没有这个问题基极就是电流驱动串联一个电阻就能工作。整体BOM算下来单通道PWM用BJT方案比MOSFET方案便宜一半以上是常有的事。我整理了一个对比表方便各位直观参考。对比项BJT三极管MOSFET场效应管单颗元件成本几分钱到几毛一毛到几元驱动方式基极电流需限流电阻栅极电压稳态无电流是否需要驱动IC多数场景不需要高边或大电流场景可能需要导通损耗Vce(sat) 0.2~2VRds(on)×I大电流更优开关速度存储时间大几十kHz以上吃力轻松上百kHz大电流承受能力较弱容易发热强电路复杂度简单一个电阻搞定较复杂驱动要求高严格来说具体价格随着市场波动这里给的是一个量级判断不是挂牌价。核心结论是在低压、小功率、中低频PWM场景下BJT的性价比确实能打省下的钱不是一星半点。1.3 什么场景适合用BJT什么场景必须换MOSFET根据我这几年在量产项目里反复验证下来的经验用BJT做PWM开关的黄金区间是电压3V到24V、电流1A以下、PWM频率不超过20kHz。如果电流超过2A或者频率超过50kHz还是乖乖用MOSFET不然散热和开关损耗会非常难看。具体拆解下来这些场景最适合BJT方案单片机直推的小功率直流电机调速比如玩具电机、模型水泵、桌面小风扇LED灯带调光、电子蜡烛的火焰模拟频率低到几百赫兹都行加热丝或加热片的PWM控温频率几赫兹到几十赫兹就够4线PWM风扇的低成本调速改造很多树莓派玩家就是这么干的低频电磁阀、继电器线圈的PWM控制这些场景的共同点非常明显负载电流不大开关频率不高对效率不敏感但对成本极其敏感。如果你的应用正好落在这些区间里那就大胆用BJT省下来的预算花在更该花的地方。别为了跟风用MOSFET最后发现性能没提升成本倒是上去了那才是真的亏。2. 三种低成本PWM控制电路拆解2.1 方案一NE555产生PWM 三极管扩流如果项目里没有MCU或者不想让主控承担所有PWM输出任务用NE555产生PWM是非常经典的做法。NE555本质上是一个带比较器和RS触发器的定时电路通过外部电阻和电容的充放电就能在输出脚上生成固定频率的方波。要让占空比可调只需要在放电通路上加两个二极管把充电和放电的路径分开就行。典型接法是这样的NE555的输出端也就是第3脚串联一个限流电阻后直接接三极管基极三极管发射极接地集电极接负载负载另一端接电源正极。NE555的输出能力不错能拉能灌200mA左右的电流驱动一个普通BJT的基极绰绰有余。如果只是做LED调光甚至可以省略功率三极管直接用555输出驱动小功率LED。NE555的频率和占空比计算公式用二极管分离充放电回路后是这样充电时间t1 0.693 × R1 × C1放电时间t2 0.693 × R2 × C1周期T t1 t2 0.693 × (R1 R2) × C1频率f 1.44 / ((R1 R2) × C1)占空比D R1 / (R1 R2)调R1控制充电时间调R2控制放电时间占空比就可以在很宽的范围内自由调整而且频率基本保持不变。整套方案下来一个555加一两个三极管加几个电阻电容总成本不超过一元就能得到一个带着调光旋钮的PWM控制器。很多学生竞赛作品和DIY电机调速器到现在仍然在用这个方案便宜、稳定、好调试。需要注意NE555在低电压下工作时输出高电平会比电源电压低一些但一般3V以上供电都能正常驱动普通三极管。如果你的系统只有2.7V这种超低压就需要选低压版的555或者改用方案二。2.2 方案二单片机PWM输出直驱三极管这是目前最常用、也最实用的一种方案。信号产生和算法全交给MCU的硬件定时器模拟电路只承担一个输出开关的角色设计思路非常清晰。以STM32F103为例定时器PWM输出几乎是最基础的配置。PWM输出频率由定时器时钟、预分频器和自动重装载值共同决定f 定时器时钟 / ((PSC 1) × (ARR 1))占空比则由比较寄存器CCR控制CCR ARR × 目标占空比。如果你需要16位分辨率的PWM把ARR设成65535占空比就能以1/65535的精度连续调节这在LED调光、舵机控制、精密恒温等场景里非常实用。ESP32的做法也类似用的是LEDC外设。先调用ledcSetup配置通道频率和分辨率再用ledcAttachPin把引脚绑定到通道最后用ledcWrite写入占空比数值。树莓派控制PWM风扇也可以用硬件PWM或软件PWM库来实现原理一致。MCU输出的GPIO信号经过一个限流电阻接到三极管基极就完成了驱动接口。这里最关键的是限流电阻的取值它决定三极管能不能进入饱和区。电阻太大基极电流不够三极管工作在线性区发热严重电阻太小又可能超出GPIO的驱动能力。具体的计算方法我放到第3章实操部分详细展开。GPIO和BJT的搭配还有一个好处很多单片机引脚本身支持PWM输出映射到不同引脚布线非常灵活。比如STM32的定时器通道可以重映射到别的引脚避开和其他外设的冲突ESP32的LEDC通道也几乎可以绑定到任意支持输出的GPIO。这在设计PCB时省了不少事。2.3 方案三比较器搭PWM振荡器适合纯模拟控制有些工业应用场景里不方便用MCU但又想实现模拟电压控制占空比就需要用比较器来搭PWM振荡器。LM393或LM358是典型选择通过滞回比较电路加RC反馈就能产生频率可调、占空比可调的方波。这种方案的典型结构是把三角波发生器产生的三角波送到比较器的一个输入端把控制电压送到另一个输入端。比较器输出就是PWM方波控制电压越高占空比越大。这种方式非常适合做温度控制器的线性调功用一个电位器或一个温度传感器的输出电压就能直接控制加热功率。L对于新手我不太建议一上来就搭这种电路因为运放的反馈参数计算比较繁琐而且涉及负压、共模输入范围等一堆细节。但在成本比MCU低、可靠性要求高、功能不需要太多灵活性的场合这个方案非常实用。工业上大量老式温控仪表内部就是这种结构几十年了依然在用。3. 实操搭一个STM32控制的BJT PWM电机调速模块3.1 项目目标和元件清单光讲理论容易飘我拿一个完整的实操案例来走一遍流程。这个项目我在工作里做过类似版本这里做一个简化版分享。设计目标输入STM32F103 PWM输出3.3V逻辑电平负载5V / 500mA直流有刷电机PWM频率10kHz成本目标三极管方案单通道BJT物料成本控制在0.5元以内元件清单元件型号/规格数量作用NPN三极管S80501功率开关基极限流电阻100Ω ~ 150Ω1限制基极电流基极下拉电阻10kΩ1防止误开启续流二极管1N5819或SS341吸收电机反向电动势电源去耦电容100μF电解 0.1μF瓷片各1稳定供电负载5V直流电机1被测对象S8050是一款非常经典的NPN三极管最大集电极电流500mA到1A左右饱和压降在0.3V到0.5V之间价格在批量采购时几分钱一颗非常适合这个小功率电机驱动场景。3.2 关键计算基极电阻到底怎么取这部分是BJT开关电路的重头戏我详细拆解计算过程后面再遇到类似设计可以直接套用。已知S8050在500mA集电极电流下直流电流增益hFE典型值约为120但为了确保三极管进入深度饱和区设计时取最小值40甚至取30来算都不过分。毕竟同批次三极管的hFE离散性不小温度变化也会影响增益按最小值计算最保险。所需最小基极电流Ib_min Ic / hFE_min 500mA / 40 12.5mA实际工程中为了保证三极管稳定饱和一般会取2倍以上的过驱动电流。这里按25mA设计。再看STM32F103的GPIO驱动能力。这个型号的GPIO最大输出电流约为25mA和我们的需求刚好匹配。但要考虑一个问题GPIO在输出大电流时实际高电平电压会掉。查STM32F103的数据手册IO口在20mA拉电流时最小高电平约为2.4V典型值在3.0V左右。所以计算基极电阻时不能直接用3.3V算按2.8V作为驱动电压是比较保守合理的估计。S8050在500mA下Vbe(sat)最大约1.0V取0.9V计算。基极限流电阻Rb (Vin - Vbe) / Ib (2.8 - 0.9) / 0.025 76Ω实际取最接近的标准值100Ω。这个电阻值在大量项目中实测下来工作稳定100Ω既保证基极电流足够也让GPIO的输出电流在安全范围内。如果你想留更多余量可以取82Ω如果希望GPIO压力小一点取150Ω也可以但饱和深度会稍浅适合负载电流不超过400mA的场景。完整计算过程就是这样看懂了之后任何类似场景都可以套用先定负载电流再查三极管hFE最小值算出所需Ib然后根据MCU高电平实际电压和Vbe计算基极电阻最后取标准值。3.3 电路连接、保护元件和PCB布局要点接线顺序如下STM32的PWM输出脚比如PA1串联100Ω电阻接到S8050基极基极对地接一个10kΩ下拉电阻防止上电瞬间GPIO高阻态时三极管误开启S8050发射极直接接地要靠近单点接地S8050集电极接电机负极电机正极接5V电源续流二极管反向并联在电机两端二极管阳极接电机负极也就是集电极阴极接电机正极和电源续流二极管是最容易被新手忽略的元件。电机是感性负载PWM关断瞬间会产生反向电动势峰值电压可能高达电源电压的几倍甚至几十倍。如果没有续流二极管这个高压尖峰直接打在S8050的集电极上轻则导致三极管击穿重则整板损坏。1N5819是肖特基二极管导通压降小恢复速度快在5V电机驱动里非常合适。PCB布局上几个要点很关键三极管的走线要紧而短尤其是发射极到地之间的走线越长越容易引入杂散电感影响开关波形单片机的地和电机电源的地必须共地否则PWM信号回路是断的三极管根本不会正常开关电源去耦电容尽量靠近电机的供电端100μF电解电容储能0.1μF瓷片电容滤高频如果负载电流再大一些可以在S8050集电极的铜箔上加大面积铺铜辅助散热别指望TO-92封装能扛超过1A的电流我在实际项目里遇到过因为发射极走线过长导致PWM波形严重振铃的情况后来把三极管往单片机引脚附近挪了挪加大地线宽度波形立刻干净了很多。这类细节只有在现场调试时才有深刻体会。3.4 实测波形与占空比调节效果硬件焊好以后用示波器同时测三组信号GPIO输出端的PWM波形、S8050基极波形、S8050集电极波形。正常情况下GPIO波形是干净的数字方波高电平3.0V到3.3V频率10kHz。基极波形和GPIO波形基本一致但电压略低这是因为被100Ω电阻和基极结压降拉低了一些。集电极波形则是反相的GPIO为高时三极管饱和导通集电极电压接近0VGPIO为低时三极管截止集电极被负载拉到5V。实测饱和导通时集电极电压通常在0.1V到0.3V之间说明三极管进了深度饱和区没有工作在线性区。只要看到这个波形基本就成功了。把占空比从0%慢慢调到100%电机的平均电压线性变化转速也随之平滑上升。在50%左右占空比时电机处于最大功率输出状态这时候用电流表测一下平均电流可以验证设计是否在工作范围内。如果电机在某个占空比区间出现明显的噪声或抖动多半是PWM频率和电机机械谐振频率接近了换个频率或调整占空比曲线就能解决。4. 常见问题与排查经验4.1 三极管发烫严重这个是头号问题三极管发热说白了就是功耗太大。功耗来自两个方面导通功耗和开关功耗。导通功耗 I × Vce(sat)。如果三极管正常饱和Vce只有0.3V左右500mA电流下导通功耗才0.15W基本不热。但如果基极驱动不足三极管被顶在了放大区Vce可能高达2V甚至3V功耗一下变成了1W以上板子很快就烫手了。排查思路很简单用示波器看集电极波形如果低电平电压超过0.5V很多说明三极管没有完全饱和基极电阻要减小或者过驱动电流要加大。如果是开关频率太高导致的发热就看下高电平上升沿和下降沿是否拖尾严重如果是换低频率测试。我处理过的最离谱的一个案例板子上三极管烫到变色最后发现是基极电阻从设计值100Ω实际焊成了10kΩ基极电流只有0.2mA三极管几乎全程工作在放大区。这种错误在贴片样机阶段特别容易发生一定要逐一核对BOM和实际元件值。4.2 关断延迟明显PWM波形断不开BJT有一个天生弱点导通时基区储存了大量电荷关断时需要时间把这些电荷抽走这就产生了关断延迟。用示波器看集电极波形会发现高电平下降沿不是陡峭的直线而是拖着一条“尾巴”。在小电流、低频场景下这个延迟可以忽略。但当占空比很小比如只有1%的时候如果关断延迟占了周期的一大部分平均输出电压就对不上了。解决关断延迟有几个常见手段在基极电阻上并联一个几千皮法的加速电容导通瞬间提供瞬间大电流关断瞬间帮助抽取基区电荷这是最常用的加速办法在基极和发射极之间并联一个几kΩ的电阻给基区电荷提供一条泄放通路减小基极过驱动倍数不是越大越好过大反而让关断更慢对了还有一点如果你在主控里用软件实现PWM频繁的中断响应也可能造成波形延迟。这时候最好用硬件定时器的PWM输出功能把波形稳定性交给外设软件只负责写比较寄存器。STM32和ESP32都有这个能力。4.3 上电瞬间负载自己动了一下这个现象在做电机控制时经常遇到。MCU上电复位期间GPIO引脚通常处于高阻态没有明确的输出电平。如果此时三极管基极没有外部下拉电阻集电极端的噪声或者电源上电浪涌都可能把三极管误导通一下导致电机“偷跑”零点几秒。解决办法就是前面说过的在基极对地接一个10kΩ下拉电阻。这个电阻不会影响正常工作时的基极电流分配因为10kΩ相对于100Ω基极电阻来说分流可以忽略但在上电瞬间能稳稳地把基极电位钳在0V保证三极管完全截止。另外在单片机启动代码里要把PWM相关的GPIO端口配置放在最前面先设为低电平输出或者复用推挽输出再开启定时器PWM。这样能最大程度避免启动阶段的毛刺输出。4.4 PWM频率上不去波形直接变形如果你试着把BJT方案的PWM频率从10kHz往50kHz以上调很快就会发现三极管越来越烫波形变形也越来越严重。根本原因就是BJT的存储时间。普通小信号BJT的存储时间在1到5微秒之间十有八九在1.5微秒左右。按照10kHz计算周期是100微秒存储时间占1.5%影响不大但到了50kHz周期只有20微秒存储时间占了7.5%开关损耗急剧上升。这里给大家一个经验阈值普通BJT做PWM开关频率尽量保持在20kHz以内如果必须在20kHz以上优先考虑MOSFET。这不是BJT不能用而是它的物理特性决定的硬上高频率只会得到一块发烫的废板。我在工作里做4线风扇调速时也遇到过这个问题。风扇的PWM信号频率标准一般是25kHz很多低压BJT在这个频率下已经比较吃力我干脆直接用AO3400这类逻辑电平MOSFET效果反而更好成本也没有增加太多。说到底还是要按应用场景选型。5. 经验补充既想省钱又想留后路5.1 同PCB兼容BJT和MOSFET的布局思路在量产项目中为了让成本和生产之间更有弹性我常用一个技巧在PCB上同时预留BJT和MOSFET的焊盘元件位号一样贴片时按当时的价格和供应情况决定贴哪个。具体做法是选一款SOT-23封装的NPN三极管比如SS8050和一款SOT-23封装的N沟道MOSFET比如AO3400两个封装尺寸完全一致。PCB上焊盘保持不变BOM里给这两个料留一个可选位号。硬件工程师设计时预留的基极串联电阻位保持不动对MOSFET来说这个电阻可以保留0到10Ω对BJT来说则需要按前面的计算方法取值所以需要预留两个电阻位或者从软件上调整输出电平来适配。这种兼容设计还需要注意BJT和MOSFET的驱动逻辑并不完全一样。BJT需要限流电阻MOSFET不需要BJT导通需要持续基极电流MOSFET只需要栅极电压。所以兼容设计不太适合高频PWM应用只能用于低频或中频的小功率控制。但这个思路在应对供应链波动时非常实用哪个料便宜用哪个哪个料有货用哪个项目就不会因为一颗料缺货而卡住。5.2 按功率档位直接套用的选型建议最后把我这些年验证过的选型模板整理出来给各位做一个快速参考负载参数推荐BJT型号推荐PWM频率关键注意事项5V / 0.3A以下SS8050、2N22221kHz ~ 10kHz基极电阻100~470Ω基本不需要散热5V / 0.5A~1AS8050或D88210kHz以内加续流二极管集电极铺铜散热12V / 1A左右D882、TIP411kHz ~ 10kHz加散热焊盘基极驱动电流要足够12V~24V / 2A以内TIP41、TIP122达林顿1kHz ~ 5kHz达林顿Vce高注意功耗必须加散热2A以上或频率50kHz以上换MOSFET高频随意不要再死磕BJT了这张表是经验值可以作为初始设计的参考。真正量产前一定要用目标批次的三极管实测饱和压降、温升和开关波形因为不同批次、不同品牌的器件参数离散性比你想像的大得多。另外多说一句达林顿管虽然增益高用起来方便但它的饱和压降比普通单管大不少。TIP120这类达林顿在2A下Vce可以到2V光导通功耗就有4WMOSFET在同样电流下可能只有0.1W左右。所以达林顿方案只适合对成本极度敏感、对效率不敏感的低频应用不要拿来和MOSFET比效率不在一个量级上。5.3 几个我自己踩过坑后记住的经验第一永远不要高估GPIO的驱动能力。STM32的25mA是最大值持续在高频开关下跑容易过热。能用100Ω以上电阻限制基极电流就别为了减小基极电阻去挑战IO极限。第二续流二极管的位置很重要要尽量靠近电机或电感性负载的引脚。二极管离得太远引线电感会让它失去保护作用该烧三极管还是烧。第三判断三极管是否饱和最简单的办法就是测Vce。饱和时Vce应该在0.3V以下如果大于0.5V就要警惕。这个测试不需要高档仪器万用表就能做。第四做量产设计时建议在PCB上预留测试点基极电压、集电极电压、电源各一个。小批量阶段测试点能救命出了问题不用飞线去蹭引脚。第五示波器看到的波形永远和你想象的差很远。我见过不少刚入行的工程师计算完理论占空比就以为完事了结果一测发现GPIO输出电平掉到2.5V基极电流变小三极管没进饱和区。设计时一定要给实际压降留出余地。实际上BJT做PWM这件事在很多人看来是“过时技术”但在我接触的大批量消费品电子里它依然非常活跃。低压小功率、成本敏感、功能稳定这三个条件放在一起BJT方案的竞争力非常强。如果你正面临一个低成本PWM控制需求不妨按这篇文章的思路先把BJT方案搭起来试一下再和MOSFET方案做一轮对比测试。很多时候性能差异没有你想象的大但成本差异实实在在摆在那里。