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

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的编程…...

Mybatis的#{}和${}

#{}:预编译语句,用?对参数位置进行一个占位的操作,在数据库生成一个模版,等待后续填充.也可以推测出#在生成模版后的性能是比$快的. ${}:即时语句,提前的吧参数填充进去,在MySQL里就是一个完整的SQL语句. 填充逻辑不同 #{}会给String类型的参数自动的加上双引号,而${}则是直…...

【零基础实战】STM32控制DRV8833电机驱动详解

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 一、DRV8833模块简介二、STM32选型建议三、硬件连接详解1. 接线示意图2. 电源注意事项 四、核心控制原理1. PWM调速原…...

AI智能成长系统 | 应用探讨研究

研究背景 在现代家庭中,三岁宝宝的成长环境日益复杂。由于宝宝每天接触的人群多样,包括家庭成员、同龄小朋友以及可能的陌生人,其语言环境也相应地变得复杂多变。这种环境下,宝宝很容易接触到一些不适宜的语言,即俗称…...

java 网络安全感知 网络安全学java

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 实验五 java网络编程及安全 实验内容 1.掌握Socket程序的编写;2.掌握密码技术的使用;3.设计安全传输…...

VisionMaster4.4 python脚本 图像处理 转换函数 爱之初体验

最近有接触过一丢丢VM4.3的模块开发. 一直有把python图像处理部分模块移植进来的打算 不过时间不够没来得及折腾.偶尔发现4.4支持py脚本 于是拿来折腾.一下午. 发现4.4支持python脚本,好开心. 首先安装VM4.4 注意一定要是4.4 打开后拖了一个模块. 但是发现import numpy imp…...

Node.js 中的 fs 模块详解

fs(File System)模块是 Node.js 的核心模块之一,用于处理文件系统的操作,包括文件的读取、写入、删除、重命名等。它提供了同步和异步两种操作方式,适用于不同的场景。 1. 前置知识 1.1 文件系统 文件系统是操作系统…...

debezium专栏文章目录

debezium专栏文章目录 第一阶段:基础认知篇 CDC革命:为什么说Debezium改变了数据流动方式? 对比Log-Based/Trigger-Based/Query-Based CDC方案Debezium在数据管道中的战略价值 5分钟部署你的第一个Debezium连接器 使用Docker Compose快速搭…...

python-leetcode 40.二叉树的层序遍历

题目: 给定二叉树的根节点root,返回其节点值得层序遍历(即逐层从左到右访问所有节点) 方法:广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…...

蓝桥杯学习大纲

(致酷德与热爱算法、编程的小伙伴们) 在查阅了相当多的资料后,发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以,干脆自己整理一篇,欢迎大家补充! 一、蓝桥必备高频考点 我们以此为重点学习…...

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)

小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025) 本文内容需要你有一定的 Linux 操作基础,最好是程序员那种,英文水平足够用才行。一般人不需要使用这么复杂的路由器操作系统&#xff0c…...

Debezium 报错:“The db history topic is missing” 的处理方法

Debezium 报错:“The db history topic is missing” 的处理方法 一、引言 在使用 Debezium 进行数据同步时,可能会遇到一个常见的错误:“The db history topic is missing”。这个错误表明 Debezium 无法找到或访问其数据库历史记录主题(db history topic),这通常是由…...

水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL8检测报告标准讲解:

水基试剂,湿式化学,清水,干式化学,干粉,卤烃清洁剂,二氧化碳灭火器UL检测报告标准讲解: 本政策涵盖的灭火器 水基试剂灭火器 水基试剂灭火器使用水基试剂带走燃烧三要素中的热量要素&#xf…...

YOLOv11-ultralytics-8.3.67部分代码阅读笔记-build.py

