ラベル サーボ・コントローラ の投稿を表示しています。 すべての投稿を表示
ラベル サーボ・コントローラ の投稿を表示しています。 すべての投稿を表示

2025年9月4日木曜日

出入り検知器をPCB化する(その26) インテグレーション3

 暫く作業をお休みしていたが、これまで作った基板を組み合わせて、人の通行を感知して挨拶する挨拶ロボットを作る。

そこで新たらしく必要になるのがロボットを制御する方法、即ちサーボモータによるロボットの動作とメロディ・音声を同期させる手法及びその記述法である。最初のステップとしてインテグレーション1で作ったサーボ制御ユニットのコマンドを次の様に整理した。

    <nn>A - Rotate Ch.1 to direction <nn>.(<nn>=-90..0..90)
    <nn>B - Rotate Ch.2 to direction <nn>.(<nn>=-90..0..90)
    <nn>C - Rotate Ch.3 to direction <nn>.(<nn>=-90..0..90)
    <nn>a - Rotate Ch.1 <nn>degrees.(<nn>=-90..0..90)
    <nn>b - Rotate Ch.2 <nn>degrees.(<nn>=-90..0..90)
    <nn>c - Rotate Ch.3 <nn>degrees.(<nn>=-90..0..90)
    <nn>x - Set Ch.1 speed to <nn>.(<nn>=1..253)
    <nn>y - Set Ch.2 speed to <nn>.(<nn>=1..253)
    <nn>z - Set Ch.3 speed to <nn>.(<nn>=1..253)
    <mm>s - Set all speed to <mm>.(<mm>=1..253)
     <m>S - Set all speed to level <m>. (<m>=0..9)
        Z - Rotate Ch.1,2,3 to origin(0,0,0).
        > - Wait Idle
        $ - Abort
        e - Echo OFF(default)
        E - Echo ON
        i - Idling OFF(default)
        I - Idling ON
        v - Show software version.
        V - Show configuration data.
 

これらのサーボの制御コマンドは制御モジュールに後置記法(逆ポーランド記法)で与える。つまり改行を待たずアルファベットや記号のコマンドを入力した時点で即動作する。いちいち改行を入れる必要が無いので連続的な指示が可能である。 


 メロディや音声に同期してサーボユニットへ指示を行うための記法を次の様にした。

    [A:B:C](D)E 

 ここでサーボへの指示は[]の中に記述し、メロディは()の中に記述する。つまりAはサーボの事前処理、Bがサーボの動きの記述、Cがサーボの終了処理、Dはメロディ、Eが音声メッセージである。例えば、

    "[200sZ>5s:90A90C>-90A-90C>:$Z>](@j)ohayo" 

と記述すると、

  1. スピード200で原点移動、 その後スピードを5に変更(A部)
  2. 「@j」で定義されるメロディを演奏(D部)
  3. その後「おはよう」と発声(E部)
  4. 2,3を行っている間にチャネル1とチャネル3のサーボモータを原点から+90度へ、次に-90度へ回転(B部)
  5.  発声が終了するとともにサーボの回転を停止し原点へ移動(C部)

 のように動作する。こういった1行をイベント毎に用意し、実行すればよい。

 (続く)

 

2025年4月30日水曜日

出入り検知器をPCB化する(その25) インテグレーション2


 アップグレードしたメインの基板はサーボコントローラより前に発注して昨年末に入手済みである。 前バージョンとの大きな違いは配線パターンの向きを表裏逆にした点である。ICのピン間(2.54mm)を通す配線を表側に配置した。昔、レジストを塗布していない基板ではこうしたものだが今はレジストがハンダのブリッジを防いでくれるのでうっかり逆にしていた。プロの仕事を見るとICのピン間には2本の配線を通せるようであるが、私は私はそこまで追い込むつもりは無い。

 

 さらに次のバージョンを発注し入手した。

