我可以使用GPIO进行脉冲宽度调制(PWM)吗?


97

我可以将GPIO用作脉宽调制输出吗?

如果是这样,我将如何进行呢?我可以有多少个并发的,不同的PWM输出?


您可能需要指定使用的模型。它们都略有不同。
not2qubit '16

2
@ user1147688当只有一个模型时,会询问此问题!
berry120 '16

Answers:


76

正如Alex Chamberlain所建议的,根据型号WiringPi库似乎既支持一个或两个GPIO引脚上的硬件PWM输出,又支持其他GPIO引脚上的软件PWM。同时,RPIO.PWM库通过任何GPIO引脚上的DMA进行PWM 。实际上,这是硬件和软件PWM之间的过渡,提供了1 µs的时序分辨率,而WiringPi的Software PWM [1]提供了100 µs的时序分辨率。

其中哪一种适合您的应用取决于您需要多少个PWM输出以及这些输出中想要的性能。

如果您的应用程序容许低时序分辨率和高抖动,那么您可以使用软件或DMA辅助时序循环。如果需要更高的精度/更低的抖动PWM,则可能需要硬件帮助。

什么时候软件PWM合适?

如果要用柔和的实时响应要求来闪烁一堆具有不同人类可见节奏(十赫兹)的LED,则软件循环可以处理与GPIO引脚数量一样多的PWM。

什么时候硬件PWM合适?

如果要控制具有严格实时响应要求的伺服电机,则需要使用硬件PWM。即使这样,您也可能无法确保将编码器输入与PWM输出联系在一起的伺服环路的实时响应。

稳定的伺服环路需要以规则的速率(低抖动)读取编码器,以规则的速率写出修改后的PWM输出值,并且两者之间的延迟应为固定的(总体上低抖动)。如果您不能这样做,则必须对电机进行微调(软调),以防止其在负载下变得不稳定。如果没有低级别的支持,使用多任务操作系统很难做到这一点。

如果我需要更多的硬件PWM输出怎么办?

如果您需要运行的伺服环路数量多于硬件PWM输出的数量,那么您可能需要将它们转移到另一台设备上以确保硬实时性能,从而使Raspberry Pi成为软实时监督者

一种选择是Adafruit 16通道12位PWM /伺服驱动器-I²C接口-PCA9685,它允许您仅使用I²C总线的几个GPIO引脚控制16个PWM输出。有关其用法的示例,请查看Raspberry Pi论坛上的I²C16 通道PWM /伺服突破-工作文章。

1.由于dm76您的建议,但希瑟说,RPIO.PWM可能不再是新PI型号。


我可以使用软件PWM方法运行直流电动机吗?
gideon 2013年

@gideon-是的,我使用的电机功率放大器都将PWM用作输入。
Mark Booth 2013年

2
仅供参考,与100us分辨率的
WiringPi

@MarkBooth-没有问题。该库编写得非常好,可以用作RPi.GPIO的直接替代品,如果您从RPi.GPIO开始一个项目,后来又需要PWM信号,这将非常方便...
dm76,2014年

我认为RPIO.PWM可能不再适用于新的pi模型。
石南花

39

硬件PWM

是的,Raspberry Pi上有一个硬件PWM输出,已连接到P1-12(GPIO18)。此外,可以使用I²CSPI接口添加PWM输出。有些人在此方面取得了成功(论坛帖子)。

范例程式码

您可以使用WiringPi库来控制PWM引脚。您可以查看代码以避免包含整个库。

软件PWM

Raspberry Pi不适合用于任何重要的软件PWM,因为Linux不是实时操作系统。


1
问题,严重的软件PWM的定义或示例是什么?什么是“实时操作系统”,有没有机会在Pi上安装一个
AnthonyBlake,2012年

@AnthonyBlake好吧,您可能可以使用软件PWM控制灯的亮度,但是我怀疑电动机会失速。尽管无需进行软件PWM,但硬件更简单,更有效。Google会更好地解释实时操作系统;他们保证软件可以运行多长时间和多长时间。
亚历克斯·张伯伦

