news 2026/10/5 5:30:04

Arduino PWM控制直流风扇调速实战:从占空比到续流二极管的避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Arduino PWM控制直流风扇调速实战:从占空比到续流二极管的避坑指南

Arduino玩PWM控制风扇这事儿,看起来是入门级操作,但真正调起来门道不少。很多人拿到板子第一步就是接个电机、写个analogWrite(9, 128),然后发现风扇嗡嗡响、转速不受控、甚至板子直接掉线——这些问题我都踩过。这篇文章就把我做直流电机风扇调速时踩过的坑、验证过的电路、以及调频率调曲线的心得完整整理出来,适合刚接触Arduino的同学,也适合做了几轮小车但电磁兼容一塌糊涂的人。

1. PWM调速的核心逻辑:为什么“斩波”比“降压”更聪明

1.1 先搞懂PWM到底是什么

PWM的全称是脉冲宽度调制,英文Pulse Width Modulation,本质是一串固定频率、高低电平交替的方波。真正控制功率的不是电压大小,而是高电平在一个周期内占的比例,也就是占空比。比如一个5V的方波,占空比50%,接上电机后平均电压约2.5V,电机就会以大约半速运行。

这个思想很容易和调压混淆,但两者完全是两码事。模拟调压是让电压连续变化,通常用可调稳压芯片或电位器分压实现;PWM调压则是高速开关电源,靠开关时间比例来模拟平均电压。类比来说,调压器像水龙头慢慢拧到中间,PWM像每秒开关一百次的水阀,最终总出水量大概是一半。对电机这种感性和电阻混合的负载,开关式控制反而更高效。

音频里的“音量控制”也是PWM的应用之一。简单说,数字系统没法直接输出“一半电压”,但可以输出“全开一半时间”,效果在宏观上等效于一半电压,这就是PWM存在的根本意义。

在Arduino里,PWM通常是8位分辨率,也就是占空比从0到255。analogWrite(9, 0)是0%,analogWrite(9, 255)是100%,analogWrite(9, 128)大概是50.2%。这个分辨率对风扇调速已经够用,如果想要更细腻可以升级到16位定时器或外部PWM芯片,但那是后话。

1.2 直流电机的负载特性:为什么PWM是天然选择

直流有刷电机本质上是感性负载,绕组有电感,电流不能突变。给电机施加恒定电压时,电流逐渐上升,达到稳定后电流由电机内阻和反电动势决定。电机转速越高,反电动势越大,稳态电流越小。这是电机自适应的特性,也是调速的基本物理基础。

如果用线性降压来调速,比如把12V降到6V给12V电机用,效率只有50%左右,多余的能量变成热量散在降压管上。电流大一点,功率管烫得能煎鸡蛋。而PWM调速是开关工作,MOS管要么完全导通(导通电阻很小)、要么完全截止(电流为零),平均损耗可以做到非常低。这就是为什么几乎所有电机驱动器都用PWM——丢掉的损耗小,效率高,电路简单。

但感性负载给PWM带来一个麻烦:断电瞬间电流要续流。电感中的电流不能突变,当MOS管关断时,电机绕组的电流失去通路,会在两端产生很高的反向电动势,如果超过MOS管击穿电压,管子直接报废。这也是后续一定要加续流二极管的原因,我们先记住这个结论,第2章会详细展开。

另外,PWM频率的选择对电机噪音影响巨大。低频PWM会让电机绕组发出可听见的“滋滋”声,这是磁致伸缩效应加电流脉动产生的噪声。一般推荐PWM频率避开人耳敏感区,常见做法是10kHz到25kHz。Arduino默认的490Hz和980Hz对直流电机来说偏低,这也是很多人做的风扇听起来像蜂鸣器的原因。

2. 硬件准备与驱动电路搭建

2.1 元器件清单:从小白到进阶一次配齐

做PWM直流电机风扇项目,核心元件并不复杂。我先给一份我自己常用的清单,分两类:基础入门版和进阶扩展版。

基础版包括:

  • Arduino UNO开发板一块(这是最常见的型号,ATmega328P主控,5V供电)
  • 直流电机风扇一个(5V或12V均可,玩具电机、散热风扇、抽风风扇都能玩)
  • 驱动器件一个:N沟道MOS管(AO3400挺常用)或者NPN三极管(S8050、2N2222都可以)
  • 续流二极管1N4007或1N5819一个(肖特基更好,反向恢复快)
  • 面包板一块,杜邦线若干
  • 电源:电机和Arduino最好分开供电,5V电机可以直接用USB供电的小功率情况,12V电机务必外接电源,别指望板载稳压撑得住