最新バージョンの変更点はインターフェイスの都合上電源の5V系と3.3V系を分けた事である。 というのは電源を3.3V系で統一出来たら良かったんだけど超音波測距やサーボモータを使う上で(3.3V系では物足りなく)5Vを使いたく、一方ICによっては3.3Vでしか使えないものがあるからである。そのためI2Cレベルコンバータを追加した。

部品点数がだんだん増えてきて、組み立てに約半日を要した。特にSMDのハンダ付けにはいつも苦労する。 上手く繋がっていない場合もあるのでハンダ付け後は必ずテスターで導通具合をチェックする必要がある。あと、レベルコンバータのICには1番ピンを表す刻印が見付からず逆に付けて、取り外すときパターンを壊してしまった(仕方なく1号機は空中配線で凌いだ)。


こういう場合は、ICを文字が読める方向に置いて文字の下側の左端が1番ピンのようだ。

(続く)

 

2025年2月12日水曜日

出入り検知器をPCB化する(その22) インテグレーション1

 インテグレーションの最初のステップとして、新しいサーボ・コントローラ基板を発注した。これはトルクの大きいサーボに電流を流せるよう部品を見直したのと、基板ごとに違っていた電源電圧を1つの電源から供給できるように統一する為である。おまけで、前に作った2チャンネルのコントローラを3チャネルに増やし、操作方法を少し変更している。

3チャネル化に当たってPIC内のペリフェラルの使い方を少し変更した。

これまでの2チャンネルでは周期20msのパルスを10msずらして発生させていたが、これを5msずらし3チャネル目を挟み込みたい。そのためには100Hzの方形波が必要だがTMR0が方形波を出力できないため、最終段で2分周して方形波を出力出来るNCO1に変更した。但しNCO1からCLCへは直接のルートが無く信号を渡せないため、間にDSMを挟んで渡してる。この方式では4チャネルまで対応できるが残念な事にPIC内には4チャネル迄拡張するためのTMR1&CCPリソースが無い。

基板を発注した時期がたまたま春節の休暇に被ったため予想以上に時間がかかって、通常だと1週間程度で届くはずが2週間ほどかかった。基板が届いて早速組み立てた。

基板上にはACアダプタ用電源コネクタ、分岐用2P電源コネクタ、サーボモータ用コネクタ×3、ホスト接続用コネクタ、電源SW、ロータリーSW、プッシュSW、レバーSW、赤色LED、緑色LED×3等を搭載している。3つの緑色LEDはそのチャネルのサーボが動作中に点灯する。

幾つかのバグ取りを経て5msずれたパルスを出力することが出来た。なおこのパルスを与えるとサーボの消費電流が増えるので、サーボが目標点に到達した約1秒後にパルスを止めるようにしている。

このコントローラはリモート制御で使う事が前提であるが、ローカルテストのため基板上のスイッチでも操作できる。基板上のChSelスイッチを押す毎にCh1、Ch2、Ch3、ChAll、ChOffと移行する。このとき選択されたチャネルのLEDが点灯しロータリースイッチで回転速度を、レバースイッチで動きを制御できる。サーボが動作中にはLEDは点滅する。ChOff、或いは無操作で数秒経過するとリモート状態に戻る。ローカルテストで設定した回転速度はリモート制御には反映されない。別の言い方をすれば、リモート制御の回転速度はローカルテスト後も維持される。

(続く)


 

 

 

 

2024年12月21日土曜日

出入り検知器をPCB化する(その20)サーボ・モータを動かす8

 サーボ・コントローラを語るうえで大事な事を忘れていた。

