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

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的基本原理

  1. 占空比(Duty Cycle) :
    • 占空比定义为在一个信号周期内,高电平的时间占整个周期的比例。
    • 计算公式:Duty Cycle = (High Time / Period) × 100%
    例子 :若PWM信号的周期为20ms,高电平持续时间为5ms,则占空比为25%。

  2. 频率(Frequency) :
    • 频率是PWM信号在单位时间内完成的周期数,通常以Hz(赫兹)为单位。
    • 较高的频率可以有效减少信号控制的抖动,但也可能增加硬件的复杂性。

  3. PWM信号的特点 :
    • PWM信号由一系列高低交替的方波构成。
    • 通过改变占空比,可以模拟不同幅度的模拟信号。

三、PWM的应用场景

  1. LED亮度控制 :
    • 通过调节PWM信号的占空比,可以实现LED亮度的渐变效果。
  2. 电机速度控制 :
    • PWM信号的占空比决定了电机的转速,占空比越高,电机的转速越快。
  3. 加热器温度控制 :
    • 见空气处理和加热系统的温度调节。
  4. 音频调制 :
    • 在音频设备中,PWM用于信号的生成和处理。

四、PWM的硬件配置与使用

  1. 基本PWM信号输出电路
    以下是使用STM32微控制器实现PWM控制LED亮度的电路图:
    示意图

这是一个使用STM32微控制器通过PWM控制LED亮度的电路图。LED通过限流电阻连接到地,PWM信号通过STM32的PWM引脚输出。电路中还包含了一个3.3V电源和去耦电容,以确保电路的稳定性。

  1. 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);}
}
  1. PWM频率与占空比的调整
    • 增加频率 :降低信号抖动,但可能导致过高的频率不易被某些设备处理。
    • 调整占空比 :改变输出强度,需根据实际需求设定合理的PWM信号范围。

六、PWM的实际应用技巧

  1. 实现电机速度控制
    PWM可以用来驱动直流电机,通过调节占空比控制电机的转速。具体步骤为:
    • 选择合适的PWM频率 :通常在20kHz以上以减少噪音。
    • 配置PWM输出引脚 :将PWM信号连接到电机驱动模块。
    • 通过代码调整占空比 :根据实际需求控制电机速度。
  2. 滤波处理
    • 滤波的目的 :减少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.高速加工能力&#xff1…...

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&#xff…...

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(); // 设置为透明光标&#xff0c…...

后端开发:开启技术世界的新大门

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

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: 解谜微信小…...

algorithm-stone未来发展规划:AI辅助学习与智能推荐系统

algorithm-stone未来发展规划:AI辅助学习与智能推荐系统 【免费下载链接】algorithm-stone ACM/LeetCode算法竞赛路线图,最全的算法学习地图! 项目地址: https://gitcode.com/gh_mirrors/al/algorithm-stone algorithm-stone作为ACM/L…...

一篇讲透:Java并发与线程安全,新手看完永久不踩坑

文章目录前言:写给所有普通业务开发的真心话一、先掰扯明白三个核心词(大白话定义简易代码示例,看完绝不迷糊)老开发真心话:为什么我很多年没碰过并发,系统也没崩?1.1 什么是并发编程&#xff1…...

高层次综合设计流程

一、高层次设计流程 1.高层次综合的基本介绍和说明 2.C语言验证 3.接口的综合 4.任意精度类型 5.设计的分析和优化 6.RTL验证 7.hls的ip core的集成 8.在zynq的soc中使用hls ip core 9.在microblaze中使用hls ip core二、ug871中内容 1.设计流程 2.接口综合 3.优化方法 包括工程…...

GESP2023年6月认证C++三级( 第三部分编程题(2、密码合规检测))

一、🔐 故事背景:守护密码之门!在魔法学院门口,有一扇超级智能大门🚪。它会检查每个进入的人的密码:👮‍♂️“只有符合规则的密码,才能进去!”否则:❌ “不合…...

GESP2023年6月认证C++三级( 第三部分编程题(1、春游))

一、🎒 故事背景:春游点名危机!👩‍🏫老师带着同学们去春游啦!班上有 n 个同学,每个人都有一个编号:0, 1, 2, 3, ..., n-1到了集合时间,老师开始点名!但是………...

Rust 所有权系统:借用检查器与生命周期

# Rust异步编程:Tokio运行时深度解析> **版本说明**:本文基于 Tokio 1.x 版本和 Rust 1.75 编写,所有代码示例均经过测试验证。## 📚 引言异步编程是现代高性能服务的基石,而 Tokio 作为 Rust 生态中最成熟的异步运…...

GEO系统贴牌深度解析:杭州爱搜索如何助力企业构建AI搜索时代的自主营销阵地

核心参数解析与全平台覆盖能力概览在AI搜索时代,信息获取的逻辑正发生根本性转变。传统搜索引擎依赖关键词匹配和链接分析,而AI大模型(如ChatGPT、DeepSeek、豆包等)则基于对海量语料的理解,直接生成答案。这意味着&am…...

C++的输入和输出流详解

输入和输出流从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。从磁盘文件输入数据,数据输出到磁盘文件简称文件I/O。对内存中指定的空间进行输入输出,通常指定一个字符数组作为存储空间&#xff0…...

为什么你的边缘服务启动仍需800ms?Docker 24.1.0 WASM Runtime深度调优手册(实测降低至47ms)

更多请点击: https://intelliparadigm.com 第一章:Docker 24.1.0 WASM Runtime边缘服务启动性能瓶颈全景洞察 Docker 24.1.0 首次原生集成 WasmEdge 作为可选 WASM 运行时,但在边缘轻量级场景中,服务冷启动延迟常突破 350ms&…...

MCP多模态融合效率提升300%:从零搭建可落地的跨模态对齐Pipeline

更多请点击: https://intelliparadigm.com 第一章:MCP多模态融合效率提升300%:从零搭建可落地的跨模态对齐Pipeline MCP(Multimodal Contrastive Projection)通过统一隐空间约束,实现文本、图像与语音特征…...