制御ハードウェアPWM周波数


21

私は、wiringpiでハードウェアPWM出力を使用しています。周波数を変更できるようにする関数pwmSetClockを提供します。(https://projects.drogon.net/raspberry-pi/wiringpi/functions/)。デフォルトは200 Mhzであるため、除数を200000000に設定すると、LEDが出力フラッシュに接続されて見えるはずですが、そうではありません。

これは変更できますか?


1
ハードウェアPWMでテストを行っていますが、周波数が固定されていないようです。で設定されたパルス幅に基づいて変化しましたpwmWrite()。私が起こることを期待していない何か
TheMeaningfulEngineer

回答:


25

最近、自分で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に与えます。上の式をオシロスコープで確認しましたが、それは成り立つようです。上記のように、周波数の上限は、必要な解像度の影響を受けます。


pwmRangeの下限について:2に正常に設定しました(50%のデューティサイクルを取得するため)。
テッドPudlik 14

どのソースから、pwmクロックの周波数が19.2 MHzであることを知っていますか?
thi gg 14

10

この式によると:

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

50Hz --->サイクルごとに20ms。20ms / 200単位=単位あたり
0.1ms

5

これは私が使用しているコードです。設定を変更すると、何が変わるかを確認しようとしています。

#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に変更すると、奇妙な動作が発生する理由です。


1
デューティサイクルを変更するにはどうすればよいですか?
noufal

周波数をどのように測定しましたか?
Seanny123
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.