ただ今の日時:

デジタル回転計の製作

ちょっとだけ凝ってみました!

 次の開発(ブラシレスモータの制御)に必要になり、急遽製作しなければならなくなり、作くることになりました。どうせ作るなら今後も使えそうな機能を入れてみようと、ちょっとだけ凝ってみました。 色々やるにつ入れて欲が出てきて、結局は右写真の様なものになりました。 結構使い勝手がいいもので、性能も恐らく市販品と引けを取らないくらいになったと思っているのですが  ヽ(~〜~ )ノ ハテ? 駆動電源はバッテリーで、消費期限が近いものが格安(300円)で(型番:2CR、 電圧6Vリチウム電池)売られていたので、これを使おうと思ったのだが、電池ソケットがありません。 手持ちの材料を探したところ、CR2リチウム電池ホルダーがあったので、これを使うことにしました。長さが少しだけ短いですが、 電池を抑えている
板バネを少し曲げてやれば、結構しっくり入ります。


 製作目標
  1. バッテリー駆動であること
  2. 表示は液晶表示とし、出来るだけ消費電力を抑える
  3. 目標精度は0.1%±2digt以内
  4. 計測可能回転数は10rpm〜50,000rpmとする。
  5. prm」と「prs」表示が切り替えができること
  6. サンプリング時間が「1秒」と「0.5秒」の切り替えができること
  7. 回転センサーの1回転あたりのパル数が任意に設定でき、それに応じて演算して表示すること
  8. 回転数の上限値下限値が設定でき、それに応じて比較機能を動作させること。 また比較機能の使用/不使用が選択できること。
 マイコン側テーマ
1. 完成日付
2009年5月23日
2. テーマ
CCPのキャプチャ機能を学習し、センサーからの回転数を計測する機能を製作する
3. 使用したPICマイコン
PIC16F876A-I/SP  500円/@  ※ 2009/05現在  鰹H月電子通商 価格
4. 電源電圧とシステムクロック
電源:CPU:DC5V、クロック:外部16MHz
5. 開発環境
ハードウェア:ID-U40(CCS)
ソフトウェア:CCS-C PCWHD Version4.093(CCS-C)
6. 回路図
ここにあります!
7. プログラム
メインソースとヘッダー、HEXの一式はここにあります。ZIPで圧縮しています。
8. 参照した主な書籍とWebサイト
「改訂版・C言語によるPICプログラミング入門」 後閑哲也 著者 葛Z術評論社 発行・・・文献1
 動作の説明

 最初に思いついた動作は「1秒間に入力されるパルスを数え、それをrpsとして、 60倍してやればrpmが求められる」と単純な構想でプログラムを作り、動作させてみました。 確かにそれらしい動作をしましたが、いまいち目標から外れています。(特に200rpm以下の精度が悪い!)
 掲載した回路図と違いますが、この時回転信号はマイコンICのT1CKI11Pin)に入力し、1秒TMR0プリスケーラ値 変数バッファ値とで作りだし、1秒検知後、TMR1に入力されるパル数を計測していました。当然、CCP機能は使用していません。
 色々調べた結果、「周波数カウンターの応用」であることが分かり、演算方法にも主に2種類あることが分かりました。 その一つが先ほど紹介した「1秒間に入力されるパルスを計測する」方法で、もうひとつは「1周期のパルス時間を計測する」方法がありました。 両者はそれぞれ長所短所があり、主に低い回転数は後者の方法が良いとされています。 また高い回転数の場合は前者の方が良いみたいです。現に最初の製作したものは 10MHzのパルスを入力でき、 それをrpm表示させると、とんでもない数値になりますが、精度はGoodでした!今回の目標回転数は比較的低い方なので、 後者の方法で製作することにしました。

 さて、1周期をどの様にして計測するかはWebサイトや書籍を見ると、大半はCCP機能にある「キャプチャーモード 」か「コンペアモード」を使っているようです。今回は「キャプチャ-モード」を使います。原理はCCP113Pin)と言う入力端子に立ちあがりまたは立ち下がり(設定による)のエッジを見つけると同時に、 CCPR1LCCPR1Hと言う8ビット×2=16ビットのレジスターにTMR1(16ビット) の内容がコピーされます。これと同時に割り込みがかかります。今回はこの機能を使います。
