5V 风扇怎么选、怎么驱动:风扇模块、MOSFET 与继电器

Cartoon of a large black square brushless case fan with a red-and-black lead ending in a white two-pin plug, beside a red circuit board carrying a black chip, four silver pins, a small white motor and a red two-blade propeller, with a blue microcontroller board cropped small at the bottom right

风扇要照着你手上已经有的那组电源来挑,然后用三极管、驱动模块或继电器去开关它——绝对不要直接挂在 Arduino 的输出引脚上。一颗裸的 5 V 或 12 V 机箱风扇就是两条线,一通电就转。风扇模块完全是另一回事:一颗裸马达坐在一颗驱动芯片上,所以你的引脚只负责对芯片下令,马达的电流由芯片去扛。

直流散热风扇和「风扇模块」,到底差在哪里?

这颗 4010 机箱风扇是一个封好的无刷单元:黑色的 40 × 40 × 10 mm 框、一条红黑线、一个小小的白色两针插头。它只需要两条线,是因为其余的东西都住在轮毂里面——一颗驱动芯片,加一颗盯着转子、跟着转子按顺序切换线圈的霍尔传感器。它自己换相,而这也正是它出厂时转速就已经定死的原因:那两条线上没有任何控制输入,所以你对供电做的任何事,同时也做在了里面那颗驱动芯片身上。

L9110 风扇模块的做法正好反过来:一块印着「Fan Motor」的红色板子,上面的插座里坐着一颗八脚的 L9110 H 桥,一个支架下面装着一颗白色的小型有刷马达,还有一片红色螺旋桨,由你自己压到轴上去。那颗马达是裸的——有电刷和换向器,没有电子线路——所以芯片才是这件产品本身。四个标着 GND、VCC、INA 和 INB 的引脚把活交给你的板子:把其中一个 IN 拉高它就转,拉另一个它就反着转。

想把风吹进项目盒里?机箱风扇加一个开关。想要一颗程序能启动、能调速、能反转的风扇?模块。

另外那几条路——按你的项目真正需要的来挑

ItemPriceQty
DIY Fan Module DC Small Motor Fan for Fire Fighting Project L9110DIY Fan Module DC Small Motor Fan for Fire Fighting Project L9110L9110FMRM11.90
DC Cooling Fan 5V/12V Brushless Small Fan for 3D Printer DIY Projects Electronics Cooling - 4010 FAN (12V)DC Cooling Fan 5V/12V Brushless Small Fan for 3D Printer DIY Projects Electronics Cooling - 4010 FAN (12V)F401012RM4.95
USB To 9V DC Jack Cable 5.5 x 2.1 mm 5V 9V DC Power USB Cable Connector Jack - USB TO 12V DC JACKUSB To 9V DC Jack Cable 5.5 x 2.1 mm 5V 9V DC Power USB Cable Connector Jack - USB TO 12V DC JACK12VUSBJRM5.95
5.5x2.1mm DC Power Male Connector Plug Jack Adapter for Arduino DIY Electronics Projects - 5.5x2.1 DC CONNECTOR (F)5.5x2.1mm DC Power Male Connector Plug Jack Adapter for Arduino DIY Electronics Projects - 5.5x2.1 DC CONNECTOR (F)5521DCFRM1.20
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 20CM40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 20CMDPWMF20RM3.20
IRF520 MOSFET Driver Module PWM Output Power Control for Arduino Raspberry Pi DC Motor ControlIRF520 MOSFET Driver Module PWM Output Power Control for Arduino Raspberry Pi DC Motor ControlIR520AMRM4.95缺货

这些是替代方案,不是上面那张清单的加购项。L9110 风扇模块是一体式的那条路:马达、螺旋桨和驱动全在一块板上。4010 的 12V 风扇,配上 USB 转 12V 的升压线和一条圆孔母座带线,就是 12V 那条路,母座那两个裸线头正好夹进继电器的螺丝端子。公对母杜邦线适合不用面包板的接法,而 IRF520 模块是给一颗裸风扇做真正 PWM 调速的 MOSFET 那条路。

卡通剖面对比图:左边是一颗黑色方形机箱风扇,轮毂被剖开,露出一颗驱动芯片、一颗青色传感器和几组铜线圈,前面是一条红黑线接着白色两针插头;右边是一块红色电路板,一颗大大的黑色八脚芯片驱动着一颗被剖开的白色有刷马达,里面只有线圈、换向器和电刷,轴上装着一片红色双叶螺旋桨
电子线路住在哪一边。机箱风扇把驱动芯片和霍尔传感器藏在轮毂里,外面只留两条普通的线。模块把驱动芯片摆在板子外面,因为它带的那颗白色小马达,里头除了线圈、换向器和两片电刷之外什么都没有。

