拓冰建站拓冰建站
首页 / 资讯中心 / 正文

STM32智能绿色风扇毕业设计:从PWM调速到温控系统实现

如果你正在找单片机毕业设计题目又希望它兼顾“控制逻辑、传感器采集、电机驱动、显示交互”这些嵌入式常见知识点那么“基于STM32的智能绿色风扇”是一个性价比很高的方向。这套设计做出来之后不只是给风扇加一个定时器而是把 MCU 的 PWM、ADC、UART、定时器中断、按键与显示外设全部串起来。放在毕业设计里它既能体现你对 STM32 外设的掌握程度又方便现场演示环境温度一变化风扇转速跟着变人离得近了也能通过传感器触发状态切换完全对得上“绿色节能、智能控制”的主题。这篇文章会从项目功能拆解、硬件选型、STM32 外设配置、关键代码示例、部署调试、功能验证、常见坑点几个方向完整过一遍。即使你还没定具体型号也可以先按 STM32F103 系列的通用开发流程来理解整体方案后面再根据手里的板子做适配。1. 项目核心能力速览项目属性说明项目类型单片机嵌入式系统设计 / 智能硬件类毕业设计核心主控STM32 系列 MCU推荐 STM32F103C8T6 或同平台开发板主要功能温度检测、风扇 PWM 无级调速、手动/自动模式切换、状态显示、按键与遥控控制典型传感器DHT11/DHT22 温湿度传感器、热释电人体红外传感器可选驱动器件L298N / 电机驱动模块、5V 风扇或 12V 风扇需共地开发环境Keil MDK STM32CubeMX / 标准外设库 STM32 Flash Loader 或 ST-Link Utility显示方式OLED 屏I2C或 LCD1602并行/ I2C 转接启动与下载ST-Link / J-Link 下载USB 转 TTL 串口调试是否需要联网不需要单机本地运行适合场景课程设计、毕业设计、智能家居小项目原型2. 智能绿色风扇整体方案设计做毕业设计的第一步不是急着写代码而是把系统的数据流和控制流画清楚。基于 STM32 的智能绿色风扇本质是一个典型的闭环控制系统传感器采集环境数据 → MCU 根据预设逻辑运算 → 输出 PWM 信号控制风扇转速 → 显示模块实时刷新运行状态 → 按键或遥控器干预模式。在设计上我建议把系统拆成五个部分看待。2.1 电源与驱动模块风扇属于功率器件MCU 引脚的电流驱动能力有限不能直接把风扇正极接在 STM32 的 GPIO 上。常规做法是使用 L298N、L9110S 或基于 MOS 管的驱动模块。驱动模块的电源需要独立供电同时要和 STM32 开发板共地否则控制信号没有参考地风扇可能不转或者乱转。2.2 传感器采集模块温度传感器是“智能”的关键。DHT11 价格低、单总线协议简单适合初学者但精度一般如果论文里想体现更好的数据对比可以选择 DHT22湿度和温度精度都会更好。热释电人体红外传感器可以检测人体靠近设计逻辑很自然室内有人时正常调温无人时降到低转速或待机节能效果一目了然。2.3 MCU 控制模块STM32F103C8T6 是一款基于 ARM Cortex-M3 内核的 MCU主频 72MHz自带 64KB Flash 和 20KB SRAM。对风扇控制这种场景来说资源完全够用。它内置多个定时器其中通用定时器 TIM2/TIM3/TIM4 可以输出 PWMADC 可以读取电位器模拟量用来做手动挡位调节也很方便。2.4 人机交互模块基础的交互方式有两种独立按键模式切换、档位加减、开关机。红外遥控HS0038 一体化接收头配合遥控器体现“遥控风扇”的体验演示效果比按键更直观。如果要追求界面表现力建议上加 0.96 寸 OLED显示当前温度、转速百分比、当前模式、人体检测状态。OLED 用 I2C 接口仅占用两个 GPIO非常适合本项目。2.5 控制策略模块“智能绿色”的核心关键词是节能。控制策略不需要做得很复杂但要体现明确的逻辑闭环自动模式下温度低于某个阈值风扇不转或低转速温度升高转速按比例提升温度超过设定的上限满速运行。手动模式下用户通过按键或遥控器直接选择低、中、高三档。节能逻辑人体红外检测无人超过设定时间自动进入待机或低速通风状态。保护逻辑堵转或电流异常时停止 PWM 输出并通过 OLED 提示故障。3. 开发环境与硬件准备清单以 STM32F103C8T6 最小系统板为例需要准备的内容如下。3.1 硬件清单对照表器件用途参考型号主控板项目核心STM32F103C8T6 最小系统板风扇被控对象12V 电脑散热风扇或 5V 涡轮风扇电机驱动实现 PWM 调速L298N、L9110S、MOS 驱动模块均可温湿度传感器采集环境温湿度DHT11 或 DHT22人体红外模块检测人员存在HC-SR501 热释电模块红外遥控远程控制HS0038 一体接收头 遥控器OLED 显示界面显示0.96 寸 I2C OLED下载器烧录与调试ST-Link V2 或 J-LinkUSB 转 TTL串口日志输出CH340 模块独立按键手动操作轻触按键若干电源给驱动模块供电5V/12V 适配器或电池组3.2 软件工具与固件包软件用途说明Keil MDK编写、编译、下载代码需要安装对应 STM32 器件包STM32CubeMX图形化配置时钟与外设生成初始化代码推荐使用ST-Link Utility固件下载与校验也可以直接用 Keil 下载串口调试助手查看日志便于观察调试信息DHT11 驱动源码传感器时序读取需根据实际库函数或 HAL 库适配3.3 环境检查要点安装 Keil MDK 后打开一个 STM32 工程前先确认三件事项目管理器中能看到对应的 Device 型号。F103C8 需要在 Pack Installer 中安装 STM32F1 系列器件支持包否则会提示找不到芯片。编译器版本和工程模板一致。不同编译器版本对项目文件兼容性有差异推荐直接使用当前 Keil 版本自带编译器或固定使用同一编译器的工程模板。下载器驱动安装成功。ST-Link 接入电脑后设备管理器里能看到对应串口或 ST-Link 调试接口如果显示未知设备需要重新安装驱动。4. STM32 外设配置思路这一节是项目从“能跑”到“能讲”的关键。答辩和评审对代码的要求往往不只是功能正常更希望看到你能解释清楚外设配置的原因。基于 STM32 的智能风扇项目至少要掌握以下四个外设。4.1 定时器与 PWM 调速原理风扇调速最常用的方案不是改变供电电压而是通过 PWM 调节平均功率。STM32 通用定时器通过比较寄存器决定输出高电平的持续宽度改变占空比就能改变风扇两端电压的平均值从而实现转速控制。以 F103 使用 PWM 模式 1 为例核心配置思路是设置预分频器 PSC把 72MHz 时钟分频到合适的频率。设置自动重装载值 ARR决定 PWM 周期。设置比较值 CCR控制占空比。如果选用 1kHz 左右的 PWM 频率PSC 可以设置为 71ARR 可以设置为 999这样 72MHz 经过 72 分频后为 1MHz再计数到 1000刚好是 1kHz。4.2 ADC 数据采集ADC 可以采集电位器电压实现手动调速也可以采集电流采样电阻电压用做风扇状态监测。在初始化时需要配置 ADC 通道、采样时间以及是否使用扫描模式。F103 的 ADC 是 12 位分辨率读取范围是 0 到 4095。注意采样时间不要太小否则输入阻抗较高的传感器源会产生较大误差。4.3 UART 串口调试串口是嵌入式项目调试的“眼睛”。在项目初期把温度数据、PWM 占空比、当前模式通过 UART 打印到电脑端串口助手能省掉很多通过示波器猜测状态的时间。常见的引脚映射是USART1_TX 对应 PA9。USART1_RX 对应 PA10。使用 CH340 模块连接 A9、A10 和 GND。4.4 外部中断与按键消抖按键不能直接通过轮询实现很复杂的交互逻辑。为了提高代码可读性通常采用外部中断触发或定时器扫描消抖使用 GPIO 外部中断 EXTI 捕获按键按下。在中断回调中置标志位主循环处理按键事件。10ms 到 20ms 的软件延时消抖。硬实时要求不高的场景也可以在主循环里每 10ms 扫描一次按键然后用状态机消抖。这种结构写起来简单不容易出现中断服务函数里处理耗时逻辑的问题。5. 功能模块与代码实现演示下面给出一套基于 HAL 库的思路示例。由于不同开发板的引脚定义和风扇模块可能不同示例代码属于通用逻辑你需要根据自己的 CubeMX 配置修改通道和引脚。5.1 使用 STM32CubeMX 配置时钟和引脚在 STM32CubeMX 中新建工程芯片选择 STM32F103C8T6。配置基本思路RCC 中选择 HSE 外部晶振。SYS 中 Debug 选择 Serial Wire否则 ST-Link 第二次下载可能失败。TIM3 选择 PWM Generation CH1用于风扇调速。USART1 选择异步通信模式。ADC1 打开 IN0 通道用于读取电位器调速信号可选。预留两个 GPIO 作为按键输入模式设置为 Input 模式。配置 I2C1 用于 OLED 显示如果使用软件模拟 I2C也可以不配置硬件 I2C。DHT11 使用一个普通 GPIO 输出口设置为开漏输出并在外部加上拉电阻。5.2 PWM 初始化示例// PWM 初始化示例基于 HAL 库只展示关键逻辑 void MX_TIM3_Init(void) { TIM_OC_InitTypeDef sConfigOC {0}; htim3.Instance TIM3; htim3.Init.Prescaler 71; // 72MHz / 72 1MHz htim3.Init.CounterMode TIM_COUNTERMODE_UP; htim3.Init.Period 999; // PWM 频率 1kHz htim3.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(htim3); sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 0; sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim3, sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); } // 设置风扇转速speed 范围为 0 - 100 void Fan_SetSpeed(uint8_t speed) { if (speed 100) { speed 100; } __HAL_TIM_SET_COMPARE(htim3, TIM_CHANNEL_1, speed * 10 - 1); }5.3 DHT11 数据读取与温度转换示例// DHT11 读取示例这里省略底层时序函数只展示数据解析逻辑 // 一次性读取 40bit8bit 湿度整数 8bit 湿度小数 8bit 温度整数 8bit 温度小数 8bit 校验和 bool DHT11_ReadData(uint8_t *humidity, uint8_t *temperature) { uint8_t data[5] {0}; // 调用底层读取函数将 40bit 数据填入 data if (DHT11_FetchRawData(data) ! DHT11_OK) { return false; } // 校验 uint8_t sum data[0] data[1] data[2] data[3]; if (sum ! data[4]) { return false; } *humidity data[0]; *temperature data[2]; return true; }DHT11 时序相对敏感GPIO 拉低起始信号后需要精确延时。建议在实现时使用定时器微秒延时函数不要依赖普通 for 循环做延时否则会因为编译器优化导致时序不稳定。5.4 自动调速控制逻辑示例// 自动模式控制逻辑示例 void AutoMode_Control(uint8_t temperature) { uint8_t speed 0; if (temperature 25) { speed 0; // 温度低风扇停止 } else if (temperature 30) { speed 30; // 温度升高低速运行 } else if (temperature 35) { speed 70; // 温度偏高中高速运行 } else { speed 100; // 温度过高全速运行 } Fan_SetSpeed(speed); Display_ShowSpeed(speed); }这种分段线性控制的好处是逻辑简单在论文中很容易绘制出“温度-转速”控制曲线答辩时也能解释清楚。如果想增加技术亮点可以把温度区间改成比例控制转速和温度呈线性关系。5.5 主循环任务调度示例风扇控制系统的实时性要求并不高不需要使用 RTOS用简单的前后台架构即可。int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM3_Init(); MX_USART1_UART_Init(); MX_I2C1_Init(); OLED_Init(); uint8_t temperature 0; uint8_t humidity 0; uint32_t lastReadTime 0; while (1) { // 每 2 秒读取一次温湿度 if (HAL_GetTick() - lastReadTime 2000) { lastReadTime HAL_GetTick(); if (DHT11_ReadData(humidity, temperature)) { char buf[32]; snprintf(buf, sizeof(buf), temp:%d hum:%d\r\n, temperature, humidity); HAL_UART_Transmit(huart1, (uint8_t *)buf, strlen(buf), 100); } if (mode MODE_AUTO) { AutoMode_Control(temperature); } } // 处理按键标志在中断中只置位不处理逻辑 if (keyFlag KEY_MODE) { keyFlag ~KEY_MODE; Mode_Switch(); } // OLED 周期性刷新 OLED_Update(); } }6. Keil 工程搭建、烧录与调试6.1 创建工程与编译使用 STM32CubeMX 生成工程后选择生成 MDK-ARM 工程直接用 Keil 打开即可。如果你选择自己手动搭建工程需要添加以下文件启动文件 startup_stm32f103xb.s。系统时钟文件 system_stm32f1xx.c。外设库或 HAL 库源码。自己编写的 main.c、gpio.c、tim.c、usart.c 等文件。在 Keil 中点击 Build 按钮前先检查 Options for Target 里的芯片型号、C/C 宏定义以及 Debug 设置。F103 系列如果使用 HAL 库宏定义一般使用 STM32F103xB。6.2 通过 ST-Link 下载程序连接 ST-Link 到 SWD 调试口接线方式如下ST-Link 引脚STM32 引脚SWDIOPA13SWCLKPA14GNDGND3.3V3.3V在 Keil 中打开 Options for Target选择 Debug 页签下拉选择 ST-Link Debugger点击 Settings如果能识别到芯片 ID说明连接正常。之后点 Download 即可烧录。常见问题是只接 SWDIO 和 SWCLK 两根线却忘了共地。ST-Link 与板子必须共地通讯才能稳定。6.3 使用串口调试助手查看日志烧录完成后把程序中的 UART 日志功能打开在电脑端打开串口调试助手选择对应 COM 口波特率设置为代码中初始化的数值例如 115200。正常读取 DHT11 后串口终端每隔 2 秒输出一条温度湿度数据。如果输出乱码优先检查波特率是否一致其次是检查外部晶振配置是否与开发板实际晶振一致。7. 功能测试与效果验证系统的功能验证建议分模块进行。不要等到所有代码都写完再整体上电否则出现问题很难定位。按以下顺序测试更稳妥。7.1 电源与最小系统测试测试目的确认 STM32 最小系统能正常工作。操作方式给开发板上电测量 3.3V 引脚对地电压确认在 3.25V 到 3.35V 之间检查电源指示灯是否正常亮起通过 ST-Link 连接后Keil 能识别到芯片信息。判断标准芯片能被识别说明 MCU 工作正常。7.2 风扇驱动与 PWM 调速测试测试目的确认电机驱动模块接线正确PWM 输出有效。操作方式先在代码里写死一个固定占空比例如 50%烧录后观察风扇是否转动。确认转动后再改成按 0%、25%、50%、100% 固定变化观察转速是否有明显区别。判断标准占空比改变时风扇转速有可感知变化。如果固定 50% 时风扇不转检查三点驱动模块供电是否接好。PWM 信号 GPIO 是否配置为复用推挽模式。风扇电压规格和驱动模块输出电压是否匹配。7.3 温湿度采集测试操作方式用 STM32 驱动 DHT11把温度和湿度打印到串口。预期结果正常环境下温度值与室内实际温度偏差不大湿度值稳定。用手捏住传感器等十几秒温度应该上升对传感器哈气湿度应该明显变化。排查思路如果一直读取失败输出校验错误重点检查上拉电阻、GPIO 配置和时序延时精度。DHT11 的数据线需要 4.7k 到 10k 左右的上拉电阻。7.4 自动控制功能测试操作方式把系统切换到自动模式用吹风机或热风枪在传感器附近加热观察风扇转速是否跟随温度升高而提升停止加热后观察转速是否回降。判断标准温度变化后风扇转速在 1 到 2 秒内有响应OLED 或串口显示的转速值同步更新。这个测试是整个系统演示中最直观的一环。如果做现场演示用热风筒比用手捂传感器效果更明显。7.5 人体感应节能测试操作方式安装好人体红外模块在有效检测范围内移动观察系统状态是否切换为“有人”然后静坐不动超过设定的延时时间观察是否进入节能待机。判断标准状态切换与传感器输出一致风扇在无人的时候不会维持高速运转。实际测试中HC-SR501 模块背后通常有两个电位器一个调节灵敏度一个调节延时时间。在项目调试阶段把延时调到 5 秒左右方便反复测试。如果灵敏度太高模块会频繁误触发建议把模块灵敏度调到较低水平。8. 资源占用与性能观察智能风扇项目对 MCU 资源要求很低。以 STM32F103C8T6 为例程序 Flash 占用通常在 15KB 到 35KB 之间取决于是否使用完整 HAL 库和 OLED 字库。RAM 占用也很小主要是显示缓冲区、DHT11 数据数组和串口缓存。不过资源占用少不代表可以不关注性能瓶颈。实际开发中需要注意以下问题。8.1 CPU 占用点主循环里的 CPU 开销主要集中在 OLED 刷新和 DHT11 读取。OLED 刷新如果是全屏全量刷新又没有等待延时会占用不少 CPU。更合理的做法是只在数据变化时刷新局部区域或者把刷新频率控制在 10Hz 以下。DHT11 读取函数里有大量微秒级延时如果这些延时时长没有优化主循环中其他任务的响应就会变得不稳定。所以不要在一次读取后立即做耗时操作最好用定时器中断触发周期性读取。8.2 如何观察运行状态RTT 或串口日志输出温度、转速、模式观察逻辑是否按照预期切换。使用调试器在关键函数设置断点。在调试界面中可以直接查看 htim3.Instance-CCR1 的值确认占空比更新。观察风扇电流或转速变化判断 PWM 频率是否在合理范围。PWM 频率太低时风扇会发出明显啸叫或出现顿挫感。8.3 降低 CPU 占用的思路如果不使用 RTOS就要学会用标志位和时间片。实现方式是定时器每 1ms 产生中断作为系统时基。在中断中累加计数到 10ms 置按键扫描标志。到 100ms 置 OLED 刷新标志。到 2000ms 置 DHT11 读取标志。主循环只查询标志位按时间片处理不同任务。这种结构阅读起来简洁在毕业论文的软件设计部分也更容易画出流程图。9. 典型问题排查表与解决思路下面把基于 STM32 的智能风扇项目中最容易踩到的坑列成排查表方便调试时快速对照。问题现象可能原因排查方式解决思路程序烧录一次后第二次烧录失败Debug 引脚被占用或软件复位配置错误查看 Keil 下载提示使用串口 ISP 擦除或修改 SYS 调试配置为 Serial Wire风扇不转驱动模块没共地、PWM 未启动、电源电压不足测量 GPIO 输出、检查驱动指示灯补齐共地检查 HAL_TIM_PWM_Start 调用风扇转速无法调节PWM 通道或定时器配置错误用万用表测量 PWM 引脚电压恢复 GPIO 复用配置检查占空比更新函数DHT11 读取数据一直失败上拉电阻缺失、单总线时序延时不准、引脚模式错误用示波器或逻辑分析仪查看时序增加 4.7k 上拉改开漏输出微调延时串口输出乱码波特率不一致、外部晶振配置错误、串口工具参数错误重新确认波特率改成 115200 或统一为代码配置波特率OLED 显示花屏I2C 速率过高、地址不对、供电不稳定检查 I2C 扫描地址降低 I2C 速度确认 0x78 或 0x3C 地址模式切换按钮无反应按键没消除抖动、GPIO 配置错误串口打印按键状态增加消抖检查按键电平逻辑自动模式转速波动大温度采样频率过高、控制策略跳变观察串口温度曲线增加采样周期对转速平滑过渡红外遥控失灵载波频率不匹配、遥控编码读取错误先测试接收头输出用逻辑分析仪读取 NEC 码值在调试 StM32 项目时还要注意区分硬件问题和代码问题。每次改动之后只调整一个变量不要同时改了好几处地方再做测试否则产生的问题很难找到根因。10. 毕业设计写作与答辩建议如果这个项目是用于毕业设计除了功能演示之外提交文档和答辩演示往往占比很高。这里多给几条实在建议。10.1 文档中的图表一定要自绘系统框图、电路原理图、软件流程图、状态转换图是评审老师最常翻阅的内容。不要直接截图别人的设计建议使用 Visio、亿图或开源画图工具自己重绘保持风格统一。绘制软件流程图时把 A 自动模式和 M 手动模式的分支画清楚同时在图中标明按键切换的条件和温度调度的阈值。10.2 突出节能效果的量化对比毕业设计的“绿色”主题需要有一些数据作为支撑。在测试环节可以测量三种场景下的风扇平均转速和工作时长普通风扇固定转速运行。智能风扇自动调速模式。智能风扇自动调速 人体感应待机模式。用单位时间内的平均转速作为参考指标就能大致估算节能比例。即使无法精确测量功耗也能体现出绿色节能的设计意图。建议在论文测试章节中展示两组曲线环境温度变化曲线与 PWM 占空比变化曲线。手动固定档位与自动调速下的累计工作状态对比。10.3 答辩演示准备清单现场演示不能只靠“程序能跑”。提前准备以下内容热风枪或吹风筒用来模拟温度升高。一条 USB 供电线和独立适配器避免现场电池没电。一块备用 STM32 最小系统板。烧录好程序的备份板以防现场误操作把程序弄丢。将串口调试助手和 Keil 调试工程提前打开评委提问时可以现场查看变量。10.4 使用边界与合规提醒基于 STM32 的智能绿色风扇属于嵌入式学习项目使用 DHT11、红外遥控、PWM 调速等都是常规教学应用。需要提醒的是不要使用未经授权的商业代码库开源代码按许可协议使用并标注来源。对硬件模块的接线电压与电流规格要留有裕量避免短路和过载。如果项目后续加入远程控制、云平台或摄像头识别功能涉及个人信息和人脸数据时必须明确隐私授权和数据安全边界。毕业设计报告使用他人原理图或参考代码时应避免直接照搬要在理解的基础上自行绘制和编写。11. 总结与下一步基于 STM32F103C8T6 的智能绿色风扇是一个知识点覆盖比较完整的单片机毕业设计题目。它既能帮助你掌握定时器 PWM 输出、ADC 采集、DHT11 单总线通信、UART 串口调试、外部中断与按键消抖等 STM32 核心外设又能在展示层面体现出“绿色节能”的设计价值。这个项目最先值得验证的三个功能是PWM 是否可以无级调速、DHT11 是否能稳定读到温湿度数据、自动模式是否能根据温度快速响应。这三个功能跑通之后整个系统的骨架就立住了。最容易踩的坑集中在三个地方风扇驱动模块和 MCU 没有共地。DHT11 读取时序不稳定数据校验不通过。Keil 下载目标芯片型号或 Debug 配置不正确导致程序无法写入。如果你还希望继续扩展可以在现有基础上加入 ESP8266 或 ESP32 模块把温湿度数据通过 MQTT 上报到服务器再用手机 App 查看状态和远程控制风扇开关。这样项目就从单一的单片机控制升级为物联网应用。也可以在控制策略里引入 PID 温控算法把风扇转速控制做得更平滑。这些都是适合在论文“展望”部分展开的方向而且不用推翻现有硬件设计只需要在软件层和通信层做扩展。对单片机初学者来说这个项目的难度曲线也比较友好先做硬件接线再写传感器驱动再到主循环任务调度每一层都能独立测试。只要按模块拆开做验证最终联调并不困难。建议把开发板、传感器和下载器组成一套固定测试环境调通后保留一份稳定工程再继续加功能。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门