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

目录

一、系统概述

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

[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 系统特点)

四、PWM控制风扇转速

[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 系统特点

本系统实现了风扇的基本开关控制,具有以下特点:

  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+直流风扇 可动态降低转速

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