STM32F103C8T6 输出模块演示

从 MCU 的一个 GPIO 引脚出发,看它如何点亮 LED、驱动蜂鸣器、切换继电器、放大三极管、斩波 MOS 管——并理解背后那个最简"按键翻转"程序的执行流程。

主控 STM32F103C8T6
按键 PB11输入
输出 PB12推挽
时钟 HSE 8MHz × 9 = 72 MHz
HAL库 v1.8
OVERVIEW

为什么需要 5 种"输出器件"?

STM32 的 GPIO 只能直接输出 ±25 mA 左右的电流,且电压固定在 0 / 3.3V。要点亮 5 mA 的 LED 还凑合,但要驱动蜂鸣器、继电器、电机、LED 灯带、加热丝……几乎都需要"驱动级"。于是我们引入三极管、MOS 管来放大电流、隔离电压,再用蜂鸣器、继电器这些"执行器"完成最终的物理输出。

01

发光二极管

LED · 最简单的光输出

02

NPN 三极管

电流放大 · 中等负载驱动

03

N-MOSFET

电压控制 · 大电流斩波

04

蜂鸣器

有源/无源 · 声音输出

05

电磁继电器

电气隔离 · 高低压切换

DEVICE 01

① 发光二极管 (LED)

发光二极管

发光二极管 Light Emitting Diode

Direct-driven visual indicator
原理
PN 结电致发光,电流驱动
典型电流
3 – 20 mA,正向压降 ≈ 2V
功能
把电信号转成可见光
驱动
GPIO + 限流电阻即可直驱

原理

LED 本质是一个 PN 结。当 N 区接高电平、P 区接低电平,正向偏置时电子与空穴在结区复合,多余能量以光子形式释放,从而发光。颜色由半导体材料决定(红/黄/绿/蓝/白)。

功能

作为状态指示灯:电源指示、运行指示、故障告警、人机交互反馈。亮度由流过 LED 的电流决定(3 mA 微亮、20 mA 高亮)。

限流电阻计算

  • 公式:R = (VCC − VF) / I
  • 例:3.3V MCU,VF=2V,I=5mA → R = 260Ω,取 330Ω~1KΩ 即可
  • 本工程原理图:R2 = 1 kΩ,亮度适中且省电

动画演示

3.3V PB12 1kΩ LED GND
PB12 = LOW · 灭
DEVICE 02

② NPN 三极管(如 S8050 / S9013)

三极管

NPN 双极结型三极管 BJT · NPN

Current-controlled switch / amplifier
原理
小电流 IB 控制大电流 IC
β
100 – 300(IC = β · IB)
功能
把 MCU 的 mA 级信号放大到几百 mA
典型
蜂鸣器、继电器、小型直流负载驱动

原理

NPN 三极管有 B(基极)、C(集电极)、E(发射极) 三极。当 VBE ≈ 0.7V 时,BE 结导通,产生基极电流 IB;集电极电流 IC = β · IB。MCU 给出几 mA 的 IB,就能"开闸"放出几百 mA 给负载——这是"以小控大"。

饱和与截止

  • 截止:IB=0 → IC=0,等效开关断开
  • 饱和:IB 足够大 → VCE≈0.2V,等效开关接通(Vout ≈ 0V,低电平有效)
  • 本工程:R3 = 1 kΩ 串基极,确保在 3.3V 时 IB ≈ 2.6 mA,可驱动 ~260 mA 负载

功能

用极小的 MCU 信号驱动电流较大的器件。蜂鸣器(30 mA)、继电器线圈(70 mA)、小电机都靠它来"续命"。

动画演示(基极电流 → 集电极导通)

+5V 蜂鸣器 B C E GND 1k PB12 IB IC IE
PB12 = LOW · 截止
DEVICE 03

③ N-MOSFET(如 15N10)

MOS管

N 沟道增强型 MOSFET N-MOS · Voltage-controlled

Voltage-driven high-side or low-side switch
原理
栅极电压 VGS 产生电场,开关沟道
VGS(th)
1 – 4V,RDS(on) 极小(mΩ 级)
功能
大电流低损耗开关、PWM 调速
典型
电机、LED 灯带、加热片、电源开关

原理

MOSFET 是电压控制器件——栅极(G)相对于源极(S)电压 VGS 超过阈值 Vth 时,氧化层下感应出 N 型反型层,漏极(D)与源极之间形成"沟道",电流导通。

与三极管的关键区别:栅极几乎不取电流(只充放电容),所以 MCU 可以轻松驱动;导通电阻极小(15N10 典型 10 mΩ@VGS=10V),几乎不发热。

功能

  • 低边开关:MOS 放在负载和 GND 之间(最常用)
  • 高边开关:MOS 放在电源和负载之间(P 沟道或自举电路)
  • PWM 调速:高速开关 → 平均电压可调 → 电机/灯带调亮度
  • 本工程:R7 = 200 Ω 限流 + R9 = 10 kΩ 下拉确保默认关断;1N4007 续流保护

动画演示(栅极加电 → 沟道打开)

+5V 负载 G D S n GND 200 PB12 VGS
PB12 = LOW · 关断
DEVICE 04

④ 蜂鸣器(有源 / 无源)

蜂鸣器

电磁式蜂鸣器 Buzzer