そもそもサーボモータの制御信号(PWM)には統一規格はあるのか、 それはTowerPro社のSG-90と同じで良いのか、或いはどんなものがあるのか、という点である。こういったサーボモータはラジコンで使われているようなので規格は統一されていそうなものである。実際にカタログには制御信号はPWMとだけ書いてある場合も多く、あたかも統一されているようである。そこで秋月で入手できるもの(360度回転の物を除く)を中心に市販品を調べてみた。全てを調べ切った訳ではないが、概要は次の通り。

  1.  TowerPro - このメーカーのサーボモータの制御信号(PWM)のパルス幅は180°回転の場合500μs~2400μsでセンターは1450μsである。
  2.  FEETECH - このメーカーのサーボモータの制御信号は180°回転の場合500μs~2500μsでセンターは1500μsである。回転角が120°の製品もあるがセンターのパルス幅は同じく1500μsである。またシリアルインターフェイス(1Mbps)のものも販売されているようだ。
  3.  GWS - このメーカーのサーボモータの制御信号は180°回転の場合800μs~2200μsでセンターは1500μsであり、120°回転の場合900μs~2100μsでセンターは同じく1500μsである。
  4. SAVOX - 製品の数が少ないが、回転角が164°のものの制御信号は800μs~2200μsでセンターは1500μsである。

 これらの値をもとに回転角1度当たりのパルス幅変化量を計算すると11μs前後の製品が多いが、中には6.7μsの製品もあった。

これらのメーカのパルス周期はいずれも20ms(50Hz)である。一方Amazonで売っている高トルクのサーボでは高パルス周期(50Hz~333Hz~800Hz)のものもあるようだ。ただ800Hzのパルスを出すとすればパルス幅はせいぜい1ms(1000μs)程度なので、これを使うつもりなら仕様を具体的に検討してみる必要がある。

さて、制御信号の時間的な仕様が分かったので今回作ったサーボ・コントローラで実際にこれが動くのか電気的特性を試してみた。テストに使ったのでは TowerPro の MG996Rである。

このサーボを選んだのはトルクが11Kg/cmもあるので(SG-90は1.8Kg/cm)大喰らいであり、その分だけ制御信号にもある程度パワーが必要かもしれないと考えたからである。つまり(データシートに明示されていない)サーボモータの制御信号の入力インピーダンスや閾値がPICで駆動できる範囲にあるかという事である。

結論から言うと問題なく動いた。最初は電源の電流を500mAに制限して動かしてみたらサーボはかすかに唸るが全く動いてくれなかった、そこで制限を1.5Aくらいに上げると普通に動いた。無負荷のSG-90なら100mAでも動くがMG996Rは無負荷でも1Aは必要である。仕様上は無負荷の電流は170mAとなっているが実際には突入電流が大きく最大電流1400mAの電源を用意しておく必要があるのだろう。やはり大喰らいである。

 以上の事から少なくともTowerPro社のサーボはPICで駆動できる事、またサーボ・コントローラで様々なサーボモータに対応させるためには少なくともPWMの細かい設定が必要な事が分かった(TowerPro社以外のサーボについては機会があれば試したい)。サーボモータを使う側から見ると、制御信号の統一規格は無く、使うサーボモータの仕様に合わせて制御信号のパラメータを変える必要があるという事である。

幸いこの程度の事ならプログラムの簡単な変更で済むのでサーボの仕様に合わせてパラメータを切り替えられようにする予定である。

 (続く)


2024年12月2日月曜日

出入り検知器をPCB化する(その19)サーボ・モータを動かす7

 サーボモータに与えている制御信号を測定してみると、周期が1%ほど短い。また一定している筈の制御パルスの幅にも若干の揺らぎが見られる。これらの原因を考えると、周期の元となっているLFINTOSCの周波数が若干ずれている事と、LFINTOSCとパルス幅を決める元となっているFosc/4(=HFINTOSC/8)の周波数の間に一種の唸り(エイリアシング)が発生して揺らぎが発生しているようだ。