为什么 5V 风扇不能直接挂在 Arduino 的输出引脚上?

Uno 兼容板上那颗 ATmega328P,对电压很大方,对电流很小气。它的数据手册把单个引脚的绝对极限写在 40 mA,但设计时要按 20 mA 来算,因为输出电压那几张表就只列到这里。超过之后,芯片不再保证一个被拉高的引脚还接近 5V:引脚的输出管子本身有电阻,你拉得越狠,它吃掉的电源就越多。引脚是先变软,不是先炸。

再看马达在通电那一瞬间要的是什么。转子还没动,所以它生不出反电动势去对抗电源,唯一限制电流的只剩绕组那点裸电阻。那一下涌流——每次叶片被卡住都会重来一次——是运行电流的好几倍,而运行电流本身,数量级上就已经不是 20 mA 该碰的东西了。一颗 40 mm 风扇就是一颗马达。比起一句经验法则,你更想要手上这颗风扇的实际数字的话,把万用表打到直流电流档串进去,趁它自由旋转时读一次;启动和堵转是这个数的好几倍,而引脚要扛的正是堵转那个数。

关于续流二极管的那套说法,在这两个零件里只对其中一个成立。有刷马达的绕组,或者继电器的线圈,是一个电感:把它的电流切断,塌下来的磁场会让线圈生出足以维持这股电流的任何电压——一个高过你电源、方向还相反的尖峰,而这正是击穿三极管的东西。在线圈两端并一颗二极管,就等于给了它一个无害的回路去消散掉,L9110继电器模块都在板上自带了。无刷风扇不属于这一类负载:它自己的驱动在内部就把这种切换吸收掉了。它照样不能碰引脚——为的是电流,不是那个尖峰。

开关一颗风扇,老实说有哪三条路?

MOSFET 低边开关是最便宜的一条路。三极管——MOSFET 或双极型——坐在风扇的负极线和地之间;引脚驱动它的栅极或基极,这只花掉负载电流的一小部分,而风扇的电流经三极管流到地,不再经过芯片。之所以叫低边,是因为开关坐在接地那一端,而这不是随便定的:N 沟道 MOSFET 要栅极比源极高出几伏才导通,在下面那一头源极就是地,所以一个 5V 的引脚够得着。把同一个零件搬到正极线上,源极就跟着电源浮起来,栅极得高过电源才开得了,你就掉进电荷泵或者 P 沟道器件的世界了。IRF520 模块就是这条路的成品版,它有一个失效模式被我们那篇 IRF520 指南拆开讲过:栅极从 5V 逻辑那边永远拿不到足够的电压来完全导通,于是风扇转起来又停掉。

L9110 风扇模块是唯一一条风扇和驱动一起到货的路。L9110 是单个 H 桥——一颗马达,不是两颗——每通道连续 800 mA,供电范围 2.5–12V,内建续流二极管,而且是两个控制脚而不是一个——反转就是从这里来的,我们那篇 L298N 指南演示过。

当风扇的电源和你的逻辑是两个不同的电压时,继电器才配得上位置。我们这块一路 5V 继电器模块用的是印着 10A 30VDC 的 SRD-05VDC-SL-C,它的线圈侧和触点侧不共用任何金属:IN 端子只是点亮你在红板上看得见的那颗光耦,模块自己的三极管从 DC+ 把线圈吸合,而这个线圈扳动的触点,是几片跟前面这些都不相连的金属簧片——这就是它们能去通一个对你板子一无所知的 12V 回路的原因;我们那篇继电器指南讲得更深。

路数 风扇的电流由谁扛 能不能调速 风扇电源可以跟逻辑不同吗 我们的零件
三极管 / MOSFET 低边开关 三极管,流到地 可以——真正的 PWM 可以,只要把地接在一起 IRF520 模块
H 桥驱动模块 L9110 芯片 可以,还能反转 只能在芯片的 2.5–12V 范围内 L9110 风扇模块
继电器 机械触点 不行——只有开和关 可以,完全隔离 5V 继电器模块

一颗三极管在通过负载电流,用看的,不是用画的:

L9110 风扇模块要怎么接?

L9110 风扇模块只要四条线,别的都不要。GND 和 VCC 接你板子的地和 5V,而这一路 VCC 同时喂芯片的逻辑和它驱动的那颗马达——所以给模块供电的那个东西也得扛得住马达,跟风扇是同一条规矩:如果螺旋桨一启动板子就重启,就给模块自己一组电源,然后把地接在一起。INA 和 INB 接两个数字引脚,芯片是成对地读它们。