进阶版增加:

  • 10k电位器一个(手动调速)
  • 温度传感器(NTC热敏电阻或DHT11数字温湿度传感器)
  • 转速检测模块(霍尔传感器A3144或者电机自带测速输出)
  • OLED显示屏SSD1306(显示转速和温度)
  • Wokwi仿真平台账号(这个不需要硬件就能写代码验证逻辑)

表格整理一下:

器件型号示例用途说明
主控Arduino UNO生成PWM信号3/5/6/9/10/11共6个硬件PWM引脚
电机5V/12V直流风扇被控对象有刷直流电机为本文主角
驱动管AO3400 MOS功率级开关低压大电流,导通电阻小
续流二极管1N5819保护驱动管肖特基,压降低
电源USB 5V/DC 12V供能电机供电与逻辑供电分离更稳
电位器10k手动给定参考值接AnalogIn做调速旋钮

2.2 驱动方案对比:三极管、MOS管、驱动模块怎么选

直接用Arduino引脚驱动电机?几乎不行。ATmega328P的引脚最大输出电流约40mA,而一个5V直流小风扇启动电流可能超过200mA,带不动。即便带得动拉低电压也会导致系统复位。所以需要用外部元件放大电流。

第一梯队是NPN三极管,比如S8050、2N2222。接法很经典:Arduino引脚通过1k限流电阻接到三极管基极,发射极接地,集电极接电机负极,电机正极接电源正。这种方案电路简单,元件便宜,适合电流1A以下的场合。但三极管存在导通压降(约0.2V到0.5V),大电流时发热明显,而且基极电流需要持续供给,驱动能力有限。

第二梯队是N沟道MOS管,比如AO3400、IRLZ44N。MOS管是电压控制器件,栅极几乎不取电流,Arduino引脚可以直接驱动逻辑电平MOS管。AO3400这种小管子RDS(on)只有几十毫欧,导通损耗可以用“低到可以忽略”来形容,12V电机1A电流下压降不到百毫伏。接法上,栅极接Arduino引脚,源极接地,漏极接电机负极。为了让关断更可靠,可以在栅极和源极之间加一个10k下拉电阻。

第三梯队是现成驱动模块,如L298N、TB6612FNG、DRV8833。L298N是很老但普及度高的模块,缺点是两个二极管压降导致发热,适合学习不适合做效率高的产品。TB6612FNG或DRV8833这种H桥驱动芯片更现代,体积小、内阻低,而且支持正反转,适合做智能小车这类需要转向的项目。如果只是驱动一个单向风扇,用单管MOS就足够了,不需要上H桥。

我给个结论:纯调速、单向风扇,首选AO3400单管方案;需要正反转,选TB6612FNG模块;纯学习懒得烧脑子,L298N也能跑,但别指望它高效率。

2.3 续流二极管:省掉它你就等着烧管

这一节单独拎出来讲,因为太多人在这里翻车。电机绕组是感性元件,工作时有电流储能。MOS管关断瞬间,电流不能瞬间变成0,会继续流动。此时MOS管处于截止状态,电流无处可去,只能在漏极和源极之间形成高压。电感的自感电动势公式是e = -L * di/dt,开关速度越快、电流越大,电压尖峰越高,瞬间可能超过50V甚至100V。

一个12V的电机产生50V的反向尖峰,直接落在额定电压30V的AO3400上,结果就是击穿、烧毁、冒烟一条龙。解决办法是在电机两端反向并联一个续流二极管,阴极接电源正极,阳极接电机与MOS管连接的节点。这样MOS管关断时,电感电流通过二极管释放,电压被钳位在0.3V~0.7V,MOS管安全。

选二极管时,1N5819肖特基管是首选,因为正向压降低、开关速度快。1N4007虽然也能用,但它恢复速度慢,高频PWM下可能会在开关瞬间出问题。我的经验是:小功率电机直接1N5819,电流超过3A就换SS34甚至SS54。

