【嵌入式】PWM DAC的滤波器设计

news/2025/10/28 20:07:00/文章来源:https://www.cnblogs.com/lvista/p/19172629

PWM DAC

PWM概念本身很简单,具体可以参考各网上资料。

PWM:脉冲宽度调制(英语:Pulse-width modulation,缩写:PWM),简称脉宽调制,是用脉冲来输出模拟信号的一种技术,一般变换后脉冲的周期固定,但脉冲的工作周期会依模拟信号的大小而改变。

PWM DAC就是通过PWM输出,经过滤波后达成模拟输出的技术。

实现目标

这里实现一个LED呼吸灯

构建RC滤波器

直接将PWM输出作为LED输入虽然不会产生明显的影响,但PWM本身存在极大的波纹,对于各种电子器件是不好的,因此需要RC滤波来减小波纹。

假设PWM时钟设定如下

  • 系统时钟:72M

  • PWM分辨率:取8位,即每个PWM周期含\(2^8\)个系统时钟滴答数,对应可有\(2^8+1\)种占空比信号,对应\(2^8+1\)种DAC水平。

    需要明确的是,取n位只是一个为了方便的约定说法。最高的可设定分辨率与ARR寄存器(Auto-reload Register)有关,对于16位的ARR寄存器来说,可设定\(2^{16}\)种值。如果ARR寄存器设定为k,则在一个PWM周期内,则可划分k+1种占空比的PWM信号

  • PWM频率\(\frac{72M}{2^8}=281250\)Hz

则对于以上PWM信号,需要对其281250Hz的一次谐波\(A_1\)进行滤波处理:

\[A_1=\frac{2}{\pi}(V_h-V_l)sin(\pi p-\pi) \]

经过周期信号的傅立叶变换,可将信号分解为直流与n阶谐波信号,这这里的一阶即为与PWM同频率的三角函数波,即基波

  • 当占空比p取0.5时\(A_1\)最大为\(A_{1max}=\frac{2}{\pi}(V_h-V_l)=\frac{2\times 3.3V}{\pi}\)
  • 对于一般PWM DAC要求,\(A_{1max}\)不应大于PWM直流分量的分辨率,即\(\frac{3.3V}{2^8}\),对于更高要求,可取其一半,这里取其一半

综上,要求对281250Hz谐波的最大值从\(A_{1max}=\frac{2\times 3.3V}{\pi}\)抑制到\(\frac{3.3V}{2^9}\)(取一半),二者比值为\(\frac{\pi}{2^{10}}\),转换为分贝为\(-20lg(\frac{\pi}{2^{10}})=-50dB\)

因为设计RC一阶滤波需要知道其截止频率\(f_c\),即-3dB处频率。需要通过\((271kHz, -50dB)\)计算\((f_c, -3dB)\)

对于RC一阶低通滤波器滤波,其幅频响应如下:

\[|H(f)| = \frac{1}{\sqrt{1 + \left(\frac{f}{f_c}\right)^2}} \]

\(H(f)\)是幅度-频率响应,指\(\frac{Vout}{Vin}\)\(f_c\)是-3dB处频率,即截止频率。

可以用LTspice进行仿真

V1 in 0 AC 1
R1 in out 1k
C1 out 0 10n* 交流分析
.ac dec 100 1 1Meg.backanno
.end

截屏2025-10-28 19.32

绿色实线就是幅度-频率响应。

这里使用两组一阶RC串联,因此幅度-频率响应表达式为二者相乘:

\[|H(f)| = \frac{1}{{1 + \left(\frac{f}{f_c}\right)^2}} \]

代入\(H=\frac{\pi}{2^{10}}, f=271kHz\)就可以得到截止频率常量\(f_c\),注意是一组RC的截止频率。

根据RC截止频率计算公式可计算得RC:

\[f_c=\frac{1}{2\pi RC} \]

可通过LTspice仿真查看PWM的滤波效果:

截屏2025-10-28 19.52

截屏2025-10-28 19.53

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

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

相关文章

被称作遗憾之物 爬满了脊骨 又把控了痛楚 被称作无用之物 修筑了唯一的通路

