当前位置: 首页 > article >正文

实现 STM32 PWM 输出:原理、配置与应用详解

实现 STM32 PWM 输出:原理、配置与应用详解

在嵌入式开发领域,STM32 微控制器凭借其强大的功能和丰富的外设资源,被广泛应用。PWM(脉冲宽度调制)作为 STM32 的重要功能之一,对于电机调速、LED 调光、信号合成等场景不可或缺。本文深入解析 STM32 的 PWM 协议,从原理到代码实现,再到实际应用,助你全面掌握这一关键技术。

一、PWM 基础原理

PWM 信号是一种脉冲信号,其频率保持恒定,但脉冲的宽度(即高电平持续时间)可变。它通过周期(T)和占空比(D)两个关键参数来定义。周期是 PWM 信号重复一次所需的时间,而占空比则是高电平时间(ton)与周期的比率,用百分比表示。计算公式为:D = ton / T × 100%。

例如,在电机调速中,较高的占空比意味着电机获得的平均电压更大,从而转速更快。通过精准控制 PWM 信号的占空比,可以实现对各种设备的精细调节。

二、STM32 的 PWM 硬件基础

STM32 内置定时器是实现 PWM 功能的核心硬件。定时器在 PWM 模式下,会产生周期性和宽度可调的脉冲信号。它通过自动重装载寄存器(ARR)设定 PWM 周期,利用捕获比较寄存器(CCR)确定脉冲宽度。

不同系列的 STM32 微控制器配备多种定时器,通用定时器(如 TIM2 - TIM5)和高级定时器(如 TIM1)都支持 PWM 输出,且具有不同的通道数量和特性,为开发者提供了灵活的硬件选择。

三、STM32 PWM 配置步骤

  1. 开启时钟与 GPIO 配置

    • 首先,要通过调用 __HAL_RCC_GPIOx_CLK_ENABLE() 函数开启对应 GPIO 端口的时钟,确保 GPIO 能正常工作。例如,若使用 PB0 引脚输出 PWM 信号,则开启 GPIOB 时钟。
    • 接着,使用 HAL_GPIO_Init() 函数配置 GPIO 引脚为复用推挽输出模式(GPIO_MODE_AF_PP),以便将定时器的 PWM 信号输出到该引脚。
  2. 定时器初始化

    • 调用 HAL_TIM_PWM_Init() 函数对定时器进行初始化。需设置定时器的时钟频率、计数周期(自动重装载寄存器 ARR 的值)等参数。例如,设定 ARR 为 999,则在定时器时钟频率为 10 kHz 时,PWM 周期为 100 ms(10000 Hz / (999 + 1))。
  3. PWM 通道配置

    • 使用 HAL_TIM_PWM_ConfigChannel() 函数配置定时器的 PWM 通道。指定通道号(如 TIM_CHANNEL_1)、脉冲宽度(捕获比较寄存器 CCR 的初始值)、极性(正极性或负极性)等参数。例如,设置 CCR 为 500,占空比即为 50%(500 / (999 + 1) × 100%)。
  4. 启动 PWM 输出

    • 最后,调用 HAL_TIM_PWM_Start() 函数启动指定通道的 PWM 输出,使能定时器的 PWM 信号产生与引脚输出。

四、示例代码与解析