有人看到电机模块上画着二极管,以为就不用加了,那是误导。很多成品驱动模块已经把续流二极管集成在内部,但如果自己搭电路,这一步绝不可省。还有一个容易忽略的细节:如果是H桥驱动,每个功率管都要配续流路径,这就是标准H桥模块内部通常会集成四个瞬态抑制二极管的原因。

3. Arduino端到端代码实现

3.1 第一版:用analogWrite跑通基本调速

硬件搭好,插上USB,打开Arduino IDE,就到了写代码的环节。最基础的程序就是PWM呼吸灯和调速循环,代码不过二十行,先跑通再谈优化。

#define PWM_PIN 9 void setup() { pinMode(PWM_PIN, OUTPUT); } void loop() { // 从0慢慢加到最大,让风扇逐步加速 for (int duty = 0; duty <= 255; duty += 5) { analogWrite(PWM_PIN, duty); delay(50); } // 再从最大减速到0 for (int duty = 255; duty >= 0; duty -= 5) { analogWrite(PWM_PIN, duty); delay(50); } delay(1000); }

这段代码逻辑简单:占空比0→255循环。注意duty += 5是每次加5,整个循环约2.6秒,升降速不要太快,否则电机电流冲击比较大。你接上电应该能看到风扇缓慢启动、逐渐加快、再降下来。

这里补充一个很多人忽视的点:尽量不要用analogWrite快速改变占空比时,“最小启动占空比”这个概念。直流电机启动需要克服静摩擦和惯性,占空比太低时电压不足,电机不转但电流很大,时间长了会发热。在程序里可以做“软启动”,前面已经演示了,从0到255渐进式加速,而不是直接跳到一个高值。

如果想让风扇能在任意占空比下启动,通常需求先把占空比拉到60%以上让电机转起来,再回落到目标值。这叫启动死区补偿,尤其对电脑散热风扇这种带有轴承阻力的负载很有效。我的实践是:低于40占空比时先强制输出180持续100ms,再回到目标值,实测启动稳定不卡死。

3.2 频率是你最大的敌人:调整定时器消除尖啸

Arduino的analogWrite默认频率其实分两种:引脚5和6由Timer0控制,频率约980Hz;引脚3、9、10、11由Timer1和Timer2控制,频率约490Hz。对直流电机来说,490Hz的PWM会让绕组发出明显的“滋滋”声,耳朵贴着能烦死。

这里需要理解Arduino定时器的工作方式。Timer0、Timer1、Timer2是三个硬件定时器,通过计数达到设定值来产生PWM波形。修改分频系数是改变频率最直接的方式。下面示例改Timer1的分频系数,影响9号和10号引脚的PWM频率。

