SSブログ

BCM2835ライブラリ その4 [Raspberry Pi]

Raspberry PiのデジタルインターフェイスであるGPIOをC/C++から統一的に扱うためのBCM2835ライブラリの話に戻る。今日でトップページの意訳を終わらせる。

ところで、B+とRaspberry Pi 2のピン配置はここのまとめが網羅的でかつわかりやすい。

2.7  PWM

BCM2835は限定されたサブセットのGPIOピンを使ってハードウェアPWMをサポートしている。このライブラリではこれらのピンでPWM出力の構成変更と制御をすることができる。

BCM2835にはふたつの独立したPWMチャンネルがある。次のGPIOピンがPWMチャンネルにつながれている。

GPIOピン RPiピン PWMチャンネル ALT機能
12 0 0
13 1 0
18 1-12 0 5
19 1 5
40 0 0
41 1 0
45 1 0
52 0 1
53 1 1


GPIOピンをPWMチャンネルの出力にするためには、この表にあるALT機能を設定しなければならない。現在のRaspberry Piではこのうちのただ一つのピンだけがIOヘッダに出ている。そしてPWM出力のためにはALT機能を5に設定しなければならない。

両方のPWMチャンネルに同じPWMクロックが使われている。クロックドライバは bcm2835_pwm_set_clock()関数で変更することができる。それぞれのチャンネルは独立に bcm2835_pwm_set_mode()でエネーブルすることができる。PWMチャンネルの平均出力はDATA/RANGE比で決まる。RANGEはbcm2835_pwm_set_range()で、DATAはbcm2835_pwm_set_data() で設定可能である。

それぞれのPWMチャンネルはバランスモードとマークスペースモードのいずれかで動作する。バランスモードではハードウェアはRANGEパルス数に対して全体としてDATAパルス数になるようにクロックパルスの組み合わせを発生させる。マークスペースモードではハードウェアはDATAクロック数の幅の間HIGHを出力して、RANGE-DATAクロック数の間LOWを出力する。

訳注:これは何を言っているのかわからないけど、元の英語も何言ってるのかわからないのでしかたがない。 これはマークスペースモードでは周期がRANGEクロックで、そのうち最初のDATAクロックに相当する間HIGHになって残りはLOWに落ちる、ということで、バランスモードというのはおそらく低い周波数成分が最小になるようにパターンを選ぶ、ということだろうと思う。つまり、RANGE=4の場合、図-1のようにするということだろう、というか僕ならこうする。
0828fig01.png
すべてのRANGEの値とそれ以下のDATAの値に対して、例えば各周波数成分のエネルギーに1/f(あるいは1/f2のほうがいいか)の重みをつけた総和が最小になるパターンは、位相のズレを除いて一意に決まると思える(証明はできない)けど、それをパターンごとに持っているとは思えないし、なにか原始関数というか生成多項式というかそういうものが作れるのかどうかもわからないのでどうやってどうやって作ってるのかわからない。これ自身は数学の問題としては面白いかもしれない(もちろんできたとしてももうすでにあるわけだから、頭の体操でしかないけど。ちなみに、上の絵は位相も気にした場合。パルス幅が変わったときにも低い周波数成分を最小にする)。 実際にこうなっているのかどうか調べるのが面倒なのでこのまま訳に戻る。
PWNクロックはパルス幅を制御するために設定することができる。PWMクロックは19.2MHzクロックから作られる(訳注:これはPWM用に発信機を持っているということなんだろうか。Raspberry PiのBCM2835のクロックは700MHzらしいのでそこから分周して得られる値ではない)。どんな分周値も設定できるが、一般的な値をbcm2835PWMClockDividerのBCM2835_PWM_CLOCK_DIVIDER_某として提供してある。

例えば、DCモータを1kHz付近のPWMで、スピードを0/1024(停止)から1024/1024(最高速度)の1/1024刻みでドライブしたいとする。この場合、クロックの分周値を16に、RANGEを1024にすればいい。パルスの周期は1.2MHz/1024=1171.875Hzになる(訳注:19.2MHz/16 = 1.2MHz)。

2.8  SPI

bcm2835ライブラリのSPIを動作させるにはSPIカーネルモジュールを停止させる必要がある。
sudo raspi-config
 under Advanced Options - enable Device Tree
 under Advanced Options - disable SPI
 Reboot.

2.9  リアルタイムパフォーマンスと時間制約

bcm2835ライブラリはユーザプログラムである(すなわち「ユーザランド」で実行する)。そのようなプログラムはカーネルの一部ではなくて、普通はカーネルによってページングやスワッピングの対象になっている。カーネルは実行中のプログラム以外にもすることがある。これはこのようなプログラムにリアルタイムのパフォーマンスや、リアルタイムのタイミング制御が得られると期待してはいけないということである。とくにbcm2835_delay()とbcm2835_delayMicroseconds()は正確に要求された時間の後返ることを保証していない。事実、ホストやI/Oなどの動作状況によって要求した時間よりかなり長いディレイになることがある。だから正確に要求通りのディレイが得られるとは期待しないで。

ArjanはLinuxでは次のコードでスワッピングを停止できると報告している。
struct sched_param sp;
memset(&sp, 0, sizeof(sp));
sp.sched_priority = sched_get_priority_max(SCHED_FIFO);
sched_setscheduler(0, SCHED_FIFO, &sp);
mlockall(MCL_CURRENT | MCL_FUTURE);
(訳注:一般的にはスワップを停止するのは危険である。ある一定以上のメモリリソースを消費しないということが確定している場合にだけ行うべきである。また、unix系のOSではスワップが発生しなくてもリアルタイム性には限界がある)

2.10  ほかの言語とのバインディング

mikemはPerlのバインディングを作ってCPANで公開している。

Matthew Bakerは親切にもPythonバインディングを作ってくれた。

Gary Marksはbcm2835ライブラリに基づいてRaspbery Pi用のSPIが使えるコマンドラインユティリティを作った。このspinclというユーティリティはGNUのGPLv3でiP Solutionsからライセンスされている。

2.11  オープンソースライセンスGPLv2

ソースの流用、アプリの配布に関してはGPLv2に従う。

2.12  謝辞

2.13  改版履歴


nice!(0)  コメント(1)  トラックバック(0) 

nice! 0

コメント 1

Cialis 20 mg

沒有醫生的處方
overnight cialis tadalafil http://cialisyoues.com/ Tadalafil tablets
by Cialis 20 mg (2018-04-14 03:59) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。