STM32之风扇模块(开关控制+PWM调速)

目录

一、系统概述

二、5V直流风扇模块简介

2.1  基本概述

2.2  关键特性

2.3  接口定义

2.4  典型驱动电路

2.4.1  继电器驱动方案(开关控制)

2.4.2  三极管驱动方案(调速控制)

2.5  常见问题解决

三、继电器模块控制风扇启停 

3.1  硬件准备

3.2  硬件连接

3.3  软件实现

3.3.1  初始化代码

3.3.2  风扇控制函数

3.3.3  主程序

3.4  常见问题解决

3.5  系统特点

四、PWM控制风扇转速

4.1  硬件准备

4.2  硬件连接

4.3  软件实现

4.3.1  PWM初始化

4.3.2  调速控制函数

4.3.3  主程序逻辑

4.4  系统优化

4.4.1  转速显示

4.2.2  按键调速

4.5  系统特点

五、总结


一、系统概述

        本系统使用STM32F103C8T6单片机通过继电器模块控制小风扇的开启和关闭,实现简单的开关控制功能。同时使用STM32F103C8T6的PWM功能通过NPN三极管控制5直流风扇转速,实现低成本的无级调速方案。系统包含PWM生成、转速显示和过流保护功能,适用于需要经济型风扇调速的场合。

二、5V直流风扇模块简介

2.1  基本概述

        5V两线直流风扇是最简单的散热风扇类型,仅包含电源正极(VCC)和地线(GND)两根线,通过电压调节实现调速。其核心部件是直流有刷电机或简易无刷电机驱动电路,具有结构简单、成本低廉的特点。

2.2  关键特性

参数典型值/描述
工作电压5V ±10% (4.5V-5.5V)
空载电流50-150mA(取决于尺寸)
负载电流100-300mA(堵转时可能更高)
转速范围2000-5000 RPM(电压线性调节)
噪音水平25-35 dB(全速时)
启动电压通常≥3V(部分型号需4V以上)
寿命10,000-20,000小时(有刷电机)

2.3  接口定义

线色/引脚功能说明
红色VCC (+5V)接5V电源正极
黑色GND接电源负极

2.4  典型驱动电路

2.4.1  继电器驱动方案(开关控制)

原理图设计:

电源部分:

        图中标有“+5V”的线路为整个电路提供5伏特的直流电源,这是电路工作的能量来源。

继电器(U17):

  • 作用:继电器是一种电控制器件,它可以用较小的电流去控制较大电流的通断,在这里用于控制风扇电源的通断。
  • 工作原理:继电器内部包含一个线圈和一个开关。当线圈中有电流通过时,会产生磁场,吸引开关动作,从而接通或断开外部电路。图中继电器的引脚1和2连接到控制信号和电源,引脚3和5是常闭和常开触点,用于连接风扇电源。

晶体管(Q5):

  • 作用:晶体管在这里作为开关使用,用于控制继电器线圈中的电流。
  • 工作原理:当晶体管的基极有足够的电流输入时,晶体管导通,允许电流从集电极流向发射极,进而使继电器线圈中有电流通过。图中基极通过电阻R12连接到“FAN”控制信号,当“FAN”信号为高电平时,晶体管导通。

二极管(D7):

  • 作用:二极管在这里起到续流保护的作用。
  • 工作原理:当晶体管突然关断时,继电器线圈中的电流会突然中断,由于电感的特性,线圈会产生一个反向电动势,这个反向电动势可能会损坏晶体管。二极管D7为这个反向电动势提供了一个泄放回路,保护晶体管不受损坏。

电阻(R12):

  • 作用:电阻R12用于限制流入晶体管基极的电流,防止因电流过大而损坏晶体管。它起到分压和限流的作用,确保晶体管工作在安全的工作区域内。

控制信号(FAN):

        “FAN”是外部控制信号输入,当该信号为高电平时,晶体管导通,继电器线圈得电,触点闭合,风扇运转;当“FAN”信号为低电平时,晶体管截止,继电器线圈失电,触点断开,风扇停止。

2.4.2  三极管驱动方案(调速控制)

原理图设计:

电源部分:

        图中“+5V”表示该电路的电源输入为5伏特直流电,为整个电路提供工作电压,“GND”代表接地,是电路的参考零电位点。

控制信号输入:

        “PA11”是外部控制信号的输入引脚。这个信号通常由单片机的某个引脚输出,用来控制风扇或电机的启动与停止。

