Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

PIC16F1823 + Servo Motor + IR RC Module で壊れた扇風機の首振り -PWM-

pic16f1823_servo_pwm
今まではタイマー1の割り込みでサーボの駆動用の信号を作るという人様の書いたコードを拝借していたが、PWMで駆動するように変更することにした。
はるかにシンプルだからだ。

PWMの扱いは初めてではないが、やっぱりデータシートを読むことから始める。
とはいっても、PIC16F1823の方が機能が少ないので、前にPIC16F1827でやったときよりは楽な感じがした。
いずれにしてもこの部分を読みながら順にコードを書いていくだけだ。
pic16f1823_servo_pwm-01
設定する値は上の説明に続いて書かれている計算式から決定するが、まずは下に示したPWM Periodから。
pic16f1823_servo_pwm-02
サーボの信号の周期はGWS PICOの仕様を参考にすると43~63Hz(Frame time:16~23ms)とゆっくりなので、PICのクロック数をあまり上げると設定できなくなる。
というより、速すぎて余分なループで時間稼ぎをしなければならなくなる。
概算で、クロック数を4MHz、TMR2 Prescale Valueはめいっぱいの64として、
4000000Hz / 4 / 64 / 63Hz = 248 (= PR2 + 1 )※1
となったのと、PR2の値は大きいほどPWMの分解能が高くなるらしいので、いっそのことPR2 = 255 とした。
クロックが2MHzだとFrame timeを43HzにしてもPR2 = 181となって、わざわざクロックを落とすメリットはひとつも無いことになる。
2MHzでTMR2 Prescale Valueを32にした場合も、クロックを8MHzにした場合も、計算上求められるPR2の値が255を越えてしまうので、結局時間稼ぎのループが必要となってしまう。
正直言ってこのあたりの決め方はまだよく分かってない感があるが、いずれにしても以下の値で行くことにした。
Clock:4MHz
TMR2 Prescale Value:64
PR2:255
続いてパルスの長さはこの式で求める。
pic16f1823_servo_pwm-03
仮に0°の位置に持ってくるとして、以前に調べたサーボの仕様を確認すると1.5msの長さにすればいいので、
0.0015 = (CCPR1L:CCP1CON<5:4>) x (1/4000000) x 64
を計算して CCPR1L:CCP1CON<5:4> = 94 となる。
同様に+60°では56、-60°では131となる。


以上を確認用にコードしたものが以下のファイルだ。
pic12f1823_servo_pwm pic12f1823_servo_pwm (168 ダウンロード )
単純にCCPR1L:CCP1CON<5:4>の値を56~131の間でループで増減させているだけ。
CCPR1L:CCP1CON<5:4>は、全部で10ビット分の設定値のうち上位(左)の8ビットがCCPR1Lに入り、下位(右)の2ビット分がCCP1CONの5ビット目と4ビット目に入るという意味だ。
なので、
CCPR1L = 94 >> 2;
は、CCP1CONの5ビット目と4ビット目に入る分の2ビットを除いた分をCCPR1Lに代入し、
CCP1CONbits.DC1B = 94 & 0b00000011;
は、左の6ビット分は0にして、右の2ビット分だけをCCP1CONbits.DC1Bに代入するという意味だ。

※1
こういう計算の仕方は私の癖だ。
計算式通りに代入すると
0.016 = [(PR2)+1] x 4 x (1/4000000) x 64
PR2 = 249
となる。

「扇風機の首振り機能復活プロジェクト」記事一覧へ

このエントリーをはてなブックマークに追加

Posted under: PIC その他, PIC16F1823, 扇風機の首振り機能復活プロジェクト


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.