Audible output · driven by NPN or MOS
有源
内置振荡,给电就响(~2 kHz)
无源
需外部 1.5 – 5 kHz 方波驱动
电流
10 – 30 mA(3V / 5V 常见)
功能
按键音、报警、提示音

原理

内部由线圈、磁铁、振动膜片组成。通电后线圈产生交变磁场驱动膜片振动发声。

  • 有源蜂鸣器:内部含振荡电路与驱动三极管,只要加直流电压即发声。GPIO 输出 HIGH/LOW 即可控制开关。
  • 无源蜂鸣器:相当于一个"喇叭",必须外部给一定频率的方波才能响。可以播放旋律、做音调反馈。

为什么需要三极管驱动?

蜂鸣器工作电流 10–30 mA,接近 MCU 单引脚 25 mA 上限,且长期满载会损伤 MCU 内部 MOSFET。所以工程中一律用 NPN 做低边开关,蜂鸣器接 5V,单片机只负责给基极一个 mA 级的控制信号。

动画演示

+5V 蜂鸣器 PB12 PB
PB12 = LOW · 静音
DEVICE 05

⑤ 电磁继电器(如 SRD-05VDC-SL-C)

继电器

小型电磁继电器 Relay · Electromechanical Switch

Galvanic isolation · high-voltage switching
原理
线圈通电产生磁力,吸合衔铁切换触点
线圈
5V / 70 mA(3V/12V/24V 也常见)
触点
10A 250VAC / 30VDC 等级
功能
低压控制高压,实现电气隔离

原理

继电器由线圈和触点两部分组成,靠磁场隔空"拉"一个金属簧片。线圈通电 → 产生磁力 → 衔铁吸合 → 公共端(COM)从常闭(NC)打到常开(NO)。

功能与典型应用

  • 用 3.3V/5V 的 MCU 信号控制 220V 交流电设备(灯具、加热器、电机)
  • 电气隔离:线圈与触点之间耐压通常 1500V 以上
  • 本工程:SRD-05VDC-SL-C,5V 线圈,1 路转换触点,10A 负载能力

注意事项

  • 线圈是感性负载,断电瞬间会感应高压反电动势——必须并联续流二极管(1N4007)
  • 线圈电流 70 mA 远超 MCU 能力,必须用三极管驱动
  • LED3 指示灯便于调试观察

动画演示(线圈通电 → 衔铁吸合)

+5V 线圈 B GND 1k PB12 NC NO COM 弹簧
PB12 = LOW · 释放
SCHEMATIC

▌整体原理图

把 5 种输出电路放在同一张原理图里:从 PA15 输出的控制信号,经过 LED 直驱、NPN 三极管电流放大、N-MOS 大电流开关,再驱动 5V 有源蜂鸣器、声光报警组合以及继电器控制输出。实际接线时,只需把任意一路的控制端接到 PB12,程序即可统一控制。

输出模块整体原理图
LED 直驱 NPN 三极管 N-MOS 管 5V 有源蜂鸣器 声光报警 继电器输出
PROGRAM ANALYSIS

三、演示程序分析

演示程序是"按键翻转输出"——每按一次 KEY(PB11),PB12 的电平就翻转一次。这个动作可以作为控制上述 5 种输出器件的统一接口:把 PB12 接到任意一个的驱动端,行为完全一致。

▌硬件引脚配置

引脚方向功能
PB11INPUT用户按键 KEY(上拉,按下 = 低)
PB12OUTPUT推挽输出,连接到 5 种负载的驱动端
HSE—外部 8 MHz 晶振 × 9 = 72 MHz 系统时钟

时钟树:HSE 8M → PLL ×9 → SYSCLK 72M → AHB 72M / APB1 36M / APB2 72M。

Core/Src/main.c · main loop
/* main.c · 主循环:按键翻转 PB12 */
while (1)
{
    // ① 检测 KEY 是否被按下(PB11 == RESET = 低电平)
    if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET)
    {
        // ② 按键消抖:等待 10 ms 后再读一次
        HAL_Delay(10);

        // ③ 确认仍然按下(不是抖动)
        if (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET)
        {
            // ④ 等待按键松开(防止长按连续触发)
            while (HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_RESET);

            // ⑤ 松开后翻转 PB12 → 驱动端切换状态
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12);
        }
    }
}

▌程序流程图

是 否 是 否 while(1) 循环 开始 / 系统初始化 while (1) 主循环 PB11 == RESET? 检测按键按下 HAL_Delay(10ms) 消抖 仍为 RESET? 二次确认 等待按键松开 while == RESET 翻转 PB12 (Toggle)
INTERACTIVE DEMO

四、交互式演示

PB11 平时为高电平(内部上拉),按下按键后变为低电平。整个程序运行在 while(1) 主循环中,按住按钮再松开,完整跑一遍循环体的 5 个步骤:检测 → 消抖 → 确认 → 等待松开 → 翻转输出,然后回到循环顶部。PB12 的电平变化同时驱动右侧的红色 LED 和蜂鸣器仿真。

▌模拟按键翻转 PB12

按住按钮模拟按下(PB11 → LOW),松开后触发翻转。流程图与 LED / 蜂鸣器仿真会同步响应。

🔘 KEY · PB11
未按下 · HIGH

按住不放,松开后触发一次翻转

PB11
HIGH
PB12
LOW
LED 红灯
♪
蜂鸣器
当前流程步骤
▸ 等待按键…