test30 前两题都 0pts,nbm(? 2-A 飞船制造 (spaceship.cpp) 怎么有傻子没开 c++11 写了 rank 然后 re 惹 /fad 考虑依次枚举 \(s=i+j+k\),计算出 \(s\) 一定的方案数就能确定唯一的 \(s\),方案数计算好像只能考虑…

neovim在windwos11下snack.nvim的问题

问题复现 首先确定有 find 命令,在执行之后,会出现下面的问题: Command failed: - cmd: `find . -type f -not -path */.git/* -not -path */.*`几乎百分百。 查找原因 查阅之后得知,问题为调用了linux风格的find命…

完整教程:Java 集合 “List + Set”面试清单(含超通俗生活案例与深度理解)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

禁用 IPython 历史记录 history.sqlite

Windows 在 %UserProfile%\.ipython\profile_default\ 文件夹中或 Linux 在 ~/.ipython/profile_default/ 目录中(默认配置文件名为profile_default),新建ipython_config.json文件,填入以下内容即可禁用 IPython 历…

Luogu P7914 [CSP-S 2021] 括号序列 题解 [ 蓝 ] [ 区间 DP ] [ 前缀和优化 ] [ 调试技巧 ]

括号序列:无聊,感觉做过类似的拼接类区间 DP 就直接秒了。 注意到这个超级括号序列定义很复杂,除了两边没有 \(\texttt{*}\) 没有啥很好的性质。于是直接考虑暴力区间 DP:定义 \(dp_{l, r}\) 表示 \(l\sim r\) 的合…

扩展BaseMapper类 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《程序员修炼之道:从小工到专家》前五分之二观后感

读完《程序员修炼之道:从小工到专家》前五分之二的内容,我对“程序员如何成长”有了更清晰的认知。书中开篇便强调“职业主义”,打破了我对“码农”的刻板印象——程序员不应只是被动执行需求的工具人,而应像匠人般…

矩阵快速幂章节笔记(这里主要介绍的是我的错题)

矩阵加速的递推 1.1维k阶 f(n)=f(n-1)+f(n-2)+f(n-i)可以添加系数 那么矩阵的第一列就是系数了,其它用未知数,然后计算。注意start数组,就是开始的数组是倒着来的,请看代码(斐波那契) 2.k维1阶 dp[i][j]=dp[i-…

实验二 现代C++编程初体验

任务一: 代码:#pragma once#include <string>// 类T: 声明 class T { // 对象属性、方法 public:T(int x = 0, int y = 0); // 普通构造函数T(const T &t); // 复制构造函数T(T &&t); //…

P5322 [BJOI2019] 排兵布阵

P5322 [BJOI2019] 排兵布阵 题解题目传送门 博客传送门 我们浏览一遍测试点,发现了一个 \(s=1\) 的特殊性质。先考虑这一性质。 \(s=1\)特殊性质 如果我们当前第 \(i\) 座城市的兵力数量足够时,添加兵力显然不优。而…

题解:P9292 [ROI 2018] Robomarathon

题目传送门 题目大意: 有 \(N\) 名机器人选手参加马拉松,选手编号为 \(1 \dots N\),分道编号也为 \(1 \dots N\)。选手 \(i\) 占据分道 \(i\),跑完全程需要 \(a_i\) 秒。设 \(S \subseteq \{1, 2, \dots, N\}\) 表…

[题解]P5322 [BJOI2019] 排兵布阵

P5322 [BJOI2019] 排兵布阵 我们可以预处理出第 \(i\) 个城堡分配 \(j\) 的兵力能获得多少的得分,记为 \(w[i][j]\)。 则每一个 \(w[i]\) 都是一个泛化物品,即价值(\(w[i][j]\))随着分配体积(\(j\))变化的物品。…

申威服务器安装Nacos 2.0.3 RPM包详细步骤(Kylin V10 sw_64架构)​附安装包

申威服务器安装Nacos 2.0.3 RPM包详细步骤(Kylin V10 sw_64架构)​附安装包​ Nacos 2.0.3-1.ky10.sw_64.rpm​ 是专为 ​申威(SW)架构​ 处理器,并运行 ​中标麒麟操作系统 Kylin V10(64位)​​ 的服务器环境定…

ZKY精选冲刺省选国赛仿真训练题

求和 QOJ - 9902 解题思路 代码实现点击查看代码Bridges AtCoder - arc143_d 解题思路 代码实现点击查看代码龙门考古 UniversalOJ - 840 解题思路 代码实现点击查看代码Discrete Centrifugal Jumps CodeForces - 1407…

MySQL 查询与更新语句执行过程深度解析:从原理到实践​ - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ZKY精选冲刺省选国赛技巧训练题

Discrete Centrifugal Jumps CodeForces - 1407D 解题思路 代码实现点击查看代码序列妙妙值 UniversalOJ - 549 解题思路 代码实现点击查看代码Constrained Sums AtCoder - abc277_h 解题思路 代码实现点击查看代码ag…

逆向基础--编码(001)

逆向基础--编码(001)一.位与字节比特(Bit):1比特就是1位,每个0或1就是一个位,位是数据存储的最小单位。位是二进制表示,8位二进制是一个字节。 8位二进制(就是8个比特)最大:11111111字节(Byte):字节是通过网…

20251027 - 倍增 ST表

前言: 怎么标题改来改去的? 概念 因为每一个整数都可以转换成对应的二进制,所以可以表示成 \(a_0 \times 2^0 + a_1 \times 2 ^ 1 + a_2 \times 2 ^ 2 + a_{len} \times 2 ^ {len}\)。 因此,对于求跳 \(x\) 步后的…

周康阳精选冲刺省选国赛思维训练题

agc052_a Long Common Subsequence 解题思路 代码实现点击查看代码agc052_a Long Common Subsequence 解题思路 代码实现点击查看代码agc052_a Long Common Subsequence 解题思路 代码实现点击查看代码agc052_a Long C…