news 2026/4/25 23:46:33

STM32通过PWM实现呼吸灯效果:代码详解与硬件连接

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32通过PWM实现呼吸灯效果:代码详解与硬件连接

文章目录

    • 摘要
    • 1. 引言
      • 1.1 呼吸灯应用场景
      • 1.2 PWM技术原理
    • 2. 硬件准备
      • 2.1 所需材料清单
      • 2.2 STM32引脚分配
      • 2.3 连接示意图
    • 3. 开发环境搭建
      • 3.1 软件安装步骤
      • 3.2 CubeMX关键配置
    • 4. PWM配置详解
      • 4.1 定时器参数计算
    • 5. 代码实现
      • 5.1 文件结构
      • 5.2 核心代码:`main.c`
      • 5.3 PWM初始化:`tim.c`
    • 6. 烧录与调试
      • 6.1 烧录流程
      • 6.2 常见问题解决
    • 7. 优化
      • 7.1高级优化方案
    • 8. 技术图谱总结

摘要

本文详细讲解如何使用STM32的PWM功能实现呼吸灯效果,涵盖硬件连接、CubeMX配置、代码编写及调试技巧,通过定时器控制LED亮度渐变,提供完整可复现的嵌入式开发案例。


1. 引言

1.1 呼吸灯应用场景

呼吸灯通过亮度平滑变化模拟呼吸节奏,广泛应用于设备状态指示(如手机通知)、装饰照明等领域。其核心是通过PWM(脉冲宽度调制)控制LED的导通时间。

1.2 PWM技术原理

PWM通过调节脉冲占空比(高电平时间占总周期的比例)控制平均电压输出。公式为:

V_avg = (t_on / T) × V_cc

其中:

  • t_on:高电平时间
  • T:PWM周期
  • V_cc:电源电压
定时器时钟
预分频器
计数器
比较寄存器
PWM输出

2. 硬件准备

2.1 所需材料清单

组件规格数量
STM32开发板STM32F103C8T61
LED灯5mm 红色1
电阻220Ω1
杜邦线20cm若干

2.2 STM32引脚分配

功能引脚复用功能
PWM输出PA8TIM1_CH1
LED阳极通过电阻接PA8-
LED阴极GND-

2.3 连接示意图

PWM输出
STM32 PA8
220Ω电阻
LED阳极
GND

3. 开发环境搭建

3.1 软件安装步骤

  1. 下载Keil MDK5(官网链接)
  2. 安装STM32CubeMX(ST官网)
  3. 安装ST-Link驱动

3.2 CubeMX关键配置

新建工程
选择STM32F103C8
配置SYS-Debug-Serial Wire
配置TIM1
设置通道1-PWM
生成代码

4. PWM配置详解

4.1 定时器参数计算

目标:100Hz PWM频率,72MHz系统时钟
计算步骤:

预分频值 = 时钟频率 / (计数器周期 * PWM频率) - 1 = 72,000,000 / (1000 * 100) - 1 = 71

CubeMX设置:

  • Prescaler: 71
  • Counter Period: 999 (ARR值)
  • Pulse: 初始占空比0

5. 代码实现

5.1 文件结构

Breathing_LED/ ├── Core/ │ ├── Src/ │ │ ├── main.c # 主程序 │ │ └── tim.c # 定时器配置 ├── Drivers/ └── STM32F103C8Tx_FLASH.ld # 链接脚本

5.2 核心代码:main.c

/* 文件名:main.c */#include"main.h"#include"tim.h"TIM_HandleTypeDef htim1;// TIM1句柄intmain(void){HAL_Init();SystemClock_Config();MX_TIM1_Init();HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);// 启动PWMuint16_tduty=0;// 当前占空比int8_tdir=1;// 方向:1递增,-1递减while(1){HAL_Delay(10);// 10ms更新一次// 更新占空比值if(dir==1){if(++duty>=1000)dir=-1;}else{if(--duty==0)dir=1;}// 更新PWM脉宽__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,duty);}}

