私は、wiringpiでハードウェアPWM出力を使用しています。周波数を変更できるようにする関数pwmSetClockを提供します。(https://projects.drogon.net/raspberry-pi/wiringpi/functions/)。デフォルトは200 Mhzであるため、除数を200000000に設定すると、LEDが出力フラッシュに接続されて見えるはずですが、そうではありません。
これは変更できますか?
私は、wiringpiでハードウェアPWM出力を使用しています。周波数を変更できるようにする関数pwmSetClockを提供します。(https://projects.drogon.net/raspberry-pi/wiringpi/functions/)。デフォルトは200 Mhzであるため、除数を200000000に設定すると、LEDが出力フラッシュに接続されて見えるはずですが、そうではありません。
これは変更できますか?
回答:
最近、自分でPWMの実験を開始する理由がありましたが、(コメントの1つで指摘されているように)デューティサイクルによって周波数が変化するように見えることがわかりました。オンおよびオフPWMパルスを可能な限り均等に分散させるために、Broadcomが「バランスの取れた」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にのみ設定できます。
Raspberry Pi PWMクロックの基本周波数は19.2 MHzです。この周波数をの引数で割るpwmSetClock()
と、PWMカウンターがインクリメントされる周波数になります。カウンターが指定範囲に等しい値に達すると、カウンターはゼロにリセットされます。カウンターが指定されたデューティサイクルより小さい間、出力は高く、それ以外の場合は出力は低くなります。
つまり、特定の周波数を持つようにPWMを設定する場合、次の関係を使用できます。
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
pwmSetClock()
およびに最大許容値を使用するとpwmSetRange()
、達成可能な最小ハードウェアPWM周波数は〜1.14 Hzになります。これは確かに目に見えるちらつき(実際にはフラッシュのようなもの)をLEDに与えます。上の式をオシロスコープで確認しましたが、それは成り立つようです。上記のように、周波数の上限は、必要な解像度の影響を受けます。
この式によると:
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の信号を想定しています。
これは私が使用しているコードです。設定を変更すると、何が変わるかを確認しようとしています。
#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に変更すると、奇妙な動作が発生する理由です。
pwmWrite()
。私が起こることを期待していない何か