このPICではLFINTOSCの周波数は固定で補正できないが、HFINTOSCのそれは±1%以上補正できるので LFINTOSCの使用を止め、ソースをHFINTOSCに一本化する事で唸りを防ぐ事とした。幸いFosc/4の2MHzから100Hzを取り出す事はこれまで通りTMR0で分周する事で可能だ。結局、次の回路に落ち着いた。また周波数の補正パラメータの値(OSCTUNE)はPIC内部のEEPROMに書き込み保存されるようにした。


これで、この回路を1つの周波数源で駆動する事となり、動作が安定するだろう。また周波数を補正する事でパルス周期をほぼ20msに追い込むことが出来たが発信器には温度特性(次図)もあるのでどこかで妥協が必要である。

電圧依存性は少ないようである。

サーボ・コントローラについては一先ずこれで終わりたい。

(続く)




2024年11月29日金曜日

出入り検知器をPCB化する(その18)サーボ・モータを動かす6

 タイマー0、タイマー1及びCLCを使うことでタイマー2の機能から来る制約から解放されたのでクロック(HFINTOSC)の周波数を4倍の16MHzに上げFoscを8MHz、Fosc/4を2MHzとした。これで処理に余裕も生まれる。

前回の回路を実装してみたが上手く動かない。問題点は2つあった。1つ目はデータシートの回路図上のT1GSPMの表記(1/0)が逆になっていて(本文は正しかった)、ゲートによってカウンタが制御できなかった。このバグを潰すのに数日を要した。もう1点はタイマー1のゲートが閉じているとカウンター1のオーバフローが1になったままリセットできない点であり、そのため2回目以降のタイマー割込みを発生できないうえにD-FFがリセットされたままなのでタイマーのゲートが開けない、いわゆるデッドロックの状態になっている事である。設定を色々試したがどうしてもタイマー1はリセットできなかった(強制的にゲートを開けて数クロック入れてやればリセットされるが美しくない)。この件をネットで検索すると「CCPと組み合わせて使え」とのアドバイスが見付かった。どうやらCCPからタイマーをリセットできるようである。

そこで次図のようにタイマー1をCCPと組み合わせて使うよう変更した。CCPはコンペア+パルス出力+タイマーリセットモードに設定し、タイマー1のオーバーフローではなくタイマー1のカウント値がCCPRの値とマッチするタイミングでパルスを出力するようにし、そのパルスでCLCのD-FFをリセットするとともに割り込みをかけるようにした。同じタイミングでタイマー1はリセットされるようである。

これで上手く行った。これでパルス幅をデッドバンド幅の1μs単位で設定できるので低速の動きもスムーズになった。

このサーボコントローラはシリアルインターフェイス経由で次のようなオンライン・コマンドを受け付ける。


  (続く)

 

2024年11月24日日曜日

出入り検知器をPCB化する(その17)サーボ・モータを動かす5

 これまで使ったTMR2+PWM5,6では大き目のデューティ比のパルスを細かくコントロールする事は苦手である。そこで改めてサーボモータを細かくコントロールする事を考える。サーボモータのデッドバンド幅が1μsだとするとパルス幅を1μs単位でコントロールしたい。1μsを最小単位とし、サーボモータに与える最大パルス幅を2.5msとすると2500倍であり、これを制御するには12ビット以上のカウンタが必要である。これに該当するのは16ビットカウンタを持つタイマー1である(タイマー1は次の回路構成)。またこれに与えるクロックは1MHz以上とする必要がある。

今回の目的にタイマー1を使うときの問題点は、タイマー1はワンショットで、タイマー2の様なフリーランではない事であり、カウントが終了する度に再度カウンターに初期値を設定する必要がある。幸いその時間的余裕は17.5ms以上あるので割り込み処理で間に合うだろう。またタイマー1自体には任意のパルス幅のパルスを生成する機能は無いため、他の機能(例えばCLC)と組み合わせて使うことになる。このアイデアをPIC16F18346を使って組み立てて次図のように構成した。

