可以更改吗?
#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=1920
和pwmRange=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
评论
我正在使用硬件PWM进行一些测试,它似乎没有固定的频率。它根据在pwmWrite()中设置的脉冲宽度而变化。不是我希望发生的事情