目录
一、系统概述
二、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 | 继电器信号端 | 控制继电器线圈吸合 |
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 系统特点
本系统实现了风扇的基本开关控制,具有以下特点:
1. 电路简单可靠
2. 高低压完全隔离
3. 状态指示明确
4. 易于功能扩展
四、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风扇调速,具有以下特点:
1. 硬件成本极低
2. 调速范围宽(20%-100%)
3. 电路简单可靠
实际应用时需根据风扇规格调整:
- 最小启动占空比
- PWM频率
五、总结
继电器控制风扇优缺点:
优点 | 缺点 |
---|---|
控制高压/大电流负载 | 只能开关控制,无法调速 |
电气隔离安全可靠 | 机械触点寿命有限(约10万次) |
电路简单,成本低 | 切换时有机械噪音 |
PWM控制风扇优缺点:
优点 | 缺点 |
---|---|
无级调速,控制精细 | 仅适用于直流风扇 |
无机械损耗,寿命长 | 需额外驱动电路(三极管等) |
可结合温度反馈实现闭环控制 | 低速时可能停转(需最小占空比) |
方案决策指南:
控制需求 | 推荐方案 | 理由 |
---|---|---|
简单开关控制 | 继电器 | 安全隔离高压 |
直流风扇调速 | PWM | 精准控制转速 |
低成本、无需调速 | 继电器+交流风扇 | 电路简单 |
静音/节能需求 | PWM+直流风扇 | 可动态降低转速 |
通过合理选择控制方式,可平衡成本、性能和安全需求。建议在原型阶段测试实际负载特性,再确定最终方案。