你知道吗?pwm可以制作adc模块哦!这样普通的gpio也能实现adc功能了。
我们嵌入式日常接触的pwm波,你真的了解他吗?
只有知道PWM的频谱是怎么样的,才能设计合适的滤波器,下面我们一起从底层数学原理来推导PWM的频谱分量吧。

PWM频谱分量推导

一、PWM 波的函数定义

在一个周期([0, T])内,PWM 波的表达式为:
f(t)={A,0≤t≤DT(高电平阶段)0,DT<t≤T(低电平阶段)f(t) = \begin{cases} A & ,\ 0 \leq t \leq DT \quad \text{(高电平阶段)} \\ 0 & ,\ DT < t \leq T \quad \text{(低电平阶段)} \end{cases} f(t)={A0, 0tDT(高电平阶段), DT<tT(低电平阶段)

二、傅里叶系数(F_n)的计算

复数形式的傅里叶系数定义为:
Fn=1T∫0Tf(t)e−jnω0tdt(n=0,±1,±2,…)F_n = \frac{1}{T} \int_{0}^{T} f(t) e^{-jn\omega_0 t} dt \quad (n = 0, \pm1, \pm2, \dots) Fn=T10Tf(t)ejnω0tdt(n=0,±1,±2,)

步骤 1:拆分积分区间

根据 PWM 的分段定义,将积分拆分为高电平和低电平两部分:
Fn=1T(∫0DTA⋅e−jnω0tdt+∫DTT0⋅e−jnω0tdt)F_n = \frac{1}{T} \left( \int_{0}^{DT} A \cdot e^{-jn\omega_0 t} dt + \int_{DT}^{T} 0 \cdot e^{-jn\omega_0 t} dt \right) Fn=T1(0DTAejnω0tdt+DTT0ejnω0tdt)
低电平阶段的积分项为 0,因此简化为:
Fn=AT∫0DTe−jnω0tdtF_n = \frac{A}{T} \int_{0}^{DT} e^{-jn\omega_0 t} dt Fn=TA0DTejnω0tdt

步骤 2:计算积分

利用指数函数积分公式
∫ektdt=1kekt+C\int e^{kt} dt = \frac{1}{k} e^{kt} + C ektdt=k1ekt+C
,得:
∫0DTe−jnω0tdt=[e−jnω0t−jnω0]0DT=1−jnω0(e−jnω0⋅DT−e0)\int_{0}^{DT} e^{-jn\omega_0 t} dt = \left[ \frac{e^{-jn\omega_0 t}}{-jn\omega_0} \right]_{0}^{DT} = \frac{1}{-jn\omega_0} \left( e^{-jn\omega_0 \cdot DT} - e^{0} \right) 0DTejnω0tdt=[jnω0ejnω0t]0DT=jnω01(ejnω0DTe0)
代入
ω0=2π/T,则ω0⋅DT=2πDn\omega_0 = 2\pi/T ,则 \omega_0 \cdot DT = 2\pi D n ω0=2π/Tω0DT=2πDn
,因此:
∫0DTe−jnω0tdt=1−jnω0(e−jn2πD−1)\int_{0}^{DT} e^{-jn\omega_0 t} dt = \frac{1}{-jn\omega_0} \left( e^{-jn2\pi D} - 1 \right) 0DTejnω0tdt=jnω01(ejn2πD1)

步骤 3:代入(F_n)并化简

将积分结果代入傅里叶系数公式:
Fn=AT⋅1−jnω0(e−jn2πD−1)F_n = \frac{A}{T} \cdot \frac{1}{-jn\omega_0} \left( e^{-jn2\pi D} - 1 \right) Fn=TAjnω01(ejn2πD1)
利用ω0T=2π\omega_0 T = 2\piω0T=2π(即1Tω0=12π\frac{1}{T\omega_0} = \frac{1}{2\pi}Tω01=2π1)化简:
Fn=A−jn⋅2π(e−jn2πD−1)=Ajn2π(1−e−jn2πD)F_n = \frac{A}{-jn \cdot 2\pi} \left( e^{-jn2\pi D} - 1 \right) = \frac{A}{jn2\pi} \left( 1 - e^{-jn2\pi D} \right) Fn=jn2πA(ejn2πD1)=jn2πA(1ejn2πD)

分量结论

综上,我们得出:

1. 直流分量((n = 0))

当(n = 0)时,原公式分母为 0,需单独计算:
F0=1T∫0Tf(t)dt=1T⋅A⋅DT=ADF_0 = \frac{1}{T} \int_{0}^{T} f(t) dt = \frac{1}{T} \cdot A \cdot DT = AD F0=T10Tf(t)dt=T1ADT=AD
结论:直流分量与占空比D成正比,这是 PWM 用于模拟量控制的核心原理。

2. 交流谐波分量(n≠0n \neq 0n=0

利用欧拉公式e−jθ=cos⁡θ−jsin⁡θe^{-j\theta} = \cos\theta - j\sin\thetaejθ=cosθjsinθ,将(F_n)展开为幅度和相位形式:
1−e−jn2πD=1−cos⁡(2πnD)+jsin⁡(2πnD)=2je−jnπDsin⁡(nπD)1 - e^{-jn2\pi D} = 1 - \cos(2\pi n D) + j\sin(2\pi n D) = 2j e^{-jn\pi D} \sin(n\pi D) 1ejn2πD=1cos(2πnD)+jsin(2πnD)=2jejnπDsin(nπD)
代入(F_n)得:
Fn=Ajn2π⋅2je−jnπDsin⁡(nπD)=Anπe−jnπDsin⁡(nπD)F_n = \frac{A}{jn2\pi} \cdot 2j e^{-jn\pi D} \sin(n\pi D) = \frac{A}{n\pi} e^{-jn\pi D} \sin(n\pi D) Fn=jn2πA2jejnπDsin(nπD)=nπAejnπDsin(nπD)
因此,第n次谐波的幅度为:
∣Fn∣=Anπ∣sin⁡(nπD)∣(n=±1,±2,…)|F_n| = \frac{A}{n\pi} |\sin(n\pi D)| \quad (n = \pm1, \pm2, \dots) Fn=nπAsin(nπD)(n=±1,±2,)

这个可比方波的要复杂一点,因为你看到这个里面有一个sin(D)的关系项。 不过,如果你就只关心直流量AD的话,这个只是告诉你,他的基波和谐波基本是连续的。

再提一个有趣的地方,这里的D取0.5的话,刚好可以把偶数波消掉,这也是方波为啥频谱不是全谐波的原因。

matlab验证

下面以振幅2 , 占空比为0.2的来计算一波。

clear; clc; close all;%% 参数设置
A = 2;          % 峰值幅度
D = 0.2;        % 占空比 (0 < D < 1)
F = 100;        % PWM频率 (Hz)
T = 1/F;        % 周期 (s)
fs = 100000;    % 采样频率 (Hz),需远大于PWM频率以确保精度
N_cycles = 10;  % 生成的周期数
N = N_cycles * fs * T;  % 总采样点数%% 生成PWM信号
t = 0:1/fs:(N-1)/fs;    % 时间向量
t_mod = mod(t, T);       % 周期化时间
pwm = (t_mod < D*T) * A; % 生成PWM信号%% 计算频谱
Y = fft(pwm);                    % 傅里叶变换
f = (0:N-1)*(fs/N);              % 频率向量
P = abs(Y)/N;                    % 幅度谱(归一化)
P(2:end-1) = 2*P(2:end-1);       % 双边谱转单边谱(除DC分量外)% 截取有意义的频率范围(0到10倍PWM频率)
f_max = 10*F;
idx = f <= f_max;
f_plot = f(idx);
P_plot = P(idx);%% 理论计算频谱(用于对比)
n = 0:10;               % 谐波次数
f_theo = n*F;           % 理论频率点
P_theo = zeros(size(n));
P_theo(1) = A*D;        % 直流分量 (n=0)for i = 2:length(n)ni = n(i);P_theo(i) = (A/(ni*pi)) * abs(sin(ni*pi*D));
end%% 绘图
figure('Name','PWM波形及其频谱','Position',[100 100 1000 600]);% 绘制PWM波形
subplot(2,1,1);
plot(t, pwm, 'LineWidth',1.2);
xlabel('时间 (s)');
ylabel('幅度');
title(['PWM波形 (频率 = ', num2str(F), ' Hz, 占空比 = ', num2str(D), ')']);
xlim([0, 3*T]);  % 显示3个周期
grid on;% 绘制频谱
subplot(2,1,2);
plot(f_plot, P_plot, 'b', 'LineWidth',1.2);
hold on;
stem(f_theo, P_theo, 'r', 'MarkerFaceColor','r');
xlabel('频率 (Hz)');
ylabel('幅度');
title('PWM信号频谱');
legend('FFT计算结果', '理论计算结果');
xlim([0, f_max]);
grid on;
hold off;%% 显示关键谐波信息
disp('PWM信号主要谐波成分:');
disp('谐波次数 | 频率 (Hz) | 理论幅度 | FFT计算幅度');
disp('-------------------------------------------');
for i = 1:length(n)if i == 1fprintf('直流分量 | %8.1f | %8.4f | %8.4f\n', ...f_theo(i), P_theo(i), P_plot(f_plot == 0));else% 找到最接近理论频率的FFT结果[~, idx_closest] = min(abs(f_plot - f_theo(i)));fprintf('    %d    | %8.1f | %8.4f | %8.4f\n', ...n(i), f_theo(i), P_theo(i), P_plot(idx_closest));end
end

不知道C站犯啥毛病了,图传不上来,那你们自己跑一遍试试吧。

这篇文章的灵感来源于最近在读嘉立创的电路设计教程,其中一个PWM转ADC的电路(点击这个蓝色的链接可以去看看) 这个电路是低成本的ADC的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92630.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92630.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92630.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

相机、镜头参数详解以及相关计算公式

一、工业相机参数 1、分辨率 相机每次采集图像的像素点数&#xff0c;也是指这个相机总共有多少个感光晶片。在采集图像时&#xff0c;相机的分辨率对检测精度有很大的影响&#xff0c;在对同样大的视场成像时&#xff0c;分辨率越高&#xff0c;对细节的展示越明显。 相机像素…

通信中间件 Fast DDS(一) :编译、安装和测试

目录 1.简介 2.Windows编译、安装和测试 2.1.编译环境准备 2.2.编译安装 2.2.1.安装FastCDR 2.2.2.安装Foonathan Memory 2.2.3.安装FastDDS 2.3.验证安装 3.Linux编译、安装和测试 3.1.编译环境准备 3.2.编译安装 3.2.1.安装FastCDR 3.2.2.安装Foonathan M…

NI USRP X410 无线电上的雷达目标仿真

此示例展示如何在 NI™ USRP™ 无线电的 FPGA 上部署雷达目标仿真算法。 介绍 在本例中&#xff0c;您将从 Simulink 模型入手&#xff0c;该模型可模拟最多四个雷达目标响应。您将按照分步指南&#xff0c;在 Simulink 中从该模型生成比特流&#xff0c;并使用生成的 MATLAB 主…

PyTorch 深度学习实战教程-番外篇04:卷积层详解与实战指南

标签&#xff1a;# 深度学习 #人工智能 #神经网络 #PyTorch #卷积神经网络 相关文章&#xff1a; 《Pytorch深度学习框架实战教程01》 《Pytorch深度学习框架实战教程02&#xff1a;开发环境部署》 《Pytorch深度学习框架实战教程03&#xff1a;Tensor 的创建、属性、操作与…

LeetCode 面试经典 150_数组/字符串_分发糖果(15_135_C++_困难)(贪心算法)

LeetCode 面试经典 150_数组/字符串_分发糖果&#xff08;15_135_C_困难&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;贪心算法&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;贪…

配置timer控制 IO的输出(STC8)

使用STC8的Timer控制IO输出 STC8系列单片机具有多个定时器&#xff0c;可以用于精确控制IO口的输出状态。以下是使用Timer0和Timer1控制IO输出的方法。 初始化Timer0 配置Timer0为16位自动重装模式&#xff0c;用于周期性控制IO输出&#xff1a; /************************ 定时…

【Python练习】086. 编写一个函数,实现简单的DHCP服务器功能

086. 编写一个函数,实现简单的DHCP服务器功能 086. 编写一个函数,实现简单的DHCP服务器功能 安装依赖库 示例代码 代码说明 示例输出 注意事项 扩展功能 DHCP服务器功能实现方法 依赖库安装 基本功能实现 功能说明 运行方法 注意事项 扩展功能 086. 编写一个函数,实现简单的…

生产环境Tomcat运行一段时间后,如何测试其性能是否满足后续使用

要测试生产环境中已运行一段时间的Tomcat性能是否满足后续使用需求&#xff0c;需从基础监控、负载压力测试、配置合理性校验、稳定性验证等多维度入手&#xff0c;结合工具和实际业务场景定位瓶颈&#xff0c;确保其能应对未来可能的流量增长。以下是具体方法和步骤&#xff1…

Qt中的设计模式:经典的MVC,MVP和MVVM

Qt中的设计模式&#xff1a;经典的MVC&#xff0c;MVP和MVVM 前言 ​ 笔者这里最近正在研究经典的三大 Model/View 框架&#xff0c;不得不说&#xff0c;我先前的确写过Qt在这里的体现&#xff0c;但是&#xff0c;笔者认为之前的文章中&#xff0c;我只是机械的memcpy的Qt的…

Windows浮动ip怎么配置

Windows浮动IP怎么配置&#xff0c;达到IP漂移的效果&#xff0c;方法肯定是有的&#xff0c;这里我推荐一款好用的高可用Vip漂移软件PanguVip&#xff0c;我们先看下最终达到的效果图&#xff0c;如下所示PanguVip软件免费下载百度网盘为您提供文件的网络备份、同步和分享服务…

[langchain] Sync streaming vs Async Streaming

我不太清楚langchain中的sync stream 和 async steam有什么关系和区别sync stream from langchain.chat_models import init_chat_model from langchain_deepseek.chat_models import ChatDeepSeek import dotenv dotenv.load_dotenv()messages [ ("system", &quo…

nginx下lua的实现机制、Lua错误处理、面向对象

nginx下lua的实现机制 nginxlua概述 nginx&#xff1a;功能由模块提供。 http模块、events模块&#xff0c;mail模块。 处理http请求的时候&#xff0c;可以利用模块做一些功能&#xff1a;eg&#xff1a;登录校验&#xff0c;js合并&#xff0c;数据库访问&#xff0c;鉴权。 …

Axure基于中继器实现的组件库(导航菜单、动态表格)

摘要 本文将为您详细介绍基于 Axure 的中继器组件库中的 9 个独特组件&#xff0c;这些组件不仅能够极大地提升您的原型设计效率&#xff0c;还能为您的项目增添令人惊叹的交互效果和视觉呈现。 引言 在当今快速发展的数字产品设计领域&#xff0c;原型设计工具的革新不断推动着…

Kafka 生产者与消费者分区策略全解析:从原理到实践

一、生产者分区策略1.1 分区好处&#xff08;1&#xff09;便于合理使用存储资源&#xff0c;每个Partition在一个Broker上存储&#xff0c;可以把海量的数据按照分区切割成一块一块数据存储在多台Broker上。合理控制分区的任务&#xff0c;可以实现负载均衡的效果。&#xff0…

高频面试点:深入理解 TCP 三次握手与四次挥手

在网络通信的世界里,TCP(Transmission Control Protocol,传输控制协议)是确保数据可靠传输的基石。其中,三次握手建立连接、四次挥手断开连接的过程,更是 Java 秋招面试中的高频考点。今天,我们就深入剖析这两个关键过程,结合原理、代码示例与面试真题,帮你吃透知识点…

k8s-nfs实现创建sc的两种方式

法一&#xff1a;基于 官方 NFS CSI 插件 法二&#xff1a;基于 nfs-subdir-external-provisioner 法一 官方 NFS CSI 插件 大致步骤# 安装 NFS sudo apt update sudo apt install -y nfs-kernel-server # 创建共享目录 sudo mkdir -p /data/nfs sudo chmod 777 /data/nfs # 配…

n8n 入门指南:更适合跨境出海搞钱的AI智能体

如果你最近刷到 AI 圈的分享应该会发现——n8n 又火起来了。其实 n8n 早在 2020 年左右就被程序员玩过一波&#xff0c;当时很多人拿它做网站自动发邮件、消息转发之类的“流程自动化”。但那时候 AI 还没这么卷&#xff0c;大家也没觉得多有用。n8n为什么最近又翻红&#xff1…

【数据分享】各省农业土地流转率(2010-2023)

数据介绍土地流转是推动农业规模化、现代化发展的关键机制。为助力相关研究&#xff0c;现分享一份覆盖全国30个省级行政区、时间跨度为2010-2023年的农业土地流转率面板数据集。本数据直接提取自权威统计年报&#xff0c;具有较高的参考价值。一、数据概览覆盖范围&#xff1a…

音视频时间戳获取与同步原理详解

引言&#xff1a;为什么音视频同步如此重要&#xff1f; 在音视频技术领域&#xff0c;"同步"是决定用户体验的核心要素。想象一下观看电影时画面与声音错位0.5秒的场景&#xff1a;角色说话时嘴唇动作与声音不匹配&#xff0c;爆炸场景的视觉冲击先于音效到达——这…

Day38--动态规划--322. 零钱兑换,279. 完全平方数,139. 单词拆分,56. 携带矿石资源(卡码网),背包问题总结

Day38–动态规划–322. 零钱兑换&#xff0c;279. 完全平方数&#xff0c;139. 单词拆分&#xff0c;56. 携带矿石资源&#xff08;卡码网&#xff09;&#xff0c;背包问题总结 今天的是几道经典的“完全背包”题目。前两道题目&#xff0c;要区分求的是“价值”&#xff0c;还…