十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32温控风扇实战:从ADC采集到PWM控制的完整嵌入式项目解析

STM32温控风扇实战:从ADC采集到PWM控制的完整嵌入式项目解析 简介基于STM32温控风扇设计综合实践论文是一份面向电子与嵌入式相关专业学生的毕业设计/综合实践参考文档完整呈现了以STM32单片机为核心、以温度传感器和LCD1602液晶显示为主要外设的温控风扇设计方案与实现过程。文档从绪论、方案论证到硬件设计层层展开详细对比了热电阻等温度传感器、STM32F103控制核心以及不同显示电路的选型依据并给出了温度检测、液晶显示、风扇调速等关键模块的电路与程序设计思路同时结合智能家居应用背景体现了低功耗、低成本、易操作的设计特点可作为课程设计、综合实践或本科毕业设计的写作模板与调试参考。资源包仅含1个doc格式论文文件整体大小约2.79MB结构清晰涵盖系统总体设计、传感器电路、显示电路等章节方便直接阅读、修改和打印。目前已有2072人学习该内容适合需要快速搭建温控系统框架、理解STM32嵌入式开发流程或撰写相关实践报告的学习者。 做嵌入式相关课程设计或者综合实践的同学一定对“基于STM32的温控风扇”这个题目不陌生。每年我都能在答辩现场看到好几组拿这个课题的有的做得扎实有的只是把网上的例程抄了一遍问两句就露馅了。这个题目为什么这么受欢迎因为它看起来很简单——一个温度传感器加一个风扇而已但真正做完你会发现ADC采集、定时器PWM、中断优先级、功率驱动、闭环控制这些嵌入式开发的看家本领全部能用上。这篇文章我就结合自己带学生做综合实践的经验把这个项目从硬件选型到软件实现、再到论文整理的完整链路拆开讲清楚给准备做或者正在做类似题目的同学一个可以直接“抄作业”的参考。1. 为什么“一个风扇”能撑起一门综合实践课先说个反直觉的结论温控风扇这个题目最大的价值恰恰在于它“看起来简单”。很多同学选题的时候喜欢挑那些听着高大上的题目比如什么“基于STM32的智能家居网关”“基于神经网络的手写数字识别”结果开题两周就发现自己啃不动最后全部变成淘宝买板子、CSDN抄代码答辩时对系统原理一问三不知。温控风扇不一样它的知识跨度足够宽但每个环节的难度又都在一个“跳一跳够得着”的水平线上。我粗略算了一下一个完整的温控风扇项目里至少涉及这么几个关键知识点温度采集无论是DS18B20这种单总线数字传感器还是NTC热敏电阻配合ADC采样你都得碰。这就避不开通信时序、分压电路计算、ADC分辨率与参考电压的关系这些基础问题。电机驱动风扇电机不是MCU引脚直接能驱动的需要一个功率放大环节。这里涉及三极管/MOS管的开关特性、PWM占空比与平均电压的关系、续流二极管的作用。控制策略最简单的做法是设一个阈值温度高了就开风扇低了就关。但实际做出来你会发现这种“单点阈值”方案在临界点附近会反复启停所以才需要引入滞回比较、甚至PID调速。人机交互与调试至少需要一个按键设定目标温度、一个OLED或者数码管显示当前温度这又涉及GPIO输入、显示驱动、状态机设计。说白了这个课题练的不是某个单一技术而是“把一个完整的小系统从零搭建起来”的综合能力。这种能力恰恰是课堂实验和期末考试没法覆盖的。另外一个很实在的原因是这个题目的硬件成本极低STM32F103C8T6最小系统板加上一个DS18B20、一个风扇、一颗MOS管总成本不到30块钱学生自己买得起实验室批量采购也不心疼。相比那些动辄几百上千的开发套件这个题目在经费上就没有门槛。所以我的结论是如果你正在纠结综合实践选什么题温控风扇可以闭眼选如果你已经选了那这篇文章就是为你写的。2. 硬件选型与电路连接别在“看起来简单”的地方翻车2.1 温度传感器怎么选DS18B20、NTC还是LM35先说温度传感器。我见过学生用过的方案基本就三种DS18B20、NTC热敏电阻、LM35模拟温度传感器。它们各有优缺点不是越贵越好关键是看你的设计需求。传感器类型精度典型值读取方式优点缺点DS18B20数字±0.5℃单总线协议直接输出数字温度无需校准抗干扰强时序要求严格读取耗时较长NTC热敏电阻模拟±1~2℃取决于电路ADC采样分压便宜响应快搭配任意ADC引脚即可非线性严重需要查表或公式换算LM35模拟±0.5℃ADC采样输出电压输出电压与温度线性对应10mV/℃需要参考电压稳定精度依赖ADC如果这是综合实践课程我最推荐的是DS18B20。原因很简单单总线协议虽然时序有点讲究但STM32的GPIO模拟时序查一下手册就能写对而且是数字信号不会因为杜邦线接触不良、板子供电不稳导致ADC读数漂移。而NTC这种方案你还要处理分压电阻温度系数、VCC波动、非线性换算对新手来说坑太多。LM35则更尴尬——它输出的是模拟电压最终还是绕回到ADC采样的问题上。当然如果你的论文想突出“多元参数采集”那可以DS18B20测环境温度、NTC测风扇出风口温度做一个双通道温度监测这也是加分项。但基础版本一个DS18B20完全够用。2.2 风扇驱动的坑三极管、MOS管与续流二极管这部分是很多同学第一个翻车的地方。很多人以为STM32的GPIO引脚能直接驱动风扇结果一接上要么风扇纹丝不动要么主板直接复位重启。先说原理STM32的GPIO引脚在推挽输出模式下最大能提供的电流也就20mA左右手册标称是±25mA实际留一半余量而一个5V的小型直流风扇正常工作电流在150mA到300mA之间启动瞬间甚至能到500mA以上。差了一个数量级怎么可能直接驱动。所以中间必须加功率放大器件。可选方案有三个NPN三极管如S8050驱动能力有限But饱和导通压降在0.2V左右对5V风扇来说会损失一点电压转速会略有下降但胜在便宜、操作简单。逻辑电平MOS管如AO3400我实际测试下来最推荐的方案。AO3400的栅极阈值电压在1.2V到1.6V之间STM32的3.3V高电平完全能把它完全打开导通电阻只有40mΩ左右几乎不发热通过2A电流毫无压力。ULN2003达林顿管阵列优点是内置续流二极管引脚接起来方便但饱和压降高达1V左右对风扇转速影响比较明显适合驱动继电器而不是直流电机。无论你用哪种方案都记住一个铁律必须在风扇电机两端反向并联一个续流二极管1N4148或1N4007均可注意方向——阴极接电源正极。电机是感性负载PWM关断瞬间会产生很大的反向电动势没有续流二极管的话轻则干扰MCU复位重则直接击穿MOS管或三极管。我第一次带学生做项目的时候就遇到过风扇突然不转、同时OLED花屏的情况排查半天发现就是学生偷懒没接续流二极管反向电动势把板上3.3V都给干扰了。2.3 引脚分配与最小系统细节引脚分配不建议搞得太花哨我习惯下面的这张表直接照抄基本不会出问题功能引脚说明DS18B20数据线PA0配置为开漏输出外部接4.7kΩ上拉电阻风扇PWM控制PA1定时器2的通道2配置为PWM输出OLED I2CPB6/PB7使用I2C1外设地址0x3C按键模式切换PB0配置为上拉输入下降沿触发按键目标温度PB1同上BOOT0下拉到GND正常闪存启动调试时避免误入Bootloader几个细节需要特别留意。DS18B20的数据线在寄生供电模式下可以只用两根线但我建议这跟线外部加上拉电阻因为STM32内部上拉电阻阻值在30kΩ到50kΩ之间强度不够单总线通信容易不稳定。其次是STM32F103的PA0和PA1这两个引脚它们分别对应TIM2的CH1和CH2用定时器输出PWM比用软件延时翻转引脚靠谱一个量级CPU完全不占用。最后如果你的核心板不带LDO稳压千万别直接给5V引脚灌3.3V也别接反电源——我见过太多次这种让板子冒烟的“低级错误”虽然STM32芯片烧了也就十几块钱但耽误的调试时间可不止这点钱。3. 温控策略从“单点阈值”到“滞回比较”再到PID3.1 单点阈值的启停振荡问题拿到这个题目大部分人第一反应是温度高于28℃开风扇低于28℃关风扇。代码写起来也很简单if (temp 28.0f) { HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, GPIO_PIN_SET); // 开 } else { HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, GPIO_PIN_RESET); // 关 }这个逻辑看起来没毛病实际跑起来就露馅了。现象是这样的风扇开启后风吹到传感器附近温度降到27.9℃然后风扇立刻关闭关掉之后温度慢慢回升到28.1℃风扇又开了。如果传感器离风扇出风口近一点这个风扇就会像抽风一样几秒钟内反复开关。频繁启停首先影响的就是电机寿命其次是电源电压被频繁拉低MCU偶尔会复位重启表现为屏幕闪一下黑屏。这个问题的本质是系统在阈值点附近没有“状态记忆”导致输出对输入的微小波动过度敏感。解决办法就是引入滞回比较也叫Schmitt触发思想。3.2 滞回比较的代码实现滞回比较的思路很简单设定两个不同的阈值——开启阈值比如28.5℃和关闭阈值比如26.5℃。当前温度超过开启阈值时打开风扇只有当前温度低于关闭阈值时才关闭风扇介于两者之间的区间26.5℃到28.5℃风扇维持当前状态不变。这样做的效果是风扇一旦开启必须等温度明显下降到26.5℃以下才关闭中间那2℃的“死区”避免了反复切换。整个过程相当于做了一次一去一回的“迟滞”所以叫滞回比较。#define FAN_ON_TEMP 28.5f // 开启阈值 #define FAN_OFF_TEMP 26.5f // 关闭阈值 static uint8_t fan_state 0; // 0表示关1表示开 void fan_control(float temp) { if (fan_state 0) { if (temp FAN_ON_TEMP) { fan_state 1; __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_2, fan_duty); // 开启PWM } } else { if (temp FAN_OFF_TEMP) { fan_state 0; __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_2, 0); // 关闭PWM } } }注意这里我用了static局部变量保存风扇状态而不是每次直接读温度判开关这就是“状态记忆”的核心。死区范围的大小需要根据实际场景调整如果传感器紧贴散热片温度变化快死区可以设大一点如果传感器远离风扇温度变化平缓死区可以设小一些。我调试的时候习惯把死区设在2℃到4℃之间效果比较理想。3.3 什么时候需要上PID滞回比较虽然能消除振荡但它的输出只有“开”和“关”两档。这意味着系统控制精度不高——比如目标是维持28℃实际温度会在26.5℃和28.5℃之间来回波动波动幅度接近死区范围。如果你的设计要求是“把温度稳定在设定值±0.5℃以内”那滞回比较就力不从心了。这时候就该上PID比例-积分-微分控制。不过说句掏心窝的话对温控风扇这个场景绝大多数时候不需要完整的PID用P比例控制就够了。具体来说就是根据当前温度与目标温度的差值线性调节PWM占空比uint16_t fan_duty (uint16_t)(base_duty kp * (temp - target_temp)); if (fan_duty 1000) fan_duty 1000; // 限幅 if (fan_duty 200) fan_duty 200; // 避免占空比过小时电机不转这里有个很关键的工程细节PWM占空比不能从0直接开始线性映射。因为风扇电机存在静摩擦力矩占空比太小比如低于10%的时候电机根本转不起来但你已经给了它驱动电压电机处于“堵转”状态电流会很大长时间会烧电机。所以我的习惯是设置一个最小占空比比如20%低于这个值就直接输出0高于这个值才让风扇转起来。这在实际项目中叫“死区补偿”虽然名字有点吓人但原理就是这么朴素。完整PID对温控风扇来说主要用在哪呢我觉得是“恒温箱维持一定温度”这种场景比如用一个加热电阻丝和风扇配合同时控制制冷和加热。但单纯一个风扇PI去掉D就够了微分项对温度这种大惯性、慢变化的量来说很容易放大噪声调试起来非常痛苦。所以如果论文篇幅有限写到比例控制滞回比较就足够撑起“控制策略”这一章了。4. 软件实现HAL库框架下PWM与ADC的配合4.1 CubeMX配置要点PWM频率与ADC采样现在的STM32开发我建议直接用STM32CubeMX生成工程骨架不管你是用标准外设库还是HAL库至少引脚和时钟的初始化是自动生成的不会出现新手常见的“时钟没配对导致串口乱码”的问题。在CubeMX里有几个关键配置需要特别注意先看PWM。前面说了用TIM2的CH2作为风扇控制引脚在CubeMX中把TIM2的Channel2选为PWM Generation CH2预分频器(Prescaler)和自动重载值(Auto-Reload)决定了PWM频率。计算公式是PWM频率 定时器时钟频率 / (Prescaler 1) / (AutoReload 1)STM32F103C8T6的APB1定时器时钟最高是36MHz如果Prescaler设为71AutoReload设为499那么PWM频率 36MHz / 72 / 500 1kHz。这个频率对风扇电机来说是合适的——太高了驱动电路的开关损耗会增加太低了比如低于100Hz能听到明显的“嗡嗡”声风扇转速也会抖动。我实测下来1kHz到20kHz都能正常工作但1kHz到2kHz这个区间最稳。再看ADC。用NTC方案的话需要把对应的ADC引脚配置为模拟输入。这里有个新手最容易忽略的点ADC采样不是“读一次就算数”的。ADC转换结果会有噪声尤其是电源不稳的时候单次采样的数值可能在几十个LSB之间跳动。解决办法有两个维度一个是在CubeMX里把采样时间调大比如239.5周期另一个是在代码里做多次采样取平均。还有一个很容易被忽略的配置是DMA。如果你的系统还有其他任务比如OLED刷新、按键扫描、PID计算CPU全花在等待ADC转换上就太浪费了。用ADC的DMA循环模式让数据自动搬运到内存数组里CPU只需要在需要的时候读数组内容效率高一个档次。热搜词里那条“stm32 hal库adc单通道dma多次采样”就是很多人在搜的标准答案可见这个需求有多典型。4.2 数据滤波与温控主循环不管你用DS18B20还是NTC温度数据不滤波就直接用早晚会出事。DS18B20的误差倒是不大但NTC配合ADC时噪声会导致温度读数随机抖动±0.5℃接近阈值时就会导致风扇状态抖动。我用的最简单也最有效的滤波手段是滑动平均滤波#define FILTER_LEN 8 static uint16_t buf[FILTER_LEN]; static uint8_t idx 0; static uint32_t sum 0; uint16_t adc_filter(uint16_t value) { sum - buf[idx]; buf[idx] value; sum value; idx (idx 1) % FILTER_LEN; return (uint16_t)(sum / FILTER_LEN); }这个算法的好处是对内存占用极小8个uint16_t计算量也不大但能把大部分高频噪声滤掉。如果你是NTC方案滤波之后还有一个关键步骤把ADC数值换算成温度。NTC的阻值与温度的关系是Rt R25 * exp(B * (1/T - 1/T25))其中R25是25℃时的阻值B是材料常数一般在3435到3950之间。直接套公式需要做浮点指数运算Cortex-M3内核没有硬件浮点单元除非选F4系列但用DWT指令软浮点也能算只是稍微慢一点。也可以做一个ADC值到温度值的查表表表格可以是ADC值和温度一一对应的数组用插值法逼近这是工程上更常用的方法。主循环结构我建议写成这样while (1) { // 1. 读取温度DS18B20启动转换并读取 temp read_temperature(); // 2. 温度滤波滑动平均 temp_filtered filter(temp); // 3. 温控策略滞回比较或PID fan_control(temp_filtered); // 4. OLED显示刷新 oled_show(temp_filtered, fan_duty); // 5. 按键扫描 button_scan(); HAL_Delay(200); // 200ms一个控制周期 }控制周期200ms是经过权衡的风扇和温度都是大惯性对象100ms以内的时间尺度上温度基本不会有什么变化做太快纯属浪费CPU但如果你用PID控制周期太长了又会导致响应滞后。200ms算是一个经验值各位可以根据实际调试感受调整。4.3 标准库与HAL库的取舍写到这里必须回答一个无数人纠结过的问题到底用标准库还是HAL库我的观点是现在的综合实践课程能用HAL库就用HAL库。原因有两个。第一HAL库配合CubeMX可以自动生成初始化代码把最折磨人的时钟树配置省掉了这样你能把精力集中在功能逻辑上而不是去背寄存器。第二招聘市场上现在要求熟悉HAL库的岗位越来越多用HAL库做项目对找实习也有帮助。但有一类情况适合用标准库如果你用的是STM32F103系列而且网上能找到大量参考代码以标准库为主那你直接抄标准库也不算错。不过要注意标准库的工程结构需要手动添加启动文件和固件库包对新手来说是个不小的挑战——热搜词里那些“stm32标准库新建工程”“keil5安装stm32芯片包”就说明有多少人卡在这一步。如果网上能找到同一芯片的HAL库例程我建议直接用HAL库然后用CubeMX生成工程再把例程里的功能代码移植进去。遇到不懂的函数就右键跳转定义看HAL库源码这个方法比查手册快得多。5. 实测排错我的风扇从“不转”到“稳定转”踩过的坑这一章是重点中的重点因为项目做完之后你论文里能写多少“实践心得”全靠这一part。写论文最忌讳的就是“软件仿真成功实物没跑过”或者“只跑通了Demo深入问细节就答不上来”。下面是我这几年调试温控风扇时踩过、也看学生踩过的坑完整排查链路分享给大家。5.1 error: no stm32 target found的排查链路第一次把工程烧录到板子里最崩溃的报错就是这个error: no stm32 target found!。很多人第一反应是ST-Link坏了其实大部分时候不是。我的排查链路是固定的检查ST-Link的SWD接线标准接法是SWDIO、SWCLK、GND三根线外加3.3V给板子供电。最容易被忽略的是GND必须共地。如果板子是USB供电ST-Link也是USB供电那就要确认两者GND是否连到同一网络。检查BOOT0引脚状态STM32F103的BOOT0如果被拉高上电后会进入ISP Bootloader而不是Flash启动SWD调试接口在这种状态下是连不上的。我排查的时候会确认BOOT0是低电平接地或者悬空具体看板子电路。检查供电如果芯片完全没供电SWD也检测不到。用万用表量一下芯片VDD和GND之间的电压3.3V±0.1V才算正常。换个调试器试试如果以上都正常但还是找不到目标借一个ST-Link/V2或者J-Link替换测试。市面上有一些劣质ST-Link驱动不稳换个好的就通了。如果之前烧过程序禁用过调试接口有些例程为了省GPIO会把SWD引脚复用为普通GPIO这时候程序一烧进去调试器就再也连接不上了。解决办法是把BOOT0拉高进入ISP模式用串口擦除Flash里的程序或者按住复位键点击连接再松开。这个问题排查起来特别耗时间热搜词里“stm32禁用jtag”这种情况不在少数。我看到过很多学生遇到这个报错就直接拔线重插、重启Keil其实大概率是BOOT0或者GND的问题花两分钟按上面的链路走一遍更高效。5.2 风扇转速忽快忽慢ADC数据的处理问题硬件能连上、程序能烧进去之后下一个高频问题是风扇转速忽快忽慢OLED上显示的温度数字还会跳动。这个现象的原因非常典型ADC采样数据没有滤波。前面说的滑动平均滤波不是可选项而是必选项。如果你的代码已经加了滑动平均还是跳那就要查这么几个地方参考电压是否稳定很多最小系统板用的是板载LDO比如AMS1117它输出3.3V给MCU供电的同时也作为ADC的参考电压。如果USB供电电压不稳参考电压就会跟着抖ADC结果自然不准。解决方法是允许的情况下用外部基准电压芯片或者至少在电源部分多加几个100nF去耦电容。采样时间是否太短ADC的采样电容需要时间充电。STM32的ADC采样时间可设置为1.5到239.5周期。如果采样时间太短信号源内阻比较大时采样结果就会有偏置。我的习惯是NTC方案都选55.5或239.5周期宁可转换慢一点也不要数据漂。NTC的引线干扰如果传感器到板子的线比较长又没有用双绞线或者屏蔽线环境噪声很容易耦合进模拟信号里。解决办法是缩短线缆或者在ADC引脚对地并联一个100pF左右的电容做低通滤波。5.3 PWM输出却带不动风扇的功率问题还有个让人摸不着头脑的问题PWM波形用示波器看完全正常占空比50%输出但风扇就是转不起来用手拨一下扇叶才转。这种情况经典得不能再经典了。这里要回到电机启动的物理特性。直流电机的启动转矩和启动电流成正比启动电流是额定电流的好几倍。当占空比过低时平均电压不够产生的转矩不足以克服静摩擦和风叶阻力电机就“死”在那里不转。但为什么用手拨一下就能转因为外力帮它克服了静摩擦接下来维持转动所需的转矩比启动时小就转起来了。解决办法有三个设置最小占空比像前面说的把PWM下限从0调到20%~30%低于这个值直接输出0避免电机长期处于“想转又转不动”的堵转状态。启动瞬间满占空比先用100%占空比驱动200ms让电机转起来然后把占空比降到目标值。这样既保证了启动可靠性又实现了软启动。检查驱动管是否饱和导通有些同学用PNP三极管接法不当或者MOS管的栅极电阻阻值太大开关速度慢导致PWM高频率下驱动管没有完全导通等效内阻增大也会出现“带不动”的现象。用万用表量一下风扇供电电压PWM 100%时电压应该有4.8V左右明显低于这个值就要检查驱动电路。6. 论文写作与答辩别让综合实践文档拖后腿6.1 综合实践论文的章节组织项目做完最后一个大活是写论文或者说综合实践报告。很多同学技术路线做得很顺但一到写文档就变成流水账被导师批得一无是处。我看了很多份优秀报告之后总结出一个规律一份合格的综合实践论文章节应该像下面这样组织而不是按照“背景→原理→代码→结论”这种毫无信息量的模板堆砌。我建议的章节安排章节内容要点常见错误摘要你的系统能干什么实现指标测温范围、控制精度、响应时间写成课程介绍没有具体数据方案论证对比不同MCU/传感器/驱动方案给出选型理由只堆参数不解释为什么选它硬件设计原理图设计思路、关键电路计算如NTC分压、PWM频率、MOS管功耗只贴原理图没有计算过程软件设计主程序流程图、控制策略、核心代码片段整段贴代码没有逻辑说明系统测试测试环境、测试数据表、异常处理过程只有“测试通过”四个字总结本项目实现的成果和不足空话套话一堆没有实际内容其中“方案论证”这一章最容易被忽略但恰恰是答辩时老师最爱问的。比如为什么不用51单片机而是用STM32为什么用DS18B20不用LM35这些问题在方案论证部分写清楚了答辩时就能从容应对。6.2 测试数据表与结果分析怎么写系统测试部分不要写“运行正常”要用数据说话。我一般建议学生按照下面的格式做一张测试记录表测试序号环境温度℃设定目标℃实测风扇状态PWM占空比稳定后实际温度℃备注122.528.0关闭0%22.8温度低于开启阈值正常227.028.0关闭0%27.3在滞回区间内维持关328.828.0开启45%28.2超阈值开启正常430.228.0开启72%28.4温差越大占空比越高525.028.0关闭0%25.4低于关闭阈值正常有了这样一张表你论文的“测试结果”就不再是空话而是能体现“实测验证”的数据支撑。同时可以加一栏“启动响应时间”用秒表测一下从温度越界到风扇达到目标转速的时间这也是一个很好的性能指标。6.3 答辩常问的几个问题最后说说答辩。温控风扇这个题目老师大概率会问下面几个问题提前准备好就能稳住场面“你的PWM频率为什么选1kHz换成20kHz会怎样”这个问题考察的是对PWM原理的理解。可以回答1kHz驱动风扇噪声在阈值附近可以接受20kHz频率更高但驱动管开关损耗增大而且MCU定时器频率有限20kHz时占空比分辨率会降低。“你的传感器离风扇多远这和你的滞回区间有什么关系”这就是在考察你的系统标定能力。传感器离风扇越近风扇开启后测到的温度下降越明显死区可以设小一点离得远温度变化滞后死区要设大一点避免振荡。“如果温度传感器断线你的系统会怎么表现”这个问题很刁钻考察的是你对系统容错的思考。DS18B20如果断线读数会返回某个异常值比如85℃或者0℃如果你不做异常值判断风扇可能会全速转或者停转。提前在代码里加一个温度合理性判断比如0℃到60℃之外的数据丢弃就能回答得漂亮。这些问题的共同点是你必须对自己的系统有足够的理解而不是“代码跑通就完事”。这也是为什么我一直强调做项目的过程比结果重要调通后的排错经验比调通的瞬间更宝贵。最后再分享一个小技巧写论文时把你实测中波形截图比如示波器抓的PWM波形、OLED显示的照片、整体系统实物图贴上并配上“实际测得”字样导师看着会觉得你的工作量扎实很多。温控风扇虽然是个“老题”但只要你做得细致、写得真诚它一样能成为一篇拿高分的综合实践论文。本文还有配套的精品资源点击获取
返回列表