差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
pwm [2022/02/23 13:15] gongyusu [PWM(2)- DAC的滤波器设计] |
pwm [2022/09/06 04:48] (当前版本) gongyu [3. PWM的实现方式] |
||
---|---|---|---|
行 59: | 行 59: | ||
只要带宽足够,任何模拟值都可以使用PWM进行编码。 \\ | 只要带宽足够,任何模拟值都可以使用PWM进行编码。 \\ | ||
既然PWM是数字信号,那么任何具有高低电平可控输出功能的数字芯片都可以生成PWM,比如最常用有微控制器(MCU),可编程逻辑FPGA,或是LED驱动控制芯片如PCA9685,以及各种电源用的控制芯片,以上都可以产生PWM波形,所以说PWM应用实在是太广了。 | 既然PWM是数字信号,那么任何具有高低电平可控输出功能的数字芯片都可以生成PWM,比如最常用有微控制器(MCU),可编程逻辑FPGA,或是LED驱动控制芯片如PCA9685,以及各种电源用的控制芯片,以上都可以产生PWM波形,所以说PWM应用实在是太广了。 | ||
+ | |||
+ | [[sigma_delta_modulator|Sigma Delta调制]] | ||
+ | |||
#### 模拟器件搭建PWM电路 | #### 模拟器件搭建PWM电路 | ||
行 67: | 行 70: | ||
#### 3.1 单片机(MCU)生成PWM | #### 3.1 单片机(MCU)生成PWM | ||
使用MCU生成PWM是最简单的方式,PWM发生功能和定时器功能是一起的,一种方法是使用软件设置定时器的定时时间,定时时间到翻转IO的高低电平,由于是软件来翻转电平,因此精度不能做到非常精确;另一种是直接使用定时器中的PWM功能,在定时器模块中已经集成了专用的PWM发生电路,用户只需要配置一下该模块的寄存器,在寄存器中配置好PWM的频率和占空比,软件使能该功能后,就可以输出精准的PWM波形。 | 使用MCU生成PWM是最简单的方式,PWM发生功能和定时器功能是一起的,一种方法是使用软件设置定时器的定时时间,定时时间到翻转IO的高低电平,由于是软件来翻转电平,因此精度不能做到非常精确;另一种是直接使用定时器中的PWM功能,在定时器模块中已经集成了专用的PWM发生电路,用户只需要配置一下该模块的寄存器,在寄存器中配置好PWM的频率和占空比,软件使能该功能后,就可以输出精准的PWM波形。 | ||
- | {{ :contenteetimes-images-edn-design-ideas-make-dac-microcontroller-pwm-timer-figure1.png |}}<WRAP centeralign>微控制器通过定时器输出PWM,再经过模拟低通滤波器得到模拟信号</WRAP> | + | {{drawio>mcu_pwm_awg.png}} <WRAP centeralign>微控制器通过定时器输出PWM,再经过模拟低通滤波器得到模拟信号</WRAP> |
{{ :contenteetimes-images-edn-design-ideas-make-dac-microcontroller-pwm-timer-figure2.png |}}<WRAP centeralign>每一路可以产生不同的信号</WRAP> | {{ :contenteetimes-images-edn-design-ideas-make-dac-microcontroller-pwm-timer-figure2.png |}}<WRAP centeralign>每一路可以产生不同的信号</WRAP> | ||
行 86: | 行 89: | ||
{{ :dualpwmlpf.jpg |}}<WRAP centeralign> 双PWM的PCB 3D,用KiCad绘制</WRAP> | {{ :dualpwmlpf.jpg |}}<WRAP centeralign> 双PWM的PCB 3D,用KiCad绘制</WRAP> | ||
+ | |||
+ | 下面是用树莓派RP2040微控制器,通过MicroPython混合汇编语言编程生成正弦波形的参考代码: | ||
<code python> | <code python> | ||
行 204: | 行 209: | ||
* [[https://www.edn.com/swapping-bits-improves-performance-of-fpga-pwm-counter/|在用FPGA产生PWM通过交换数据位提升性能]] | * [[https://www.edn.com/swapping-bits-improves-performance-of-fpga-pwm-counter/|在用FPGA产生PWM通过交换数据位提升性能]] | ||
* [[https://www.edn.com/double-%c2%b5cs-pwm-frequency-resolution/|Double µC’s PWM frequency & resolution]] | * [[https://www.edn.com/double-%c2%b5cs-pwm-frequency-resolution/|Double µC’s PWM frequency & resolution]] | ||
+ | |||
+ | |||
+ | |||
+ | 以下为更多参考技术文章,有待整理。 | ||
### PWM(1)- 独臂神通 | ### PWM(1)- 独臂神通 | ||
+ | |||
+ | **当你缺少DAC时** | ||
+ | 即使在这个高度集成混合信号集成电路的时代,遇到不包含数模转换器的微控制器也并不罕见。可编程逻辑在这方面甚至更成问题;我从来没有听说过FPGA或CPLD有DAC模块。即使微控制器有DAC,也可能只有一个或两个通道——与集成ADC外设形成对比的是,集成ADC外设通常包含一个多路复用器,允许一个ADC模块转换连接到几个甚至几十个端口引脚的模拟信号。那么,当你发现一个微控制器在各个方面都非常适合你的应用,除了它没有集成DAC时,你应该怎么做呢?最明显的选择是使用外部DAC。一个快速的Digi-Key搜索表明,您至少有一千种选择,其中一些价格不到一美元,而且是小型SC70、MSOP、SOT或DFN包。但有时候你真的不想在设计中添加另一个芯片。也许你的微控制器没有三个未使用的引脚,你将需要SPI通信;也许你赶时间,不想付隔夜运费;也许你需要六个独立的DAC输出,但是没有足够的电路板空间来容纳六个通道的设备。在任何情况下,如果外部DAC是完全不可能的,那么您有一个替代方案。 | ||
+ | |||
+ | **PWM、电阻器、电容器** | ||
+ | |||
+ | 这里的最小值是一个电阻器,一个电容,和一些脉冲宽度调制功能。如果您使用的是FPGA或CPLD,当然不会缺少PWM功能。对于处理器,我认为我曾经使用过的每一个微控制器都包含PWM硬件,但我认为一定有一些部分不包含PWM硬件。所以这是首先要检查的事情——如果你的微控制器没有PWM,你就运气不好了(除非你想要设置一些二进制的PWM程序,但说真的,如果你在船上,只需要使用外部DAC)。接下来,您需要一种方法来低通滤波PWM信号。一个基本的单极RC滤波器可以很好,如果你不介意一些涟波的输出,所以如果所有你可以适合你的板或预算是一个电阻和电容,PWM DAC仍然是一个可行的选择。然而,一个更好的滤波器意味着一个更好的DAC,它可能值得你带一个电感或运放,这样你就可以有两个极点而不是一个。 | ||
+ | |||
+ | 一个典型的数字时钟信号是一个周期序列,其中逻辑高电压的持续时间等于逻辑低电压的持续时间。相反,PWM信号是一个周期序列,其中逻辑高(或逻辑低)电压的持续时间根据外部条件而变化,这些变化可以用来传输信息。如果你对无线电电路很熟悉,你就会知道,信息是通过正弦信号的方式传输的,而正弦信号是通过某种调制方式进行传输的。这种情况类似于PWM的功能——不是幅度或频率调制,而是脉宽调制。你会发现它有助于思考这个概念相似:我们都知道,一个模拟音频信号可以从汽车收音机的天线传播首先调制载波,然后处理接收到的信号的方式消除了载体和恢复原来的音频信息。同样,我们可以通过脉宽调制数字载波来产生可编程模拟电压,然后将调制后的信号“传送”到低通滤波器。 | ||
+ | |||
+ | 在上图中,逻辑高被标识为“ON”或活动状态,逻辑低被标识为“OFF”或非活动状态。在第一个时间段内,激活状态的持续时间与不激活状态的持续时间相等。然后,在接下来的两个时段,活动状态持续时间增加一个网格宽度;这意味着无功状态持续时间必须减少一个栅格宽度,因为PWM载波频率(因此PWM周期)是恒定的。在我们的PWM DAC的背景下,我们真的不需要知道绝对的有源和非有源持续时间;重要的是持续时间之间的比率,我们根据PWM占空比来讨论: | ||
+ | |||
+ | 从占空比到模拟电压 | ||
+ | |||
+ | 在低通滤波器输出处观察到的标称DAC电压仅由两个参数决定,即占空比和PWM信号的逻辑高电压;在图中,这个逻辑高电压用A表示“振幅”。占空比、幅值和DAC电压之间的关系是相当直观的:在频域,低通滤波器抑制输入信号的高频成分。时域等效的效果是平滑,或平均——因此,通过低通滤波PWM信号,我们提取其平均值。让我们假设占空比为50%(即活动持续时间等于不活动持续时间),我们使用3.3 V逻辑。你大概可以猜到DAC的标称电压是多少:1.65 V,因为信号在3.3 V和0 V时的时间各占一半,因此平滑后的版本将在正中间结束。我们可以归纳如下: | ||
+ | |||
+ | 分辨率? | ||
+ | |||
+ | 在选择DAC时,首先要考虑的规范之一是“分辨率”,这是一个有点模糊的术语,用有点模糊的“位”单位表示。我们所说的“分辨率”真正的意思是“DAC可以产生多少不同的输出电压(或电流)?”“位”是指控制数字到模拟电路的数据寄存器,这样一个10位DAC可以产生210 = 1024个不同的输出电压。如果您充分理解了这一点,您将看到我们可以很容易地识别PWM DAC的等效分辨率。 | ||
+ | |||
+ | 让我们假设图中显示的PWM信号被限制为脉冲宽度是一个网格的倍数。这意味着占空比可以假设8个不同的值:0%、~14%、~29%、~43%、~57%、~71%、~86%和100%。每个占空比对应一个特定的输出电压,所以我们这里有一个3位DAC,因为23 = 8。 | ||
+ | |||
+ | 要确定现实生活中的PWM DAC的分辨率,只需应用相同的分析:可以生成多少不同的占空比?这个问题通常不难回答,因为标准PWM硬件块的中心元件是一个控制脉冲宽度的n位计数器,这意味着等效DAC分辨率是2N。例如,Atmel公司的SAM4S微控制器系列的数据表包括其PWM控制器的以下特性: | ||
+ | |||
+ | 16位计数器意味着16位分辨率,或216 = 65536不同的电压从0 V VDDIO(可在1.62 V至3.6 V)。另一个例子,硅实验室的EFM8UB1微控制器特性变量PWM分辨率,因此参考手册是显式的关于分辨率规格: | ||
+ | |||
+ | 在这一点上,当您可以从pwm + rc过滤器实现获得16位分辨率时,常规DAC似乎几乎没有任何用处。当然,这并不是全部——DAC不仅仅是解决方案。在下一篇文章中,我们将使用仿真更深入地探索与PWM数模转换相关的概念、电路和性能限制。 | ||
+ | |||
+ | * [[https://www.allaboutcircuits.com/technical-articles/low-pass-filter-a-pwm-signal-into-an-analog-voltage/|Low-Pass Filter a PWM Signal into an Analog Voltage]] | ||
+ | * [[https://www.allaboutcircuits.com/technical-articles/low-pass-filter-tutorial-basics-passive-RC-filter/|What Is a Low Pass Filter? A Tutorial on the Basics of Passive RC Filters]] | ||
+ | |||
PWM可以算是数字电路中的“独臂”神通,“独臂” - 只需一根线;“神通” - 在很多关键的应用中起到栋梁的作用。PWM(脉宽调制 Pulse Width Modulation)从字面意思上讲它是一种“调制”方式,调制就意味着在某些载波信号上携带了某些的信息,通过解调的过程就可以得到其携带的信息,这些信息的属性由PWM的产生端定义,总之在这一根仅仅发生0、1交替变化的信号线上可以做出很多文章。 | PWM可以算是数字电路中的“独臂”神通,“独臂” - 只需一根线;“神通” - 在很多关键的应用中起到栋梁的作用。PWM(脉宽调制 Pulse Width Modulation)从字面意思上讲它是一种“调制”方式,调制就意味着在某些载波信号上携带了某些的信息,通过解调的过程就可以得到其携带的信息,这些信息的属性由PWM的产生端定义,总之在这一根仅仅发生0、1交替变化的信号线上可以做出很多文章。 | ||