PWM(脉宽调制)技术详解:从基础到应用实践示例
PWM(脉宽调制)技术详解:从基础到应用实践示例
目录
- PWM(脉宽调制)技术详解:从基础到应用实践示例
- 学前思考:
- 一、PWM概述
- 二、PWM的基本原理
- 三、PWM的应用场景
- 四、PWM的硬件配置与使用
- 五、PWM的编程实现(源码示例)
- 六、PWM的实际应用技巧
- 七、PWM的优缺点
- 八、总结
学前思考:
PWM,全称是Pulse Width Modulation,中文叫脉宽调制。在嵌入式系统中,它是个非常重要的概念,特别是在控制一些需要模拟信号的设备时,比如LED、电机或者舵机等。
首先,我需要搞清楚PWM是什么。网上查了一下,PWM是一种通过对数字信号进行调制,来模拟模拟信号的技术。简单来说,就是通过改变数字信号脉冲的宽度,模拟不同幅度的模拟信号。这样就可以用微控制器的数字输出来控制一些需要模拟信号的设备。
接下来,想到PWM的原理。比如说,如果一个LED灯泡和一个电阻串联,连在3.3V的电源上,当我快速切换LED的开和关,开关频率足够高的时候,人眼是看不出闪烁的,只会看到LED的亮度和占空比有关。这就是PWM的基本原理。占空比就是一个周期内高电平所占的比例,占空比越高,LED看起来越亮。
那怎么在嵌入式系统中实现PWM呢?需要学习一下微控制器的PWM模块的配置。像是STM32、Arduino这些常用控制器都有PWM功能。每个PWM通道可以通过配置占空比和频率来控制输出信号。比如,Arduino Uno有六个PWM引脚,STLM32也有多个PWM通道。
于是,我计划从学习PWM的配置开始,先从简单的LED亮度控制开始,再逐步深入,尝试控制电机的速度。首先,看看具体的硬件接线。对于LED,可以使用一个电阻和LED连接到PWM引脚,再连接到地。电机的话可能比较复杂,可能需要使用电机驱动模块,这样更安全。
然后,思考如何通过编程实现PWM的控制。需要学习如何初始化PWM模块,设置占空比和频率。在Arduino中,可以通过 analogueWrite函数设置PWM信号,而在STM32中,则需要配置PWM寄存器,设置计数器周期和比较值来实现。
但仅仅掌握基本操作是不够的,还需要了解背后的原理。比如,为什么PWM能够模拟模拟信号? PWM的工作原理涉及到采样定理,当开关频率远高于信号的频率时,可以根据占空比来还原信号的大小。此外,不同的PWM频率对应用有什么影响?比如,调制频率太低,可能会引起马达噪音,而太高的频率可能不适合某些敏感设备。
接下来,我需要思考PWM和其他控制方式的区别,比如比较调频(Frequency Modulation)和调幅(Amplitude Modulation)的不同应用场合和特点。此外,PWM还可能涉及到死区时间和滤波,这些对于实际应用中的信号质量也很重要。
在实际操作中,可能会遇到一些问题。例如,PWM信号的噪声干扰设备,或者PWM频率设置不当导致的问题。这时候需要学习一些抗噪声的方法,比如增加滤波电容,或者选择合适的PWM频率。
此外,学习PWM的实际应用也很重要。比如,如何用PWM实现电机的正反转控制,或者通过改变PWM信号的占空比来控制马达的速度。这些都需要具体的编程和硬件知识。
总的来说,学习PWM技术需要从基础理论入手,学习PWM的定义、工作原理,接着学习如何在具体微控制器上配置PWM模块,通过实际项目比如控制LED亮度和电机速度来进行实践。在这个过程中,还需要不断查资料,解决遇到的问题,理解背后的物理原理和技术细节。只有这样,才能真正掌握PWM技术,并能够灵活运用到各种嵌入式系统中去。
一、PWM概述
PWM(Pulse Width Modulation,脉宽调制) 是一种通过调节信号脉冲宽度来模拟不同幅度模拟信号的技术。它通过周期性地改变信号的占空比(即在一个信号周期内,高电平持续时间的比例)来控制输出强度,从而实现对设备如LED亮度、电机转速等的精确控制。
PWM的核心在于其输出频率和占空比的可调节性,使得数字设备能够模拟模拟信号的效果。这一技术在嵌入式系统中应用广泛,适用于多种控制场景。
二、PWM的基本原理
-
占空比(Duty Cycle) :
• 占空比定义为在一个信号周期内,高电平的时间占整个周期的比例。
• 计算公式:Duty Cycle = (High Time / Period) × 100%
例子 :若PWM信号的周期为20ms,高电平持续时间为5ms,则占空比为25%。 -
频率(Frequency) :
• 频率是PWM信号在单位时间内完成的周期数,通常以Hz(赫兹)为单位。
• 较高的频率可以有效减少信号控制的抖动,但也可能增加硬件的复杂性。 -
PWM信号的特点 :
• PWM信号由一系列高低交替的方波构成。
• 通过改变占空比,可以模拟不同幅度的模拟信号。
三、PWM的应用场景
- LED亮度控制 :
• 通过调节PWM信号的占空比,可以实现LED亮度的渐变效果。 - 电机速度控制 :
• PWM信号的占空比决定了电机的转速,占空比越高,电机的转速越快。 - 加热器温度控制 :
• 见空气处理和加热系统的温度调节。 - 音频调制 :
• 在音频设备中,PWM用于信号的生成和处理。
四、PWM的硬件配置与使用
- 基本PWM信号输出电路
以下是使用STM32微控制器实现PWM控制LED亮度的电路图:
这是一个使用STM32微控制器通过PWM控制LED亮度的电路图。LED通过限流电阻连接到地,PWM信号通过STM32的PWM引脚输出。电路中还包含了一个3.3V电源和去耦电容,以确保电路的稳定性。
- PWM信号生成与配置步骤
(1)配置GPIO引脚为PWM输出模式 :
• 将GPIO引脚设置为PWM输出模式。
(2)配置PWM参数 :
• 设置PWM信号的频率和占空比。
(3)启动PWM模块 :
• 启用PWM生成模块,开始输出PWM信号。
五、PWM的编程实现(源码示例)
以STM32为例,实现LED亮度的PWM控制
#include "stm32f4xx.h"void PWM_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;TIM_HandleTypeDef TIM_InitStructure;// 配置PWM引脚的GPIOGPIO_InitStructure.GPIO_Pin = GPIO_PIN_0; // 选择PWM引脚GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP; // 设置为复用推挽模式GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_HIGH; // 设置为高速模式HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置PWM参数TIM_InitStructure.TIM_Period = 999; // 设置计数器周期,频率: 1000HzTIM_InitStructure.TIM_Prescaler = 0; // 预分频器设置为0,不进行分频TIM_InitStructure.TIM_EnableDMA = TIM_DMA_DISABLED; // 不启用DMATIM_InitStructure.TIM_OnePulse = TIM_ONE_PULSE_DISABLED; // 不启用单脉冲模式TIM_InitStructure.TIM_ClockDivision = TIM_CLOCKDIVISION_CK_INT; // 不进行时钟分割TIM_InitStructure.TIM_CounterMode = TIM_COUNTERMODE_UP; // 计数器向上计数模式// 配置PWM通道TIM_OC_InitTypeDef TIM_OC_InitStructure;TIM_OC_InitStructure.TIM_OCMode = TIM_OCMODE_PWM1; // 设置PWM模式1TIM_OC_InitStructure.TIM_OutputState = TIM_OUTPUTSTATE_ENABLED; // 启用输出TIM_OC_InitStructure.TIM_Pulse = 500; // 初始占空比50%HAL_TIM_OC_Init(&TIM_InitStructure, &TIM_OC_InitStructure);// 启用PWM模块__HAL_TIM_ENABLE(&TIM_InitStructure);
}void Set_LED_Brightness(uint16_t duty) {// 设置PWM信号的占空比__HAL_TIM_SET_COMPARE(&TIM_InitStructure, TIM_CHANNEL_1, duty);
}int main(void) {HAL_Init();SystemClock_Config();PWM_Init();while (1) {// 改变LED亮度Set_LED_Brightness(250);HAL_Delay(1000);Set_LED_Brightness(500);HAL_Delay(1000);Set_LED_Brightness(750);HAL_Delay(1000);}
}
- PWM频率与占空比的调整
• 增加频率 :降低信号抖动,但可能导致过高的频率不易被某些设备处理。
• 调整占空比 :改变输出强度,需根据实际需求设定合理的PWM信号范围。
六、PWM的实际应用技巧
- 实现电机速度控制
PWM可以用来驱动直流电机,通过调节占空比控制电机的转速。具体步骤为:
• 选择合适的PWM频率 :通常在20kHz以上以减少噪音。
• 配置PWM输出引脚 :将PWM信号连接到电机驱动模块。
• 通过代码调整占空比 :根据实际需求控制电机速度。 - 滤波处理
• 滤波的目的 :减少PWM信号对其他电路的干扰,同时改善输出信号的质量。
• 滤波的方法 :在PWM输出端加入低通滤波器,保留低频成分,滤除高频噪声。
七、PWM的优缺点
优点 :
• 高效性:PWM信号直接由硬件生成,实时性高。
• 精确控制:可以通过改变占空比实现精准的模拟控制。
• 易于实现:大多数微控制器内置PWM模块。
缺点 :
• 对于一些对高频敏感的设备,可能产生噪音问题。
• 设置过程中需注意信号线的过滤和屏蔽。
八、总结
PWM(脉宽调制)技术是嵌入式系统中一项重要的控制技术,通过调节脉冲宽度来实现对模拟设备的精准控制。从LED亮度到电机速度,PWM的应用场景非常广泛。对于嵌入式学习者来说,理解PWM的工作原理、掌握其配置方法,不仅能提升编程能力,还能为更多复杂系统的开发打下坚实的基础。
通过学习PWM,可以更好地掌握如何利用微控制器的数字输出来模拟模拟信号,并在实际项目中实现更复杂的控制逻辑。
相关文章:

PWM(脉宽调制)技术详解:从基础到应用实践示例
PWM(脉宽调制)技术详解:从基础到应用实践示例 目录 PWM(脉宽调制)技术详解:从基础到应用实践示例学前思考:一、PWM概述二、PWM的基本原理三、PWM的应用场景四、PWM的硬件配置与使用五、PWM的编程…...
Hutool - DB 连接池配置集成
在实际开发中,尤其是在高并发场景下,使用连接池来管理数据库连接是非常必要的,它可以显著提高数据库操作的性能和效率。Hutool - DB 支持集成多种常见的连接池,如 HikariCP、Druid 等。下面分别介绍如何将这两种连接池集成到 Huto…...

激光工控机在自动化生产线中有什么关键作用?
激光工控机作为自动化生产线的核心设备,通过高精度控制、快速响应和智能化集成,在提升效率、保障质量、实现柔性制造等方面发挥着不可替代的作用。以下是其关键作用的具体分析: 一、实现高效连续生产: 1.高速加工能力࿱…...

Visual Studio Code的下载安装与汉化
1.下载安装 Visual Studio Code的下载安装十分简单,在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了...

nlp|微调大语言模型初探索(3),qlora微调deepseek记录
前言 上篇文章记录了使用lora微调llama-1b,微调成功,但是微调llama-8b显存爆炸,这次尝试使用qlora来尝试微调参数体量更大的大语言模型,看看64G显存的极限在哪里。 1.Why QLora? QLoRA 在模型加载阶段通过 4-bit 量化大幅减少了模型权重的显存占用。QLoRA 通过 反量化到 …...
【全栈】SprintBoot+vue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量
【全栈】SprintBootvue3迷你商城-细节解析(1):Token、Jwt令牌、Redis、ThreadLocal变量 往期的文章都在这里啦,大家有兴趣可以看一下 后端部分: 【全栈】SprintBootvue3迷你商城(1) 【全栈】…...

基于ffmpeg+openGL ES实现的视频编辑工具(一)
在深入钻研音视频编辑开发这片技术海洋时,相信不少开发者都和我有同样的感受:网络上关于音视频编辑工具实现的资料繁多,理论阐释细致入微,代码片段也随处可见。然而,一个显著的缺憾是,缺乏一个完整成型的 A…...
面试完整回答:SQL 分页查询中 limit 500000,10和 limit 10 速度一样快吗?
首先:在 SQL 分页查询中,LIMIT 500000, 10 和 LIMIT 10 的速度不会一样快,以下是原因和优化建议: 性能差异的原因 LIMIT 10: 只需要扫描前 10 条记录,然后返回结果。 性能非常高,因为数据库只…...

Linux系统管理(十六)——通过WSL配置windows下的Linux系统(可视化界面与远程连接)
前言 WSL,即Windows Subsystem for Linux,是微软在Windows 10和Windows 11中引入的功能,允许用户在Windows上原生运行Linux的命令行工具和应用程序,无需启动完整的Linux虚拟机或进行双系统启动。 开启WSL服务 开启虚拟化 进入…...
【RabbitMQ业务幂等设计】RabbitMQ消息是幂等的吗?
在分布式系统中,RabbitMQ 自身不直接提供消息幂等性保障机制,但可通过业务逻辑设计和技术组合实现消息处理的幂等性。以下是 8 种核心实现方案及最佳实践: 一、消息唯一标识符 (Message Deduplication) 原理 每条消息携带全局唯一IDÿ…...

flutter在安卓模拟器上运行
目录 下载android studio,然后把其中的模拟器设为环境变量,然后在vscode/cursor中使用插件,打开安卓模拟器一、下载android studio网址mac 下载64位 ARM 二、启动android studio三、设置SDK四、打开文件 打开模拟器五、运行程序六、在vscode/…...
linux shell 当命令执行出现错误立即退出的方法
在 Linux 脚本中,如果你想在整个脚本执行完毕后检查是否有错误发生,可以通过以下几种方式实现: 1. 使用 $? 检查上一条命令的退出状态 每个命令执行后,Shell 会将其退出状态存储在特殊变量 $? 中。$? 的值为 0 表示成功&#…...
与本地电脑PDF文档对话的PDF问答程序
文章目录 PDF问答程序程序流程处理PDF文档创建问答链 在探索和学习新技术时,了解LangChain框架的理论知识固然重要,但实际的案例分析与实践尝试能为你提供更加直观的认识和更深人的理解。本文主要以解析案例代码为主。通过具体的实践操作,你可…...

QT之改变鼠标样式
QT改变鼠标图片 资源路径如下 代码实现 QPixmap customCursorPixmap(":/images/mouse.png");QCursor customCursor(customCursorPixmap);QWidget::setCursor(customCursor); // 可以设置为整个窗口或特定控件QWidget::setCursor(); // 设置为透明光标,…...

后端开发:开启技术世界的新大门
在互联网的广阔天地中,后端开发宛如一座大厦的基石,虽不直接与用户 “面对面” 交流,却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域,负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…...

Sun-Panel:简洁且美观的导航首页开源项目!!
在这个数字化飞速发展的时代,我们几乎每个人都拥有自己的服务器或者NAS。但问题来了,管理这些设备往往需要记住一大堆复杂的命令和界面,对于像了不起这样追求简洁生活的程序员来说,简直是噩梦! 今天介绍一款界面清爽&…...

第4章 信息系统架构(四)
4.6 网络架构 网络是信息技术架构中的基础,不仅是用户请求和获取IT信息资源服务的通道,同时也是 信息系统架构中各类资源融合和调度的枢纽。特别是云计算、大数据和移动互联网技术飞速发 展的今天,网络更加成为实现这些技术跨越的重要环节。…...

【Java八股文】07-Redis面试篇
【Java八股文】07-Redis面试篇 Redis面试篇认识redis为什么用 Redis 作为 MySQL 的缓存? 数据结构讲一下Redis底层的数据结构ZSet底层是由什么实现的 线程模型Redis 是单线程吗?Redis怎么进行I/O多路复用的?Redis 采用单线程为什么还这么快&a…...

Windows PyCharm的python项目移动存储位置后需要做的变更
项目使用的venv虚拟环境,因此项目移动存储位置后需要重新配置python解释器的位置,否则无法识别,若非虚拟环境中运行,则直接移动后打开即可,无需任何配置。 PyCharm版本为2021.3.3 (Professional Edition),其…...
微信小程序消息推送解密
package com.test.main.b2b;import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Arrays;/*** author * version 1.0* description: 解谜微信小…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...