INA INB 螺旋桨会怎样
LOW LOW
HIGH LOW 往一个方向转
LOW HIGH 往另一个方向转
HIGH HIGH 停——跟两个都 LOW 一样

两个输入同电平都会让马达停,而且停的方式是一样的:H 桥把马达的两个端子短接在一起,于是还在转的电枢对着自己的短路发电,变成刹车而不是滑行。调速也是从这同样两个脚来的——一个按住 LOW,对另一个下 analogWrite,绕组的电感会把这些脉冲平均成一股更小的稳定电流。在 Uno 上只有标着波浪号的那六个引脚(3、5、6、9、10 和 11)能出真正的 PWM;analogWrite 用在别的脚上,只会给你全开或者全关。

这块模块有一个要说清楚的限制:那片红色螺旋桨是你自己压到轴上去的压配件,做出来的结果是一块裸板上一片露在外面的桨叶。它能在工作台上吹动空气,也能听令反转,但它没法像方形机箱风扇那样拧进项目盒的侧壁。要给一个盒子散热,零件还是机箱风扇——模块是给一颗由你的程序说了算的风扇准备的。

为什么 PWM 会让便宜风扇嗡嗡响,或者干脆不转?

有刷马达吃 PWM 一点意见都没有。把它的供电切开,降低的是绕组上的平均电压,绕组自己的电感把脉冲抹平成一股稳稳的电流,马达就慢下来。你对 IN 脚下 analogWrite 的时候,L9110 模块干的就是这件事。

两条线的无刷机箱风扇会出状况,是因为切开它的供电,同时也把轮毂里那颗驱动芯片一起切开了。每一个关断期,那颗芯片的电源轨都会塌下来,它丢掉霍尔读数,也丢掉自己在换相顺序里的位置,然后在下一个脉冲上重新开始。低占空比的时候它永远拿不到一段够长的时间把转子带过来,于是线圈只是按 PWM 的节奏被踢了几下,风扇原地不动,用你的 PWM 频率嗡嗡叫。每一颗风扇都有一个占空比下限,低于它就不转。

踢启动才是能用的答案。先下满占空比几百毫秒,让转子动起来、让驱动拿到一段干净的时间去找到换相,然后再降到你要的那个占空比——一颗正在转的转子,需要的力矩远小于一颗停着的转子挣脱静止所需要的。把那个下限写死成你的程序允许下达的最小值:一颗被命令跑在 15%、却悄悄堵住不转的风扇,是一颗你以为它在散热的风扇。

模块上那颗有刷马达没有这些东西要对付:

卡通对比图:两颗一模一样的黑色方形机箱风扇,各自上方是一条青色脉冲波形——左边是窄脉冲波形,下面的风扇静止不动,标着一个橙色叉号和几道橙色声波弧;右边的波形先是一段满高度的平台再转成窄脉冲,下面同一颗风扇正在旋转,带着青色的运动弧线
同样一个低占空比,两种到达方式。左边直接丢进一路被切开的供电,风扇里面的驱动始终找不回自己的位置,于是它原地嗡嗡响。右边先用一小段满功率把转子带动起来,同样那个低占空比就足以让它继续转下去。

该买 5V 那颗风扇,还是 12V 那颗?

4010 机箱风扇有 5V 和 12V 两个版本,该买的是你项目里已经有的那组电源的电压,不是你看上的那颗风扇。无刷风扇的驱动有一个欠压下限,低于它就换不了相,所以一颗 12V 风扇喂 5V 会抽搐、爬行,或者干脆什么都不做——而这不是故障。反过来那一边更糟:5V 的零件接 12V,不会跑得更快,它会烧。

用 USB 供电的话,4010 5V 风扇就是答案。手上有 12V 火牛,就拿 12V 风扇,板子还是走它自己的 5V;只有 USB 的话,上面那条升压线圆孔母座带线就凑出一对 12V 的裸线头。插头尺寸和极性,是我们那篇直流电源指南的题目。

框体尺寸是另外一个决定。扫掠面积随直径的平方增长,而噪音随叶尖速度陡峭上升,所以更大的框体能更慢、更安静地送出同样的风量。孔位允许多大,就取多大。

框体 5V 12V 适合
40 × 40 × 10 mm 4010 5V 4010 12V 小型项目盒、3D 打印机的电子仓、盖子很紧的机壳
60 × 60 × 10 mm 6010 5V 6010 12V 比较大的机壳,多开那个孔不心疼、而且在意安静的场合