この図でTMR0の分周比を620とせず310としたのはCLC1とCLC3のCK端子の論理を逆にし、HとVのサーボに与えるパルスを半周期(10ms)ずらし突入電流を減らす事を狙っている為である。TMR0の出力はデユーティ比が50%ではないためCLC2で2分周し周期20ms、デユーティ比50%の方形波を作る。

この回路の動作は、D-FFのD端子が1になると次のCK端子の変化点でQが1となりパルスがスタートする。それと共にタイマーのゲートGが開きカウントがスタート。カウントが進みカウンタが0xffffから0x0へ変わる時オーバーフローが発生してOVFが1になり、その時点でD-FFがリセットされパルスが終わる。この時割込みを発生させ、ソフトで次のカウンタの初期値を設定する。もしD-FFのD端子が0の場合は次のパルスは発生しない。この方法なら制御の最初や最後で中途半端な幅のパルスを生成することは無い。

タイマー1(TMR1,TMR3)のクロック入力には2MHzを使いプリスケーラで2分周して1MHzのクロックとしてカウントする。SG90の性能は0.12sec/60度であるからパルス間隔20msでは10度回転し、これに相当するパルス幅の変化量は概ね110μsであるから、これ(110)が20ms毎のタイマーのカウント値の最大変化量とする。即ちこれ以上カウント値の変化量を大きくしてもサーボモータが追従できない。この値を基準に制御プログラムを作成する。

〔参考〕ここでPICのタイマーの表記が紛らわしいので改めて説明する。PICには3種類のタイマーがあり、それぞれタイマー0、タイマー1、タイマー2と呼ぶ。PICの種類毎にそれぞれのタイマーが何個ずつ実装されているかが異なり、PIC16F183x6ではタイマー0はTMR0、タイマー1はTMR1、TMR3、TMR5、タイマー2はTMR2、TMR4、TMR6が実装されている。

 (続く)



2024年11月22日金曜日

出入り検知器をPCB化する(その16)サーボ・モータを動かす4

 この回路は手動制御とリモート制御の両方を実現しており、双方で制御の仕方が違う。リモート制御では角度を±90度、回転速度は19段階で指示できるが、手動制御ではレバースイッチは回転方向を、回転速度はロータリーコードスイッチで10段階に指示する。この折り合いをどうするかが1つの課題であるが、全て後優先とした。つまり新しい指示が入ると、それに対応した実行中の動作をキャンセルし指示に従う。回転速度の違いはマッピングで吸収した。
 
 基板を発注した。 大きさは 57.2 mm×40.6 mm と試作基板より一回り小さくマッチ箱サイズにできた。そして1週間で納品され、組み立てた。

そして設計通り動いた。

しかし低速での動きがぎこちないのが気に入らない。このままでは3度単位でしか制御できないので仕方ない事であるが、出来ればもっと滑らかな動きにならないか。サーボのデッドバンド幅が1μsなので上手くやれば(機械的なガタが無ければ)0.1度(=180度/2000μs/1μs)単位まで追い込めるはずである。

(続く)


2024年11月12日火曜日

出入り検知器をPCB化する(その15)サーボ・モータを動かす3

サーボモータのコントローラに手動スイッチを付ける事となった。そこで秋月で買っておいたレバースイッチを付ける事とした。これは左右に各2段階、プッシュスイッチも付いていて色々使えそうだ。

このレバースイッチを付けるためには8ピンのPIC16F18313では端子が足りない。水平用と垂直用の2つのスイッチを付ける事を考えると単純には12個の端子が欲しい。そこで手持ちの20ピンのPIC16F18346を使うこととした。これはPIC16F18326の20ピン版である。勿体ない気もするが増えたPICの12ピンを全てスイッチに割り当てた。そしてハードは次の様に組み上がった。


ソフトはPIC16F18313で作ったソフトを少し改造して使った。PIC16F18346になったのでプログラムメモリーが3.5KBから28KBに、RAMが256Bから2KBに大きく広がり使い易くなった。

