我正在将wirelesspi与硬件PWM输出配合使用。它提供了函数pwmSetClock,该函数应该可以更改频率。 (https://projects.drogon.net/raspberry-pi/wiringpi/functions/)。我相信,由于默认值为200 Mhz,将除数设置为200000000可以使LED明显连接到输出闪光灯,但这不是这种情况。

可以更改吗?

评论

我正在使用硬件PWM进行一些测试,它似乎没有固定的频率。它根据在pwmWrite()中设置的脉冲宽度而变化。不是我希望发生的事情

#1 楼

我最近有一些理由亲自开始尝试PWM,发现(如评论之一所指出),频率似乎随占空比而变化-奇怪,对吗?事实证明,Broadcom实施了“平衡” PWM,以使开和关PWM脉冲尽可能均匀地分布。他们在其数据表的第139页上提供了对该算法的描述和更多讨论:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom。 Datasheet.pdf

因此,您真正想要的是将PWM置于标记空间模式,这将为您提供您正在寻找的传统(且易于预测)的PWM:

pwmSetMode(PWM_MODE_MS);


其余的答案假设我们处于标记空间模式。

我还对pwmSetClock()pwmSetRange()的允许值范围进行了一些实验。正如在其他答案之一中所述,pwmSetClock()的有效范围似乎从2到4095,而pwmSetRange()的有效范围最大为4096(我没有尝试找到下限)。

范围和时钟(更好的名字可能是除数)都会影响频率。该范围也会影响分辨率,因此虽然可以使用非常低的值,但实际上可能会限制在最低水平。例如,如果使用4的范围,则可以实现更高的频率,但只能将占空比设置为0 / 4、1 / 4、2 / 4、3 / 4或4/4。 br />
Raspberry Pi PWM时钟的基本频率为19.2 MHz。该频率除以pwmSetClock()的自变量,即为PWM计数器递增的频率。当计数器达到等于指定范围的值时,它将重置为零。当计数器小于指定的占空比时,输出为高,否则输出为低。

这意味着,如果要将PWM设置为具有特定频率,则可以使用以下关系:

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.


如果使用pwmSetClock()pwmSetRange()的最大允许值,最终将获得〜1.14 Hz的最小硬件PWM频率。这肯定会给LED带来可见的闪烁(实际上是更多的闪烁)。我确实用示波器确认了上面的方程式,它似乎成立了。频率上限将受到所需分辨率的影响,如上所述。

评论


关于pwmRange的下限:我成功地将其设置为2(以获得50%的占空比)。

– Ted Pudlik
14年7月19日在21:32

您从哪个来源知道pwm时钟的频率为19.2 MHz?

– thi gg
2014年12月3日17:37

#2 楼

根据这个公式:

pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange


我们可以设置pwmClock=1920pwmRange=200以获得pwmFrequency=50Hz

50 Hz = 19.2e6 Hz / 1920 / 200



我在alarmpi上对其进行了测试:

$ pacman -S wiringpi
$ gpio mode 1 pwm
$ gpio pwm-ms
$ gpio pwmc 1920
$ gpio pwmr 200     # 0.1 ms per unit
$ gpio pwm 1 15     # 1.5 ms (0º)
$ gpio pwm 1 20     # 2.0 ms (+90º)
$ gpio pwm 1 10     # 1.0 ms (-90º)




注意:我的伺服器期望信号为50Hz。

评论


您如何得出:“ gpio pwmr 200#每单位0.1毫秒”

–mxlian
17-2-5在21:34



50Hz->每周期20ms 20ms / 200单位=每单位0.1ms

–mxlian
17-2-5在21:40

#3 楼

这是我正在使用的代码。我试图查看更改设置后会发生什么变化。

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main (void)
{
  printf ("Raspberry Pi wiringPi test program\n") ;

  if (wiringPiSetupGpio() == -1)
    exit (1) ;

  pinMode(18,PWM_OUTPUT);
  pwmSetClock(2);
  pwmSetRange (10) ;
  pwmWrite (18, 5);

for (;;) delay (1000) ;
}



pwmSetClock(1); -> 2.342kHz

pwmSetClock(2); -> 4.81MHz

pwmSetClock(3); -> 3.19MHz

pwmSetClock(4); -> 2.398MHz

pwmSetClock(5); -> 1.919MHz

pwmSetClock(6); -> 1.6MHz

pwmSetClock(7); -> 1.3MHz

pwmSetClock(8); -> 1.2MHz

pwmSetClock(9); -> 1.067MHz

pwmSetClock(10); -> 959kHz

pwmSetClock(11); -> 871kHz

pwmSetClock(20); -> 480kHz

pwmSetClock(200); -> 48kHz

pwmSetClock(500); -> 19kHz

pwmSetClock(1000); -> 9.59kHz

pwmSetClock(2000); -> 4.802kHz

pwmSetClock(4000); -> 2.401kHz

pwmSetClock(5000); -> 10.58kHz


从我测试的结果来看,似乎除数从2到小于5000的某个数字。我猜想它与的二进制表示有关这些数字直接在寄存器中设置。
一旦数字二进制表示的位数超过了寄存器可以容纳的位数,则只需取第一个位并以此方式解释这些数字。这就是为什么从4000到5000时会出现奇怪行为的原因。

评论


我将如何更改占空比?

– noufal
13年12月24日在11:29

您如何测量频率?

– Seanny123
2014年6月9日14:56