我可以将GPIO用作脉宽调制输出吗?
如果是这样,我将如何进行呢?我可以有多少个并发的,不同的PWM输出?
我可以将GPIO用作脉宽调制输出吗?
如果是这样,我将如何进行呢?我可以有多少个并发的,不同的PWM输出?
Answers:
正如Alex Chamberlain所建议的,根据型号,WiringPi库似乎既支持一个或两个GPIO引脚上的硬件PWM输出,又支持其他GPIO引脚上的软件PWM。同时,RPIO.PWM库通过任何GPIO引脚上的DMA进行PWM 。实际上,这是硬件和软件PWM之间的过渡,提供了1 µs的时序分辨率,而WiringPi的Software PWM [1]提供了100 µs的时序分辨率。
其中哪一种适合您的应用取决于您需要多少个PWM输出以及这些输出中想要的性能。
如果您的应用程序容许低时序分辨率和高抖动,那么您可以使用软件或DMA辅助时序循环。如果需要更高的精度/更低的抖动PWM,则可能需要硬件帮助。
如果要用柔和的实时响应要求来闪烁一堆具有不同人类可见节奏(十赫兹)的LED,则软件循环可以处理与GPIO引脚数量一样多的PWM。
如果要控制具有严格实时响应要求的伺服电机,则需要使用硬件PWM。即使这样,您也可能无法确保将编码器输入与PWM输出联系在一起的伺服环路的实时响应。
稳定的伺服环路需要以规则的速率(低抖动)读取编码器,以规则的速率写出修改后的PWM输出值,并且两者之间的延迟应为固定的(总体上低抖动)。如果您不能这样做,则必须对电机进行微调(软调),以防止其在负载下变得不稳定。如果没有低级别的支持,使用多任务操作系统很难做到这一点。
如果您需要运行的伺服环路数量多于硬件PWM输出的数量,那么您可能需要将它们转移到另一台设备上以确保硬实时性能,从而使Raspberry Pi成为软实时监督者。
一种选择是Adafruit 16通道12位PWM /伺服驱动器-I²C接口-PCA9685,它允许您仅使用I²C总线的几个GPIO引脚控制16个PWM输出。有关其用法的示例,请查看Raspberry Pi论坛上的I²C16 通道PWM /伺服突破-工作文章。
是的,Raspberry Pi上有一个硬件PWM输出,已连接到P1-12(GPIO18)。此外,可以使用I²C或SPI接口添加PWM输出。有些人在此方面取得了成功(论坛帖子)。
您可以使用WiringPi库来控制PWM引脚。您可以查看代码以避免包含整个库。
Raspberry Pi不适合用于任何重要的软件PWM,因为Linux不是实时操作系统。
最近的Pis有两个硬件PWM通道。另外,硬件定时PWM脉冲可以在连接到40引脚扩展接头连接器的所有GPIO上独立生成。
实际上,这意味着有两个高精度PWM通道,而所有其他GPIO可能具有Arduino风格的PWM(800 Hz,0关闭-255完全打开)。
Raspberry Pi的RISC OS并非实时操作系统,而是协作式多任务处理,因此您可以轻松运行具有100%CPU的应用程序,从而可以更好地管理时序。只是不要指望除了您自己的代码以外还要执行其他任何操作。
我发现了这个库(pi-blaster),该库声称“极其有效:不使用CPU,并提供非常稳定的脉冲”。
我尚未测试过,但是会尽快更新(可能是今天)