装风扇之前,有两条规矩值得先知道。轴流风扇从敞开的叶面把空气吸进来,从轮毂被支撑筋架着的那一面推出去——也就是贴标签的那一面——所以一颗装反了的风扇,会老老实实地把热风吹回盒子里。而一颗风扇在一个封死的盒子里什么也做不了:空气能出去多快,取决于它能进来多快,所以在另一头开第二个口,风扇在下就把这个口开高,让风扫过机壳的整个长度,而不是对着一堵关死的墙猛推。四个角孔是 ø4 mm,40 mm 框的孔距是 32 mm 见方,60 mm 框是 50 mm,依据 Sunon 的尺寸图——M3 螺丝穿过去还很宽裕,而这些就是风扇还没到货、你就可以先在面板上画好的数字。

温度触发的风扇要怎么做?

DHT11 传感器读空气温度,Uno 做判断,继电器模块切断风扇的红线。没有一处需要焊接:继电器的两个端子排都是螺丝夹,风扇那个白色插头正好吃公头杜邦针。继电器出现在这里不是为了它的隔离——传感器、板子和风扇全跑在同一组 5V——它在这里,是因为一个温控开关从头到尾只需要开或关,而螺丝端子继电器是唯一一条不用焊、也不用去算三极管尺寸就能走到的路。哪天你要的是风扇变安静而不是关掉,再换到 MOSFET 那条路。

有一个细节决定了整个布局:Uno 只有一个 5V 插孔,而这个项目需要三个地方有 5V——继电器的 DC+、传感器的 VCC,还有风扇。这就是那块迷你面包板的活。这块 SYB-170 没有电源轨,所以随便挑一条普通的五孔排当 5V,另一条当地;哪些孔是通的,我们那篇面包板指南讲过。开工前先数一遍线:5V 那排上要落四根(从 Uno 进来的、去继电器 DC+ 的、去传感器 VCC 的,还有接到继电器 COM 的),地那排也是四根,所以五个孔刚刚好,多出来一根线就没地方放了。

为什么
Uno 的 5V 面包板 A 排 A 排成为共用的 5V 汇合点
Uno 的 GND 面包板 B 排 B 排成为共用的地
DHT11 的 VCC / GND / S A 排 / B 排 / Uno 的 D2 三根折弯的针脚;S 是信号
继电器的 DC+ / DC− A 排 / B 排 给线圈那一侧供电
继电器的 IN Uno 的 D8 控制脚
A 排(5V) 继电器的 COM 把电源送进触点
继电器的 NO 风扇的红线 触点闭合 → 风扇拿到 5V
风扇的黑线 B 排(GND) 把风扇的回路补齐

DHT11 装在哪里,决定了这个闭环乖不乖。它读的是它自己周围那一圈空气,不是你要冷却的那个零件,所以把它装在盒子里靠近发热处、并且避开风扇自己的风路:一颗坐在风里的传感器是第一个被吹凉的东西,几秒钟内就掉回下限之下,又立刻把风扇关掉。这种来回短周期,正是程序里那两度间隔存在的意义,而一颗位置放坏的传感器会跑赢它。DHT11 是一颗量到 50 °C 的环境空气传感器——它看的是盒子里的温度,不是拿来贴在稳压器或驱动芯片上的探头。

上电前有两项检查。继电器板下缘附近那颗跳线,选的是 IN 上的 HIGH 还是 LOW 让线圈吸合——把它设成 HIGH 吸合,或者把下面程序里 digitalWrite 的电平对调。无论哪一种,Uno 的引脚从通电那一刻起、一直到 setup() 跑起来之前都是输入、什么都不驱动,所以那一小段时间里继电器完全交给模块自己的上下拉去决定:接着风扇按一次复位看一看,让你现在就见到这个行为,而不是等盖子盖上以后才见到。还有,用 USB 时 Uno 的 5V 引脚是从主机接口经过板上那颗自恢复保险丝来的,所以风扇喝的是板子那口水:如果风扇一启动板子就重启,就给风扇自己一组电源,只把地接在一起。

手指和扎带离叶片远一点,整个项目留在低压直流里——这里没有任何一样东西该靠近市电线路。

// 温度触发的 5V 风扇:DHT11 -> Uno -> 继电器模块 -> 风扇。
// 继电器只有开和关,所以风扇不是全速转,就是完全不转。
#include <DHT.h>