このハードに乗せるソフトは最初にPIC16F18313用に作ったものを、いくつかの点を手直しして上手く動かすことが出来たが、レバースイッチの2段階の操作で速度を制御するのは使い勝手が悪そうだったので別に速度切り替えのスイッチを追加する事とした。ここはジョイスティックにすれば良かったかもしれない。

 そしてこんな回路になった。

この回路(実装基板)の隠れた機能は3つのPICに対応している点である。20ピンのPIC16F18346だとフルの機能を使えるが、14ピンのPIC16F18326だとロータリーコードスイッチが使えず、PIC16F18313 だとレバースイッチも使えずリモート制御のみになる。一方3つのPICに対して(メモリー容量が許せば)プログラムはほぼそのまま使える点である。

この回路ですでに基板の設計とプログラミングは済んでいるが、まだロータリーコードスイッチを入手していないので検証が出来ていない。機能が確認できたら基板を発注する予定である。

 そして、ロータリーコードスイッチを追加してこうなった。

ソフトも幾つか手直しして動くようになった。

 (続く)

 


2024年10月24日木曜日

出入り検知器をPCB化する(その14)サーボ・モータを動かす2

 サーボモータ(SG-90)をPIC16F18313で動かすための基本的な計算が出来たところで実際のプログラムを作る。サーボモータを動かすために必要なパルス波形は次のようなものである。

2つのパルスの周期(20ms)はTMR2で決める。2つのサーボモータの角度に対応する2つのパルス幅(0.5ms~2.4ms)はパルス幅変調器(PWM5及びPWM6)で決める。

 サーボモータがある角度にある時、突然別の角度を指示するとサーボモータは最速(仕様では0.12sec/60度=500度/秒)でこれに追従する。これが目的とする動作に合っているのか、またサーボモータの負荷を高め寿命を縮めることにならないか気になるところである。そこでTMR2+PWMで生成できる最小の分解能である3度毎にステップを進める事とする。もし20ms毎に割り込みをかけて3度進めると150度/秒となり、良さそうである。TMR2にはポストスケーラがあるので、これを使うとこの1倍から1/16倍までのスピード制御が可能であり、即ち9.4度/秒~150度/秒の速度制御が可能である。

ロジックとしてはTMR2(のポストスケーラ)により割込みがかかったときサーボが目的とする角度に達していない場合は要回転を意味するフラグを立てる。さらにパルスの立下りで(IOCの機能を使って)割り込みをかけ、要回転フラグが立っている場合は次のパルス幅に相当する値をPWMに書き込む。そのタイミングがパルスの立下り後である理由はパルスの立下り時に処理を始めると処理のための時間的余裕が十分あるからである。時間的には20ms以内に処理を終わらせればよいので問題は無いだろう。なおIOC(Interrupt On Change)とはPICのピンの信号の変化を捉えて割込みを起こす機能であり、立ち上がりと立下りを個別に捉え割り込みを起こす事ができる。通常は入力信号に対して使う機能だと思うが、ここでは出力信号に対して使っている。

ソフトの開発と並行して汎用基板にプロトタイプのハード(コントローラ)を作った。 大きさは概ね2cm×4cmに収まった。

基板に載っている部品はPIC16F18313と電源のパスコン、LEDと電流制限用抵抗だけで他に接続用に電源コネクタ、サーバモータ用3Pコネクタが2つ、ホストと繋ぐシリアル通信用コネクタが1つあるだけである。シリアルインターフェイスはUSBを介してTeraTermから文字ベースでテストできるようにした。

電源を入れると各部の初期化を行い、TME2やPWMを起動、1.45msのパルスを作ってサーボを中点まで移動、その後パルス幅を0としてサーボを休止、割り込み可としてSLEEPする。