TMR1の内容を0にセットしておき、TMR1をストップしておきます。CCP1の入力端子に回転センサーの信号を入れます。 この信号のエッジにより、最初の割り込みでCCPR1LCCPR1Hの内容は0になります。それと同時にTMR1をスタートさせます。 次の割り込みで、TMR1をストップさせます。あとは、TMR1のオーバーフロー回数を変数より読み取り、 下記の計算をさせます。

65536 × TMR1のオーバーフロー回数 + CCPR1HCCPR1L(16ビット)の内容

この値が、入力されたパルス数です。あとは1パルスの時間を掛けて、その逆数を求めれば、rpsが求まります。
ちなみにTMR1の入力は外部入力(同期)にしておき、T1CKI11Pin)より、 16MHzのクロック発信器の信号を直接入れています(回路図参照)。 この信号をプリスケーラー値」を入れています。TMR1プリスケーラ値は ×1、×2、×4、×8、が設定できますが、この値が小さいほど精度が上がります。しかし、

(1/16MHz)×2=125nsTMR1 (1/16MHz)×4=250nsメインClock

となり、 メインクロックより小さくなると同期がとれなくなり、計測不能になります。またTMR1を非同期に設定すると今度はキャプチャーがうまく取れないとされています。 (やったことがありませんが・・・)

 現物の動作

↑ センサーコネクタ        ↑ センサー部


↑ 計測と編集スイッチ       ↑ パワースイッチ

↑ 計測部全体外観


 全体の大きさは、93mm×64mm、厚さ22mm透明のポリカボネートに入っています。ちょっと変わったこととして、 パラメータを設定するためのスイッチを、通常であれば5つのタクトスイッチを用意するのですが、上下左右PUSHスイッチが一体になったジョグスイッチを使いました。LinKman社製で マルツパーツ館189円で売っていました。面実装タイプのものですが、操作する部分が短く、専用のカバーらしきものものありません。 仕方ないので5mm角アクリル棒を加工して、ちょっときつめにはまる穴を開けて作り、上下左右の操作に 使い、真ん中にφ2.1mmの穴をあけ、φ2のメッキ線を通し、PUSH操作として操作します。 実はこの部分が一番難しく、今でもちょっとぶつけると外れます。また逆さまにするとφ2のメッキ線が落下します。めんどくさいのそのまま使っていますが、いつかは直したいと思います。
  操作する上では特に問題なく行なえ、5つのスイッチよりはるかに便利です。今後はこの操作ノブを改良したいと思います。以下は、POWERスイッチをONにし、ジョグスイッチのセンターPUSHを押すたびに変わる操作画面です。

@起動時 [PUSH]        Aゲート時間選択          B単位選択

C比較機能ON/OFF    D 1回転当たりのパルス数設定

E 運転待機画面

  1. @POWERスイッチON直後の起動画面
  2. Aゲートサンプリング時間の選択です。←矢印で1.0sec、→矢印で0.5secが選択されます。ゲートタイムセットとなっていますが、気にしないで下さい。 ヾ(--;)ぉぃぉぃ
  3. B単位の選択です。←矢印でrpm、→矢印でrpsが選択されます。選択に応じて、回転数の計算は自動的にされます。
  4. C比較機能のON/OFF選択です。←矢印でOFF、→矢印でONが選択されます。
  5. D1回転あたりに入力されるパルス数を入れます。1〜999まで設定が可能です。←矢印と→矢印で変更したい桁にブリンクさせます。↑矢印で+1、↓矢印で−1になります。
  6. Eこの画面が計測待機画面です。回転数の計測はこの画面にしてMEASUREスイッチを押さないとはじまりません。この画面でジョグスイッチのPUSHを押すと、Aの画面からスタートします。
 Compare Function を'ON'にしたら

G F