const uint8_t DHT_PIN   = 2;    // DHT11 的 "S" 脚
const uint8_t RELAY_PIN = 8;    // 继电器模块的 IN 螺丝端子
const float   FAN_ON_C  = 30.0; // 到了这个温度或更高就开风扇
const float   FAN_OFF_C = 28.0; // 到了这个温度或更低就关风扇
// 两个数字之间那 2 degC 的间隔就是回差:没有它,一个在单一门槛
// 上下抖动的读数会让继电器一直跳。

DHT dht(DHT_PIN, DHT11);
bool fanRunning = false;

void setup() {
  Serial.begin(9600);
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);  // 释放:第一次读数之前风扇先关着
  dht.begin();
}

void loop() {
  float tempC = dht.readTemperature();

  if (isnan(tempC)) {            // 一次失败的读数不可以去动风扇
    Serial.println(F("DHT11 read failed"));
    delay(2000);
    return;
  }

  if (!fanRunning && tempC >= FAN_ON_C) {
    fanRunning = true;
  } else if (fanRunning && tempC <= FAN_OFF_C) {
    fanRunning = false;
  }

  digitalWrite(RELAY_PIN, fanRunning ? HIGH : LOW);

  Serial.print(tempC, 1);
  Serial.println(fanRunning ? F(" C  fan ON") : F(" C  fan OFF"));

  delay(2000);                   // DHT11 两次读数之间大约需要 2 秒
}

它需要 IDE 的 Library Manager 里那个 DHT sensor library;想把读数放到屏幕上看,见我们那篇 DHT11 加 OLED 指南

卡通风格的桌面成品:一块蓝色单片机板、一块白色迷你面包板上插着一颗装在黑色转接板上的淡蓝色 DHT11 传感器、一块带蓝色方块继电器和蓝色螺丝端子的红色继电器板,还有一颗正在旋转、带着青色气流弧线的黑色大方形机箱风扇,全部由彩色杜邦线连在一起
做完的这个闭环:淡蓝色的 DHT11 方块读空气,蓝色板子做判断,红色继电器板闭合它的触点,黑色的 4010 风扇就全速转,一直转到温度掉回下限之下为止。

我们从真实客户身上看到的常见错误

把「才 5V 而已」当成「引脚接得起」。电压是风扇需要的东西;电流是它向开关它的那个东西索取的东西。一颗 5V 风扇接在 5V 引脚上,还是一颗马达挂在 20 mA 上。

指望机箱风扇能反转。把红线和黑线对调不会让它倒着转;里面那颗驱动认定了一个极性。反转是 H 桥的活。

指望继电器能调速。它的触点要么碰上,要么没碰上。想要风扇变安静而不是关掉,那是 MOSFET 或者模块那条路。

FAQ

小型 5V 直流风扇可以直接接到 Arduino 引脚上吗?

不行。ATmega328P 的引脚是按 20 mA 定规格的,绝对极限 40 mA,而马达的启动和堵转电流是运行电流的好几倍,运行电流本身在数量级上就已经不对了。中间要放一颗三极管、一块驱动模块,或者一个继电器。

为什么我用 analogWrite 的时候,5V 风扇只是嗡嗡响却不转?

因为切开供电的同时,也切开了风扇轮毂里面那颗驱动芯片。它在每一个关断期都会丢掉自己的换相状态,然后在每个脉冲上重新开始,所以低占空比时转子根本转不过来,你听到的就是 PWM 频率本身。先用满占空比踢它几百毫秒,再降到你要的转速。

直流散热风扇和风扇模块差在哪里?

散热风扇是一个封好的无刷单元,驱动在轮毂里面,外面出两条线;它只会转。风扇模块是一颗裸的有刷马达加一片螺旋桨,装在一块 L9110 H 桥板上,所以单片机可以启动它、停住它、调它的速度,还能让它反转。

无刷机箱风扇需要并一颗续流二极管吗?

不需要,而这正是那套常见说法会误导人的地方。续流二极管保护的,是你的开关不被一个裸线圈塌陷的磁场打穿——有刷马达或者继电器线圈。无刷风扇自己的驱动在内部就处理掉了。排除引脚这条路的是电流,不是那个尖峰。

12V 风扇可以用 5V 来跑吗?

跑不出什么名堂。无刷风扇里面那颗驱动有一个欠压下限,所以在 5V 上,一颗 12V 风扇会抽搐、爬行,或者干脆不动——那是风扇行为正常,不是零件坏了。买 5V 版本,或者用一条升压线加一条圆孔母座带线,把你的 5V 抬到 12V。反过来绝对不行:5V 风扇接 12V 不会转得更快,它会过热。

最后更新:2026 年 9 月。有问题?WhatsApp 联系我们

Leave a Reply

Your email address will not be published. Required fields are marked *