RS-Kager2-Servo313-032 2024/10/23 for RS-Kager2 ver 0.27
 Copyright(C)2024 MYcrosLip
*** Init Servo.
*** Start Interrupt.
*** Start Servo.
*** Sleep Loop.

あとはシリアル通信で受信したコマンドを解釈してPWMを制御しサーボを3度ステップで動かす。目的の角度に達したらパルスを止める。3度進むのに必要な時間は7.5msであるから50Hzの1周期(20ms)以内に終わり、タイマーなどを使った遅延操作は不要である。

実装した主なコマンドは<nn>H、<nn>V、Z、<mm>Gである。Hは水平サーボ、Vは垂直サーボの軸を回転(指向)させるコマンドで<nn>は-90度~90度の範囲であり、Zは原点(0,0)に復帰、Gは速度制御(<mm>は引数で1~16)である。

次の実行例で、90Hは水平サーボを90度に向け、90Vは垂直サーボを90度に向け、Zで原点に戻っている。小文字のhやvは動作確認のため1ステップ進むごとに表示させている。

90Hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
90Vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
Zhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhvhv

 サーボの動作中でも次のコマンドを受け付ける。この場合、実行中のコマンドの終了を待たずにキャンセルし、後で来たコマンドを処理する。この動作を2つのサーボに対して各々独立して行う(逆に言えば処理待ちキューを作らずに済ませたという事)。

これで外部から文字ベースでサーボを制御できるようになった。

(続く)

 


 

2024年10月19日土曜日

出入り検知器をPCB化する(その13)サーボ・モータを動かす1

 出入り検知器にサーボ・モータを動かす機能を追加できないか相談を受けた。水平と垂直の2方向の動きをサーボで作る。そこでSG-90という最も安価なサーボを秋月で入手して動かしてみる事に。

SG-90にはSG90-HVという軸が360度回転するタイプもあるが、入手したSG-90は可動域が180度のタイプである。SG-90の角度を制御するには電源5Vを加え、次のような20ms周期のパルス幅変調の信号を制御端子に加え角度を制御する。

 角度は0.5ms~2.4msのパルス幅に対応して0度~180度に変化する。中点(90度)のパルス幅は1.45msである。パルスを0.05ms(50μs)単位で変化させると180度を39ステップ、即ち4.7度単位で制御する事ができる。SG-90のデッドバンド巾は1μs(本当?)なので問題にはならないだろう。

この幅のパルスを作る事は難しくない。問題は周期の50Hz(20ms)との関係である。ポイントは大きなデューティ比 0.5/20~1.45/20~2.4/20 を細かく制御する必要がある事である。これを整数比に直すと10/400~29/400~48/400 であり、20msの1/400である50μs単位で制御する事になるが、これは試算値であって実際のSG-90がこれをどれ程の精度で追従できるかは分からない。

8ピンのPIC16F18313には2個のPWM(パルス幅変調器)が内蔵されていて丁度良い。このPWMはタイマー2(TMR2)と組み合わせて使う。


TMR2はFosc/4のクロックで動く8ビットカウンタであり、1/1, 1/4, 1/16, 1/64 のプリスケーラが利用可能。これを使ってFosc/4=500KHz、プリスケーラ=1/64、カウンタの上限(PR2)を155に設定すると約50Hz(=500KHz/64/156)が取り出せる。なおTMR2のポストスケーラ(1/1~1/16)からは直接信号が取り出せず割り込み用にしか使えない。

TMR2と組み合わせて使うPWMのパルス幅は10ビットで指定する。つまり8ビットカウンタの1カウント値の1/4まで指定でき、これは約32μsステップ(=20ms/156/4)単位で指定できる事になる。これを使って改めてパルス幅の指定範囲を計算するとカウント値は 0.5ms÷32μs≒15、1.45ms÷32μs≒45、2.4ms÷32μs=75 という値となる。つまり90度で30カウント差だから1カウントが3度の回転に相当する。

(続く)