电阻部分:

  • R24(10KΩ):这是一个上拉电阻。当PA11引脚没有外部信号输入时,上拉电阻将该引脚的电位拉高到+5V,确保晶体管Q10处于截止状态,风扇或电机不工作。当PA11引脚接收到有效的控制信号时,会改变晶体管基极的电位。
  • R26(1KΩ):它是基极电阻,作用是限制流入晶体管Q10基极的电流,防止因电流过大而损坏晶体管。通过合理选择R26的阻值,可以确保晶体管工作在合适的放大或开关状态。

晶体管部分:

Q10(S8050)是一个NPN型晶体管,在这里作为开关使用。

  • 当PA11引脚输入的信号使晶体管基极电压达到一定阈值时,晶体管导通,电流可以从集电极流向发射极。
  • 当基极电压低于阈值时,晶体管截止,集电极和发射极之间相当于断开。

保护二极管部分:

        D1是一个二极管,它与风扇或电机M2并联,起到续流保护的作用。风扇或电机属于感性负载,当晶体管突然截止时,感性负载中的电流不能突变,会产生一个反向电动势。这个反向电动势可能会损坏晶体管,而二极管D1为反向电动势提供了一个泄放回路,保护晶体管不受损坏。

负载部分:

        M2代表风扇或电机,是电路的负载。当晶体管Q10导通时,电流从+5V电源流出,经过风扇或电机M2、导通的晶体管Q10,最终流向GND,形成回路,风扇或电机开始运转;当晶体管Q10截止时,回路断开,风扇或电机停止运转。

2.5  常见问题解决

风扇不转:  
   - 检查启动电压是否足够  
   - 测量PWM信号是否到达驱动管  

异常噪音:  
   - 尝试调整PWM频率(1kHz→25kHz测试)  

电流过大:  
   - 检查是否堵转  
   - 更换更大电流的驱动管  

        通过合理选择驱动方案和参数,5V两线直流风扇可满足大多数低成本的散热需求,特别适合STM32等嵌入式系统的温控应用。

三、继电器模块控制风扇启停 

3.1  硬件准备

- STM32F103C8T6最小系统板
- 5V继电器模块
- 5V直流风扇

5V继电器模块详细介绍参考文章:STM32之继电器模块

3.2  硬件连接

控制部分连接:

STM32引脚连接元件说明
PB9继电器信号端控制继电器线圈吸合
PC13LED指示灯风扇状态指示
5V继电器VCC模块供电
GND继电器GND共地

负载部分连接:
5V                     →         继电器COM端
GND                 →         风扇地线(黑线)
继电器NO端     →         风扇电源线(红线)

接线示意图:

3.3  软件实现

3.3.1  初始化代码

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"void GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);// 配置PB9为推挽输出(继电器控制)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);// 配置PC13为推挽输出(LED指示)GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_Init(GPIOC, &GPIO_InitStructure);// 初始状态关闭GPIO_ResetBits(GPIOB, GPIO_Pin_9);GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}

GPIO配置 (GPIO_Init):

  • 推挽输出确保20mA驱动能力(继电器模块需70-100mA,通过三极管放大)
  • 高速模式优化信号边沿质量
  • 初始状态置低,防止上电误动作

3.3.2  风扇控制函数

void Fan_On(void)
{GPIO_SetBits(GPIOB, GPIO_Pin_9);  // 继电器吸合GPIO_SetBits(GPIOC, GPIO_Pin_13); // LED亮
}void Fan_Off(void)
{GPIO_ResetBits(GPIOB, GPIO_Pin_9);  // 继电器断开GPIO_ResetBits(GPIOC, GPIO_Pin_13); // LED灭
}

硬件响应过程(打开风扇):

  • PB9输出3.3V高电平
  • 三极管饱和导通(Vce≈0.3V)
  • 继电器线圈得电(4.7V=5V-0.3V)
  • 机械触点吸合,风扇通电

3.3.3  主程序

int main(void)
{// 硬件初始化SystemInit();GPIO_Init();while(1){// 开启风扇5秒Fan_On();Delay_ms(5000);// 关闭风扇5秒Fan_Off();Delay_ms(5000);}
}
  • 开启风扇5秒和关闭风扇5秒循环交替执行。

3.4  常见问题解决

继电器不动作:
   - 检查三极管是否损坏
   - 测量线圈两端电压(应≈5V)
   - 测试GPIO输出是否正常