2
@AnthonyBlake“实时操作系统”(RTOS)是一种操作系统,可为您提供最高执行时间的保证。就像对程序说:“是的,您将有33ms的执行时间(给定或具有2ms的公差),以翻转GPIO引脚位,以便在步进马达需要时在确切的时间窗口内为步进电机提供信号。您可以依靠就这样!” 这里有一个RT Linux。不知道它是否已经移植到RPi。
orithena

抱歉,Alex,我没有故意偷走您回答的另一部分,但我刚刚注意到我们通过不同的路线来到同一论坛。
Mark Booth 2013年

2
具有40个引脚的较新型号将第二个硬件PWM连接到GPIO19(引脚35)。
凯文

12

最近的Pis有两个硬件PWM通道。另外,硬件定时PWM脉冲可以在连接到40引脚扩展接头连接器的所有GPIO上独立生成。

实际上,这意味着有两个高精度PWM通道,而所有其他GPIO可能具有Arduino风格的PWM(800 Hz,0关闭-255完全打开)。

例如伺服爆破器和我的小猪


好答案!如何使用这两个硬件PWM?我需要控制2个伺服器,我知道您说Servoblaster和Pigpio可以满足要求,但是我只是想知道HW PWM,因为我找不到关于它们的任何信息...那里有一些相关文档吗?我有一个用于测试的RPi 2 V1.1。
Kozuch '16


2
繁重的CPU负载不会产生任何影响。繁重的网络负载可能会对gpioServo产生影响,尤其是如果采样频率为1MHz而不是默认的200kHz时。频率为50(Hz),占空比范围为0-1000000(映射到真实的基础值0-5000000)。1 ms是20 ms中的1 ms,因此占空比为5%,因此50000、1.5ms-> 7.5%-> 75000、2ms-> 10%-> 100000。
2016年

1
BCM2835 ARM外设的第102页显示了可以分配GPIO的各种模式。在线查找哪些GPIO引出到各种Pi模型扩展接头连接器。
2016年

1
@ user1147688 PLLD(500MHz)用作核心PWM时钟。由于“它”的工作方式,PWM核心频率为250 MHz。为了能够打开和关闭(对于PWM十分重要),最大为125 MHz。您可以使用PLLC(1000 MHz)将数字加倍,但是PLL随内核时钟速度而变化。
2016年

2

Raspberry Pi的RISC OS并非实时操作系统,而是协作式多任务处理,因此您可以轻松运行具有100%CPU的应用程序,从而可以更好地管理时序。只是不要指望除了您自己的代码以外还要执行其他任何操作。


我在某处读到,输出引脚的开关频率也受到硬件限制。我认为大约是20 MHz。因此,即使CPU使用率达到100%,也不要期望能够拉动300 MHz PWM或任何类似的功能。
Ponkadoodle

@Wallacoloo:哪些应用需要300 MHz PWM?
Peter Mortensen 2015年

2
@PeterMortensen:好吧,我不知道无线电发射器等如何产生信号,但是有些人可以用PWM来完成。PiFM在100 MHz上做到了这一点。但是,这似乎与我的评论相矛盾,所以我想知道是否仍然可以在该频率下控制该引脚,但这仅仅是因为引脚电容会衰减此类信号,从而使100 MHz方波实际上可能从(1.0 V ,2.3 V)而不是整个(0 V,3.3 V)范围。
Ponkadoodle

2

我发现了这个库(pi-blaster),该库声称“极其有效:不使用CPU,并提供非常稳定的脉冲”。

我尚未测试过,但是会尽快更新(可能是今天)


我一直在尝试,但是到目前为止还没有运气。据我所知,它实际上并没有切换硬件?
MrMowgli

1
只是想碰碰这个。Pi-blaster为我工作,而其他答案却没有。
瑟夫·里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.