雑誌インターフェースのサンプルや、
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
つづく…