风扇不转:
   - 检查5V电源
   - 测试继电器触点导通情况
   - 确认风扇本身正常

3.5  系统特点

本系统实现了风扇的基本开关控制,具有以下特点:
1. 电路简单可靠
2. 高低压完全隔离
3. 状态指示明确
4. 易于功能扩展

四、PWM控制风扇转速

4.1  硬件准备

- STM32F103C8T6最小系统板
- 5V直流风扇
- S8050 NPN三极管(可直接使用电机驱动模块)

4.2  硬件连接

STM32引脚连接元件说明
PA6三极管基极(PWM信号输入端)TIM3_CH1 PWM输出
PC13LED指示灯运行状态指示
5V风扇正极电源输入
GND公共地三极管发射极

4.3  软件实现

4.3.1  PWM初始化

void PWM_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;TIM_TimeBaseInitTypeDef TIM_BaseStruct;TIM_OCInitTypeDef TIM_OCStruct;// 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 配置PA6为复用推挽输出GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// 定时器基础配置TIM_BaseStruct.TIM_Prescaler = 72-1; // 1MHz计数频率TIM_BaseStruct.TIM_Period = 100-1;   // 10kHz PWM频率TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_BaseStruct);// PWM通道配置TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCStruct.TIM_Pulse = 0; // 初始占空比0%TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM3, &TIM_OCStruct);// 使能预装载TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM3, ENABLE);// 启动定时器TIM_Cmd(TIM3, ENABLE);
}

定时器配置 (PWM_Init)频率计算:

  • 系统时钟72MHz经72分频→1MHz时基
  • 每100个计数周期产生1个PWM周期 → 1MHz/100=10kHz

4.3.2  调速控制函数

void Set_Fan_Speed(uint8_t percent) // percent: 0-100%
{// 限制最小启动占空比(防止三极管未饱和)if(percent > 0 && percent < 20) percent = 20; if(percent > 100) percent = 100;TIM3->CCR1 = percent; // 修改捕获比较值GPIO_WriteBit(GPIOC, GPIO_Pin_13, (percent > 0) ? Bit_SET : Bit_RESET);
}

转速设置函数 (Set_Fan_Speed):

  • 最小20%占空比确保三极管饱和导通
  • 直接寄存器操作提高响应速度
  • LED状态同步指示

4.3.3  主程序逻辑

int main(void)
{uint8_t speed;// 初始化SystemInit();PWM_Init();ADC1_Init();LED_Init();while(1){float temp = DS18B20_GetTemp();if(temp < 30.0) speed = 0;else if(temp < 50.0) speed = 20 + (temp-30)*4;else speed = 100;Set_Fan_Speed(speed);Delay_ms(50); // 控制周期50ms}
}

        这里以温度控制为例,实际速度根据自身系统需求修改speed变量即可。

        通过温度传感器(DS18B20)读取当前环境温度,根据预设的温度-转速映射关系自动调节风扇转速,实现温度自适应的智能散热控制。

调用DS18B20驱动函数获取当前温度值temp(单位:℃)。

(1)温度低于30℃时关闭风扇(speed = 0)。

(2)温度在30℃~50℃之间时根据温度调速(spped = 20 + (temp-30)*4)。

  • 温度30℃时:speed = 20 + 0 = 20%(最小启动转速)
  • 温度40℃时:speed = 20 + 10*4 = 60%
  • 温度50℃时:speed = 20 + 20*4 = 100%

