φ(. . )めもめも

技術関連の個人的な備忘録

RaspberryPi - C言語でPWM制御。からの、Ruby用ライブラリ作成

雑誌インターフェースのサンプルや、 wiringPiのコードを参考にpwmのレジスタにアクセスする。

RaspberryPiのPWM

  • PWM0(GPIO18)がピンヘッダ(12pin)へ接続されている
  • PWM_RNGxレジスタで、Rangeを設定
  • PWM_DATxレジスタで、Duty(Highの期間)を設定
        |<---duty-->|
         ___________
        /           \____________/
        |<-------range---------->|
  • CM_GPxCTLレジスタ(※)で、Rangeのベースクロックを設定する。
  • OSCに19.2MHzの発信器が接続されている。(回路図参照)
  • CM_GPxCTLレジスタのSRCフィールドを1(oscillator)にすれば、OSC(19.2MHz)が使用可。
  • CM_GPxDIVレジスタで、OSCクロックを分周。WiringPiでは32分周して600KHzをRangeのベースクロックとしている。

※CM_GPxCTLレジスタのアドレスが、BCM2835のデータシートでは、0x20101070(0x7E101070)となっているが、 WiringPiのコード上では、0x201010A0にアクセスしている。

プログラム

Rangeを1000固定で、Dutyを0~1000まで100単位で変化させるサンプル。
※ただし、動作はLED(暗→明)で確認しただけで、オシロスコープなどでは確認していないので 正確なクロックが出力されているか不明。

コンパイルと実行
$ gcc pwm.c
$ sudo ./a.out

つづく…