void setup() { pinMode(9, OUTPUT); // TCCR1B的低3位是时钟选择位 // 001 表示不分频, 约31.4kHz // 010 表示分频8, 约3.9kHz // 011 表示分频64, 约490Hz(Arduino默认) TCCR1B = (TCCR1B & 0xF8) | 0x02; // 选择分频8 } void loop() { analogWrite(9, 128); // 50%占空比 }

由于Timer1是16位定时器,在相位校正PWM模式下,频率公式是F_CPU / (分频系数 * 510)。16MHz主频分频8后就是3.9kHz左右,这个频率基本听不到噪音,而且电机运行很平顺。如果想彻底消音,可以把分频设为1,得到31kHz,已经超出人耳听觉范围,代价是功率管开关损耗略增。对小功率风扇来说,31kHz也没问题,MOS管能扛住。

引脚3和11由Timer2控制,修改TCCR2B寄存器,原理一样。特别提醒:Timer0管着Arduino的millis()和delay()函数,强烈不建议改,否则会导致时间函数全部紊乱,这是新手很容易踩的坑。

各引脚对应关系可以存个表:

引脚定时器默认频率推荐设置
5Timer0约980Hz不要动,耗时函数依赖它
6Timer0约980Hz不要动
3Timer2约490Hz可通过TCCR2B调整
9Timer1约490Hz可通过TCCR1B调整
10Timer1约490Hz分配置同上
11Timer2约490Hz分配置同引脚3

3.3 仿真先行:用Wokwi快速验证逻辑

调频率、调驱动,最怕反复烧录浪费时间,甚至把电路烧坏。我在做轮子驱动方案时,会先去Wokwi仿真平台把逻辑跑通。Wokwi是一个在线仿真工具,支持Arduino、ESP32等主流开发板,能模拟LED、电机、传感器,甚至逻辑分析仪。直接在浏览器里接线、写代码、看波形,比硬件实物调试高效太多。

用Wokwi做PWM风扇调速,可以提前验证三件事:第一,代码语法和逻辑有没有问题;第二,PWM输出波形和频率是否正确;第三,温控曲线逻辑是不是符合预期。尤其当你改了TCCR1B寄存器之类的东西,仿真里可以看到波形频率确实变了,再移植到实物上就少很多疑惑。

实测下来,Wokwi虚拟的电机模块能显示转速百分比和电流,还支持示波器查看PWM波形,对学习PWM概念非常友好。它的限制是不能模拟真实的MOS管开关损耗和反电动势,但这块原理搞清楚后问题不大。

4. 进阶实战:打造温度自适应智能风扇

4.1 温度采集:NTC与DHT11的取舍

单纯手动调速玩几次就没意思了,真正实用的是根据温度自动调速。做一个“温度高风扇转得快、温度低风扇几乎不转”的智能散热风扇,性能直接拉满。

温度传感器选择上,两个常见方案:NTC热敏电阻和DHT11数字传感器。NTC阻值随温度变化,配合一个分压电阻可以让Arduino在模拟脚读到变化的电压。优点是响应快、精度可控、便宜,缺点是需要自己算温度公式。DHT11是数字传感器,用单总线协议返回温湿度数据,库函数调用简单,缺点是最低分辨率1°C,响应慢。如果是做机箱散热这种温度梯度不大的场景,DHT11够用;如果追求精准温控,用DS18B20或者NTC加校准。

最经济的方案是用一个10k NTC加上10k固定电阻组成分压器,接在A0引脚上。温度升高NTC阻值降低,A0电压升高。通过查表或B值公式可以换算成温度。实际项目里我比较推荐DS18B20,防水封装适合测水温,普通封装适合风道温度,单总线支持多个传感器并联,一根线搞定多路测温,写起来也不复杂。

4.2 风扇曲线设计:不是简单线性映射

机箱风扇领域有个术语叫风扇曲线,就是风扇转速和温度之间的关系曲线。很多人会写成:

int duty = map(temp, 25, 45, 0, 255);

这个映射意思是温度25°C时占空比0%,45°C时100%。看起来合理,实际用起来体验很差。温度在25~26°C之间波动时,转速跟着波动,风扇一停一转,噪音体感非常糟糕。

正确的做法是加滞回区间。简单说,升温曲线和降温曲线不在同一条线上。比如升温到35°C才开始加速,而降温到30°C才减速。这样可以避免温度在临界值附近反复横跳。此外,低占空比区间加怠速保护,比如温度低时也保持16%左右的占空比,让风扇维持最低转速,既能保持风道流通,又不至于频繁启停。

我自己用的逻辑是分段区间加滞回:低于30°C转速恒定在20%;30°C到50°C之间线性映射从20%到100%;高于50°C直接拉满。低于30°C后如果之前转速高于20%,则要到28°C才降回20%。这样既有较好的散热响应,又不会让噪声波动太明显。

4.3 完整的温控风扇代码与分析

这里给出一个带NTC温控和串口监视的完整示例,结合了滞回逻辑和软启动。

#define PWM_PIN 9 #define NTC_PIN A0 // 分压电阻值 const float SERIES_R = 10000.0; // NTC 25°C阻值 const float NTC_NOM = 10000.0; // 温度系数(典型3950) const float BETA = 3950.0; const float T0 = 298.15; // 25°C对应开尔文 int currentDuty = 20; // 初始怠速20% bool isRising = false; // 记录当前趋势 float readTemp() { int raw = analogRead(NTC_PIN); float voltage = raw / 1023.0 * 5.0; float r = (5.0 - voltage) * SERIES_R / voltage; float tKelvin = 1.0 / (1.0 / T0 + log(r / NTC_NOM) / BETA); return tKelvin - 273.15; } int tempToDuty(float temp) { // 滞回控制,避免临界点抖动 if (temp >= 50) return 255; if (temp >= 30) { return map(temp * 10, 300, 500, 20, 255); } // 降到30以下时,若之前在高速状态则延时降速 return currentDuty > 20 ? 20 : 20; } void setup() { Serial.begin(9600); pinMode(PWM_PIN, OUTPUT); analogWrite(PWM_PIN, currentDuty); } void loop() { float temp = readTemp(); int targetDuty = tempToDuty(temp); // 平滑过渡,避免转速突变 while (currentDuty != targetDuty) { if (currentDuty < targetDuty) currentDuty++; else currentDuty--; analogWrite(PWM_PIN, currentDuty); delay(15); } Serial.print("温度: "); Serial.print(temp); Serial.print("°C 占空比: "); Serial.println(currentDuty); delay(1000); }

这版代码做了一些工程化处理。第一,温度读取用了NTC的B值方程,比查表法代码短,精度在±1°C左右,够用。第二,转速变化用循环逐步逼近,每15ms变一档,实际效果是风扇平滑变速,没有顿挫感。第三,最低占空比20%起,保证电机不会因占空比过低而堵转。

如果想要无级平滑响应,可以把while循环里的步长和delay调细,但没必要过度。实测下来,1%占空比变化间隔20ms已经非常平滑了,肉眼根本看不出转速抖动。

5. 硬核避坑:常见问题与实测排查

5.1 电机不转、转速不稳怎么查

我把实测中最常见的故障按“先软件后硬件”的顺序排一下,方便定位。

先说软件问题。很多人上来就用analogWrite,但忘了pinMode设为OUTPUT,引脚默认是输入状态,输出不了PWM。检查一下代码开头有没有写pinMode。还有人PWM引脚选错了,Arduino Uno只有3、5、6、9、10、11能输出PWM,接到其他引脚上只有0V或5V两个档位,风扇当然只在最大和停止之间跳。最后,如果用了占空比低于启动阈值的值,电机不转是正常的,可以先用255试转,再用串口打印占空比确认。

再说硬件问题。测MOS管的栅极电压是否为5V,栅极和源极之间有没有虚接。续流二极管方向是否反了,如果正负极接反,等于把电源直接短路,上电就会烧。还有一个常见错误:电源共地问题。如果Arduino用USB供电、电机用外部12V电源供电,两个电源的GND必须连在一起,否则PWM信号无法形成回流,电机完全不受控。

转速不稳通常有三个来源:电源波动、接线接触不良、PWM频率过低。第一种在按下按钮或启动瞬间造成电压跌落,最好用稳压电源;第二种重新插拔杜邦线解决;第三种参考第3.2节改频率,实测从490Hz改到4kHz后,转速稳定性肉眼可见提升。

5.2 电脑4pin风扇接Arduino的坑

电脑机箱散热风扇是4线制,黄色是12V电源,黑色是GND,绿色是转速反馈,蓝色是PWM控制脚。很多人想用Arduino直接控制这个蓝线,结果怎么PWM都不转,这是个大坑。

标准主板上的CPU风扇PWM频率是25kHz,信号是开漏结构,内部通过风扇控制芯片拉低到地来实现开关。而Arduino的PWM是推挽输出,且默认频率只有490Hz。所以直接用analogWrite接蓝线,风扇要么不转,要么转速完全不受控制。如果非要控制4pin电脑风扇,有两种思路:一是把Arduino的PWM频率提高到25kHz,二是用一个三极管模拟开漏结构。

最稳妥的方案是别碰它,给4pin风扇单独买一个PWM调理模块,或者直接改用三线风扇加MOS管控制。三线风扇用12V供电,黑线GND,黄线12V,蓝线测速,控制原理和有刷电机完全一样,用PWM驱动管接地回路就行。这也是我在实际项目中更推荐的控制方式。

5.3 从UNO到ESP32与智能小车的扩展

这个项目的控制思路可以平滑迁移到智能小车方向。小车的驱动电机同样用PWM调速,只不过需要在H桥上同时控制两个电机的方向和速度。用TB6612FNG模块加Arduino UNO,写一个motor(leftSpeed, rightSpeed)函数,就能实现差速转向,完成直行、转向、原地旋转等基础动作。这是Arduino智能小车最经典的电控方案。

如果项目需求升级到ESP32,情况会更丰富。ESP32支持16路PWM通道,分辨率最高16位,而且自带Wi-Fi和BLE。可以手机连上ESP32的Web页面,拖动滑条远程调速风扇。这个方案我做下来体验很好,ESP32的LEDC库配置PWM频率比AVR寄存器直观得多,几行代码就能设置25kHz。

// ESP32示例, PWM频率25kHz, 分辨率8位 const int freq = 25000; const int channel = 0; const int resolution = 8; // 在setup中 ledcSetup(channel, freq, resolution); ledcAttachPin(9, channel); // 控制输出 ledcWrite(channel, 128);

从技术演进的角度看,Arduino UNO适合学习和调试PWM基础,ESP32更适合做物联网化、智能化程度更高的散热系统。配合SSD1306显示屏显示温度、转速,配合腾讯连连做OTA固件升级,就是一套完整的智能风扇产品雏形。我记得热搜里提到的G-Helper风扇曲线、RC调教,商业软件做得再花哨,底层还是温度到占空比的映射逻辑,本质没有变。

最后说一句个人体会。搞PWM电机控制从入门到熟练,我最大心得不是代码怎么写,而是“先算后干”。先算电流、算功耗、算频率,再动手焊接,省下的时间是实实在在的。很多人喜欢拿一堆模块乱插,烧一块板子才回头看教程,其实那些教程里的原理图早就把答案告诉你,只是你没读。控制一台风扇不难,难的是每一行代码、每一个元器件你都清楚它为什么在那里。这个项目做完,你至少能骄傲地说:我不是把风扇开开关关,我是用PWM真正把能量控制住了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 5:29:43

端侧小模型量化解密:从 FP16 到 4-bit 量化对 WebGPU 显存与速度的影响

端侧小模型量化解密&#xff1a;从 FP16 到 4-bit 量化对 WebGPU 显存与速度的影响在尝试将 1B 到 3B 级别的前沿大模型塞进浏览器端侧运行时&#xff0c;前端工程师最先遭遇的绝不是算力不足&#xff0c;而是两道冷冰冰的“物理墙”&#xff1a;带宽下载墙与显存物理墙。 以开…

作者头像 李华
网站建设 2026/10/5 5:29:04

AI编程智能体实战指南:从核心原理到私有化部署

大概半年前&#xff0c;我还在用“AI补全代码”这种小儿科玩法&#xff0c;每天对着IDE里的灰色提示一行行Tab。当时打死我也没想到&#xff0c;就这一年光景&#xff0c;AI编程智能体已经能把一个功能模块从需求分析到测试用例全流程跑通&#xff0c;甚至能主动重构我写的一坨…

作者头像 李华
网站建设 2026/10/5 5:27:56

企鹅数据集VOC与YOLO双格式:120张标注图跑通目标检测训练全流程

简介&#xff1a;这份企鹅目标检测数据集面向计算机视觉入门与算法验证场景&#xff0c;适合需要快速搭建小样本检测实验的学生、开发者及教学人员使用。数据以VOC与YOLO双格式提供&#xff0c;图片均为jpg&#xff0c;配套xml与txt标注文件&#xff0c;可直接接入常见检测框架…

作者头像 李华
网站建设 2026/10/5 5:27:56

SGLang多芯插件机制解析:昆仑芯推理适配与XCCL通信实践

1. 多芯插件机制到底在解决什么问题第一次接触 SGLang-Kunlun 这套组合的人&#xff0c;大概率会被"多芯插件机制"这几个字绕晕。我刚开始看这块代码的时候也一样&#xff0c;脑子里第一反应是&#xff1a;不就是让推理框架跑在国产加速卡上吗&#xff0c;为什么还要…

作者头像 李华
网站建设 2026/10/5 5:26:06

脑肿瘤实例分割数据集:1169张YOLO标注与YOLOv8训练实战

简介&#xff1a;这份脑肿瘤实例分割医疗影像数据集面向医学影像AI开发者、算法研究人员及放射科教学人员&#xff0c;用于解决脑部肿瘤自动识别与病灶边界精准分割的训练数据需求。数据集共含803张训练、237张验证与129张测试影像&#xff0c;以YOLO多边形实例分割格式标注Bra…

作者头像 李华
网站建设 2026/10/5 5:24:53

STM32以太网ETH外设详解:从MII/RMII到lwIP调试实战

板子上电&#xff0c;网线插进RJ45座&#xff0c;电脑右下角的网络图标转了好几圈&#xff0c;最后跳出来一个黄色感叹号。这个画面我太熟悉了——几乎所有第一次调STM32以太网的人都会在这一步卡住。串口打印一切正常&#xff0c;GPIO翻转也能看到波形&#xff0c;但网口就是死…

作者头像 李华