#include "stm32f1xx_hal.h"TIM_HandleTypeDef htim2;void TIM2_PWM_Init(void)
{// 定时器时钟配置__HAL_RCC_TIM2_CLK_ENABLE();// GPIO 配置GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 定时器初始化htim2.Instance = TIM2;htim2.Init.Prescaler = 999; // 预分频器设置,定时器时钟频率为 10 kHzhtim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 999;   // 自动重装载寄存器值,PWM 周期为 100 mshtim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;HAL_TIM_PWM_Init(&htim2);// PWM 通道配置TIM_OC_InitTypeDef sConfigOC = {0};sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = 500;    // 初始脉冲宽度,占空比 50%sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);// 启动 PWM 输出HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}int main(void)
{HAL_Init();SystemClock_Config();TIM2_PWM_Init();while (1){// 可在此添加其他功能代码}
}

在示例代码中,我们首先配置了 GPIOA 的 PA0 引脚为复用推挽输出模式,用于输出 PWM 信号。然后初始化 TIM2 定时器,设置其预分频器和自动重装载寄存器值,确定 PWM 的周期和频率。接着配置 TIM_CHANNEL_1 通道的 PWM 参数,包括模式、脉冲宽度和极性等。最后启动该通道的 PWM 输出,使能定时器产生 PWM 信号。

五、常见应用场景

  1. 电机调速

    • 通过改变 PWM 的占空比,调节电机两端的平均电压,从而实现对电机转速的控制。例如,在直流电机驱动电路中,将 PWM 信号作用于电机驱动芯片的使能端,占空比越大,电机转速越快。
  2. LED 调光

    • 利用 PWM 信号驱动 LED,人眼对 LED 的亮度感知与 PWM 占空比相关。高占空比使 LED 更亮,低占空比则使 LED 变暗,实现平滑的亮度调节。
  3. 信号合成与模拟

    • PWM 信号经低通滤波器后,可生成近似直流或正弦信号,用于音频信号合成、模拟电压源等场景。

六、注意事项与调试技巧

  1. 时钟配置

    • 确保定时器的时钟频率配置正确,因为它直接影响 PWM 的频率。若时钟频率设置不当,可能无法获得预期的 PWM 周期。
  2. 占空比计算精度

    • 在计算占空比时,要准确考虑自动重装载寄存器(ARR)的值,避免因整数运算误差导致占空比不准确。
  3. 调试工具使用

    • 使用示波器观察 PWM 信号的波形,直观地检查其频率、占空比是否符合预期。同时,可通过修改代码中的 CCR 值,实时观察 PWM 信号的变化,快速定位问题。

掌握 STM32 的 PWM 协议与应用,能为你在嵌入式项目开发中带来更多可能性,无论是简单的 LED 控制还是复杂的电机驱动系统,都能得心应手。不断实践与探索,你将能挖掘出 STM32 PWM 更多的潜力,创造出更具创新性的应用。

相关文章:

实现 STM32 PWM 输出:原理、配置与应用详解

实现 STM32 PWM 输出:原理、配置与应用详解 在嵌入式开发领域,STM32 微控制器凭借其强大的功能和丰富的外设资源,被广泛应用。PWM(脉冲宽度调制)作为 STM32 的重要功能之一,对于电机调速、LED 调光、信号合…...

Web 架构之负载均衡会话保持

文章目录 一、引言二、思维导图三、负载均衡会话保持的概念3.1 定义3.2 作用 四、负载均衡会话保持的实现方式4.1 基于 IP 地址原理代码示例(以 Nginx 为例)注释 4.2 基于 Cookie原理代码示例(以 HAProxy 为例)注释 4.3 基于 SSL …...

第一次做逆向

题目来源:ctf.show 1、下载附件,发现一个exe和一个txt文件 看看病毒加没加壳,发现没加那就直接放IDA 放到IDA找到main主函数,按F5反编译工具就把他还原成类似C语言的代码 然后我们看逻辑,将flag.txt文件的内容进行加…...

【Linux网络】传输层协议TCP

TCP协议 TCP全称为"传输控制协议(TransmissionControl Protocol"). 人如其名, 要对数据的传输进行一个详细的控制; TCP协议段格式 源、目的端口号:表示数据从哪个进程来,到哪个进程去。 32位序号、确认序号 4位TCP报头长度:表示该TCP头部有…...

AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航

作者:Yifei Su, Dong An, Kehan Chen, Weichen Yu, Baiyang Ning, Yonggen Ling, Yan Huang, Liang Wang 单位:中国科学院大学人工智能学院,中科院自动化研究所模式识别与智能系统实验室,穆罕默德本扎耶德人工智能大学&#xff0…...

排序算法之基础排序:冒泡,选择,插入排序详解

排序算法之基础排序:冒泡、选择、插入排序详解 前言一、冒泡排序(Bubble Sort)1.1 算法原理1.2 代码实现(Python)1.3 性能分析 二、选择排序(Selection Sort)2.1 算法原理2.2 代码实现&#xff…...

Linux常用命令42——tar压缩和解压缩文件

在使用Linux或macOS日常开发中,熟悉一些基本的命令有助于提高工作效率,tar 是 Linux 和 Unix 系统中用于归档文件和目录的强大命令行工具。tar 名字来自 "tape archive"(磁带归档),最初用于将文件打包到磁带…...

网络协议分析 实验七 FTP、HTTP、DHCP

文章目录 实验7.1 FTP协议练习二 使用浏览器登入FTP练习三 在窗口模式下,上传/下传数据文件实验7.2 HTTP(Hyper Text Transfer Protocol)练习二 页面提交练习三 访问比较复杂的主页实验7.3 DHCP(Dynamic Host Configuration Protocol) 实验7.1 FTP协议 dir LIST&…...

HTML 表格与div深度解析区别及常见误区

一、HTML<div>元素详解 <div>是HTML中最基本的块级容器元素&#xff0c;本身没有语义&#xff0c;主要用于组织和布局页面内容。以下是其核心用法&#xff1a; 1. 基础结构与特性 <div><!-内部可包含任意HTML元素 --><h2>标题</h2><p…...

Linux 系统中设置开机启动脚本

Linux 系统中设置开机启动脚本有多种方法,适用于不同的场景和需求。以下是几种最常用且详细的方法: 核心理念: 无论哪种方法,核心都是让系统在启动过程中的某个阶段执行你的脚本。 1. 使用 systemd (推荐,现代 Linux 发行版的标准) systemd 是目前大多数主流 Linux 发行…...

linux-进程信号的产生

Linux中的进程信号&#xff08;signal&#xff09;是一种用于进程间通信或向进程传递异步事件通知的机制。信号是一种软中断&#xff0c;用于通知进程某个事件的发生&#xff0c;如错误、终止请求、计时器到期等。 1. 信号的基本概念 - 信号&#xff08;Signal&#xff09;&am…...

内容中台重构企业知识管理路径

智能元数据驱动知识治理 现代企业知识管理的核心挑战在于海量非结构化数据的有效治理。通过智能元数据分类引擎&#xff0c;系统可自动识别文档属性并生成多维标签体系&#xff0c;例如将技术手册按产品版本、功能模块、适用场景进行动态标注。这种动态元数据框架不仅支持跨部…...

ubuntu22.04卸载vscode

方法 1&#xff1a;通过 Snap 卸载 VSCode 如果你是通过 Snap 安装的 VSCode&#xff08;Ubuntu 22.04 默认推荐方式&#xff09;&#xff0c;按照以下步骤卸载&#xff1a; 检查是否通过 Snap 安装&#xff1a; bash snap list | grep code如果输出显示 code&#xff0c;说明…...

AGI大模型(19):下载模型到本地之ModelScope(魔搭社区)

1 安装模块 魔塔社区提供了下载的模块&#xff0c;如下&#xff1a; pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple 2 模型下载 from modelscope import snapshot_download model_dirsnapshot_download(LLM-Research/Meta-Llama-3-8B,cache_dirrD:\…...

基于Spring Boot+Layui构建企业级电子招投标系统实战指南

一、引言&#xff1a;重塑招投标管理新范式 在数字经济浪潮下&#xff0c;传统招投标模式面临效率低、透明度不足、流程冗长等痛点。本文将以Spring Boot技术生态为核心&#xff0c;融合Mybatis持久层框架、Redis高性能缓存及Layui前端解决方案&#xff0c;构建一个覆盖招标代理…...

Kali安装详细图文安装教程(文章内附有镜像文件连接提供下载)

Kali镜像文件百度网盘&#xff1a;通过网盘分享的文件&#xff1a;kali-linux-2024.2-installer-amd64.iso 链接: https://pan.baidu.com/s/1MfCXi9KrFDqfyYPqK5nbKQ?pwdSTOP 提取码: STOP --来自百度网盘超级会员v5的分享 1.下载好镜像文件后&#xff0c;我们打开我们的VMwa…...

2.4GHz无线芯片核心技术解析与典型应用

2.4G芯片作为工作在2.4GHz ISM频段的无线通信集成电路&#xff0c;主要面向短距离数据传输应用。这类芯片具有以下技术特点&#xff1a; 多协议支持 兼容蓝牙、Wi-Fi和ZigBee等主流协议 采用SDR技术实现协议灵活切换 适用于智能家居和物联网设备 低功耗特性 采用休眠唤醒和动态…...

ai agent(智能体)开发 python高级应用4:什么是代理,如何设置squid代理服务器,让crawl4ai 0.6.3 用上代理,获取到数据平权

crawl4ai 0.6.3为啥用代理&#xff0c;什么情况下需要用到代理 在 crawl4ai 中设置代理服务器的好处&#xff1a; 一、设置代理的好处 避免IP封禁 高频请求同一网站时&#xff0c;目标服务器可能封禁真实IP。代理通过轮换IP分散请求&#xff0c;降低封禁风险。 绕过地理限制 …...

技术融资:概念与形式、步骤与案例、挑战与应对、发展趋势

一、技术融资概述 技术融资是指通过外部资金支持技术研发、产品开发或市场扩展的过程。它通常涉及风险投资、天使投资、私募股权、众筹等多种形式。技术融资的核心目标是为技术创新提供资金保障&#xff0c;推动技术从概念到市场的转化。 技术融资的主要形式包括以下几种&…...

Chrome代理IP配置教程常见方式附问题解答

在网络隐私保护和跨境业务场景中&#xff0c;为浏览器配置代理IP已成为刚需。无论是访问地域限制内容、保障数据安全&#xff0c;还是管理多账号业务&#xff0c;掌握Chrome代理配置技巧都至关重要。本文详解三种主流代理设置方式&#xff0c;助你快速实现精准流量管控。 方式一…...

微信小程序 密码框改为text后不可见,需要点击一下

这个问题是做项目的时候碰到的。 密码框常规写法&#xff1a; <view class"inputBox"><view class"input-container"><input type"{{inputType}}" placeholder"请输入密码" data-id"passwordValue" bindin…...

LLM笔记(六)线性代数

公式速查表 1. 向量与矩阵&#xff1a;表示、转换与知识存储的基础 向量表示 (Vectors): 语义的载体 在LLM中&#xff0c;向量 x ∈ R d \mathbf{x}\in\mathbb{R}^d x∈Rd 是信息的基本单元&#xff0c;承载着丰富的语义信息&#xff1a; 词嵌入向量 (Word Embeddings)&am…...

Linux——UDP/TCP协议理论

1. UDP协议 1.1 UDP协议格式 系统内的UDP协议结构体&#xff1a; 注1&#xff1a;UDP协议的报头大小是确定的&#xff0c;为8字节 注2&#xff1a;可以通过报头中&#xff0c;UDP长度将UDP协议的报头和有效载荷分离&#xff0c;有效载荷将存储到接收缓冲区中等待上层解析。 注…...

Go语言爬虫系列教程(一) 爬虫基础入门

Go爬虫基础入门 1. 网络爬虫概念介绍 1.1 什么是网络爬虫 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称网页蜘蛛、网络机器人&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。其核心功能是模拟人类浏览网页的行为&#xff0c;通过发送网络…...

PromptIDE提示词开发工具支持定向优化啦

老粉们都知道&#xff0c;PromptIDE 是一款专门解决 AI 提示词生成和优化的工具&#xff0c;让 AI 真正听懂你在说什么&#xff0c;生成更符合预期的结果&#xff01; 我们这次更新主要争对提示词优化这一块&#xff0c;推出了不同提示词优化方向&#xff0c;贴近用户需求。 举…...

多返回值(Multiple Return Values)- 《Go语言实战指南》

Go 语言支持函数返回多个值&#xff0c;这一特性在实际开发中非常常见&#xff0c;尤其用于错误处理。 一、函数返回多个值的基本语法 func 函数名(参数列表) (返回值1类型, 返回值2类型, ...) {// 函数体return 值1, 值2, ... } 示例&#xff1a;计算商和余数 func divide(…...

致远OA人事标准模块功能简介【附应用包百度网盘下载地址,官方售价4W】

人事管理应用&#xff0c;围绕岗位配置、招聘管理、员工档案、入转调离、员工自助申报、数据信息管理等人力资源管理关键业务&#xff0c;构建全员可参与的人事工作协同平台&#xff0c;让人事从繁杂琐碎的事务中解脱出来&#xff0c;高质高效工作&#xff0c;让管理层清楚掌握…...

Python-简单网络编程 I

目录 一、UDP 网络程序1. 通信结构图2. Python 代码实现1&#xff09;服务器端2&#xff09;客户端 3. 注意 二、TCP 网络程序1. 通信结构图2. Python 代码实现1&#xff09;服务器端2&#xff09;客户端 3. 注意 三、文件下载1. PyCharm 程序传参1&#xff09;图形化界面传参2…...

鸿蒙北向应用开发: deveco5.0 创建开源鸿蒙项目

本地已经安装deveco5.0 使用5.0创建开源鸿蒙项目 文件->新建->新建项目 直接创建空项目,一路默认 next 直接编译项目 直接连接开源鸿蒙5.0开发板编译会提示 compatibleSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the dev…...

数据库故障排查指南:从入门到精通

1. 常见数据库故障类型 1.1 连接故障 数据库连接超时连接池耗尽网络连接中断认证失败1.2 性能故障 查询执行缓慢内存使用过高CPU使用率异常磁盘I/O瓶颈1.3 数据故障 数据不一致数据丢失数据损坏事务失败2. 故障排查流程 2.1 初步诊断 -- 检查数据库状态SHOW STATUS;SHOW PRO…...