STM32中使用三极管驱动风扇
摘要:本文介绍了三极管的结构原理及STM32驱动代码实现。三极管分为NPN和PNP型,通过小电流控制大电流实现放大功能。文中提供了使用STM32F103C8T6驱动S8050三极管控制风扇的完整代码方案,包括头文件定义、PWM初始化函数和速度控制函数。硬件连接部分强调了三极管引脚识别和电路连接要点,实现了0-100%无级调速功能。该方案展示了如何通过STM32定时器的PWM输出来精确控制三极管驱动
目录
一、认识三级管
1.三极管的基本概念
三极管是一种电流控制型的半导体器件,由三层半导体材料构成,形成两个 PN 结(如下图所示)。根据结构不同,可分为 NPN 型 和 PNP 型 两种。
- NPN 型:由两层 N 型半导体夹一层 P 型半导体构成(N-P-N)。
- PNP 型:由两层 P 型半导体夹一层 N 型半导体构成(P-N-P)。
![]() |
![]() |
注意:电子从负极流向正极,电流是从正正极流向负极,这样形成了基于硅晶体管的单向导电性,PN结就是合金P与合金N接触的这个区域(交界面)
三极管有三个电极:
- 发射极(Emitter, E):发射载流子。
- 基极(Base, B):控制载流子流动。
- 集电极(Collector, C):收集载流子。

2. 三极管的内部结构与工作原理
1. 结构特点
- 发射区:掺杂浓度高,用于高效发射载流子。
- 基区:非常薄(微米级),掺杂浓度低,以减少载流子在基区的复合。
- 集电区:面积较大,用于收集载流子。
2. 工作原理(以 NPN 为例)
当三极管工作在放大区时:
- 发射结(BE)正向偏置:使电子从发射区注入基区。
- 集电结(BC)反向偏置:使大部分注入基区的电子被集电区收集,形成集电极电流。
由于基区很薄且掺杂浓度低,只有极少数电子在基区与空穴复合,形成很小的基极电流 IBIB。而大部分电子到达集电极,形成较大的集电极电流 ICIC。
三极管的核心特性是:小电流控制大电流,即:
IC=βIBIC=βIB
其中,ββ(或 hFEhFE)为直流电流放大系数,典型值在 20~500 之间。
注意:发射极e和集电极c断开状态时,禁止电流通过

二、STM32驱动代码
注意:使用的是最常见的S8050三极管
风扇控制模块,包含 fan.c、fan.h 和在 main.c 中的调用示例,使用 STM32F103C8T6 +标准外设库(Standard Peripheral Library),驱动引脚为 PB8(TIM4_CH3)。
1. fan.h —— 头文件
// fan.h
#ifndef __FAN_H
#define __FAN_H
#include "stm32f10x.h"
void Fan_Init(void);
void Fan_SetSpeed(uint8_t duty); // duty: 0 ~ 100
#endif
2. fan.c —— 实现文件
// fan.c
#include "fan.h"
// 初始化 PB8 为 TIM4_CH3 PWM 输出
void Fan_Init(void)
{
// 1. 开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
// 2. 配置 PB8 为复用推挽输出(TIM4_CH3)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 3. 配置 TIM4 基础参数(1kHz PWM)
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 72MHz / (71+1) = 1MHz
TIM_TimeBaseStructure.TIM_Period = 999; // 1MHz / (999+1) = 1kHz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
// 4. 配置通道 3(CH3)为 PWM 模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始关闭
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
// 5. 启动定时器
TIM_Cmd(TIM4, ENABLE);
}
// 设置风扇转速:duty = 0~100(百分比)
void Fan_SetSpeed(uint8_t duty)
{
if (duty > 100) duty = 100;
uint32_t pulse = (duty * 1000) / 100; // 映射到 0~1000
TIM_SetCompare3(TIM4, pulse);
}
3. main.c —— 主程序(调用示例)
// main.c
#include "stm32f10x.h"
#include "fan.h"
#include "Delay.h"
int main(void)
{
// 其他外设初始化(如串口、DHT11、OLED 等)可放这里
// 初始化风扇
Fan_Init();
while (1)
{
Fan_SetSpeed(0); // 停止
Delay_ms(2000);
Fan_SetSpeed(30); // 低速
Delay_ms(2000);
Fan_SetSpeed(60); // 中速
Delay_ms(2000);
Fan_SetSpeed(100); // 全速
Delay_ms(2000);
}
}
🔌 硬件连接再确认(关键!)这个看下面的链接,看不懂的话对着连接
S8050 三极管是干什么的?S8050 引脚图和原理图,几分钟带你搞定 S8050 - 知乎
| 元件 | 连接 |
|---|---|
| 风扇红线 | 外部 5V 电源正极(我使用的是5v风扇) |
| 风扇黑线 | S8050 的 集电极(C,中间脚) |
| S8050 基极(B,左边脚) | → 220Ω 电阻 → PB8 |
| S8050 发射极(E,右边脚) | → GND(与 STM32 共地) |
✅ S8050 封装:TO-92,字面朝自己,引脚朝下 → 左 B,中 C,右 E
更多推荐






所有评论(0)