C Compare Function のモードで'ONを選択すると 次に表示する画面はFの画面が出てきます。←矢印を押すごとに Under設定値の桁が左方向にブリンクしていきます。最上位桁まで行き、さらに←矢印を押すと今度はOver設定値の最小桁がブリンクします。Over設定値 の最上桁まで行き、さらに←矢印をクリックすると、Under設定値の最小桁がブリンクします。逆に→矢印を押すと、逆方向にブリンク桁が移動していきます。変更したい桁を部リンクした状態で、 ↑矢印で+1、↓矢印で−1されます。設定できる範囲はそれぞれ99999までです。UnderOverの設定値は必ず、 Under値 Over値で設定して下さい。この監視は手抜き (゚-゚;)ヾ(-_-;) オイオイ...  してソフトに入れていません。万一、この条件が成り立たない場合は、黄色と緑色の 警報LEDは両方ONになります。回転数[rpm]Under値の場合、緑色のLEDが点灯します。また回転数[rpm]Over値 の場合、黄色のLEDが点灯します。Unde値回転数Over値の場合は、両方のLEDは消灯しています。r設定完了後に、センターPUSHを押すと、 Dの画面になります。

 その他

 それぞれの設定内容は電源をOFFにすると初期値に戻ります。今回使ったマイコンにはEEP-ROMがあるので保存すれば良いのですが、事情が変われば再設定するのは同じなので、あえて保存機能を省きました。

D H

 [rpm」の表示の時は、Dの様に小数点第2位まで表示します。また「rps」の時はHの様に小数点第3位まで表示します。
 また計測は必ずDまたはHの画面状態でないと行えません。計測可能状態の画面で「MEASURE」スイッチを押すと、計測が開始されます。

 運転開始と性能チェック

 運転は「MEASURE」スイッチを押している間だけ行われます。このスイッチを押している間、画面の右横にある青のLEDが サンプル時間に合わせて点滅を行います。スイッチから手を離すと、最後に計測した内容のまま表示は保持します。
 性能を比較するのに用いた計測器は下記のものです。もう20年以上前のもので、「日本電産シンポ工業(旧:シンポ工業梶j」社製の計測器で、 当時にしては画期的で、幅広い計測が行なえ、精度も±0.008%±1digitと言う高性能のなものです。

入力:AC100-AC200V
測定範囲:0.2〜99999rpm
計測可能パルス入力:1Hz〜10kHz
パルス幅:30uS(min)
信号電圧:0.2V〜30Vp-p
センサー:光系、磁気系OK
その他:アナログ出力付
センサー用電源内蔵


↑本器と回転計DT-5FV                         ↑ 回転計DT-5FV

←左側が本器センサーピックアップ部で右側がDT-5FVのセンサー部です。そして、下にあるのがescap社製のDCコアレスモータ です。
 左図のように同時に計測しようとしたところ、本器のピックアップがDT-5FVのセンサーから出る光に影響され、正確な測定ができませんでしたので個別に性能を確認しました。


● 360rpm付近の計測

↑ 366.44rpm

● 500rpm付近の計測

↑ 506.30prm

● 1,000rpm付近の計測

↑ 1,012.64rpm

● 1,500rpm付近の計測

↑ 1,532.77

● 2,000rpm付近の計測

↑ 2,077.86

● 3,000rpm付近の計測

↑ 3,054.56

● 4,000rpm付近の計測

↑ 4,084.33

● 5,000rpm付近の計測

↑ 5,029.65

● 7,000rpm付近の計測

↑ 7,041.84

 総  評

 性能チェックでお分かりと思いますが、結構良い値が計測されています。十分実用になります。これを使って次はブラシレスモータの回転制御を作成する予定です。 仕様検討しているモータにはエンコーダが内蔵されているので、実際の出力軸とエンコーダ側の両方を検証しようと思っており、この回転計が威力を発揮すると思っています。
 プログラムについてはあまり、 きれいとは言えませんが、今回はハード面で色々と勉強になりました。またジョグスイッチにも出会えて、改良次第で結構使えそうです。センサーピックアップ部は取り外しができるため、 他のセンサーなどを接続することができます。ここにPG(パルスジェネレータ)からの信号を入れて検証したところ、50,000prm付近で 約1%の誤差がありました。これは、クロック発振源の16MHzの誤差ではないかと思っています。もう少し良いものを使用して、 機会があれば検証報告したいと思います。