5.3 PWM初始化:tim.c

/* 文件名:tim.c */voidMX_TIM1_Init(void){TIM_ClockConfigTypeDef sClockSourceConfig={0};TIM_MasterConfigTypeDef sMasterConfig={0};TIM_OC_InitTypeDef sConfigOC={0};htim1.Instance=TIM1;htim1.Init.Prescaler=71;// 预分频值htim1.Init.CounterMode=TIM_COUNTERMODE_UP;htim1.Init.Period=999;// 自动重装载值htim1.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&htim1);// PWM配置sConfigOC.OCMode=TIM_OCMODE_PWM1;sConfigOC.Pulse=0;// 初始占空比sConfigOC.OCPolarity=TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode=TIM_OCFAST_DISABLE;HAL_TIM_PWM_ConfigChannel(&htim1,&sConfigOC,TIM_CHANNEL_1);HAL_TIM_MspPostInit(&htim1);}

6. 烧录与调试

6.1 烧录流程

6.2 常见问题解决

问题现象解决方案
LED不亮检查PA8-GND电压是否变化
亮度不渐变确认HAL_Delay()是否生效
呼吸频率过快增大HAL_Delay()参数

7. 优化

7.1高级优化方案

  1. 使用正弦波表实现更自然的亮度变化:
constuint16_tsine_table[100]={/* 预计算值 */};duty=sine_table[counter++%100];
  1. 启用DMA自动更新占空比,减少CPU占用

8. 技术图谱总结

占空比控制
STM32
TIM1定时器
GPIO控制
PWM输出
LED驱动
呼吸算法
CubeMX配置
Keil编译

通过本教程,您已掌握:

  1. PWM原理及定时器配置方法
  2. STM32CubeMX可视化开发流程
  3. 呼吸灯算法实现技巧
  4. 嵌入式系统调试关键
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 1:43:07

CSS文本溢出显示省略号:一行与多行的优雅处理方案

CSS文本溢出显示省略号:一行与多行的优雅处理方案CSS文本溢出显示省略号:一行与多行的优雅处理方案引言CSS文本溢出的基础原理单行文本省略号的正确姿势1. 三件套缺一不可2. 宽度一定要“可计算”3. flex 子项的“血泪史”4. 兼容陷阱:旧版 S…

作者头像 李华
网站建设 2026/4/17 14:02:44

代智能直播管理系统源码,集智能化、自动化、精细化于一体的管理工具

温馨提示:文末有资源获取方式面对直播运营中互动管理、数据统计、粉丝维护等多重挑战,一套集智能化、自动化、精细化于一体的管理工具至关重要。我们现介绍一款先进的AI直播场控机器人系统源码,它旨在构建现代化播出环境,通过技术…

作者头像 李华
网站建设 2026/4/21 7:21:51

Jenkins自动化构建与CI/CD流水线实战

本文详解Jenkins的安装配置、Pipeline编写、自动化构建部署的完整实践。前言 持续集成/持续部署(CI/CD)是现代软件开发的标配: 自动化构建:代码提交后自动编译打包自动化测试:每次构建自动运行测试自动化部署&#xff…

作者头像 李华
网站建设 2026/4/23 18:33:27

Android selinux 权限 修复 avc: denied

selinux {getenforce 串口命令查看权限selinux0 内核关闭 selinuxselinux1 内核打开 selinuxandroid 系统 两种模式androidboot.selinuxpermissive 宽松androidboot.selinuxenforcing 强制getenforcesetenforce 0 命令,让 selinux 处于宽容模式sn: getprop …

作者头像 李华
网站建设 2026/4/20 7:57:50

【Java毕设源码分享】基于springboot+vue的数据库课程在线教学平台设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/4/20 0:27:12

【Java毕设源码分享】基于springboot+vue的人力资源管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华