目录
[2.1 基本概述](#2.1 基本概述)
[2.2 关键特性](#2.2 关键特性)
[2.3 接口定义](#2.3 接口定义)
[2.4 典型驱动电路](#2.4 典型驱动电路)
[2.4.1 继电器驱动方案(开关控制)](#2.4.1 继电器驱动方案(开关控制))
[2.4.2 三极管驱动方案(调速控制)](#2.4.2 三极管驱动方案(调速控制))
[2.5 常见问题解决](#2.5 常见问题解决)
[3.1 硬件准备](#3.1 硬件准备)
[3.2 硬件连接](#3.2 硬件连接)
[3.3 软件实现](#3.3 软件实现)
[3.3.1 初始化代码](#3.3.1 初始化代码)
[3.3.2 风扇控制函数](#3.3.2 风扇控制函数)
[3.3.3 主程序](#3.3.3 主程序)
[3.4 常见问题解决](#3.4 常见问题解决)
[3.5 系统特点](#3.5 系统特点)
[4.1 硬件准备](#4.1 硬件准备)
[4.2 硬件连接](#4.2 硬件连接)
[4.3 软件实现](#4.3 软件实现)
[4.3.1 PWM初始化](#4.3.1 PWM初始化)
[4.3.2 调速控制函数](#4.3.2 调速控制函数)
[4.3.3 主程序逻辑](#4.3.3 主程序逻辑)
[4.4 系统优化](#4.4 系统优化)
[4.4.1 转速显示](#4.4.1 转速显示)
[4.2.2 按键调速](#4.2.2 按键调速)
[4.5 系统特点](#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 | 继电器信号端 | 控制继电器线圈吸合 |
PC13 | LED指示灯 | 风扇状态指示 |
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 系统特点
本系统实现了风扇的基本开关控制,具有以下特点:
-
电路简单可靠
-
高低压完全隔离
-
状态指示明确
-
易于功能扩展
四、PWM控制风扇转速
4.1 硬件准备
-
STM32F103C8T6最小系统板
-
5V直流风扇
-
S8050 NPN三极管(可直接使用电机驱动模块)
4.2 硬件连接
STM32引脚 | 连接元件 | 说明 |
---|---|---|
PA6 | 三极管基极(PWM信号输入端) | TIM3_CH1 PWM输出 |
PC13 | LED指示灯 | 运行状态指示 |
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风扇调速,具有以下特点:
-
硬件成本极低
-
调速范围宽(20%-100%)
-
电路简单可靠
实际应用时需根据风扇规格调整:
-
最小启动占空比
-
PWM频率
五、总结
继电器控制风扇优缺点:
优点 | 缺点 |
---|---|
控制高压/大电流负载 | 只能开关控制,无法调速 |
电气隔离安全可靠 | 机械触点寿命有限(约10万次) |
电路简单,成本低 | 切换时有机械噪音 |
PWM控制风扇优缺点:
优点 | 缺点 |
---|---|
无级调速,控制精细 | 仅适用于直流风扇 |
无机械损耗,寿命长 | 需额外驱动电路(三极管等) |
可结合温度反馈实现闭环控制 | 低速时可能停转(需最小占空比) |
方案决策指南:
控制需求 | 推荐方案 | 理由 |
---|---|---|
简单开关控制 | 继电器 | 安全隔离高压 |
直流风扇调速 | PWM | 精准控制转速 |
低成本、无需调速 | 继电器+交流风扇 | 电路简单 |
静音/节能需求 | PWM+直流风扇 | 可动态降低转速 |
通过合理选择控制方式,可平衡成本、性能和安全需求。建议在原型阶段测试实际负载特性,再确定最终方案。