(3)温度≥50℃时风扇全速运行(speed = 100

4.4  系统优化

4.4.1  转速显示

void Show_Speed(uint8_t percent)
{char buf[16];sprintf(buf, "Speed:%3d%%", percent);LCD_DisplayString(0, 0, buf);
}

将speed传入函数中,格式化数组后通过显示屏显示速度。

4.2.2  按键调速

void Key_Control(void)
{if(KEY_Pressed()) {static uint8_t speed = 0;speed = (speed + 25) % 125; // 0%,25%,50%,75%,100%Set_Fan_Speed(speed);}
}

每次按下按键速度增加25%. 

4.5  系统特点

本系统实现了经济高效的PWM风扇调速,具有以下特点:
1. 硬件成本极低
2. 调速范围宽(20%-100%)
3. 电路简单可靠

实际应用时需根据风扇规格调整:
- 最小启动占空比
- PWM频率

五、总结

继电器控制风扇优缺点:

优点缺点
控制高压/大电流负载只能开关控制,无法调速
电气隔离安全可靠机械触点寿命有限(约10万次)
电路简单,成本低切换时有机械噪音

PWM控制风扇优缺点:

优点缺点
无级调速,控制精细仅适用于直流风扇
无机械损耗,寿命长需额外驱动电路(三极管等)
可结合温度反馈实现闭环控制低速时可能停转(需最小占空比)

方案决策指南:

控制需求推荐方案理由
简单开关控制继电器安全隔离高压
直流风扇调速PWM精准控制转速
低成本、无需调速继电器+交流风扇电路简单
静音/节能需求PWM+直流风扇可动态降低转速

        通过合理选择控制方式,可平衡成本、性能和安全需求。建议在原型阶段测试实际负载特性,再确定最终方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914082.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AGX Xavier 搭建360环视教程【二、环境配置】

AGX Xavier 场景下的 【OpenCV FFmpeg CUDA GStreamer】 重装 & 编译的2025年稳定方案✅ 1️⃣ 先卸载老版本AGX 自带很多预装包&#xff0c;原则&#xff1a;卸载干净&#xff0c;避免旧库和新编译冲突。&#x1f539; 卸载 OpenCVdpkg -l | grep opencv sudo apt-get …

Cesium实战:交互式多边形绘制与编辑功能完全指南(最终修复版)

&#x1f4cb; 文章目录 引言功能概述环境准备核心实现步骤 地图初始化多边形绘制顶点编辑功能颜色与透明度自定义面积计算与显示 常见问题解决方案 多边形颜色显示异常面积标签不可见控制台alpha类型错误地图交互无法恢复 完整代码总结与扩展 引言 Cesium作为一款强大的3D地…

SQL判断先判断条件1是否符合,条件1不符合再判断条件2

伪代码假设存在条件1和条件2SELECT * FROM table1 WHERE 条件1 AND 条件2方法1&#xff1a;先判断条件1是否符合,条件1不符合再判断条件2是否满足&#xff1a;SELECT * FROM table1 WHERE (条件1) OR (NOT 条件1 AND 条件2);方法 2: 使用 IF 或数据库特有函数&#xff08;…

游戏的程序员会不会偷偷改自己账号的数据?

看到这个问题&#xff0c;我忍不住笑了。 作为一个在程序员这条路上摸爬滚打了快10年的老司机&#xff0c;虽然我主要专精嵌入式开发&#xff0c;但我也接触过不少游戏开发的朋友&#xff0c;对游戏行业的内部运作有一定了解。这个问题可以说是每个游戏玩家都曾经想过的&#x…

uniapp小程序tabbar跳转拦截与弹窗控制

一、第一步1、App.vue中定义globalData用于全局存储状态globalData:{needShowReleaseConfirm: false, // 标记是否需要显示发布页面确认弹窗allowReleaseJump: false ,// 标记是否允许跳转到发布页面},2、在App.vue中的onLaunch写入监听事件onLaunch: function() {// 添加switc…

华为网路设备学习-26(BGP协议 一)

一、AS&#xff08;自治系统&#xff09;AS&#xff08;自治系统&#xff09;的大小通常指其分配的唯一编号&#xff0c;范围分为两种&#xff1a;‌2字节AS号‌&#xff1a;取值范围1至65535&#xff08;其中64512-65535为私有AS号&#xff09; ‌‌4字节AS号‌&#xff1a;取…

大模型开发框架LangChain之函数调用

1.前言 之前一直使用 dify开发 agent&#xff0c;虽然功能很全面、效果也稳定&#xff0c;但是也存在流程固化、不灵活&#xff0c;以及 dify本身太重&#xff08;内部包含10个容器&#xff09;等问题。 故最近研究了大名顶顶的 langchain&#xff0c;先从函数调用开始&#xf…

pycharm中自动补全方法返回变量

使用IDEA开发java中&#xff0c;可以使用altenter 快捷键快速补全方法放回的变量使用pycharm也想实现此效果&#xff0c;如下图操作方法&#xff1a;pycharm中默认的补全方法返回变量的快捷键是&#xff1a;CtrlAltv 可以直接使用默认快捷键&#xff0c;也可以在settings->k…

Set 二分 -> 剑指算法竞赛

C【STL】集合set 标准库提供 set 关联容器分为&#xff1a; 按关键字有序保存元素&#xff1a;set&#xff08;关键字即值&#xff0c;即只保存关键字的容器&#xff09;、multiset&#xff08;关键字可重复出现的 set&#xff09;&#xff1b; 无序集合&#xff1a;unordered…

php的原生类

前言&#xff1a;累麻了&#xff01; 反射类 反射类 ReflectionClass&#xff1a;ReflectionClass 类报告了一个类的有关信息。正如其名用于映射反射一个类的类&#xff01; new ReflectionClass(MyClass) 会创建一个 ReflectionClass 实例&#xff0c;代表 MyClass 这个类。 …

PC网站和uniapp安卓APP、H5接入支付宝支付

首先我们需要完成支付宝账号注册&#xff0c;支持的账号类型&#xff1a;支付宝企业账号、支付宝个人账号、个体工商户。 到支付宝商家平台 产品中心开通APP支付、手机网站支付、电脑网站支付的产品权限。 一、电脑PC网站接入 电脑PC网站支付是指商户在电脑网页展示商品或服务&…

MCU芯片内部的ECC安全机制

MCU&#xff08;微控制器单元&#xff09;芯片内部的 ECC&#xff08;错误检测与纠正&#xff09;安全机制 是一种至关重要的硬件级可靠性技术&#xff0c;主要用于保护关键存储单元&#xff08;如 SRAM、Flash、Cache&#xff09;中的数据完整性&#xff0c;防止因外部干扰或硬…

【自动驾驶】经典LSS算法解析——深度估计

LSS-Lift.Splat,Shoot 论文题目&#xff1a;Lift, Splat, Shoot: Encoding Images From Arbitrary Camera Rigs by Implicitly Unprojecting to 3D 代码&#xff1a;https://github.com/nv-tlabs/lift-splat-shoot 概括&#xff1a;先做深度估计和特征融合&#xff0c;然后投…

《【第八篇-图片总结篇】Python图片处理自动化:终极工厂!从裁剪压缩到智能加水印,打造你的视觉内容生产流水线!》

在数字时代&#xff0c;图片无处不在。然而&#xff0c;高质量的图片背后&#xff0c;往往隐藏着繁琐的后期处理&#xff1a;图片文件太大导致加载慢&#xff1b;尺寸不符需要裁剪&#xff1b;版权保护要加水印&#xff1b; 为了兼容性还得批量转换格式……这些重复、机械的工…

frame 与新窗口切换操作【selenium 】

&#x1f9ed; 一、切换到 iframe 内部进行操作在浏览器自动化测试中&#xff0c;iframe 是一个特别的存在。它相当于在当前页面中嵌入了另一个独立的 HTML 页面。当我们试图直接访问 iframe 中的元素时&#xff0c;往往会发现定位不到&#xff0c;比如&#xff1a;elements w…

MYSQL C_API使用全解

文章目录C_API&#xff08;简单的&#xff09;安装这个库使用流程初始化连接mysql_init建立连接mysql_real_connect执行SQL语句mysql_query处理结果mysql_store_resultmsyql_use_resultmysql_num_rowsmsyql_free_resultmysql_num_fieldsmysql_fetch_row多线程安全关闭连接mysql…

闲庭信步使用图像验证平台加速FPGA的开发:第二课——RGB转YCbCr的FPGA硬件编程详解

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程文件请关注…

RK3566/RK3568 Android11 修改selinux模式

概述RK3566/RK3568 Android11 SDK默认的selinux是Enforcing模式(强制模式)。Enforcing&#xff1a;强制模式&#xff1a;SELinux在运行中&#xff0c;且已经开始限制domain/type之间的验证关系 Permisssive&#xff1a;宽容模式&#xff1a;SELinux在运行中&#xff0c;如果验证…

iOS Widget 开发-3:Widget 的种类与尺寸(主屏、锁屏、灵动岛)

iOS 支持多种类型的 Widget&#xff0c;分布在主屏幕、锁屏、灵动岛、待机模式、控制中心等多个系统位置。每种 Widget 都有各自的尺寸、交互能力与限制。 本篇将系统梳理 iOS 当前支持的 Widget 类型与尺寸规格。主屏 Widget&#xff08;Home Screen Widgets&#xff09; 主屏…

ffmpeg 中 write_option()函数详细注释

author: hjjdebug date: 2025年 07月 11日 星期五 10:51:23 CST descrip: ffmpeg 中 write_option()函数详细注释 文章目录1. 函数原型1.1 参数说明1.2 SpecifierOpt 说明符选项结构2. write_option 代码注释2.1 谁调用了write_option 函数?3. 小结:write_option()不仅在ffmpe…