build.py ultralytics\data\build.py 目录 build.py 1.所需的库和模块 2.class InfiniteDataLoader(dataloader.DataLoader): 3.class _RepeatSampler: 4.def seed_worker(worker_id): 5.def build_yolo_dataset(cfg, img_path, batch, data, mode"train"…...

Windows隐藏窗口/开机自启动

目录 使用Start-Process命令控制窗口状态 设置程序开机自启动 使用Start-Process命令控制窗口状态 隐藏窗口运行程序 使用Start-Process命令时,可以通过-WindowStyle Hidden参数让程序在后台运行,窗口不可见。例如: Start-Process D:\note…...

汽车免拆诊断案例 | 2010 款路虎揽胜车空调偶尔出风异常

故障现象  一辆2010款路虎揽胜车,搭载5.0 L发动机,累计行驶里程约为16万km。车主反映,接通空调开关后,有时出风忽大忽小,有时不出风,有时要等2 min左右才出风;有时两三天出现一次,…...

文件IO(20250217)

1. 文件IO 系统调用Linux内核提供的文件操作接口 1. 打开文件 open 2. 读写文件 read/write 3. 关闭文件 close 1.1 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int ope…...

Mac arm架构使用 Yarn 全局安装 Vue CLI

dgqdgqdeMacBook-Pro spid-admin % vue --version zsh: command not found: vue要使用 Yarn 安装 Vue CLI&#xff0c;你可以执行以下命令&#xff1a; yarn global add vue/cli这个命令会全局安装 Vue CLI&#xff0c;让你可以使用 vue 命令创建、管理 Vue.js 项目。以下是一…...

ES6相关操作(2)

一.Promise Promise是ES6引入的异步编程工具。 语法上Promise是一个构造函数,用于封装异步操作并可以获取操作成功或失败的结果 Promise构造函数:Promise(excutor){} Promise的常用函数:then,catch 实例化Promise对象(创建Promise工具) let data"请求数据"//该数据为…...

成员函数定义后面加const是什么功能:C++中const成员函数的作用

成员函数定义后面加const是什么功能&#xff1a;C中const成员函数的作用 前言C中const成员函数的作用总结 前言 在PX4的代码中的位置控制模块中&#xff0c;有这样一个成员函数 void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;该函数的…...

DeepSeek智能测试助手:分类+推理+导出一站式工具

前言 测试开发工程师在日常工作中需要处理大量测试文档&#xff0c;并且这些文档需要被高效分类、清洗和管理&#xff0c;同时结合强大的 AI 推理能力&#xff08;如 DeepSeek 模型&#xff09;进行智能化处理和分析。为此&#xff0c;我们开发了一款基于 PyQt5 的 GUI 工具&a…...

【嵌入式Linux应用开发基础】进程间通信(3):共享内存

目录 一、共享内存核心概念 1.1. 特点 1.2. 适用场景 二、共享内存原理剖析 三、嵌入式 Linux 中共享内存的使用 3.1. 相关函数介绍 3.2. System V共享内存操作步骤 3.3. 同步机制&#xff08;示例使用System V信号量&#xff09; 3.4. POSIX共享内存&#xff08;现代…...

日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(10): になります :表示从一种状态转变为另一种状态,“变得……”“成为……”

日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(10): になります :表示从一种状态转变为另一种状态,“变得……”“成为……”  1、前言(1)情况说明(2)工程师的信仰2、知识点(1)寒くなりました & 元気になりました(2)何(なに)になりたいですか。(…...

计算机毕业设计Python农产品推荐系统 农产品爬虫 农产品可视化 农产品大数据(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Python HTTP 请求工具类 HttpUtils:简化 HTTP 请求的高效工具

在现代的 Web 开发和 API 集成中&#xff0c;HTTP 请求是最常见的操作之一。无论是获取数据、提交表单&#xff0c;还是与 RESTful API 交互&#xff0c;我们都需要频繁地发送 HTTP 请求。为了简化这些操作&#xff0c;提升代码的可读性和可维护性&#xff0c;我们可以使用一个…...

「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件

PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件&#xff0c;以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性&#xff0c;如颜色、字体大小、样式和粗细。…...

【linux】文件与目录命令 - grep

文章目录 1. 基本用法2. 常用参数3. 用法举例4. 注意事项5. 正则表达式5.1 正则表达式元字符5.2 正则表达式常用修饰符5.3 正则表达式运算符优先级5.4 正则表达式匹配规则 grep 命令用于在文本文件或标准输入中查找匹配的字符串模式&#xff0c;是一种功能强大的文本搜索工具&a…...

2025鸿蒙开发面试题汇总——通俗易懂

问题和通俗易懂的答案&#xff0c;覆盖鸿蒙开发的核心知识点和实际场景&#xff0c;方便面试时快速评估候选人能力&#xff1a; 一、基础概念&#xff08;必问&#xff09; 鸿蒙和安卓最大的区别是什么&#xff1f;举个实际例子。 答案&#xff1a;鸿蒙是“分布式操作系统”&am…...

专利申请流程详解:从创意到授权的完整指南

引言 专利是保护发明创造的重要法律工具&#xff0c;能够为发明人提供独占权&#xff0c;防止他人未经许可使用、制造或销售其发明。无论是个人发明者还是企业&#xff0c;了解专利申请流程都是至关重要的。本文将详细介绍专利申请的完整流程&#xff0c;帮助你从创意到授权&a…...

编写测试计划的六大要素是什么

编写测试计划时&#xff0c;一般需要包括以下六大要素&#xff0c;确保测试工作的完整性和可执行性&#xff1a; 1. 测试目标&#xff08;Test Objectives&#xff09; 明确测试的目的&#xff0c;如&#xff1a; 确保系统符合业务需求和技术要求。发现并修复软件缺陷。验证性…...