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

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

评论

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

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

#1 楼

正如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?人眼可见的节奏(10赫兹)和柔软的实时响应要求,那么软件循环就可以处理与GPIO引脚数量一样多的PWM。 br />如果要控制具有严格实时响应要求的伺服电机,则需要使用硬件PWM。即使这样,您仍然可能无法确保将编码器输入与PWM输出联系起来的伺服环路的实时响应。

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

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

如果您需要运行的伺服环路数量多于硬件PWM输出的数量,那么您可能需要将它们转移到另一台设备上以确保硬实时性能,从而使Raspberry Pi成为软实时监督者。 br />
一种选择是类似Adafruit 16通道12位PWM /伺服驱动器-I²C接口-PCA9685,它允许您仅使用I²C的几个GPIO引脚即可控制16个PWM输出总线。有关其用法的示例,请在Raspberry Pi论坛上查看I²C16通道PWM /伺服突破-工作帖子。

1。感谢dm76的建议,但是希瑟说RPIO.PWM可能不再适用于新的pi模型。

评论


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

–基甸
13年6月23日在18:12

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

– Mark Booth
13年6月24日在8:39

仅供参考,与100us分辨率的WiringPi相比,RPI库(pythonhosted.org/RPIO/pwm_py.html)似乎具有更好的分辨率(1us)

– dm76
2014年1月9日18:18

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

– dm76
2014年1月21日,10:20

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

–希瑟
18年6月12日在23:09

#2 楼

硬件PWM
是的,Raspberry Pi上有一个硬件PWM输出,已连接到P1-12(GPIO18)。此外,可以使用I²C或SPI接口添加PWM输出。
示例代码
您可以使用WiringPi库来控制PWM引脚。您可以查看代码来避免包含整个库。
软件PWM
Raspberry Pi不适合任何重要的软件PWM,因为Linux不是实时操作系统。

评论


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

–安东尼·布雷克
2012年8月17日23:37

@AnthonyBlake好吧,您可能可以使用软件PWM控制灯的亮度,但是我怀疑电动机会失速。尽管无需进行软件PWM,但硬件更简单,更有效。 Google会更好地解释实时操作系统;他们保证有关软件运行时间和频率的某些信息。

–亚历克斯·张伯伦
2012年8月18日在7:13

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

–orithena
2012年12月26日20:48在

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

– Mark Booth
2013年6月25日21:50

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

–凯文
16-4-3在4:10

#3 楼

最近的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-26在22:52



C,Python,pigs命令行。

–琼
16年2月26日在23:00

繁重的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。

–琼
16年2月27日在9:00

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

–琼
16年4月16日在19:23

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

–琼
16年4月17日在10:02

#4 楼

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

评论


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

– Ponkadoodle
14年6月18日在7:42

@Wallacoloo:哪些应用需要300 MHz PWM?

– Peter Mortensen
15年6月20日在15:27

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

– Ponkadoodle
2015年6月21日,下午3:41

#5 楼

我发现这个库(pi-blaster)声称“非常有效:不使用CPU,并提供非常稳定的脉冲。”我尽快(大概是今天)

评论


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

– MrMowgli
17年4月28日在0:56

只是想碰碰这个。 Pi-blaster为我工作,而其他答案却没有。

– Seph Reed
17年8月7日在21:07